Compare commits

...

24 Commits

Author SHA1 Message Date
xiaojunnuo
c31eef6b82 chore: buy 2025-11-09 00:12:31 +08:00
xiaojunnuo
0c99f41bd9 chore: bindurl 提示消除 2025-11-05 00:08:59 +08:00
xiaojunnuo
bcac810f71 Merge branch 'v2-dev' into v2-dev-buy 2025-11-04 23:04:11 +08:00
xiaojunnuo
feae105426 docs: 群晖delegated配置说明 2025-11-03 18:22:35 +08:00
xiaojunnuo
d46b9c54b1 perf: 支持记忆字段排序 2025-10-31 16:57:32 +08:00
xiaojunnuo
d0b7162b6a Merge branch 'v2-dev' of https://github.com/certd/certd into v2-dev 2025-10-30 15:08:20 +08:00
xiaojunnuo
c16660254b fix: 修复批量修改定时没有立即显示生效的bug 2025-10-30 15:08:14 +08:00
xiaojunnuo
bbe0d52740 build: release 2025-10-29 01:52:41 +08:00
xiaojunnuo
c4ebbaba74 Merge branch 'v2-dev' into v2-dev-buy
# Conflicts:
#	packages/core/basic/src/utils/util.hash.ts
2025-09-24 01:58:11 +08:00
xiaojunnuo
81e588a896 Merge branch 'refs/heads/v2-dev' into v2-dev-buy
# Conflicts:
#	docs/.vitepress/config.ts
#	packages/ui/certd-client/src/views/certd/pipeline/sub-domain/index.vue
2025-09-22 22:29:59 +08:00
xiaojunnuo
b5d8161bc2 perf: 子域名托管说明 2025-08-31 10:50:07 +08:00
xiaojunnuo
b497eda26e Merge branch 'v2-dev' into v2-dev-buy 2025-08-29 16:54:11 +08:00
xiaojunnuo
fe9dd7d23f Merge branch 'v2-dev' into v2-dev-buy 2025-08-25 23:22:39 +08:00
xiaojunnuo
6f8fbe3f09 chore: 2025-08-25 21:16:33 +08:00
xiaojunnuo
6b7631ed5e fix: 修复新部署的无法保存公共eab配置的bug 2025-08-17 19:07:50 +08:00
xiaojunnuo
1b56c0f191 chore: comm trial 2025-08-15 00:20:38 +08:00
xiaojunnuo
94cbeba495 chore: comm trial 2025-08-15 00:11:48 +08:00
xiaojunnuo
962f8233b0 chore: 2025-08-11 02:02:30 +08:00
xiaojunnuo
31923d511e chore: 修复vip过期时间显示错误的问题 2025-08-11 01:47:39 +08:00
xiaojunnuo
fdbb8300d3 chore: 自动更新vip状态 2025-08-10 23:48:40 +08:00
xiaojunnuo
203d8bca57 chore: 永久专业版特殊颜色 2025-08-10 02:21:32 +08:00
xiaojunnuo
74c331eaf7 chore: 永久专业版特殊颜色 2025-08-10 02:07:48 +08:00
xiaojunnuo
54365528a8 chore: buy page and login 2025-08-09 23:41:59 +08:00
xiaojunnuo
bc174f7054 perf: cname方式hostRecord增加user校验 2025-08-09 23:37:31 +08:00
21 changed files with 379 additions and 196 deletions

View File

@@ -11,6 +11,7 @@ services:
# ↓↓↓↓↓ -------------------------------------------------------- 数据库以及证书存储路径,默认存在宿主机的/data/certd/目录下,【您需要定时备份此目录,以保障数据容灾】
# 只要修改冒号前面的,冒号后面的/app/data不要动
- /data/certd:/app/data
#- /volume1/docker/certd:/app/data:delegated #群晖使用这个配置
# ↓↓↓↓↓ -------------------------------------------------------- 如果走时不准考虑挂载localtime文件
#- /etc/localtime:/etc/localtime
#- /etc/timezone:/etc/timezone

View File

@@ -18,6 +18,12 @@
### 3. 配置Certd项目
![](./images/3.png)
建议加上 `:delegated` 提升性能
```yaml
volumes:
↓↓↓↓------加上这个提升性能
- /volume1/docker/certd:/app/data:delegated
```
### 4. 外网访问设置

View File

@@ -130,12 +130,15 @@ export class PlusService {
return res.accessToken;
}
async getVipTrial() {
async getVipTrial(vipType= "plus") {
await this.register();
const plusRequestService = await this.getPlusRequestService();
const res = await plusRequestService.request({
url: '/activation/subject/vip/trialGet',
method: 'POST',
data:{
vipType
}
});
if (res.license) {
await this.updateLicense(res.license);

View File

@@ -10,4 +10,4 @@ VITE_APP_LOGO=static/images/logo/logo.svg
VITE_APP_LOGIN_LOGO=static/images/logo/rect-black.svg
VITE_APP_PROJECT_PATH=https://github.com/certd/certd
VITE_APP_NAMESPACE=fs
VITE_APP_VIP_PRODUCT_URL=http://localhost:1017/subject#/product/list
VITE_APP_VIP_PRODUCT_URL="http://localhost:1017/subject#/app/certd/product"

View File

@@ -1,3 +1,6 @@
VITE_APP_API=api
#登录与权限开启
VITE_APP_PM_ENABLED=true
VITE_APP_VIP_PRODUCT_URL="https://app.handfree.work/subject#/app/certd/product"

View File

@@ -33,11 +33,11 @@
"@aws-sdk/s3-request-presigner": "^3.535.0",
"@certd/vue-js-cron-light": "^4.0.14",
"@ctrl/tinycolor": "^4.1.0",
"@fast-crud/editor-code": "^1.26.6",
"@fast-crud/fast-crud": "^1.26.6",
"@fast-crud/fast-extends": "^1.26.6",
"@fast-crud/ui-antdv4": "^1.26.6",
"@fast-crud/ui-interface": "^1.26.6",
"@fast-crud/editor-code": "^1.27.4",
"@fast-crud/fast-crud": "^1.27.4",
"@fast-crud/fast-extends": "^1.27.4",
"@fast-crud/ui-antdv4": "^1.27.4",
"@fast-crud/ui-interface": "^1.27.4",
"@iconify/tailwind": "^1.2.0",
"@iconify/vue": "^4.1.1",
"@manypkg/get-packages": "^2.2.2",

View File

@@ -8,10 +8,10 @@ export async function doActive(form: any) {
});
}
export async function getVipTrial() {
export async function getVipTrial(vipType: string) {
return await request({
url: "/sys/plus/getVipTrial",
method: "post",
data: {},
data: { vipType },
});
}

View File

@@ -1,5 +1,5 @@
<template>
<div v-if="!settingStore.isComm || userStore.isAdmin" class="layout-vip isPlus" @click="openUpgrade">
<div v-if="!settingStore.isComm || userStore.isAdmin" class="layout-vip isPlus" :class="{ isForever: settingStore.isForever }" @click="openUpgrade">
<contextHolder />
<fs-icon icon="mingcute:vip-1-line" :title="text.title" />
@@ -12,7 +12,7 @@
</div>
</template>
<script lang="tsx" setup>
import { computed, onMounted, reactive } from "vue";
import { computed, onMounted, reactive, ref } from "vue";
import dayjs from "dayjs";
import { message, Modal } from "ant-design-vue";
import * as api from "./api";
@@ -21,7 +21,7 @@ import { useRouter } from "vue-router";
import { useUserStore } from "/@/store/user";
import { mitter } from "/@/utils/util.mitt";
import { useI18n } from "vue-i18n";
import { env } from "/@/utils/util.env";
const { t } = useI18n();
const settingStore = useSettingStore();
@@ -106,7 +106,7 @@ const text = computed<Text>(() => {
const expireTime = computed(() => {
if (settingStore.isPlus) {
return dayjs(settingStore.plusInfo.expireTime).format("YYYY-MM-DD");
return settingStore.expiresText;
}
return "";
});
@@ -165,34 +165,38 @@ function goAccount() {
router.push("/sys/account");
}
async function getVipTrial() {
const res = await api.getVipTrial();
async function getVipTrial(vipType = "plus") {
const res = await api.getVipTrial(vipType);
message.success(t("vip.congratulations_vip_trial", { duration: res.duration }));
await settingStore.init();
}
function openTrialModal() {
function openTrialModal(vipType = "plus") {
Modal.destroyAll();
modal.confirm({
title: t("vip.trial_modal_title"),
okText: t("vip.trial_modal_ok_text"),
onOk() {
getVipTrial();
getVipTrial(vipType);
},
width: 600,
content: () => {
return (
<div class="flex-col mt-10 mb-10">
<div>{t("vip.trial_modal_thanks")}</div>
<div>{t("vip.trial_modal_click_confirm")}</div>
<div>{t("vip.trial_modal_click_confirm", { vipType })}</div>
</div>
);
},
});
}
function openStarModal() {
function openStarModal(vipType: string) {
if (settingStore.isPlus) {
message.error(t("vip.already_vip"));
return;
}
Modal.destroyAll();
const goGithub = () => {
window.open("https://github.com/certd/certd/");
@@ -203,7 +207,7 @@ function openStarModal() {
okText: t("vip.star_now"),
onOk() {
goGithub();
openTrialModal();
openTrialModal(vipType);
},
width: 600,
content: () => {
@@ -231,7 +235,49 @@ function openUpgrade() {
title = t("vip.renew_pro_upgrade_business");
}
// const goBuyUrl = "https://afdian.com/a/greper"
const subjectId = settingStore.installInfo.siteId;
const appKey = settingStore.installInfo.appKey;
const location = window.location;
const callbackUrl = encodeURIComponent(`${location.origin}${location.pathname}#/sys/account`);
const goBuyUrl = `${env.VIP_PRODUCT_URL}?appKey=${appKey}&subjectId=${subjectId}&callback=${callbackUrl}`;
const goBuyCommUrl = `${goBuyUrl}&vipType=comm`;
const productInfo = settingStore.productInfo;
function checkPerpetualPlus() {
if (settingStore.isPerpetual) {
Modal.warn({
title: t("vip.already_perpetual_plus"),
okText: t("vip.confirm"),
});
throw new Error(t("vip.already_perpetual_plus"));
}
}
function goBuyPlusPage() {
checkPerpetualPlus();
if (settingStore.isComm) {
Modal.warn({
title: t("vip.already_comm"),
okText: t("vip.confirm"),
});
return;
}
window.open(goBuyUrl);
}
function goBuyCommPage() {
checkPerpetualPlus();
if (settingStore.isPlus && !settingStore.isComm) {
Modal.confirm({
title: t("vip.already_plus"),
okText: t("vip.confirm"),
onOk() {
window.open(goBuyCommUrl);
},
});
return;
}
window.open(goBuyCommUrl);
}
const vipTypeDefine = {
free: {
title: t("vip.basic_edition"),
@@ -248,7 +294,7 @@ function openUpgrade() {
trial: {
title: t("vip.click_to_get_7_day_trial"),
click: () => {
openStarModal();
openStarModal("plus");
},
},
icon: "stash:thumb-up",
@@ -258,7 +304,7 @@ function openUpgrade() {
get() {
return (
<a-tooltip title={t("vip.afdian_support_vip")}>
<a-button size="small" type="primary" href="https://afdian.com/a/greper" target="_blank">
<a-button size="small" type="primary" onClick={goBuyPlusPage}>
{t("vip.get_after_support")}
</a-button>
</a-tooltip>
@@ -274,30 +320,57 @@ function openUpgrade() {
price: productInfo.comm.price,
price3: `¥${productInfo.comm.price3}/3${t("vip.years")}`,
tooltip: productInfo.comm.tooltip,
trial: {
title: t("vip.click_to_get_7_day_trial"),
click: () => {
openStarModal("comm");
},
},
get() {
return <a-button size="small">{t("vip.contact_author_for_trial")}</a-button>;
return (
<a-button size="small" type="primary" onClick={goBuyCommPage}>
{t("vip.buy")}
</a-button>
);
},
},
};
const modalRef = modal.confirm({
const manualActiveFlag = ref();
function showManualActivation() {
manualActiveFlag.value = true;
}
const modalRef = modal.success({
title,
async onOk() {
return await doActive();
},
maskClosable: true,
okText: t("vip.activate"),
okText: t("vip.close"),
width: 1100,
content: () => {
let activationCodeGetWay = (
<span>
<a href="https://afdian.com/a/greper" target="_blank">
{t("vip.get_pro_code_after_support")}
</a>
<span> {t("vip.business_contact_author")}</span>
</span>
);
let manualActiveBlock: any = "";
if (manualActiveFlag.value) {
manualActiveBlock = (
<div>
<div class="mt-10">
<a-input-search class="w-2/6" v-model:value={formState.code} placeholder={placeholder} enter-button={t("vip.activate")} onSearch={doActive}></a-input-search>
</div>
<div class="mt-10">
{t("vip.activation_code_one_use")}
<a onClick={goAccount}>{t("vip.bind_account")}</a>{t("vip.transfer_vip")}
</div>
</div>
);
}
const vipLabel = settingStore.vipLabel;
let plusInfo: any = "";
if (isPlus) {
plusInfo = (
<div class="mt-10">
{t("vip.current")} {vipLabel} {t("vip.activated_expire_time")}
{settingStore.expiresText}
</div>
);
}
const slots = [];
for (const key in vipTypeDefine) {
// @ts-ignore
@@ -363,26 +436,19 @@ function openUpgrade() {
<a-row gutter={20}>{slots}</a-row>
</div>
<div class="mt-10">
<h3 class="block-header">{isPlus ? t("vip.renew") : t("vip.activate_immediately")}</h3>
<div>{isPlus ? `${t("vip.current")} ${vipLabel} ${t("vip.activated_expire_time")}` + dayjs(settingStore.plusInfo.expireTime).format("YYYY-MM-DD") : ""}</div>
<div class="mt-10">
<div class="flex-o w-100">
<span>{t("vip.site_id")}</span>
<fs-copyable class="flex-1" v-model={computedSiteId.value}></fs-copyable>
</div>
<a-input class="mt-10" v-model:value={formState.code} placeholder={placeholder} />
<a-input class="mt-10" v-model:value={formState.inviteCode} placeholder={t("vip.invite_code_optional")} />
</div>
<div class="mt-10">
{t("vip.no_activation_code")}
{activationCodeGetWay}
</div>
<div class="mt-10">
{t("vip.activation_code_one_use")}
<a onClick={goAccount}>{t("vip.bind_account")}</a>{t("vip.transfer_vip")}
<div class="flex-o w-100">
<span>{t("vip.site_id")}</span>
<fs-copyable v-model={computedSiteId.value}></fs-copyable>
</div>
</div>
{plusInfo}
<div class="mt-10">
{t("vip.have_activation_code")}
<span>
<a onClick={showManualActivation}>{t("vip.manual_activation")}</a>
</span>
</div>
<div class="mt-10">{manualActiveBlock}</div>
</div>
);
},
@@ -406,6 +472,10 @@ onMounted(() => {
&.isPlus {
color: #c5913f;
&.isForever {
color: #ff2e83;
}
}
.text {
@@ -420,6 +490,11 @@ onMounted(() => {
border: 1px solid #eee;
border-radius: 5px;
height: 275px;
line-height: 24px;
.privilege {
margin-top: 5px;
}
//background-color: rgba(250, 237, 167, 0.79);
&.current {

View File

@@ -32,13 +32,14 @@ export default {
successContent: "You have successfully activated {vipLabel}, valid until: {expireDate}",
bindAccountTitle: "Bind Your Account",
bindAccountContent: "Binding your account helps prevent license loss. Strongly recommended.",
congratulations_vip_trial: "Congratulations, you have received a Pro version {duration} days trial",
trial_modal_title: "7-day Pro version trial acquisition",
congratulations_vip_trial: "Congratulations, you have received a VIP version {duration} days trial",
trial_modal_title: "7-day VIP version trial acquisition",
trial_modal_ok_text: "Get now",
trial_modal_thanks: "Thank you for supporting the open source project",
trial_modal_click_confirm: "Click confirm to get a 7-day Pro version trial",
get_7_day_pro_trial: "7-day professional version trial",
trial_modal_click_confirm: "Click confirm to get a 7-day VIP({vipType}) version trial",
get_7_day_pro_trial: "7-day VIP version trial",
star_now: "Star Now",
already_vip: "Already VIP version, can't trial ",
please_help_star: "Could you please help by starring? Thanks a lot!",
admin_only_operation: "Admin operation only",
enter_activation_code: "Please enter the activation code",
@@ -61,7 +62,7 @@ export default {
plugins_fully_open: "All plugins open, including Synology and more",
click_to_get_7_day_trial: "Click to get 7-day trial",
years: "years",
afdian_support_vip: 'Get a one-year professional activation code after supporting "VIP membership" on Afdian, open source needs your support',
afdian_support_vip: "Obtain the permanent professional version coupon",
get_after_support: "Get after sponsoring",
business_edition: "Business Edition",
@@ -72,9 +73,9 @@ export default {
plugin_management: "Plugin management",
unlimited_multi_users: "Unlimited multi-users",
support_user_payment: "Supports user payments",
contact_author_for_trial: "Please contact the author for trial",
contact_author_for_trial: "Buy It Now",
activate: "Activate",
get_pro_code_after_support: 'Get a one-year professional activation code after supporting "VIP membership" on Afdian',
get_pro_code_after_support: "Go to sponsoring",
business_contact_author: "Business edition please contact the author directly",
year: "year",
freee: "Free",
@@ -88,4 +89,12 @@ export default {
activation_code_one_use: "Activation code can only be used once. To change site, please ",
bind_account: "bind account",
transfer_vip: ' then "Transfer VIP"',
manual_activation: "Manual activation use code",
close: "Close",
have_activation_code: "Already have activation code?",
buy: "Buy",
already_plus: "Already Professional Edition, will upgrade to Business Edition, Professional Edition time will be lost",
already_comm: "Already Business Edition, can't change to Professional Edition",
already_perpetual_plus: "You already have a perpetual Professional Edition, can't upgrade",
confirm: "Confirm",
};

View File

@@ -32,13 +32,14 @@ export default {
successContent: "您已成功激活{vipLabel},有效期至:{expireDate}",
bindAccountTitle: "是否绑定袖手账号",
bindAccountContent: "绑定账号后可以避免License丢失强烈建议绑定",
congratulations_vip_trial: "恭喜,您已获得专业版{duration}天试用",
trial_modal_title: "7天专业版试用获取",
congratulations_vip_trial: "恭喜,您已获得VIP{duration}天试用",
trial_modal_title: "7天VIP试用获取",
trial_modal_ok_text: "立即获取",
trial_modal_thanks: "感谢您对开源项目的支持",
trial_modal_click_confirm: "点击确认即可获取7天专业版试用",
get_7_day_pro_trial: "7天专业版试用获取",
trial_modal_click_confirm: "点击确认即可获取7天VIP({vipType})试用",
get_7_day_pro_trial: "7天VIP试用获取",
star_now: "立即去Star",
already_vip: "您已经是VIP了不能试用",
please_help_star: "可以先请您帮忙点个star吗感谢感谢",
admin_only_operation: "仅限管理员操作",
enter_activation_code: "请输入激活码",
@@ -61,8 +62,8 @@ export default {
plugins_fully_open: "插件全开放,群辉等更多插件",
click_to_get_7_day_trial: "点击获取7天试用",
years: "年",
afdian_support_vip: "爱发电赞助“VIP会员”后获取一年期专业版激活码开源需要您的支持",
get_after_support: "爱发电赞助后获取",
afdian_support_vip: "新用户开通永久专业版立享50优惠券",
get_after_support: "立即赞助",
business_edition: "商业版",
commercial_license: "商业授权,可对外运营",
@@ -72,10 +73,9 @@ export default {
plugin_management: "插件管理",
unlimited_multi_users: "多用户无限制",
support_user_payment: "支持用户支付",
contact_author_for_trial: "请联系作者获取试用",
activate: "激活",
get_pro_code_after_support: "爱发电赞助“VIP会员”后获取一年期专业版激活码",
business_contact_author: "商业版请直接联系作者",
get_pro_code_after_support: "前往获取",
business_contact_author: "",
year: "年",
freee: "免费",
renew: "续期",
@@ -88,4 +88,12 @@ export default {
activation_code_one_use: "激活码使用过一次之后,不可再次使用,如果要更换站点,请",
bind_account: "绑定账号",
transfer_vip: ',然后"转移VIP"即可',
manual_activation: "激活码手动激活",
close: "关闭",
have_activation_code: "已经有激活码了?",
buy: "立即购买",
already_plus: "已经是专业版了,是否升级为商业版?注意:专业版时长将被覆盖",
already_comm: "已经是商业版了,不能降级为专业版",
already_perpetual_plus: "您已经是永久专业版了,无法继续升级",
confirm: "确认",
};

View File

@@ -1,6 +1,6 @@
import { request } from "/src/api/service";
// import "/src/mock";
import { ColumnCompositionProps, CrudOptions, FastCrud, PageQuery, PageRes, setLogger, TransformResProps, useColumns, UseCrudProps, UserPageQuery, useTypes, utils } from "@fast-crud/fast-crud";
import { ColumnCompositionProps, CrudOptions, FastCrud, PageQuery, PageRes, setLogger, TransformResProps, useColumns, UseCrudProps, UserPageQuery, useTypes, utils, forEachTableColumns } from "@fast-crud/fast-crud";
import "@fast-crud/fast-crud/dist/style.css";
import { FsExtendsCopyable, FsExtendsEditor, FsExtendsJson, FsExtendsTime, FsExtendsUploader, FsExtendsInput } from "@fast-crud/fast-extends";
import "@fast-crud/fast-extends/dist/style.css";
@@ -17,22 +17,24 @@ import { FsEditorCode } from "@fast-crud/editor-code";
import "@fast-crud/editor-code/dist/style.css";
class ColumnSizeSaver {
save: (key: string, size: number) => void;
constructor() {
this.save = debounce((key: string, size: number) => {
type: string;
save: (key: string, value: any) => void;
constructor(type: string = "columnSize") {
this.type = type;
this.save = debounce((key: string, value: any) => {
const saveKey = this.getKey();
let data = LocalStorage.get(saveKey);
if (!data) {
data = {};
}
data[key] = size;
data[key] = value;
LocalStorage.set(saveKey, data);
});
}
getKey() {
const loc = window.location;
const currentUrl = `${loc.pathname}${loc.search}${loc.hash}`;
return `columnSize-${currentUrl}`;
return `${this.type}-${currentUrl}`;
}
get(key: string) {
const saveKey = this.getKey();
@@ -45,6 +47,7 @@ class ColumnSizeSaver {
}
}
const columnSizeSaver = new ColumnSizeSaver();
const tableSortSaver = new ColumnSizeSaver("tableSorter");
function install(app: App, options: any = {}) {
app.use(UiAntdv);
@@ -63,6 +66,8 @@ function install(app: App, options: any = {}) {
commonOptions(props: UseCrudProps): CrudOptions {
utils.logger.debug("commonOptions:", props);
const crudBinding = props.crudExpose?.crudBinding;
const crudExpose = props.crudExpose;
const { isMobile } = usePreferences();
const opts: CrudOptions = {
settings: {
@@ -74,6 +79,20 @@ function install(app: App, options: any = {}) {
},
},
},
onUseCrud(bindings: any) {
const oldSorter = tableSortSaver.get("sorter");
if (oldSorter) {
const { prop, order } = oldSorter;
forEachTableColumns(bindings.table.columns, (column: any) => {
if (column.key === prop) {
column.sortOrder = order;
} else {
column.sortOrder = false;
}
});
bindings.table.sort = oldSorter;
}
},
},
table: {
scroll: {
@@ -104,6 +123,30 @@ function install(app: App, options: any = {}) {
return "-";
},
},
onSortChange: (sortChange: any) => {
const { isServerSort, prop, asc, order } = sortChange;
const oldSort = crudBinding.value.table.sort;
const newSorter = isServerSort ? { prop, order, asc } : null;
forEachTableColumns(crudBinding.value.table.columns, (column: any) => {
if (column.key === prop) {
column.sortOrder = order;
} else {
column.sortOrder = false;
}
});
crudBinding.value.table.sort = newSorter;
if (newSorter) {
tableSortSaver.save("sorter", newSorter);
} else {
tableSortSaver.clear();
}
if (isServerSort || oldSort != null) {
crudExpose.doRefresh();
}
},
},
toolbar: {
export: {
@@ -189,6 +232,10 @@ function install(app: App, options: any = {}) {
},
wrapperCol: {
span: null,
buttons: {
copy: { show: false },
paste: { show: false },
},
},
wrapper: {
saveRemind: true,

View File

@@ -1,6 +1,5 @@
import { defineStore } from "pinia";
import { Modal, notification } from "ant-design-vue";
import * as _ from "lodash-es";
import * as basicApi from "./api.basic";
import { AppInfo, HeaderMenus, PlusInfo, SiteEnv, SiteInfo, SuiteSetting, SysInstallInfo, SysPublicSetting } from "./api.basic";
import { useUserStore } from "../user";
@@ -11,6 +10,7 @@ import { useTitle } from "@vueuse/core";
import { utils } from "/@/utils";
import { cloneDeep, merge } from "lodash-es";
import { useI18n } from "/src/locales";
import dayjs from "dayjs";
export interface SettingState {
skipReset?: boolean; // 注销登录时不清空此store的状态
sysPublic?: SysPublicSetting;
@@ -126,11 +126,14 @@ export const useSettingStore = defineStore({
getInstallInfo(): SysInstallInfo {
return this.installInfo;
},
isPerpetual(): boolean {
return this.plusInfo?.isPlus && this.plusInfo?.expireTime === -1;
},
isPlus(): boolean {
return this.plusInfo?.isPlus && this.plusInfo?.expireTime > new Date().getTime();
return this.plusInfo?.isPlus && (this.plusInfo?.expireTime === -1 || this.plusInfo?.expireTime > new Date().getTime());
},
isComm(): boolean {
return this.plusInfo?.isComm && this.plusInfo?.expireTime > new Date().getTime();
return this.plusInfo?.isComm && (this.plusInfo?.expireTime === -1 || this.plusInfo?.expireTime > new Date().getTime());
},
isAgent(): boolean {
return this.siteEnv?.agent?.enabled === true;
@@ -138,6 +141,18 @@ export const useSettingStore = defineStore({
isCommOrAgent() {
return this.isComm || this.isAgent;
},
expiresText() {
if (this.plusInfo?.expireTime == null) {
return "";
}
if (this.plusInfo?.expireTime === -1) {
return "永久";
}
return dayjs(this.plusInfo?.expireTime).format("YYYY-MM-DD");
},
isForever() {
return this.isPlus && this.plusInfo?.expireTime === -1;
},
vipLabel(): string {
const { t } = useI18n();
const vipLabelMap: any = {
@@ -181,12 +196,12 @@ export const useSettingStore = defineStore({
},
async loadSysSettings() {
const allSettings = await basicApi.loadAllSettings();
_.merge(this.sysPublic, allSettings.sysPublic || {});
_.merge(this.installInfo, allSettings.installInfo || {});
_.merge(this.siteEnv, allSettings.siteEnv || {});
_.merge(this.plusInfo, allSettings.plusInfo || {});
_.merge(this.headerMenus, allSettings.headerMenus || {});
_.merge(this.suiteSetting, allSettings.suiteSetting || {});
merge(this.sysPublic, allSettings.sysPublic || {});
merge(this.installInfo, allSettings.installInfo || {});
merge(this.siteEnv, allSettings.siteEnv || {});
merge(this.plusInfo, allSettings.plusInfo || {});
merge(this.headerMenus, allSettings.headerMenus || {});
merge(this.suiteSetting, allSettings.suiteSetting || {});
//@ts-ignore
this.initSiteInfo(allSettings.siteInfo || {});
this.initAppInfo(allSettings.app || {});
@@ -206,7 +221,7 @@ export const useSettingStore = defineStore({
siteInfo.loginLogo = `api/basic/file/download?key=${siteInfo.loginLogo}`;
}
}
this.siteInfo = _.merge({}, defaultSiteInfo, siteInfo);
this.siteInfo = merge({}, defaultSiteInfo, siteInfo);
if (this.siteInfo.logo) {
updatePreferences({

View File

@@ -6,22 +6,28 @@ export function getEnvValue(key: string) {
export class EnvConfig {
MODE: string = import.meta.env.MODE;
API: string = import.meta.env.VITE_APP_API;
STORAGE: string = import.meta.env.VITE_APP_STORAGE;
TITLE: string = import.meta.env.VITE_APP_TITLE;
SLOGAN: string = import.meta.env.VITE_APP_SLOGAN;
LOGO: string = import.meta.env.VITE_APP_LOGO;
LOGIN_LOGO: string = import.meta.env.VITE_APP_LOGIN_LOGO;
ICP_NO: string = import.meta.env.VITE_APP_ICP_NO;
COPYRIGHT_YEAR: string = import.meta.env.VITE_APP_COPYRIGHT_YEAR;
COPYRIGHT_NAME: string = import.meta.env.VITE_APP_COPYRIGHT_NAME;
COPYRIGHT_URL: string = import.meta.env.VITE_APP_COPYRIGHT_URL;
PM_ENABLED: string = import.meta.env.VITE_APP_PM_ENABLED;
API: string;
STORAGE: string;
TITLE: string;
SLOGAN: string;
LOGO: string;
LOGIN_LOGO: string;
ICP_NO: string;
COPYRIGHT_YEAR: string;
COPYRIGHT_NAME: string;
COPYRIGHT_URL: string;
PM_ENABLED: string;
VIP_PRODUCT_URL: string;
init(env: any) {
constructor() {
this.init();
}
init() {
const env = import.meta.env;
for (const key in this) {
if (this.hasOwnProperty(key)) {
this[key] = env[key];
const metaKey = "VITE_APP_" + key;
if (this.hasOwnProperty(key) && env.hasOwnProperty(metaKey)) {
this[key] = env[metaKey];
}
}
}

View File

@@ -830,10 +830,6 @@ export default defineComponent({
saveLoading.value = true;
try {
if (props.options.doSave) {
if (pipeline.value.version == null) {
pipeline.value.version = 0;
}
pipeline.value.version++;
currentPipeline.value = pipeline.value;
//移除空阶段

View File

@@ -375,7 +375,7 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
},
},
createTime: {
title: t("certd.create_time"),
title: t("certd.createTime"),
type: "datetime",
form: {
show: false,
@@ -387,7 +387,7 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
},
},
updateTime: {
title: t("certd.update_time"),
title: t("certd.updateTime"),
type: "datetime",
form: {
show: false,

View File

@@ -20,7 +20,7 @@
typeorm:
dataSource:
default:
database: './data/db-plus-dev-1.sqlite'
database: './data/db-plus-dev.sqlite'
# plus server: 'http://127.0.0.1:11007'
account:

View File

@@ -1,5 +1,6 @@
import { ALL, Body, Controller, Inject, Post, Provide } from '@midwayjs/core';
import { BaseController, PlusService, SysInstallInfo, SysSettingsService } from '@certd/lib-server';
import { logger } from '@certd/basic';
/**
*/
@@ -31,15 +32,20 @@ export class SysPlusController extends BaseController {
installInfo.bindUrl = url;
await this.sysSettingsService.saveSetting(installInfo);
//重新验证配置
await this.plusService.verify();
//重新验证vip
try{
await this.plusService.verify();
}catch(e){
logger.error(`验证配置失败:${e}`);
}
return this.ok(true);
}
@Post('/getVipTrial', { summary: 'sys:settings:edit' })
async getVipTrial(@Body(ALL) body) {
const res = await this.plusService.getVipTrial();
async getVipTrial(@Body("vipType") vipType?:string) {
const res = await this.plusService.getVipTrial(vipType);
return this.ok(res);
}
//

View File

@@ -134,6 +134,8 @@ export class CnameRecordService extends BaseService<CnameRecordEntity> {
if (!param.id) {
throw new ValidateException("id不能为空");
}
//hostRecord包含所有权校验信息不允许用户修改hostRecord
delete param.hostRecord
const old = await this.info(param.id);
if (!old) {

View File

@@ -255,6 +255,11 @@ export class PipelineService extends BaseService<PipelineEntity> {
bean.title = pipeline.title;
}
pipeline.id = bean.id;
if (pipeline.version == null) {
pipeline.version = 0;
}
pipeline.version++;
bean.content = JSON.stringify(pipeline);
await this.addOrUpdate(bean);
await this.registerTrigger(bean);

169
pnpm-lock.yaml generated
View File

@@ -46,7 +46,7 @@ importers:
packages/core/acme-client:
dependencies:
'@certd/basic':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../basic
'@peculiar/x509':
specifier: ^1.11.0
@@ -207,11 +207,11 @@ importers:
packages/core/pipeline:
dependencies:
'@certd/basic':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../basic
'@certd/plus-core':
specifier: ^1.37.2
version: 1.37.2
specifier: ^1.37.4
version: 1.37.4
dayjs:
specifier: ^1.11.7
version: 1.11.13
@@ -415,7 +415,7 @@ importers:
packages/libs/lib-k8s:
dependencies:
'@certd/basic':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/basic
'@kubernetes/client-node':
specifier: 0.21.0
@@ -455,20 +455,20 @@ importers:
packages/libs/lib-server:
dependencies:
'@certd/acme-client':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/acme-client
'@certd/basic':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/basic
'@certd/pipeline':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/pipeline
'@certd/plugin-lib':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../plugins/plugin-lib
'@certd/plus-core':
specifier: ^1.37.2
version: 1.37.2
specifier: ^1.37.4
version: 1.37.4
'@midwayjs/cache':
specifier: 3.14.0
version: 3.14.0
@@ -613,16 +613,16 @@ importers:
packages/plugins/plugin-cert:
dependencies:
'@certd/acme-client':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/acme-client
'@certd/basic':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/basic
'@certd/pipeline':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/pipeline
'@certd/plugin-lib':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../plugin-lib
'@google-cloud/publicca':
specifier: ^1.3.0
@@ -701,10 +701,10 @@ importers:
specifier: ^3.787.0
version: 3.810.0(aws-crt@1.26.2)
'@certd/basic':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/basic
'@certd/pipeline':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/pipeline
'@kubernetes/client-node':
specifier: 0.21.0
@@ -789,19 +789,19 @@ importers:
packages/pro/commercial-core:
dependencies:
'@certd/basic':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../../core/basic
'@certd/lib-server':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../../libs/lib-server
'@certd/pipeline':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../../core/pipeline
'@certd/plugin-plus':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../plugin-plus
'@certd/plus-core':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../plus-core
'@midwayjs/core':
specifier: 3.20.11
@@ -886,22 +886,22 @@ importers:
specifier: ^1.0.2
version: 1.0.3
'@certd/basic':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../../core/basic
'@certd/lib-k8s':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../../libs/lib-k8s
'@certd/pipeline':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../../core/pipeline
'@certd/plugin-cert':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../../plugins/plugin-cert
'@certd/plugin-lib':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../../plugins/plugin-lib
'@certd/plus-core':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../plus-core
ali-oss:
specifier: ^6.21.0
@@ -1004,7 +1004,7 @@ importers:
packages/pro/plus-core:
dependencies:
'@certd/basic':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../../core/basic
dayjs:
specifier: ^1.11.7
@@ -1086,20 +1086,20 @@ importers:
specifier: ^4.1.0
version: 4.1.0
'@fast-crud/editor-code':
specifier: ^1.26.6
version: 1.26.6
specifier: ^1.27.4
version: 1.27.4
'@fast-crud/fast-crud':
specifier: ^1.26.6
version: 1.26.6(vue@3.5.14(typescript@5.8.3))
specifier: ^1.27.4
version: 1.27.4(vue@3.5.14(typescript@5.8.3))
'@fast-crud/fast-extends':
specifier: ^1.26.6
version: 1.26.6(aws-crt@1.26.2)(vue@3.5.14(typescript@5.8.3))
specifier: ^1.27.4
version: 1.27.4(aws-crt@1.26.2)(vue@3.5.14(typescript@5.8.3))
'@fast-crud/ui-antdv4':
specifier: ^1.26.6
version: 1.26.6
specifier: ^1.27.4
version: 1.27.4
'@fast-crud/ui-interface':
specifier: ^1.26.6
version: 1.26.6
specifier: ^1.27.4
version: 1.27.4
'@iconify/tailwind':
specifier: ^1.2.0
version: 1.2.0
@@ -1300,10 +1300,10 @@ importers:
version: 0.1.3(zod@3.24.4)
devDependencies:
'@certd/lib-iframe':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../libs/lib-iframe
'@certd/pipeline':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/pipeline
'@rollup/plugin-commonjs':
specifier: ^25.0.7
@@ -1486,47 +1486,47 @@ importers:
specifier: ^3.705.0
version: 3.810.0(aws-crt@1.26.2)
'@certd/acme-client':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/acme-client
'@certd/basic':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/basic
'@certd/commercial-core':
specifier: ^1.37.2
version: 1.37.2(better-sqlite3@11.10.0)(encoding@0.1.13)(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.8.3))
specifier: ^1.37.4
version: 1.37.4(better-sqlite3@11.10.0)(encoding@0.1.13)(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.8.3))
'@certd/cv4pve-api-javascript':
specifier: ^8.4.2
version: 8.4.2
'@certd/jdcloud':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../libs/lib-jdcloud
'@certd/lib-huawei':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../libs/lib-huawei
'@certd/lib-k8s':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../libs/lib-k8s
'@certd/lib-server':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../libs/lib-server
'@certd/midway-flyway-js':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../libs/midway-flyway-js
'@certd/pipeline':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/pipeline
'@certd/plugin-cert':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../plugins/plugin-cert
'@certd/plugin-lib':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../plugins/plugin-lib
'@certd/plugin-plus':
specifier: ^1.37.2
version: 1.37.2(encoding@0.1.13)
specifier: ^1.37.4
version: 1.37.4(encoding@0.1.13)
'@certd/plus-core':
specifier: ^1.37.2
version: 1.37.2
specifier: ^1.37.4
version: 1.37.4
'@huaweicloud/huaweicloud-sdk-cdn':
specifier: ^3.1.120
version: 3.1.149
@@ -2769,17 +2769,17 @@ packages:
'@better-scroll/zoom@2.5.1':
resolution: {integrity: sha512-aGvFY5ooeZWS4RcxQLD+pGLpQHQxpPy0sMZV3yadcd2QK53PK9gS4Dp+BYfRv8lZ4/P2LoNEhr6Wq1DN6+uPlA==}
'@certd/commercial-core@1.37.2':
resolution: {integrity: sha512-fhDA3sr+iNPEj7xf9D2bJHIl6SzOhahJJ65wJID1HHHSKl8/o+QYpaa0vLfoxE7gmem7H+BoIDe2zB54/JVdFw==}
'@certd/commercial-core@1.37.4':
resolution: {integrity: sha512-Axx1yBekqPy6D9LjjrijVbmO8Ck6E9Fv0+Jcy8cuua269sSpME8k3nj0U8Y4ec0JwfE6GbQYF9gaUE0kSSNexg==}
'@certd/cv4pve-api-javascript@8.4.2':
resolution: {integrity: sha512-udGce7ewrVl4DmZvX+17PjsnqsdDIHEDatr8QP0AVrY2p+8JkaSPW4mXCKiLGf82C9K2+GXgT+qNIqgW7tfF9Q==}
'@certd/plugin-plus@1.37.2':
resolution: {integrity: sha512-mlhlNe3ft9DAt3sL01f5MbVnSqWprXdwW6G6Pvn1XZW+ZdvFK+/jDXcn4DwKKeBbQvbijB7VsdWMEooK8GWgoQ==}
'@certd/plugin-plus@1.37.4':
resolution: {integrity: sha512-h3oSqMBSBYAz8dPcZ4fexrUk32Y2pJcixZMycOZi5onaM9Q5skkWqW3X625B7kdyYaIsojWQzETerXmwJzTBxQ==}
'@certd/plus-core@1.37.2':
resolution: {integrity: sha512-UIugZvzmTt6OSJnKdPv6q4/06SRxPxFfPXyekLNLwGIB/LkG3qjqZyu98xOT/ytI0k/DT9WerM5X7EAyxD9oEw==}
'@certd/plus-core@1.37.4':
resolution: {integrity: sha512-7RFOBjZW98hgsTqoq2T8E6ANhWkuNP7Yi3Y1rZ7m5aXAOgn2H1Aci/Jz9bmD6MZgawfU7j2MLoBXFLEPLpwruQ==}
'@certd/vue-js-cron-core@6.0.3':
resolution: {integrity: sha512-kqzoAMhYz9j6FGNWEODRYtt4NpUEUwjpkU89z5WVg2tCtOcI5VhwyUGOd8AxiBCRfd6PtXvzuqw85PaOps9wrQ==}
@@ -3420,20 +3420,20 @@ packages:
resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
'@fast-crud/editor-code@1.26.6':
resolution: {integrity: sha512-Dq51jO3ACkJJB3eIfyyQ/cU14Sn5jBG5qui2ZTaibs16mpE1cSMLJNl1kk5VXucHeMAlaa5QEJWuuYO/dEKZcA==}
'@fast-crud/editor-code@1.27.4':
resolution: {integrity: sha512-syuSxpNc/So5xoGGZkiC4Iqa8MdrQpeHJRqs6/A8pRUDh9UEN1iBFm8PPxmSluHc7sFXZdt0IIRfJE6sDBhRiA==}
'@fast-crud/fast-crud@1.26.6':
resolution: {integrity: sha512-m44F0qPUaswEBAn+bUqpjNm/+zn/icsTEpr4rGnDd692eZKzx7uPP1szVFwCc0nZeVteI5hNNAioIKB/6Xns1w==}
'@fast-crud/fast-crud@1.27.4':
resolution: {integrity: sha512-wwTqwETgcgBa8v2P/C2MGFfAxZGvAPDFiyrg3b9k+6eMePR//RbY9+M1knsTVaHTTkabAmgwZ+OnnCJzpmnK/A==}
'@fast-crud/fast-extends@1.26.6':
resolution: {integrity: sha512-OHWxN7ZWmE0I0rGyqLjgx9RfZxHakWO68cAX5b6ADwFfFlGR2zfQuj6VjfYayPe6VSt5p3ZoUSsxQgmLbHYnKA==}
'@fast-crud/fast-extends@1.27.4':
resolution: {integrity: sha512-GVWmwondzouPsDD2mCLmxbR7RV5Cf1pJQS0nracQZfrwKsJdNcKlIZ3F3SULklAELMtW01hFbwt7VC+ZehjvAQ==}
'@fast-crud/ui-antdv4@1.26.6':
resolution: {integrity: sha512-VeTt75ejjhIzii5wcQFWY5ugEizLGZhU2cowLNTGskCBmMEAP3GGUwn4TP33dtmQWvTu7FMjwaKtyWnFaiYmuA==}
'@fast-crud/ui-antdv4@1.27.4':
resolution: {integrity: sha512-WcDYmlc06/BIpOnpfN7cZuWqW2kxZC5EfazVw1IaY+kxx3eLRdWX1dShh23oZEsKdwKwGcgY7xeiptFgEpel+Q==}
'@fast-crud/ui-interface@1.26.6':
resolution: {integrity: sha512-C6lWTWs8Vl76qQjORGbPmOy53clo3rO5KnVX2FhTcu5TTecR9JOc85IcQPSWRnWEn+dCdted2wXR83TgQK41eA==}
'@fast-crud/ui-interface@1.27.4':
resolution: {integrity: sha512-hZJiABhXOZma6kaxes9waKMdVEjaEMUtEGZ7TIXXJuExynNOMK1AVtfgACSP5uwTj8mKxUEa7iBKx2vr9EcfFA==}
'@fidm/asn1@1.0.4':
resolution: {integrity: sha512-esd1jyNvRb2HVaQGq2Gg8Z0kbQPXzV9Tq5Z14KNIov6KfFD6PTaRIO8UpcsYiTNzOqJpmyzWgVTrUwFV3UF4TQ==}
@@ -15385,13 +15385,13 @@ snapshots:
dependencies:
'@better-scroll/core': 2.5.1
'@certd/commercial-core@1.37.2(better-sqlite3@11.10.0)(encoding@0.1.13)(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.8.3))':
'@certd/commercial-core@1.37.4(better-sqlite3@11.10.0)(encoding@0.1.13)(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.8.3))':
dependencies:
'@certd/basic': link:packages/core/basic
'@certd/lib-server': link:packages/libs/lib-server
'@certd/pipeline': link:packages/core/pipeline
'@certd/plugin-plus': 1.37.2(encoding@0.1.13)
'@certd/plus-core': 1.37.2
'@certd/plugin-plus': 1.37.4(encoding@0.1.13)
'@certd/plus-core': 1.37.4
'@midwayjs/core': 3.20.11
'@midwayjs/koa': 3.20.13
'@midwayjs/logger': 3.4.2
@@ -15430,7 +15430,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@certd/plugin-plus@1.37.2(encoding@0.1.13)':
'@certd/plugin-plus@1.37.4(encoding@0.1.13)':
dependencies:
'@alicloud/pop-core': 1.8.0
'@baiducloud/sdk': 1.0.3
@@ -15438,7 +15438,8 @@ snapshots:
'@certd/lib-k8s': link:packages/libs/lib-k8s
'@certd/pipeline': link:packages/core/pipeline
'@certd/plugin-cert': link:packages/plugins/plugin-cert
'@certd/plus-core': 1.37.2
'@certd/plugin-lib': link:packages/plugins/plugin-lib
'@certd/plus-core': 1.37.4
ali-oss: 6.23.0
baidu-aip-sdk: 4.16.16
basic-ftp: 5.0.5
@@ -15457,7 +15458,7 @@ snapshots:
- proxy-agent
- supports-color
'@certd/plus-core@1.37.2':
'@certd/plus-core@1.37.4':
dependencies:
'@certd/basic': link:packages/core/basic
dayjs: 1.11.13
@@ -15973,14 +15974,14 @@ snapshots:
'@eslint/js@8.57.0': {}
'@fast-crud/editor-code@1.26.6':
'@fast-crud/editor-code@1.27.4':
dependencies:
js-yaml: 4.1.0
lodash-es: 4.17.21
monaco-editor: 0.52.2
monaco-yaml: 5.4.0(monaco-editor@0.52.2)
'@fast-crud/fast-crud@1.26.6(vue@3.5.14(typescript@5.8.3))':
'@fast-crud/fast-crud@1.27.4(vue@3.5.14(typescript@5.8.3))':
dependencies:
'@iconify/types': 2.0.0
file-saver: 2.0.5
@@ -15990,7 +15991,7 @@ snapshots:
transitivePeerDependencies:
- vue
'@fast-crud/fast-extends@1.26.6(aws-crt@1.26.2)(vue@3.5.14(typescript@5.8.3))':
'@fast-crud/fast-extends@1.27.4(aws-crt@1.26.2)(vue@3.5.14(typescript@5.8.3))':
dependencies:
'@aws-sdk/client-s3': 3.810.0(aws-crt@1.26.2)
'@aws-sdk/s3-request-presigner': 3.810.0
@@ -16020,9 +16021,9 @@ snapshots:
- utf-8-validate
- vue
'@fast-crud/ui-antdv4@1.26.6': {}
'@fast-crud/ui-antdv4@1.27.4': {}
'@fast-crud/ui-interface@1.26.6':
'@fast-crud/ui-interface@1.27.4':
dependencies:
lodash-es: 4.17.21

View File

@@ -1 +1 @@
01:26
01:52