mirror of
https://github.com/certd/certd.git
synced 2026-04-27 23:37:29 +08:00
Compare commits
11 Commits
v1.39.9
...
7a9eec88e8
| Author | SHA1 | Date | |
|---|---|---|---|
| 7a9eec88e8 | |||
| a7a4f66633 | |||
| a88d0a6ae1 | |||
| db87bc770e | |||
| 7b6b71cd4b | |||
| df98463325 | |||
| f7492db8bd | |||
| 70b46d4a8f | |||
| 411486e1e7 | |||
| 6f81305232 | |||
| 79bc22d8ce |
@@ -124,6 +124,7 @@ export default defineConfig({
|
|||||||
{text: "子域名托管", link: "/guide/use/cert/subdomain.md"},
|
{text: "子域名托管", link: "/guide/use/cert/subdomain.md"},
|
||||||
{text: "流水线有效期", link: "/guide/use/pipeline/valid.md"},
|
{text: "流水线有效期", link: "/guide/use/pipeline/valid.md"},
|
||||||
{text: "IP证书申请", link: "/guide/use/cert/ip.md"},
|
{text: "IP证书申请", link: "/guide/use/cert/ip.md"},
|
||||||
|
{text: "企业模式", link: "/guide/use/mode/enterprise.md"},
|
||||||
{text: "插件开发", link: "/guide/use/dev/plugin.md"},
|
{text: "插件开发", link: "/guide/use/dev/plugin.md"},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,6 +3,22 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.39.9](https://github.com/certd/certd/compare/v1.39.8...v1.39.9) (2026-04-05)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复cn域名获取不到到期时间的问题 ([73b8e85](https://github.com/certd/certd/commit/73b8e859766097b5251fc4e5051593d686669eb2))
|
||||||
|
* 修复某些情况下报无法修改通知的问题 ([d1a6592](https://github.com/certd/certd/commit/d1a65922d7e152d6edcf6c53b70079f16b54a0d3))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 腾讯云CLB大区增加台北 ([6b109d1](https://github.com/certd/certd/commit/6b109d172f0c7b6ce6ec164dc196d646a65f529f))
|
||||||
|
* 优化腾讯云CLB插件支持选择证书id ([c875971](https://github.com/certd/certd/commit/c875971b71dc6d392e56f0a7605281c40d9bb405))
|
||||||
|
* 支持域名到期时间监控通知 ([c6628e7](https://github.com/certd/certd/commit/c6628e7311d6c43c2a784581fb25ec37b29c168d))
|
||||||
|
* **monitor:** 支持查看监控执行记录 ([b5cc794](https://github.com/certd/certd/commit/b5cc794061c11b7200b669473c25c4bbfc944b61))
|
||||||
|
* **plugin-dnsmgr:** 添加彩虹DNS插件支持 ([af50344](https://github.com/certd/certd/commit/af503442b8298c5b89d11cf2ea351d62e66a609e))
|
||||||
|
* **spaceship:** 新增Spaceship DNS插件和授权模块 ([21aec77](https://github.com/certd/certd/commit/21aec77e5c3307b5973d4185baba33edcb28926f))
|
||||||
|
|
||||||
## [1.39.8](https://github.com/certd/certd/compare/v1.39.7...v1.39.8) (2026-03-31)
|
## [1.39.8](https://github.com/certd/certd/compare/v1.39.7...v1.39.8) (2026-03-31)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
@@ -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 |
@@ -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": "de0ae14544f1c3da4923dddc6a1a3bea4db295e7"
|
"gitHead": "1c634a702af9298d25542acc270d68f71d9b1049"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,5 +47,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "de0ae14544f1c3da4923dddc6a1a3bea4db295e7"
|
"gitHead": "1c634a702af9298d25542acc270d68f71d9b1049"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,5 +45,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "de0ae14544f1c3da4923dddc6a1a3bea4db295e7"
|
"gitHead": "1c634a702af9298d25542acc270d68f71d9b1049"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,5 +24,5 @@
|
|||||||
"prettier": "^2.8.8",
|
"prettier": "^2.8.8",
|
||||||
"tslib": "^2.8.1"
|
"tslib": "^2.8.1"
|
||||||
},
|
},
|
||||||
"gitHead": "de0ae14544f1c3da4923dddc6a1a3bea4db295e7"
|
"gitHead": "1c634a702af9298d25542acc270d68f71d9b1049"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,5 +31,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "de0ae14544f1c3da4923dddc6a1a3bea4db295e7"
|
"gitHead": "1c634a702af9298d25542acc270d68f71d9b1049"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,5 +56,5 @@
|
|||||||
"fetch"
|
"fetch"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"gitHead": "de0ae14544f1c3da4923dddc6a1a3bea4db295e7"
|
"gitHead": "1c634a702af9298d25542acc270d68f71d9b1049"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,5 +33,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "de0ae14544f1c3da4923dddc6a1a3bea4db295e7"
|
"gitHead": "1c634a702af9298d25542acc270d68f71d9b1049"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,5 +64,5 @@
|
|||||||
"typeorm": "^0.3.11",
|
"typeorm": "^0.3.11",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "de0ae14544f1c3da4923dddc6a1a3bea4db295e7"
|
"gitHead": "1c634a702af9298d25542acc270d68f71d9b1049"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,10 +76,12 @@ export abstract class BaseService<T> {
|
|||||||
* @param where
|
* @param where
|
||||||
*/
|
*/
|
||||||
async delete(ids: string | any[], where?: any) {
|
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) {
|
if (idArr.length === 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
await this.getRepository().delete({
|
await this.getRepository().delete({
|
||||||
id: In(idArr),
|
id: In(idArr),
|
||||||
...where,
|
...where,
|
||||||
@@ -94,7 +96,9 @@ export abstract class BaseService<T> {
|
|||||||
}
|
}
|
||||||
if (typeof ids === 'string') {
|
if (typeof ids === 'string') {
|
||||||
return ids.split(',');
|
return ids.split(',');
|
||||||
} else {
|
} else if(!Array.isArray(ids)){
|
||||||
|
return [ids];
|
||||||
|
}else {
|
||||||
return ids;
|
return ids;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -217,6 +221,7 @@ export abstract class BaseService<T> {
|
|||||||
if (!Array.isArray(ids)) {
|
if (!Array.isArray(ids)) {
|
||||||
ids = [ids];
|
ids = [ids];
|
||||||
}
|
}
|
||||||
|
ids = this.filterIds(ids);
|
||||||
const res = await this.getRepository().find({
|
const res = await this.getRepository().find({
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
@@ -234,7 +239,16 @@ export abstract class BaseService<T> {
|
|||||||
throw new PermissionException('权限不足');
|
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) {
|
async batchDelete(ids: number[], userId: number,projectId?:number) {
|
||||||
|
ids = this.filterIds(ids);
|
||||||
if(userId!=null){
|
if(userId!=null){
|
||||||
const list = await this.getRepository().find({
|
const list = await this.getRepository().find({
|
||||||
where: {
|
where: {
|
||||||
|
|||||||
@@ -46,5 +46,5 @@
|
|||||||
"typeorm": "^0.3.11",
|
"typeorm": "^0.3.11",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "de0ae14544f1c3da4923dddc6a1a3bea4db295e7"
|
"gitHead": "1c634a702af9298d25542acc270d68f71d9b1049"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,5 +38,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "de0ae14544f1c3da4923dddc6a1a3bea4db295e7"
|
"gitHead": "1c634a702af9298d25542acc270d68f71d9b1049"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,5 +57,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "de0ae14544f1c3da4923dddc6a1a3bea4db295e7"
|
"gitHead": "1c634a702af9298d25542acc270d68f71d9b1049"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,9 @@ import { ILogger } from "@certd/basic";
|
|||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
import { uniq } from "lodash-es";
|
import { uniq } from "lodash-es";
|
||||||
|
|
||||||
|
export interface ICertInfoGetter {
|
||||||
|
getByPipelineId: (pipelineId: number) => Promise<CertInfo>;
|
||||||
|
}
|
||||||
export type CertInfo = {
|
export type CertInfo = {
|
||||||
crt: string; //fullchain证书
|
crt: string; //fullchain证书
|
||||||
key: string; //私钥
|
key: string; //私钥
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
export const CertApplyPluginNames = [":cert:"];
|
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 "./convert.js";
|
||||||
export * from "./cert-reader.js";
|
export * from "./cert-reader.js";
|
||||||
export * from "./consts.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;
|
component?: any;
|
||||||
value?: any;
|
value?: any;
|
||||||
pageSize?: number;
|
pageSize?: number;
|
||||||
|
uploadCert?: {
|
||||||
|
title?: string;
|
||||||
|
columns?: Record<string, any>;
|
||||||
|
};
|
||||||
}) {
|
}) {
|
||||||
const title = opts?.title || "请选择";
|
const title = opts?.title || "请选择";
|
||||||
const certDomainsInputKey = opts?.certDomainsInputKey || "certDomains";
|
const certDomainsInputKey = opts?.certDomainsInputKey || "certDomains";
|
||||||
@@ -74,6 +78,7 @@ export function createRemoteSelectInputDefine(opts?: {
|
|||||||
multi,
|
multi,
|
||||||
pageSize: opts?.pageSize,
|
pageSize: opts?.pageSize,
|
||||||
watches: [certDomainsInputKey, accessIdInputKey, ...watches],
|
watches: [certDomainsInputKey, accessIdInputKey, ...watches],
|
||||||
|
uploadCert: opts?.uploadCert,
|
||||||
...opts.component,
|
...opts.component,
|
||||||
},
|
},
|
||||||
value: opts.value,
|
value: opts.value,
|
||||||
|
|||||||
@@ -25,8 +25,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</a-select>
|
</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>
|
<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>
|
</div>
|
||||||
<div class="helper" :class="{ error: hasError }">
|
<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 { defineComponent, inject, ref, useAttrs, watch, Ref } from "vue";
|
||||||
import { PluginDefine } from "@certd/pipeline";
|
import { PluginDefine } from "@certd/pipeline";
|
||||||
import { getInputFromForm } from "./utils";
|
import { getInputFromForm } from "./utils";
|
||||||
|
import UploadCert from "./upload-cert.vue";
|
||||||
|
import { UploadCertProps } from "./types";
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: "RemoteSelect",
|
name: "RemoteSelect",
|
||||||
@@ -65,9 +68,10 @@ const props = defineProps<
|
|||||||
pager?: boolean;
|
pager?: boolean;
|
||||||
multi?: boolean;
|
multi?: boolean;
|
||||||
pageSize?: number;
|
pageSize?: number;
|
||||||
|
uploadCert?: UploadCertProps;
|
||||||
} & ComponentPropsType
|
} & ComponentPropsType
|
||||||
>();
|
>();
|
||||||
|
debugger;
|
||||||
const emit = defineEmits<{
|
const emit = defineEmits<{
|
||||||
"update:value": any;
|
"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="step-item overflow-hidden">
|
||||||
<div class="text">
|
<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 class="description mt-5">
|
||||||
<div v-for="(desc, index) of currentStepItem.descriptions" :key="index">{{ desc }}</div>
|
<div v-for="(desc, index) of currentStepItem.descriptions" :key="index">{{ desc }}</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -247,6 +247,7 @@ function previewMask() {
|
|||||||
|
|
||||||
<style lang="less">
|
<style lang="less">
|
||||||
.tutorial-steps {
|
.tutorial-steps {
|
||||||
|
display: flex;
|
||||||
.step-item {
|
.step-item {
|
||||||
display: flex !important;
|
display: flex !important;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
|
|||||||
@@ -251,7 +251,7 @@ function openUpgrade() {
|
|||||||
class: "vip-modal",
|
class: "vip-modal",
|
||||||
maskClosable: true,
|
maskClosable: true,
|
||||||
okText: t("vip.close"),
|
okText: t("vip.close"),
|
||||||
width: 1100,
|
width: 1180,
|
||||||
content: () => {
|
content: () => {
|
||||||
return <VipModalContent placeholder={placeholder} isPlus={isPlus} productInfo={productInfo} goBuyPlusPage={goBuyPlusPage} goBuyCommPage={goBuyCommPage} openStarModal={openStarModal} modalRef={modalRef} />;
|
return <VipModalContent placeholder={placeholder} isPlus={isPlus} productInfo={productInfo} goBuyPlusPage={goBuyPlusPage} goBuyCommPage={goBuyCommPage} openStarModal={openStarModal} modalRef={modalRef} />;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -65,6 +65,11 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="get-show">
|
<div class="get-show">
|
||||||
<template v-if="item.type === 'plus'">
|
<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-tooltip :title="t('vip.afdian_support_vip')">
|
||||||
<a-button size="small" type="primary" @click="goBuyPlusPage">
|
<a-button size="small" type="primary" @click="goBuyPlusPage">
|
||||||
{{ t("vip.get_after_support") }}
|
{{ t("vip.get_after_support") }}
|
||||||
@@ -204,13 +209,13 @@ const vipTypeDefine: any = {
|
|||||||
desc: t("vip.community_free_version"),
|
desc: t("vip.community_free_version"),
|
||||||
type: "free",
|
type: "free",
|
||||||
icon: "lucide:package-open",
|
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: {
|
plus: {
|
||||||
title: t("vip.professional_edition"),
|
title: t("vip.professional_edition"),
|
||||||
desc: t("vip.open_source_support"),
|
desc: t("vip.open_source_support"),
|
||||||
type: "plus",
|
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: {
|
trial: {
|
||||||
title: t("vip.click_to_get_7_day_trial"),
|
title: t("vip.click_to_get_7_day_trial"),
|
||||||
click: () => {
|
click: () => {
|
||||||
@@ -227,7 +232,7 @@ const vipTypeDefine: any = {
|
|||||||
desc: t("vip.commercial_license"),
|
desc: t("vip.commercial_license"),
|
||||||
type: "comm",
|
type: "comm",
|
||||||
icon: "vaadin:handshake",
|
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")}`,
|
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")}`,
|
discountText: props.productInfo.comm.discountText || `¥${props.productInfo.comm.price3}/3${t("vip.years")}`,
|
||||||
tooltip: props.productInfo.comm.tooltip,
|
tooltip: props.productInfo.comm.tooltip,
|
||||||
@@ -260,12 +265,16 @@ const todayOrderCount = computed(() => {
|
|||||||
const lastStage = countInfo?.stages?.[countInfo?.stages?.length - 1] || {};
|
const lastStage = countInfo?.stages?.[countInfo?.stages?.length - 1] || {};
|
||||||
lastStage.orderCount = orderCount;
|
lastStage.orderCount = orderCount;
|
||||||
|
|
||||||
|
const vipTotal = countInfo?.vipTotal || 0;
|
||||||
|
const showVipTotal = countInfo?.showVipTotal || false;
|
||||||
|
const userTotal = countInfo?.userTotal || 0;
|
||||||
const stages: any = [];
|
const stages: any = [];
|
||||||
stages.push({
|
stages.push({
|
||||||
title: countInfo.title,
|
title: countInfo.title,
|
||||||
vipTotal: countInfo?.vipTotal || 0,
|
vipTotal: countInfo?.vipTotal || 0,
|
||||||
orderCount: orderCount,
|
orderCount: orderCount,
|
||||||
bg: lastStage.bg,
|
bg: lastStage.bg,
|
||||||
|
showVipTotal: showVipTotal,
|
||||||
});
|
});
|
||||||
if (lastStage.orderCount > 0) {
|
if (lastStage.orderCount > 0) {
|
||||||
stages.push(lastStage);
|
stages.push(lastStage);
|
||||||
@@ -273,6 +282,9 @@ const todayOrderCount = computed(() => {
|
|||||||
return {
|
return {
|
||||||
enabled: enabled,
|
enabled: enabled,
|
||||||
stages: stages,
|
stages: stages,
|
||||||
|
showVipTotal: showVipTotal,
|
||||||
|
vipTotal: vipTotal,
|
||||||
|
userTotal: userTotal,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ export default {
|
|||||||
unlimited_certificate_pipelines: "Unlimited certificate pipelines",
|
unlimited_certificate_pipelines: "Unlimited certificate pipelines",
|
||||||
common_deployment_plugins: "Common host, cloud platform, CDN, Baota, 1Panel deployment plugins",
|
common_deployment_plugins: "Common host, cloud platform, CDN, Baota, 1Panel deployment plugins",
|
||||||
email_webhook_notifications: "Email, webhook notification methods",
|
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",
|
professional_edition: "Professional Edition",
|
||||||
open_source_support: "Open source requires your sponsorship support",
|
open_source_support: "Open source requires your sponsorship support",
|
||||||
@@ -60,10 +61,11 @@ export default {
|
|||||||
unlimited_site_certificate_monitoring: "Unlimited site certificate monitoring",
|
unlimited_site_certificate_monitoring: "Unlimited site certificate monitoring",
|
||||||
more_notification_methods: "More notification methods",
|
more_notification_methods: "More notification methods",
|
||||||
plugins_fully_open: "All plugins open, including Synology and more",
|
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",
|
click_to_get_7_day_trial: "Click to get 7-day trial",
|
||||||
years: "years",
|
years: "years",
|
||||||
afdian_support_vip: "Obtain the permanent professional version coupon",
|
afdian_support_vip: "Obtain the permanent professional version coupon",
|
||||||
get_after_support: "Get after sponsoring",
|
get_after_support: "sponsoring",
|
||||||
|
|
||||||
business_edition: "Business Edition",
|
business_edition: "Business Edition",
|
||||||
commercial_license: "Commercial license, allowed for external operation",
|
commercial_license: "Commercial license, allowed for external operation",
|
||||||
@@ -73,6 +75,7 @@ export default {
|
|||||||
plugin_management: "Plugin management",
|
plugin_management: "Plugin management",
|
||||||
unlimited_multi_users: "Unlimited multi-users",
|
unlimited_multi_users: "Unlimited multi-users",
|
||||||
support_user_payment: "Supports user payments",
|
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",
|
contact_author_for_trial: "Buy It Now",
|
||||||
activate: "Activate",
|
activate: "Activate",
|
||||||
get_pro_code_after_support: "Go to sponsoring",
|
get_pro_code_after_support: "Go to sponsoring",
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ export default {
|
|||||||
activateCertDesc2: "让证书生效",
|
activateCertDesc2: "让证书生效",
|
||||||
taskSuccessTitle: "部署任务添加成功",
|
taskSuccessTitle: "部署任务添加成功",
|
||||||
taskSuccessDesc: "现在可以运行",
|
taskSuccessDesc: "现在可以运行",
|
||||||
pluginsTitle: "本系统提供茫茫多的部署插件",
|
pluginsTitle: "本系统提供海量的部署插件",
|
||||||
pluginsDesc: "您可以根据自身需求将证书部署到各种应用和平台",
|
pluginsDesc: "您可以根据自身需求将证书部署到各种应用和平台",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ export default {
|
|||||||
unlimited_certificate_pipelines: "证书流水线数量无限制",
|
unlimited_certificate_pipelines: "证书流水线数量无限制",
|
||||||
common_deployment_plugins: "常用的主机、云平台、cdn、宝塔、1Panel等部署插件",
|
common_deployment_plugins: "常用的主机、云平台、cdn、宝塔、1Panel等部署插件",
|
||||||
email_webhook_notifications: "邮件、webhook通知方式",
|
email_webhook_notifications: "邮件、webhook通知方式",
|
||||||
|
free_privilege: "证书申请无限制\n域名数量无限制\n证书流水线数量无限制\n常用的主机、云平台、cdn、宝塔、1Panel等部署插件\n邮件、webhook通知方式",
|
||||||
|
|
||||||
professional_edition: "专业版",
|
professional_edition: "专业版",
|
||||||
open_source_support: "开源需要您的赞助支持,个人和企业内部使用",
|
open_source_support: "开源需要您的赞助支持,个人和企业内部使用",
|
||||||
@@ -60,6 +61,7 @@ export default {
|
|||||||
unlimited_site_certificate_monitoring: "站点证书监控无限制",
|
unlimited_site_certificate_monitoring: "站点证书监控无限制",
|
||||||
more_notification_methods: "更多通知方式",
|
more_notification_methods: "更多通知方式",
|
||||||
plugins_fully_open: "插件全开放,群晖等更多插件",
|
plugins_fully_open: "插件全开放,群晖等更多插件",
|
||||||
|
plus_privilege: "可加VIP群,您的需求将优先实现\n站点证书监控无限制\n更多通知方式\n插件全开放,群晖等更多插件\n企业模式,项目管理\n域名到期监控\n第三方登录,PassKey登录",
|
||||||
click_to_get_7_day_trial: "点击获取7天试用",
|
click_to_get_7_day_trial: "点击获取7天试用",
|
||||||
years: "年",
|
years: "年",
|
||||||
afdian_support_vip: "新用户开通永久专业版立享50优惠券",
|
afdian_support_vip: "新用户开通永久专业版立享50优惠券",
|
||||||
@@ -73,6 +75,7 @@ export default {
|
|||||||
plugin_management: "插件管理",
|
plugin_management: "插件管理",
|
||||||
unlimited_multi_users: "多用户无限制",
|
unlimited_multi_users: "多用户无限制",
|
||||||
support_user_payment: "支持用户支付(购买套餐,按流水线条数、域名数量、部署次数计费)",
|
support_user_payment: "支持用户支付(购买套餐,按流水线条数、域名数量、部署次数计费)",
|
||||||
|
comm_privilege: "拥有专业版所有特权\n允许商用,可修改logo、标题\n数据统计\n插件管理\n多用户无限制\n支持用户支付(购买套餐,按流水线条数、域名数量、部署次数计费)",
|
||||||
activate: "激活",
|
activate: "激活",
|
||||||
get_pro_code_after_support: "前往获取",
|
get_pro_code_after_support: "前往获取",
|
||||||
business_contact_author: "",
|
business_contact_author: "",
|
||||||
|
|||||||
+13
-10
@@ -134,18 +134,21 @@ async function emitValue(value: any) {
|
|||||||
const userId = userStore.userInfo.id;
|
const userId = userStore.userInfo.id;
|
||||||
const isEnterprice = projectStore.isEnterprise;
|
const isEnterprice = projectStore.isEnterprise;
|
||||||
|
|
||||||
if (isEnterprice) {
|
if (pipeline?.value) {
|
||||||
const projectId = projectStore.currentProjectId;
|
if (isEnterprice) {
|
||||||
if (pipeline?.value?.projectId !== projectId) {
|
const projectId = projectStore.currentProjectId;
|
||||||
message.error("对不起,您不能修改其他项目流水线的通知");
|
if (pipeline?.value?.projectId !== projectId) {
|
||||||
return;
|
message.error("对不起,您不能修改其他项目流水线的通知");
|
||||||
}
|
return;
|
||||||
} else {
|
}
|
||||||
if (pipeline?.value?.userId !== userId) {
|
} else {
|
||||||
message.error("对不起,您不能修改他人流水线的通知");
|
if (pipeline?.value?.userId !== userId) {
|
||||||
return;
|
message.error("对不起,您不能修改他人流水线的通知");
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
emit("change", value);
|
emit("change", value);
|
||||||
emit("update:modelValue", value);
|
emit("update:modelValue", value);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -118,6 +118,10 @@ export function useTransfer() {
|
|||||||
<div class="text-2xl font-bold"> 迁移到→ </div>
|
<div class="text-2xl font-bold"> 迁移到→ </div>
|
||||||
<div>项目:"{projectStore.currentProject?.name}"</div>
|
<div>项目:"{projectStore.currentProject?.name}"</div>
|
||||||
</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">
|
<div class="flex flex-row items-center justify-center w-full">
|
||||||
<a-button type="primary" onClick={doTransfer}>
|
<a-button type="primary" onClick={doTransfer}>
|
||||||
确认迁移
|
确认迁移
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import yaml from "js-yaml";
|
|||||||
import { usePluginImport } from "./use-import";
|
import { usePluginImport } from "./use-import";
|
||||||
import { usePluginConfig } from "./use-config";
|
import { usePluginConfig } from "./use-config";
|
||||||
import { useSettingStore } from "/src/store/settings/index";
|
import { useSettingStore } from "/src/store/settings/index";
|
||||||
|
import { usePluginStore } from "/@/store/plugin";
|
||||||
|
|
||||||
export default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {
|
export default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
@@ -43,6 +44,7 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
|
|||||||
const { openConfigDialog } = usePluginConfig();
|
const { openConfigDialog } = usePluginConfig();
|
||||||
|
|
||||||
const settingStore = useSettingStore();
|
const settingStore = useSettingStore();
|
||||||
|
const pluginStore = usePluginStore();
|
||||||
return {
|
return {
|
||||||
crudOptions: {
|
crudOptions: {
|
||||||
settings: {
|
settings: {
|
||||||
@@ -83,6 +85,15 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
table: {
|
||||||
|
rowKey: "name",
|
||||||
|
remove: {
|
||||||
|
afterRemove: async context => {
|
||||||
|
await pluginStore.reload();
|
||||||
|
},
|
||||||
|
confirmMessage: "确定要删除吗?如果该插件已被使用,删除可能会导致流水线执行失败!",
|
||||||
|
},
|
||||||
|
},
|
||||||
rowHandle: {
|
rowHandle: {
|
||||||
show: true,
|
show: true,
|
||||||
minWidth: 200,
|
minWidth: 200,
|
||||||
@@ -142,9 +153,6 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
table: {
|
|
||||||
rowKey: "name",
|
|
||||||
},
|
|
||||||
tabs: {
|
tabs: {
|
||||||
name: "type",
|
name: "type",
|
||||||
show: true,
|
show: true,
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ import { SysSettings } from "/@/views/sys/settings/api";
|
|||||||
import * as api from "/@/views/sys/settings/api";
|
import * as api from "/@/views/sys/settings/api";
|
||||||
import { merge } from "lodash-es";
|
import { merge } from "lodash-es";
|
||||||
import { useSettingStore } from "/@/store/settings";
|
import { useSettingStore } from "/@/store/settings";
|
||||||
import { notification } from "ant-design-vue";
|
import { Modal, notification } from "ant-design-vue";
|
||||||
import { useI18n } from "/src/locales";
|
import { useI18n } from "/src/locales";
|
||||||
import { dict } from "@fast-crud/fast-crud";
|
import { dict } from "@fast-crud/fast-crud";
|
||||||
import { useProjectStore } from "/@/store/project";
|
import { useProjectStore } from "/@/store/project";
|
||||||
@@ -80,6 +80,24 @@ const onFinish = async (form: any) => {
|
|||||||
notification.success({
|
notification.success({
|
||||||
message: t("certd.saveSuccess"),
|
message: t("certd.saveSuccess"),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (formState.public.adminMode === "enterprise") {
|
||||||
|
Modal.confirm({
|
||||||
|
title: "数据迁移",
|
||||||
|
okText: "去迁移",
|
||||||
|
content: () => {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<div>设置为企业模式之后,之前创建的个人数据不会显示</div>
|
||||||
|
<div>是否前往迁移数据到项目? </div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
onOk: () => {
|
||||||
|
goCurrentProject();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
saveLoading.value = false;
|
saveLoading.value = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,7 +58,8 @@ export class PluginController extends CrudController<PluginService> {
|
|||||||
|
|
||||||
@Post('/delete', { description: 'sys:settings:edit' })
|
@Post('/delete', { description: 'sys:settings:edit' })
|
||||||
async delete(@Query('id') id: number) {
|
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' })
|
@Post('/deleteByIds', { description: 'sys:settings:edit' })
|
||||||
|
|||||||
@@ -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 { DomainVerifierGetter } from "./domain-verifier-getter.js";
|
||||||
import { DomainService } from "../../../cert/service/domain-service.js";
|
import { DomainService } from "../../../cert/service/domain-service.js";
|
||||||
import { SubDomainService } from "../sub-domain-service.js";
|
import { SubDomainService } from "../sub-domain-service.js";
|
||||||
|
import { CertInfoGetter } from "./cert-info-getter.js";
|
||||||
|
import { CertInfoService } from "../../../monitor/index.js";
|
||||||
|
import { ICertInfoGetter } from "@certd/plugin-lib";
|
||||||
|
|
||||||
const serviceNames = [
|
const serviceNames = [
|
||||||
'ocrService',
|
'ocrService',
|
||||||
@@ -34,6 +37,8 @@ export class TaskServiceGetter implements IServiceGetter{
|
|||||||
return await this.getNotificationService() as T
|
return await this.getNotificationService() as T
|
||||||
} else if (serviceName === 'domainVerifierGetter') {
|
} else if (serviceName === 'domainVerifierGetter') {
|
||||||
return await this.getDomainVerifierGetter() as T
|
return await this.getDomainVerifierGetter() as T
|
||||||
|
} else if (serviceName === 'certInfoGetter') {
|
||||||
|
return await this.getCertInfoGetter() as T
|
||||||
}else{
|
}else{
|
||||||
if(!serviceNames.includes(serviceName)){
|
if(!serviceNames.includes(serviceName)){
|
||||||
throw new Error(`${serviceName} not in whitelist`)
|
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)
|
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> {
|
async getAccessService(): Promise<AccessGetter> {
|
||||||
const accessService:AccessService = await this.appCtx.getAsync("accessService")
|
const accessService:AccessService = await this.appCtx.getAsync("accessService")
|
||||||
return new AccessGetter(this.userId, this.projectId, accessService.getById.bind(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
|
id: pluginEntity.id
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async deleteByIds(ids: any[]) {
|
async deleteByIds(ids: any[]) {
|
||||||
|
ids = this.filterIds(ids);
|
||||||
for (const id of ids) {
|
for (const id of ids) {
|
||||||
await this.unRegisterById(id)
|
await this.unRegisterById(id);
|
||||||
await this.delete(id);
|
await this.delete(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+33
-1
@@ -2,7 +2,7 @@ import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput
|
|||||||
|
|
||||||
import { CertApplyPluginNames, CertInfo } from "@certd/plugin-cert";
|
import { CertApplyPluginNames, CertInfo } from "@certd/plugin-cert";
|
||||||
import { OnePanelAccess } from "../access.js";
|
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";
|
import { OnePanelClient } from "../client.js";
|
||||||
|
|
||||||
@IsTaskPlugin({
|
@IsTaskPlugin({
|
||||||
@@ -66,6 +66,7 @@ export class OnePanelDeployToWebsitePlugin extends AbstractTaskPlugin {
|
|||||||
watches: ["accessId"],
|
watches: ["accessId"],
|
||||||
helper: "要更新的1Panel证书id,选择授权之后,从下拉框中选择\nIP需要加白名单,如果是同一台机器部署的,可以试试172.16.0.0/12",
|
helper: "要更新的1Panel证书id,选择授权之后,从下拉框中选择\nIP需要加白名单,如果是同一台机器部署的,可以试试172.16.0.0/12",
|
||||||
required: true,
|
required: true,
|
||||||
|
uploadCert: {}
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
sslIds!: string[];
|
sslIds!: string[];
|
||||||
@@ -213,5 +214,36 @@ export class OnePanelDeployToWebsitePlugin extends AbstractTaskPlugin {
|
|||||||
});
|
});
|
||||||
return this.ctx.utils.options.buildGroupOptions(list, this.certDomains);
|
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();
|
new OnePanelDeployToWebsitePlugin();
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ export class SpaceshipAccess extends BaseAccess {
|
|||||||
name: "api-test",
|
name: "api-test",
|
||||||
action: "TestRequest"
|
action: "TestRequest"
|
||||||
},
|
},
|
||||||
helper: "测试 API 连接是否正常"
|
helper: "测试 API 连接是否正常,需要域名查询权限"
|
||||||
})
|
})
|
||||||
testRequest = true;
|
testRequest = true;
|
||||||
|
|
||||||
@@ -48,7 +48,7 @@ export class SpaceshipAccess extends BaseAccess {
|
|||||||
|
|
||||||
async doRequest(options: {
|
async doRequest(options: {
|
||||||
url: string;
|
url: string;
|
||||||
method: 'GET' | 'POST' | 'DELETE';
|
method: 'GET' | 'POST' | 'DELETE' | 'PUT';
|
||||||
params?: any;
|
params?: any;
|
||||||
data?: any;
|
data?: any;
|
||||||
}) {
|
}) {
|
||||||
|
|||||||
@@ -3,11 +3,7 @@ import { SpaceshipAccess } from "./access.js";
|
|||||||
import { PageRes, PageSearch } from "@certd/pipeline";
|
import { PageRes, PageSearch } from "@certd/pipeline";
|
||||||
|
|
||||||
export type SpaceshipRecord = {
|
export type SpaceshipRecord = {
|
||||||
id: string;
|
|
||||||
name: string;
|
name: string;
|
||||||
type: string;
|
|
||||||
content: string;
|
|
||||||
domainId: string;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@IsDnsProvider({
|
@IsDnsProvider({
|
||||||
@@ -32,8 +28,9 @@ export class SpaceshipProvider extends AbstractDnsProvider<SpaceshipRecord> {
|
|||||||
await this.access.getDomainInfo(domain);
|
await this.access.getDomainInfo(domain);
|
||||||
|
|
||||||
const recordRes = await this.access.doRequest({
|
const recordRes = await this.access.doRequest({
|
||||||
url: `https://spaceship.dev/api/v1/domains/${domain}/records`,
|
// https://spaceship.dev/api/v1/dns/records/{domain}
|
||||||
method: "POST",
|
url: `https://spaceship.dev/api/v1/dns/records/${domain}`,
|
||||||
|
method: "PUT",
|
||||||
data: {
|
data: {
|
||||||
force: false,
|
force: false,
|
||||||
items: [
|
items: [
|
||||||
@@ -41,40 +38,33 @@ export class SpaceshipProvider extends AbstractDnsProvider<SpaceshipRecord> {
|
|||||||
type: type,
|
type: type,
|
||||||
value: value,
|
value: value,
|
||||||
name: hostRecord,
|
name: hostRecord,
|
||||||
ttl: 300
|
ttl: 60
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return {
|
return recordRes;
|
||||||
id: recordRes.items[0].id,
|
|
||||||
name: hostRecord,
|
|
||||||
type: type,
|
|
||||||
content: value,
|
|
||||||
domainId: domain
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async removeRecord(options: RemoveRecordOptions<SpaceshipRecord>): Promise<void> {
|
async removeRecord(options: RemoveRecordOptions<SpaceshipRecord>): Promise<void> {
|
||||||
const recordRes = options.recordRes;
|
const recordReq = options.recordReq;
|
||||||
this.logger.info("删除域名解析:", recordRes);
|
this.logger.info("删除域名解析:", recordReq);
|
||||||
|
|
||||||
await this.access.doRequest({
|
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",
|
method: "DELETE",
|
||||||
data: {
|
data: [
|
||||||
Records: [
|
{
|
||||||
{
|
type: recordReq.type,
|
||||||
type: recordRes.type,
|
value: recordReq.value,
|
||||||
value: recordRes.content,
|
name: recordReq.hostRecord
|
||||||
name: recordRes.name
|
}
|
||||||
}
|
]
|
||||||
]
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
this.logger.info("删除域名解析成功:", recordRes.name);
|
this.logger.info("删除域名解析成功:", JSON.stringify(recordReq));
|
||||||
}
|
}
|
||||||
|
|
||||||
async getDomainListPage(req: PageSearch): Promise<PageRes<DomainRecord>> {
|
async getDomainListPage(req: PageSearch): Promise<PageRes<DomainRecord>> {
|
||||||
|
|||||||
Generated
+111
-50
@@ -49,7 +49,7 @@ importers:
|
|||||||
packages/core/acme-client:
|
packages/core/acme-client:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@certd/basic':
|
'@certd/basic':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../basic
|
version: link:../basic
|
||||||
'@peculiar/x509':
|
'@peculiar/x509':
|
||||||
specifier: ^1.11.0
|
specifier: ^1.11.0
|
||||||
@@ -213,11 +213,11 @@ importers:
|
|||||||
packages/core/pipeline:
|
packages/core/pipeline:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@certd/basic':
|
'@certd/basic':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../basic
|
version: link:../basic
|
||||||
'@certd/plus-core':
|
'@certd/plus-core':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../pro/plus-core
|
version: 1.39.9
|
||||||
dayjs:
|
dayjs:
|
||||||
specifier: ^1.11.7
|
specifier: ^1.11.7
|
||||||
version: 1.11.13
|
version: 1.11.13
|
||||||
@@ -412,7 +412,7 @@ importers:
|
|||||||
packages/libs/lib-k8s:
|
packages/libs/lib-k8s:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@certd/basic':
|
'@certd/basic':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../core/basic
|
version: link:../../core/basic
|
||||||
'@kubernetes/client-node':
|
'@kubernetes/client-node':
|
||||||
specifier: 0.21.0
|
specifier: 0.21.0
|
||||||
@@ -452,20 +452,20 @@ importers:
|
|||||||
packages/libs/lib-server:
|
packages/libs/lib-server:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@certd/acme-client':
|
'@certd/acme-client':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../core/acme-client
|
version: link:../../core/acme-client
|
||||||
'@certd/basic':
|
'@certd/basic':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../core/basic
|
version: link:../../core/basic
|
||||||
'@certd/pipeline':
|
'@certd/pipeline':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../core/pipeline
|
version: link:../../core/pipeline
|
||||||
'@certd/plugin-lib':
|
'@certd/plugin-lib':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../plugins/plugin-lib
|
version: link:../../plugins/plugin-lib
|
||||||
'@certd/plus-core':
|
'@certd/plus-core':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../pro/plus-core
|
version: 1.39.9
|
||||||
'@midwayjs/cache':
|
'@midwayjs/cache':
|
||||||
specifier: 3.14.0
|
specifier: 3.14.0
|
||||||
version: 3.14.0
|
version: 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.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../core/acme-client
|
version: link:../../core/acme-client
|
||||||
'@certd/basic':
|
'@certd/basic':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../core/basic
|
version: link:../../core/basic
|
||||||
'@certd/pipeline':
|
'@certd/pipeline':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../core/pipeline
|
version: link:../../core/pipeline
|
||||||
'@certd/plugin-lib':
|
'@certd/plugin-lib':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../plugin-lib
|
version: link:../plugin-lib
|
||||||
psl:
|
psl:
|
||||||
specifier: ^1.9.0
|
specifier: ^1.9.0
|
||||||
@@ -683,17 +683,17 @@ 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.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../core/acme-client
|
version: link:../../core/acme-client
|
||||||
'@certd/basic':
|
'@certd/basic':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../core/basic
|
version: link:../../core/basic
|
||||||
'@certd/pipeline':
|
'@certd/pipeline':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../core/pipeline
|
version: link:../../core/pipeline
|
||||||
'@certd/plus-core':
|
'@certd/plus-core':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../pro/plus-core
|
version: 1.39.9
|
||||||
'@kubernetes/client-node':
|
'@kubernetes/client-node':
|
||||||
specifier: 0.21.0
|
specifier: 0.21.0
|
||||||
version: 0.21.0
|
version: 0.21.0
|
||||||
@@ -783,16 +783,16 @@ importers:
|
|||||||
packages/pro/commercial-core:
|
packages/pro/commercial-core:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@certd/basic':
|
'@certd/basic':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.7
|
||||||
version: link:../../core/basic
|
version: link:../../core/basic
|
||||||
'@certd/lib-server':
|
'@certd/lib-server':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.7
|
||||||
version: link:../../libs/lib-server
|
version: link:../../libs/lib-server
|
||||||
'@certd/pipeline':
|
'@certd/pipeline':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.7
|
||||||
version: link:../../core/pipeline
|
version: link:../../core/pipeline
|
||||||
'@certd/plus-core':
|
'@certd/plus-core':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.7
|
||||||
version: link:../plus-core
|
version: link:../plus-core
|
||||||
'@midwayjs/core':
|
'@midwayjs/core':
|
||||||
specifier: 3.20.11
|
specifier: 3.20.11
|
||||||
@@ -868,16 +868,16 @@ importers:
|
|||||||
packages/pro/plugin-plus:
|
packages/pro/plugin-plus:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@certd/basic':
|
'@certd/basic':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.7
|
||||||
version: link:../../core/basic
|
version: link:../../core/basic
|
||||||
'@certd/pipeline':
|
'@certd/pipeline':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.7
|
||||||
version: link:../../core/pipeline
|
version: link:../../core/pipeline
|
||||||
'@certd/plugin-lib':
|
'@certd/plugin-lib':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.7
|
||||||
version: link:../../plugins/plugin-lib
|
version: link:../../plugins/plugin-lib
|
||||||
'@certd/plus-core':
|
'@certd/plus-core':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.7
|
||||||
version: link:../plus-core
|
version: link:../plus-core
|
||||||
crypto-js:
|
crypto-js:
|
||||||
specifier: ^4.2.0
|
specifier: ^4.2.0
|
||||||
@@ -953,7 +953,7 @@ importers:
|
|||||||
packages/pro/plus-core:
|
packages/pro/plus-core:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@certd/basic':
|
'@certd/basic':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.7
|
||||||
version: link:../../core/basic
|
version: link:../../core/basic
|
||||||
dayjs:
|
dayjs:
|
||||||
specifier: ^1.11.7
|
specifier: ^1.11.7
|
||||||
@@ -1249,10 +1249,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.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../libs/lib-iframe
|
version: link:../../libs/lib-iframe
|
||||||
'@certd/pipeline':
|
'@certd/pipeline':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../core/pipeline
|
version: link:../../core/pipeline
|
||||||
'@rollup/plugin-commonjs':
|
'@rollup/plugin-commonjs':
|
||||||
specifier: ^25.0.7
|
specifier: ^25.0.7
|
||||||
@@ -1447,47 +1447,47 @@ importers:
|
|||||||
specifier: ^3.990.0
|
specifier: ^3.990.0
|
||||||
version: 3.990.0(aws-crt@1.26.2)
|
version: 3.990.0(aws-crt@1.26.2)
|
||||||
'@certd/acme-client':
|
'@certd/acme-client':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../core/acme-client
|
version: link:../../core/acme-client
|
||||||
'@certd/basic':
|
'@certd/basic':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../core/basic
|
version: link:../../core/basic
|
||||||
'@certd/commercial-core':
|
'@certd/commercial-core':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../pro/commercial-core
|
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':
|
'@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.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../libs/lib-jdcloud
|
version: link:../../libs/lib-jdcloud
|
||||||
'@certd/lib-huawei':
|
'@certd/lib-huawei':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../libs/lib-huawei
|
version: link:../../libs/lib-huawei
|
||||||
'@certd/lib-k8s':
|
'@certd/lib-k8s':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../libs/lib-k8s
|
version: link:../../libs/lib-k8s
|
||||||
'@certd/lib-server':
|
'@certd/lib-server':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../libs/lib-server
|
version: link:../../libs/lib-server
|
||||||
'@certd/midway-flyway-js':
|
'@certd/midway-flyway-js':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../libs/midway-flyway-js
|
version: link:../../libs/midway-flyway-js
|
||||||
'@certd/pipeline':
|
'@certd/pipeline':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../core/pipeline
|
version: link:../../core/pipeline
|
||||||
'@certd/plugin-cert':
|
'@certd/plugin-cert':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../plugins/plugin-cert
|
version: link:../../plugins/plugin-cert
|
||||||
'@certd/plugin-lib':
|
'@certd/plugin-lib':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../plugins/plugin-lib
|
version: link:../../plugins/plugin-lib
|
||||||
'@certd/plugin-plus':
|
'@certd/plugin-plus':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../pro/plugin-plus
|
version: 1.39.9
|
||||||
'@certd/plus-core':
|
'@certd/plus-core':
|
||||||
specifier: ^1.39.8
|
specifier: ^1.39.9
|
||||||
version: link:../../pro/plus-core
|
version: 1.39.9
|
||||||
'@google-cloud/publicca':
|
'@google-cloud/publicca':
|
||||||
specifier: ^1.3.0
|
specifier: ^1.3.0
|
||||||
version: 1.3.0(encoding@0.1.13)
|
version: 1.3.0(encoding@0.1.13)
|
||||||
@@ -2838,9 +2838,18 @@ packages:
|
|||||||
'@better-scroll/zoom@2.5.1':
|
'@better-scroll/zoom@2.5.1':
|
||||||
resolution: {integrity: sha512-aGvFY5ooeZWS4RcxQLD+pGLpQHQxpPy0sMZV3yadcd2QK53PK9gS4Dp+BYfRv8lZ4/P2LoNEhr6Wq1DN6+uPlA==}
|
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':
|
'@certd/cv4pve-api-javascript@8.4.2':
|
||||||
resolution: {integrity: sha512-udGce7ewrVl4DmZvX+17PjsnqsdDIHEDatr8QP0AVrY2p+8JkaSPW4mXCKiLGf82C9K2+GXgT+qNIqgW7tfF9Q==}
|
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':
|
'@certd/vue-js-cron-core@6.0.3':
|
||||||
resolution: {integrity: sha512-kqzoAMhYz9j6FGNWEODRYtt4NpUEUwjpkU89z5WVg2tCtOcI5VhwyUGOd8AxiBCRfd6PtXvzuqw85PaOps9wrQ==}
|
resolution: {integrity: sha512-kqzoAMhYz9j6FGNWEODRYtt4NpUEUwjpkU89z5WVg2tCtOcI5VhwyUGOd8AxiBCRfd6PtXvzuqw85PaOps9wrQ==}
|
||||||
|
|
||||||
@@ -15146,12 +15155,64 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@better-scroll/core': 2.5.1
|
'@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':
|
'@certd/cv4pve-api-javascript@8.4.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
debug: 4.4.3(supports-color@8.1.1)
|
debug: 4.4.3(supports-color@8.1.1)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- 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':
|
'@certd/vue-js-cron-core@6.0.3':
|
||||||
dependencies:
|
dependencies:
|
||||||
mustache: 4.2.0
|
mustache: 4.2.0
|
||||||
@@ -20864,13 +20925,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:
|
||||||
@@ -23296,7 +23357,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 @@
|
|||||||
23:58
|
01:26
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
00:29
|
01:53
|
||||||
|
|||||||
Reference in New Issue
Block a user