diff --git a/packages/ui/certd-client/src/views/sys/plugin/api.ts b/packages/ui/certd-client/src/views/sys/plugin/api.ts
index 3c64a215c..99360b871 100644
--- a/packages/ui/certd-client/src/views/sys/plugin/api.ts
+++ b/packages/ui/certd-client/src/views/sys/plugin/api.ts
@@ -110,6 +110,7 @@ export type OnlinePluginBean = {
downloadCount?: number;
score?: number;
aiCheckStatus?: string;
+ vip?: string;
editable?: boolean;
selfAuthored?: boolean;
installed?: boolean;
diff --git a/packages/ui/certd-client/src/views/sys/plugin/components/plugin-item-card.vue b/packages/ui/certd-client/src/views/sys/plugin/components/plugin-item-card.vue
index d46859eee..95bc99b55 100644
--- a/packages/ui/certd-client/src/views/sys/plugin/components/plugin-item-card.vue
+++ b/packages/ui/certd-client/src/views/sys/plugin/components/plugin-item-card.vue
@@ -23,6 +23,9 @@
+
+
+
@@ -227,6 +230,10 @@ const isDisabled = computed(() => {
return props.source === "local" ? props.plugin.disabled : props.plugin.localDisabled;
});
+const requiresVip = computed(() => {
+ return props.plugin.vip === "plus" || props.plugin.needPlus === true;
+});
+
const canRemoveLocal = computed(() => {
return isOwnImportedPlugin.value;
});
@@ -626,6 +633,13 @@ function handleVersionClick() {
margin-left: 8px;
}
+ .plugin-card__vip-icon {
+ flex: none;
+ color: #faad14;
+ font-size: 16px;
+ line-height: 1;
+ }
+
.plugin-card__title {
display: block;
min-width: 0;
diff --git a/packages/ui/certd-server/db/migration/v10053__plugin_installed.sql b/packages/ui/certd-server/db/migration/v10053__plugin_installed.sql
index 09996405b..6df061852 100644
--- a/packages/ui/certd-server/db/migration/v10053__plugin_installed.sql
+++ b/packages/ui/certd-server/db/migration/v10053__plugin_installed.sql
@@ -3,3 +3,6 @@ ALTER TABLE "pi_plugin" ADD COLUMN "installed" boolean NOT NULL DEFAULT true;
UPDATE "pi_plugin" SET "installed" = true;
ALTER TABLE "pi_plugin" ADD COLUMN "ai_check_status" varchar(32) NOT NULL DEFAULT '';
+
+ALTER TABLE "pi_plugin" ADD COLUMN "vip" varchar(50);
+
diff --git a/packages/ui/certd-server/src/modules/plugin/entity/plugin.ts b/packages/ui/certd-server/src/modules/plugin/entity/plugin.ts
index f3ac0263b..23a109d09 100644
--- a/packages/ui/certd-server/src/modules/plugin/entity/plugin.ts
+++ b/packages/ui/certd-server/src/modules/plugin/entity/plugin.ts
@@ -77,6 +77,9 @@ export class PluginEntity {
@Column({ name: "ai_check_status", comment: "最新版本AI审核状态", length: 32, default: "" })
aiCheckStatus: string;
+ @Column({ comment: "最低VIP等级", length: 50, nullable: true })
+ vip: string;
+
@Column({ name: "sync_time", comment: "同步时间", nullable: true })
syncTime: number;
diff --git a/packages/ui/certd-server/src/modules/plugin/service/plugin-service.ts b/packages/ui/certd-server/src/modules/plugin/service/plugin-service.ts
index 14b0430ba..6c6372fb4 100644
--- a/packages/ui/certd-server/src/modules/plugin/service/plugin-service.ts
+++ b/packages/ui/certd-server/src/modules/plugin/service/plugin-service.ts
@@ -111,6 +111,7 @@ export type OnlinePluginBean = {
downloadCount?: number;
score?: number;
aiCheckStatus?: string;
+ vip?: string;
editable?: boolean;
selfAuthored?: boolean;
installed?: boolean;
@@ -684,6 +685,7 @@ export class PluginService extends BaseService
{
downloadCount: item.downloadCount,
score: item.score,
aiCheckStatus: item.aiCheckStatus,
+ vip: item.vip,
syncTime,
type: old?.type || "store",
disabled: old?.disabled ?? false,
@@ -718,6 +720,7 @@ export class PluginService extends BaseService {
downloadCount: item.downloadCount,
score: item.score,
aiCheckStatus: item.aiCheckStatus,
+ vip: item.vip,
syncTime: item.syncTime,
installed: isInstalled,
localPluginId: isInstalled ? item.id : undefined,