@liujitcn/kratos-admin-system 0.0.62 → 0.0.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -1
- package/dist/package/declarations/src/api/base/v1/ai_provider.d.ts +7 -0
- package/dist/package/declarations/src/api/system/admin/v1/ai_provider.d.ts +18 -0
- package/dist/package/declarations/src/api/system/admin/v1/base_api_rate_limit_policy.d.ts +19 -0
- package/dist/package/declarations/src/api/system/admin/v1/base_message_provider.d.ts +21 -0
- package/dist/package/declarations/src/api/system/admin/v1/base_message_template.d.ts +16 -0
- package/dist/package/declarations/src/api/system/admin/v1/base_oauth_provider.d.ts +18 -0
- package/dist/package/declarations/src/api/system/admin/v1/base_rate_limit_rule.d.ts +21 -0
- package/dist/package/declarations/src/components/api/ApiTransfer.vue.d.ts +35 -0
- package/dist/package/declarations/src/components/api/apiTransfer.d.ts +13 -0
- package/dist/package/declarations/src/components/i18n/DynamicI18nCell.vue.d.ts +2 -2
- package/dist/package/declarations/src/components/i18n/dynamicI18n.d.ts +3 -4
- package/dist/package/declarations/src/locales/generated.d.ts +900 -0
- package/dist/package/declarations/src/rpc/base/v1/ai_message.d.ts +4 -0
- package/dist/package/declarations/src/rpc/base/v1/ai_provider.d.ts +22 -0
- package/dist/package/declarations/src/rpc/base/v1/oauth.d.ts +20 -0
- package/dist/package/declarations/src/rpc/google/protobuf/struct.d.ts +81 -0
- package/dist/package/declarations/src/rpc/system/admin/v1/ai_provider.d.ts +110 -0
- package/dist/package/declarations/src/rpc/system/admin/v1/base_api_rate_limit_policy.d.ts +137 -0
- package/dist/package/declarations/src/rpc/system/admin/v1/base_i18n.d.ts +4 -23
- package/dist/package/declarations/src/rpc/system/admin/v1/base_message.d.ts +4 -4
- package/dist/package/declarations/src/rpc/system/admin/v1/base_message_category.d.ts +19 -0
- package/dist/package/declarations/src/rpc/system/admin/v1/base_message_provider.d.ts +126 -0
- package/dist/package/declarations/src/rpc/system/admin/v1/base_message_template.d.ts +99 -0
- package/dist/package/declarations/src/rpc/system/admin/v1/base_oauth_provider.d.ts +133 -0
- package/dist/package/declarations/src/rpc/system/admin/v1/base_rate_limit_rule.d.ts +144 -0
- package/dist/package/declarations/src/utils/persisted-message.d.ts +4 -0
- package/dist/package/declarations/src/utils/rateLimit.d.ts +24 -0
- package/dist/package/declarations/src/views/ai/chat/components/ChatPanel.vue.d.ts +11 -2
- package/dist/package/declarations/src/views/ai/chat/components/XSender.vue.d.ts +9 -0
- package/dist/package/declarations/src/views/base/ai-provider/index.vue.d.ts +3 -0
- package/dist/package/declarations/src/views/base/api-rate-limit-policy/index.vue.d.ts +3 -0
- package/dist/package/declarations/src/views/base/message-provider/index.vue.d.ts +3 -0
- package/dist/package/declarations/src/views/base/message-template/index.vue.d.ts +3 -0
- package/dist/package/declarations/src/views/base/oauth-provider/index.vue.d.ts +3 -0
- package/dist/package/declarations/src/views/base/rate-limit-rule/index.vue.d.ts +3 -0
- package/dist/package/src/api/base/v1/ai_provider.ts +22 -0
- package/dist/package/src/api/system/admin/v1/ai_provider.ts +50 -0
- package/dist/package/src/api/system/admin/v1/base_api_rate_limit_policy.ts +51 -0
- package/dist/package/src/api/system/admin/v1/base_message_provider.ts +57 -0
- package/dist/package/src/api/system/admin/v1/base_message_template.ts +44 -0
- package/dist/package/src/api/system/admin/v1/base_oauth_provider.ts +50 -0
- package/dist/package/src/api/system/admin/v1/base_rate_limit_rule.ts +58 -0
- package/dist/package/src/components/ai/Ai.vue +1 -1
- package/dist/package/src/components/api/ApiTransfer.vue +117 -0
- package/dist/package/src/components/api/apiTransfer.ts +27 -0
- package/dist/package/src/components/i18n/DynamicI18nCell.vue +8 -8
- package/dist/package/src/components/i18n/DynamicI18nEditor.vue +6 -3
- package/dist/package/src/components/i18n/dynamicI18n.ts +4 -5
- package/dist/package/src/components/tenant-project/TenantProjectManager.vue +2 -1
- package/dist/package/src/locales/en-US.json +229 -4
- package/dist/package/src/locales/ja-JP.json +229 -4
- package/dist/package/src/locales/zh-CN.json +229 -4
- package/dist/package/src/locales/zh-TW.json +229 -4
- package/dist/package/src/rpc/base/v1/ai_message.ts +7 -1
- package/dist/package/src/rpc/base/v1/ai_provider.ts +33 -0
- package/dist/package/src/rpc/base/v1/oauth.ts +16 -0
- package/dist/package/src/rpc/google/protobuf/struct.ts +80 -0
- package/dist/package/src/rpc/system/admin/v1/ai_provider.ts +129 -0
- package/dist/package/src/rpc/system/admin/v1/base_api_rate_limit_policy.ts +160 -0
- package/dist/package/src/rpc/system/admin/v1/base_i18n.ts +4 -24
- package/dist/package/src/rpc/system/admin/v1/base_message.ts +4 -4
- package/dist/package/src/rpc/system/admin/v1/base_message_category.ts +20 -0
- package/dist/package/src/rpc/system/admin/v1/base_message_provider.ts +150 -0
- package/dist/package/src/rpc/system/admin/v1/base_message_template.ts +117 -0
- package/dist/package/src/rpc/system/admin/v1/base_oauth_provider.ts +156 -0
- package/dist/package/src/rpc/system/admin/v1/base_rate_limit_rule.ts +167 -0
- package/dist/package/src/utils/persisted-message.ts +21 -0
- package/dist/package/src/utils/rateLimit.ts +140 -0
- package/dist/package/src/views/ai/chat/components/ChatPanel.vue +36 -4
- package/dist/package/src/views/ai/chat/components/XSender.vue +112 -1
- package/dist/package/src/views/ai/chat/index.vue +30 -1
- package/dist/package/src/views/base/ai-provider/index.vue +512 -0
- package/dist/package/src/views/base/api-rate-limit-policy/index.vue +428 -0
- package/dist/package/src/views/base/backup-management/archive-record/index.vue +2 -0
- package/dist/package/src/views/base/backup-management/archive-restore/index.vue +2 -1
- package/dist/package/src/views/base/backup-management/backup-record/index.vue +2 -0
- package/dist/package/src/views/base/backup-management/backup-restore/index.vue +2 -1
- package/dist/package/src/views/base/config/index.vue +12 -13
- package/dist/package/src/views/base/dict/index.vue +2 -3
- package/dist/package/src/views/base/dict/item.vue +2 -3
- package/dist/package/src/views/base/job/index.vue +2 -3
- package/dist/package/src/views/base/job/log.vue +3 -2
- package/dist/package/src/views/base/menu/index.vue +27 -83
- package/dist/package/src/views/base/message/index.vue +9 -3
- package/dist/package/src/views/base/message-category/index.vue +34 -3
- package/dist/package/src/views/base/message-provider/index.vue +164 -0
- package/dist/package/src/views/base/message-template/index.vue +105 -0
- package/dist/package/src/views/base/migration/index.vue +1 -1
- package/dist/package/src/views/base/oauth-client/index.vue +6 -6
- package/dist/package/src/views/base/oauth-provider/index.vue +274 -0
- package/dist/package/src/views/base/rate-limit-rule/index.vue +322 -0
- package/dist/package/src/views/base/redact-output-policy/index.vue +1 -1
- package/dist/package/src/views/base/redact-rule/index.vue +12 -2
- package/dist/package/src/views/base/redact-storage-policy/index.vue +4 -0
- package/dist/package/src/views/base/tenant/index.vue +3 -3
- package/package.json +2 -2
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import service from "@liujitcn/kratos-admin-core/request";
|
|
2
|
+
import type {
|
|
3
|
+
BaseMessageProviderForm,
|
|
4
|
+
BaseMessageProviderService,
|
|
5
|
+
CreateBaseMessageProviderRequest,
|
|
6
|
+
DeleteBaseMessageProviderRequest,
|
|
7
|
+
GetBaseMessageProviderRequest,
|
|
8
|
+
OptionBaseMessageProviderRequest,
|
|
9
|
+
PageBaseMessageProviderRequest,
|
|
10
|
+
PageBaseMessageProviderResponse,
|
|
11
|
+
SetBaseMessageProviderStatusRequest,
|
|
12
|
+
UpdateBaseMessageProviderRequest
|
|
13
|
+
} from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_message_provider";
|
|
14
|
+
import type { SelectOptionResponse } from "@liujitcn/kratos-admin-system/rpc/common/v1/common";
|
|
15
|
+
import type { Empty } from "@liujitcn/kratos-admin-system/rpc/google/protobuf/empty";
|
|
16
|
+
|
|
17
|
+
const MESSAGE_PROVIDER_URL = "/v1/admin/base/message-provider";
|
|
18
|
+
|
|
19
|
+
/** 消息发送 Provider 管理服务实现。 */
|
|
20
|
+
export class BaseMessageProviderServiceImpl implements BaseMessageProviderService {
|
|
21
|
+
/** 查询消息发送 Provider 选项。 */
|
|
22
|
+
OptionBaseMessageProvider(request: OptionBaseMessageProviderRequest): Promise<SelectOptionResponse> {
|
|
23
|
+
return service({ url: `${MESSAGE_PROVIDER_URL}/option`, method: "get", params: request });
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** 分页查询消息发送 Provider。 */
|
|
27
|
+
PageBaseMessageProvider(request: PageBaseMessageProviderRequest): Promise<PageBaseMessageProviderResponse> {
|
|
28
|
+
return service({ url: MESSAGE_PROVIDER_URL, method: "get", params: request });
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** 查询消息发送 Provider 详情。 */
|
|
32
|
+
GetBaseMessageProvider(request: GetBaseMessageProviderRequest): Promise<BaseMessageProviderForm> {
|
|
33
|
+
return service({ url: `${MESSAGE_PROVIDER_URL}/${request.id}`, method: "get" });
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** 创建消息发送 Provider。 */
|
|
37
|
+
CreateBaseMessageProvider(request: CreateBaseMessageProviderRequest): Promise<Empty> {
|
|
38
|
+
return service({ url: MESSAGE_PROVIDER_URL, method: "post", data: request.base_message_provider });
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** 更新消息发送 Provider。 */
|
|
42
|
+
UpdateBaseMessageProvider(request: UpdateBaseMessageProviderRequest): Promise<Empty> {
|
|
43
|
+
return service({ url: `${MESSAGE_PROVIDER_URL}/${request.base_message_provider?.id ?? ""}`, method: "put", data: request.base_message_provider });
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** 删除消息发送 Provider。 */
|
|
47
|
+
DeleteBaseMessageProvider(request: DeleteBaseMessageProviderRequest): Promise<Empty> {
|
|
48
|
+
return service({ url: `${MESSAGE_PROVIDER_URL}/${request.id}`, method: "delete" });
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** 设置消息发送 Provider 状态。 */
|
|
52
|
+
SetBaseMessageProviderStatus(request: SetBaseMessageProviderStatusRequest): Promise<Empty> {
|
|
53
|
+
return service({ url: `${MESSAGE_PROVIDER_URL}/${request.id}/status`, method: "put", data: request });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export const defBaseMessageProviderService = new BaseMessageProviderServiceImpl();
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import service from "@liujitcn/kratos-admin-core/request";
|
|
2
|
+
import type {
|
|
3
|
+
BaseMessageTemplateForm,
|
|
4
|
+
BaseMessageTemplateService,
|
|
5
|
+
CreateBaseMessageTemplateRequest,
|
|
6
|
+
DeleteBaseMessageTemplateRequest,
|
|
7
|
+
GetBaseMessageTemplateRequest,
|
|
8
|
+
PageBaseMessageTemplateRequest,
|
|
9
|
+
PageBaseMessageTemplateResponse,
|
|
10
|
+
UpdateBaseMessageTemplateRequest
|
|
11
|
+
} from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_message_template";
|
|
12
|
+
import type { Empty } from "@liujitcn/kratos-admin-system/rpc/google/protobuf/empty";
|
|
13
|
+
|
|
14
|
+
const MESSAGE_TEMPLATE_URL = "/v1/admin/base/message-template";
|
|
15
|
+
|
|
16
|
+
/** 消息 Provider 模板管理服务实现。 */
|
|
17
|
+
export class BaseMessageTemplateServiceImpl implements BaseMessageTemplateService {
|
|
18
|
+
/** 分页查询消息 Provider 模板。 */
|
|
19
|
+
PageBaseMessageTemplate(request: PageBaseMessageTemplateRequest): Promise<PageBaseMessageTemplateResponse> {
|
|
20
|
+
return service({ url: MESSAGE_TEMPLATE_URL, method: "get", params: request });
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** 查询消息 Provider 模板详情。 */
|
|
24
|
+
GetBaseMessageTemplate(request: GetBaseMessageTemplateRequest): Promise<BaseMessageTemplateForm> {
|
|
25
|
+
return service({ url: `${MESSAGE_TEMPLATE_URL}/${request.id}`, method: "get" });
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** 创建消息 Provider 模板。 */
|
|
29
|
+
CreateBaseMessageTemplate(request: CreateBaseMessageTemplateRequest): Promise<Empty> {
|
|
30
|
+
return service({ url: MESSAGE_TEMPLATE_URL, method: "post", data: request.base_message_template });
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** 更新消息 Provider 模板。 */
|
|
34
|
+
UpdateBaseMessageTemplate(request: UpdateBaseMessageTemplateRequest): Promise<Empty> {
|
|
35
|
+
return service({ url: `${MESSAGE_TEMPLATE_URL}/${request.base_message_template?.id ?? ""}`, method: "put", data: request.base_message_template });
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** 删除消息 Provider 模板。 */
|
|
39
|
+
DeleteBaseMessageTemplate(request: DeleteBaseMessageTemplateRequest): Promise<Empty> {
|
|
40
|
+
return service({ url: `${MESSAGE_TEMPLATE_URL}/${request.id}`, method: "delete" });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export const defBaseMessageTemplateService = new BaseMessageTemplateServiceImpl();
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import service from "@liujitcn/kratos-admin-core/request";
|
|
2
|
+
import type {
|
|
3
|
+
BaseOauthProviderForm,
|
|
4
|
+
BaseOauthProviderService,
|
|
5
|
+
CreateBaseOauthProviderRequest,
|
|
6
|
+
DeleteBaseOauthProviderRequest,
|
|
7
|
+
GetBaseOauthProviderRequest,
|
|
8
|
+
PageBaseOauthProviderRequest,
|
|
9
|
+
PageBaseOauthProviderResponse,
|
|
10
|
+
SetBaseOauthProviderStatusRequest,
|
|
11
|
+
UpdateBaseOauthProviderRequest
|
|
12
|
+
} from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_oauth_provider";
|
|
13
|
+
import type { Empty } from "@liujitcn/kratos-admin-system/rpc/google/protobuf/empty";
|
|
14
|
+
|
|
15
|
+
const OAUTH_PROVIDER_URL = "/v1/admin/base/oauth-provider";
|
|
16
|
+
|
|
17
|
+
/** OAuth第三方登录方式管理服务实现。 */
|
|
18
|
+
export class BaseOauthProviderServiceImpl implements BaseOauthProviderService {
|
|
19
|
+
/** 分页查询OAuth登录方式。 */
|
|
20
|
+
PageBaseOauthProvider(request: PageBaseOauthProviderRequest): Promise<PageBaseOauthProviderResponse> {
|
|
21
|
+
return service({ url: OAUTH_PROVIDER_URL, method: "get", params: request });
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** 查询OAuth登录方式详情。 */
|
|
25
|
+
GetBaseOauthProvider(request: GetBaseOauthProviderRequest): Promise<BaseOauthProviderForm> {
|
|
26
|
+
return service({ url: `${OAUTH_PROVIDER_URL}/${request.id}`, method: "get" });
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** 创建OAuth登录方式。 */
|
|
30
|
+
CreateBaseOauthProvider(request: CreateBaseOauthProviderRequest): Promise<Empty> {
|
|
31
|
+
return service({ url: OAUTH_PROVIDER_URL, method: "post", data: request.base_oauth_provider });
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** 更新OAuth登录方式。 */
|
|
35
|
+
UpdateBaseOauthProvider(request: UpdateBaseOauthProviderRequest): Promise<Empty> {
|
|
36
|
+
return service({ url: `${OAUTH_PROVIDER_URL}/${request.base_oauth_provider?.id ?? ""}`, method: "put", data: request.base_oauth_provider });
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** 删除OAuth登录方式。 */
|
|
40
|
+
DeleteBaseOauthProvider(request: DeleteBaseOauthProviderRequest): Promise<Empty> {
|
|
41
|
+
return service({ url: `${OAUTH_PROVIDER_URL}/${request.id}`, method: "delete" });
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** 设置OAuth登录方式状态。 */
|
|
45
|
+
SetBaseOauthProviderStatus(request: SetBaseOauthProviderStatusRequest): Promise<Empty> {
|
|
46
|
+
return service({ url: `${OAUTH_PROVIDER_URL}/${request.id}/status`, method: "put", data: request });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export const defBaseOauthProviderService = new BaseOauthProviderServiceImpl();
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import service from "@liujitcn/kratos-admin-core/request";
|
|
2
|
+
import type {
|
|
3
|
+
BaseRateLimitRuleForm,
|
|
4
|
+
BaseRateLimitRuleService,
|
|
5
|
+
CreateBaseRateLimitRuleRequest,
|
|
6
|
+
DeleteBaseRateLimitRuleRequest,
|
|
7
|
+
GetBaseRateLimitRuleRequest,
|
|
8
|
+
OptionBaseRateLimitRuleResponse,
|
|
9
|
+
OptionBaseRateLimitRuleRequest,
|
|
10
|
+
PageBaseRateLimitRuleRequest,
|
|
11
|
+
PageBaseRateLimitRuleResponse,
|
|
12
|
+
SetBaseRateLimitRuleStatusRequest,
|
|
13
|
+
UpdateBaseRateLimitRuleRequest
|
|
14
|
+
} from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_rate_limit_rule";
|
|
15
|
+
import type { Empty } from "@liujitcn/kratos-admin-system/rpc/google/protobuf/empty";
|
|
16
|
+
|
|
17
|
+
const BASE_RATE_LIMIT_RULE_URL = "/v1/admin/base/rate-limit-rule";
|
|
18
|
+
|
|
19
|
+
/** 管理端限流规则模板服务。 */
|
|
20
|
+
export class BaseRateLimitRuleServiceImpl implements BaseRateLimitRuleService {
|
|
21
|
+
/** 查询限流规则选项。 */
|
|
22
|
+
OptionBaseRateLimitRule(request: OptionBaseRateLimitRuleRequest = { keyword: "" }): Promise<OptionBaseRateLimitRuleResponse> {
|
|
23
|
+
return service<OptionBaseRateLimitRuleRequest, OptionBaseRateLimitRuleResponse>({ url: `${BASE_RATE_LIMIT_RULE_URL}/option`, method: "get", params: request });
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** 查询限流规则分页列表。 */
|
|
27
|
+
PageBaseRateLimitRule(request: PageBaseRateLimitRuleRequest): Promise<PageBaseRateLimitRuleResponse> {
|
|
28
|
+
return service<PageBaseRateLimitRuleRequest, PageBaseRateLimitRuleResponse>({ url: BASE_RATE_LIMIT_RULE_URL, method: "get", params: request });
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** 查询限流规则详情。 */
|
|
32
|
+
GetBaseRateLimitRule(request: GetBaseRateLimitRuleRequest): Promise<BaseRateLimitRuleForm> {
|
|
33
|
+
return service<GetBaseRateLimitRuleRequest, BaseRateLimitRuleForm>({ url: `${BASE_RATE_LIMIT_RULE_URL}/${request.id}`, method: "get" });
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** 创建限流规则。 */
|
|
37
|
+
CreateBaseRateLimitRule(request: CreateBaseRateLimitRuleRequest): Promise<Empty> {
|
|
38
|
+
return service<BaseRateLimitRuleForm | undefined, Empty>({ url: BASE_RATE_LIMIT_RULE_URL, method: "post", data: request.base_rate_limit_rule });
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** 更新限流规则。 */
|
|
42
|
+
UpdateBaseRateLimitRule(request: UpdateBaseRateLimitRuleRequest): Promise<Empty> {
|
|
43
|
+
return service<BaseRateLimitRuleForm | undefined, Empty>({ url: `${BASE_RATE_LIMIT_RULE_URL}/${request.base_rate_limit_rule?.id ?? ""}`, method: "put", data: request.base_rate_limit_rule });
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** 删除限流规则。 */
|
|
47
|
+
DeleteBaseRateLimitRule(request: DeleteBaseRateLimitRuleRequest): Promise<Empty> {
|
|
48
|
+
return service<DeleteBaseRateLimitRuleRequest, Empty>({ url: `${BASE_RATE_LIMIT_RULE_URL}/${request.id}`, method: "delete" });
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** 设置限流规则状态。 */
|
|
52
|
+
SetBaseRateLimitRuleStatus(request: SetBaseRateLimitRuleStatusRequest): Promise<Empty> {
|
|
53
|
+
return service<SetBaseRateLimitRuleStatusRequest, Empty>({ url: `${BASE_RATE_LIMIT_RULE_URL}/${request.id}/status`, method: "put", data: request });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** 限流规则模板服务实例。 */
|
|
58
|
+
export const defBaseRateLimitRuleService = new BaseRateLimitRuleServiceImpl();
|
|
@@ -29,7 +29,7 @@ const aiRoute = computed(() => {
|
|
|
29
29
|
return authStore.flatMenuListGet.find(item => item.name === "AiChat" && item.path);
|
|
30
30
|
});
|
|
31
31
|
|
|
32
|
-
/**
|
|
32
|
+
/** 从顶部入口打开 AI 助手会话页。 */
|
|
33
33
|
async function openAi() {
|
|
34
34
|
if (!aiRoute.value?.path) return;
|
|
35
35
|
await navigateTo(router, aiRoute.value.path);
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<el-transfer
|
|
3
|
+
v-model="selectedValues"
|
|
4
|
+
class="api-transfer"
|
|
5
|
+
:data="options"
|
|
6
|
+
:props="{ key: 'value', label: 'label', disabled: 'disabled' }"
|
|
7
|
+
:titles="transferTitles"
|
|
8
|
+
:filterable="true"
|
|
9
|
+
:style="{ '--api-transfer-panel-height': `${panelHeight}px` }"
|
|
10
|
+
>
|
|
11
|
+
<template #default="{ option }">
|
|
12
|
+
<slot :option="option">{{ option.label }}</slot>
|
|
13
|
+
</template>
|
|
14
|
+
</el-transfer>
|
|
15
|
+
</template>
|
|
16
|
+
|
|
17
|
+
<script setup lang="ts">
|
|
18
|
+
import { computed } from "vue";
|
|
19
|
+
import type { ApiTransferOption } from "./apiTransfer";
|
|
20
|
+
|
|
21
|
+
/** API 穿梭框属性。 */
|
|
22
|
+
interface ApiTransferProps {
|
|
23
|
+
/** API 选项列表。 */
|
|
24
|
+
options: ApiTransferOption[];
|
|
25
|
+
/** 左右面板标题。 */
|
|
26
|
+
titles: string[];
|
|
27
|
+
/** 穿梭框面板高度。 */
|
|
28
|
+
panelHeight?: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const props = withDefaults(defineProps<ApiTransferProps>(), {
|
|
32
|
+
panelHeight: 360
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const selectedValues = defineModel<string[]>({ required: true });
|
|
36
|
+
const transferTitles = computed<[string, string]>(() => [props.titles[0] ?? "", props.titles[1] ?? ""]);
|
|
37
|
+
|
|
38
|
+
defineSlots<{
|
|
39
|
+
default(props: { option: ApiTransferOption }): unknown;
|
|
40
|
+
}>();
|
|
41
|
+
</script>
|
|
42
|
+
|
|
43
|
+
<style scoped lang="scss">
|
|
44
|
+
.api-transfer {
|
|
45
|
+
display: grid;
|
|
46
|
+
grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
|
|
47
|
+
align-items: center;
|
|
48
|
+
gap: 16px;
|
|
49
|
+
width: 100%;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.api-transfer :deep(.el-transfer-panel) {
|
|
53
|
+
width: 100%;
|
|
54
|
+
min-width: 0;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.api-transfer :deep(.el-transfer__buttons) {
|
|
58
|
+
display: flex;
|
|
59
|
+
flex-direction: column;
|
|
60
|
+
gap: 12px;
|
|
61
|
+
padding: 0;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.api-transfer :deep(.el-transfer__button) {
|
|
65
|
+
margin: 0;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.api-transfer :deep(.el-transfer-panel__body) {
|
|
69
|
+
height: var(--api-transfer-panel-height);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.api-transfer :deep(.el-transfer-panel__list.is-filterable) {
|
|
73
|
+
height: calc(var(--api-transfer-panel-height) - 60px);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.api-transfer :deep(.el-transfer-panel__item.el-checkbox) {
|
|
77
|
+
display: flex !important;
|
|
78
|
+
align-items: flex-start;
|
|
79
|
+
box-sizing: border-box;
|
|
80
|
+
height: auto;
|
|
81
|
+
min-height: 36px;
|
|
82
|
+
margin-right: 0;
|
|
83
|
+
padding: 8px 12px 8px 15px;
|
|
84
|
+
line-height: 20px;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.api-transfer :deep(.el-transfer-panel__item .el-checkbox__input) {
|
|
88
|
+
position: relative;
|
|
89
|
+
top: 3px;
|
|
90
|
+
flex: none;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.api-transfer :deep(.el-transfer-panel__item .el-checkbox__label) {
|
|
94
|
+
display: block;
|
|
95
|
+
flex: 1;
|
|
96
|
+
width: auto;
|
|
97
|
+
min-width: 0;
|
|
98
|
+
height: auto;
|
|
99
|
+
padding-left: 8px;
|
|
100
|
+
overflow: visible;
|
|
101
|
+
line-height: 20px;
|
|
102
|
+
text-overflow: clip;
|
|
103
|
+
white-space: normal;
|
|
104
|
+
overflow-wrap: anywhere;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
@media (max-width: 900px) {
|
|
108
|
+
.api-transfer {
|
|
109
|
+
grid-template-columns: minmax(0, 1fr);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.api-transfer :deep(.el-transfer__buttons) {
|
|
113
|
+
flex-direction: row;
|
|
114
|
+
justify-content: center;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
</style>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { defBaseApiService } from "@liujitcn/kratos-admin-system/api/system/admin/v1/base_api";
|
|
2
|
+
import type { ProFormOption } from "@liujitcn/kratos-admin-core/components/ProForm/interface";
|
|
3
|
+
import type { BaseApi, OptionBaseApiRequest } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_api";
|
|
4
|
+
|
|
5
|
+
/** API 穿梭框选项。 */
|
|
6
|
+
export type ApiTransferOption = BaseApi & ProFormOption;
|
|
7
|
+
|
|
8
|
+
/** API 穿梭框目录数据。 */
|
|
9
|
+
export interface ApiTransferCatalog {
|
|
10
|
+
/** 原始 API 列表。 */
|
|
11
|
+
apis: BaseApi[];
|
|
12
|
+
/** 穿梭框选项列表。 */
|
|
13
|
+
options: ApiTransferOption[];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** 加载 API 目录并统一生成穿梭框选项。 */
|
|
17
|
+
export async function loadApiTransferCatalog(request: OptionBaseApiRequest = {}): Promise<ApiTransferCatalog> {
|
|
18
|
+
const response = await defBaseApiService.OptionBaseApi(request);
|
|
19
|
+
const apis = response.base_apis ?? [];
|
|
20
|
+
const options = apis.map(api => ({
|
|
21
|
+
...api,
|
|
22
|
+
value: api.operation,
|
|
23
|
+
label: `${api.service_desc || api.service_name}/${api.desc || api.operation} · ${api.method} ${api.path} · ${api.operation}`
|
|
24
|
+
}));
|
|
25
|
+
|
|
26
|
+
return { apis, options };
|
|
27
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<DynamicI18nEditor
|
|
3
3
|
v-if="enabled"
|
|
4
|
-
:key="`${
|
|
4
|
+
:key="`${targetKey}:${targetId}`"
|
|
5
5
|
:model-value="values"
|
|
6
6
|
:source="source"
|
|
7
|
-
:readonly="!editable || !
|
|
7
|
+
:readonly="!editable || !targetKey || !targetId || saving"
|
|
8
8
|
:maxlength="10000"
|
|
9
9
|
@update:model-value="saveValues"
|
|
10
10
|
>
|
|
@@ -21,14 +21,14 @@
|
|
|
21
21
|
import { computed, ref, watch } from "vue";
|
|
22
22
|
import { t, useLocaleStore } from "@liujitcn/kratos-admin-core";
|
|
23
23
|
import { defBaseI18nService } from "@liujitcn/kratos-admin-system/api/system/admin/v1/base_i18n";
|
|
24
|
-
import type { BaseI18n
|
|
24
|
+
import type { BaseI18n } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_i18n";
|
|
25
25
|
import DynamicI18nEditor from "./DynamicI18nEditor.vue";
|
|
26
26
|
import { getEditableLanguageOptions, type DynamicI18nValue } from "./dynamicI18n";
|
|
27
27
|
|
|
28
28
|
/** 列表国际化字段入口,未启用非主语言时退回普通文本。 */
|
|
29
29
|
interface DynamicI18nCellProps {
|
|
30
30
|
source: string;
|
|
31
|
-
|
|
31
|
+
targetKey?: string;
|
|
32
32
|
targetId?: number;
|
|
33
33
|
i18ns?: BaseI18n[];
|
|
34
34
|
editable?: boolean;
|
|
@@ -49,9 +49,9 @@ const displaySource = computed(() => values.value.find(item => item.locale === l
|
|
|
49
49
|
|
|
50
50
|
/** 仅在确认后保存发生变化的译文,打开窗口不会自动翻译或写库。 */
|
|
51
51
|
async function saveValues(next: DynamicI18nValue[]) {
|
|
52
|
-
const
|
|
52
|
+
const targetKey = props.targetKey;
|
|
53
53
|
const targetId = props.targetId;
|
|
54
|
-
if (!props.editable || !
|
|
54
|
+
if (!props.editable || !targetKey || !targetId || saving.value) return;
|
|
55
55
|
const changed = next.filter(item => item.text !== values.value.find(value => value.locale === item.locale)?.text);
|
|
56
56
|
if (!changed.length) return;
|
|
57
57
|
const version = resourceVersion;
|
|
@@ -61,7 +61,7 @@ async function saveValues(next: DynamicI18nValue[]) {
|
|
|
61
61
|
changed.map(async item => {
|
|
62
62
|
await defBaseI18nService.UpdateBaseI18n({
|
|
63
63
|
id: item.id,
|
|
64
|
-
|
|
64
|
+
target_key: targetKey,
|
|
65
65
|
target_id: targetId,
|
|
66
66
|
locale: item.locale,
|
|
67
67
|
name: item.text
|
|
@@ -81,7 +81,7 @@ async function saveValues(next: DynamicI18nValue[]) {
|
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
watch(
|
|
84
|
-
() => [props.
|
|
84
|
+
() => [props.targetKey, props.targetId],
|
|
85
85
|
() => {
|
|
86
86
|
resourceVersion++;
|
|
87
87
|
overrides.value.clear();
|
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
<slot name="trigger" :open="openDialog">
|
|
4
4
|
<el-tooltip :content="t('system.base.i18n.field.i18ns')" placement="top" :show-after="250">
|
|
5
5
|
<el-button
|
|
6
|
-
:icon="Languages"
|
|
7
6
|
:disabled="disabled"
|
|
8
7
|
:aria-label="t('system.base.i18n.field.i18ns')"
|
|
9
8
|
aria-haspopup="dialog"
|
|
10
9
|
:aria-expanded="visible"
|
|
11
10
|
@click="openDialog"
|
|
12
|
-
|
|
11
|
+
>
|
|
12
|
+
<el-icon><Languages /></el-icon>
|
|
13
|
+
</el-button>
|
|
13
14
|
</el-tooltip>
|
|
14
15
|
</slot>
|
|
15
16
|
<ProDialog
|
|
@@ -76,6 +77,7 @@ import { Languages } from "@lucide/vue";
|
|
|
76
77
|
import { t } from "@liujitcn/kratos-admin-core";
|
|
77
78
|
import ProDialog from "@liujitcn/kratos-admin-core/components/Dialog/ProDialog.vue";
|
|
78
79
|
import { defBaseI18nService } from "@liujitcn/kratos-admin-system/api/system/admin/v1/base_i18n";
|
|
80
|
+
import { useEnabledBaseLanguages } from "@liujitcn/kratos-admin-system/api/system/admin/v1/base_language";
|
|
79
81
|
import { getEditableLanguageOptions, getLanguageLabel, type DynamicI18nValue } from "./dynamicI18n";
|
|
80
82
|
|
|
81
83
|
/** 字段旁国际化入口及本地草稿编辑弹窗。 */
|
|
@@ -95,7 +97,8 @@ const props = withDefaults(defineProps<DynamicI18nEditorProps>(), {
|
|
|
95
97
|
readonly: false
|
|
96
98
|
});
|
|
97
99
|
const emit = defineEmits<{ "update:modelValue": [value: DynamicI18nValue[]] }>();
|
|
98
|
-
const
|
|
100
|
+
const { languages } = useEnabledBaseLanguages();
|
|
101
|
+
const enabled = computed(() => languages.value.some(item => !item.is_primary && item.status === 1));
|
|
99
102
|
const inputId = useId();
|
|
100
103
|
const visible = ref(false);
|
|
101
104
|
const draftValues = ref<DynamicI18nValue[]>([]);
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { getEnabledBaseLanguages } from "@liujitcn/kratos-admin-system/api/system/admin/v1/base_language";
|
|
2
|
-
import type { I18nTargetType } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_i18n";
|
|
3
2
|
|
|
4
3
|
/** DynamicI18nValue 动态资源单语言翻译编辑状态。 */
|
|
5
4
|
export interface DynamicI18nValue {
|
|
@@ -11,7 +10,7 @@ export interface DynamicI18nValue {
|
|
|
11
10
|
|
|
12
11
|
/** DynamicI18nRecord 描述三类动态资源翻译共有字段。 */
|
|
13
12
|
export interface DynamicI18nRecord extends Omit<DynamicI18nValue, "text"> {
|
|
14
|
-
|
|
13
|
+
target_key: string;
|
|
15
14
|
target_id: number;
|
|
16
15
|
name: string;
|
|
17
16
|
}
|
|
@@ -55,12 +54,12 @@ export function normalizeDynamicI18ns(
|
|
|
55
54
|
/** serializeDynamicI18ns 按启用语言序列化译文,未填写时保存原值。 */
|
|
56
55
|
export function serializeDynamicI18ns(
|
|
57
56
|
values: DynamicI18nValue[],
|
|
58
|
-
|
|
57
|
+
targetKey: string,
|
|
59
58
|
targetId: number,
|
|
60
59
|
source: string
|
|
61
|
-
): Array<{ id: number;
|
|
60
|
+
): Array<{ id: number; target_key: string; target_id: number; locale: string; name: string }> {
|
|
62
61
|
return getEditableLanguageOptions().map(({ value: locale }) => {
|
|
63
62
|
const item = values.find(value => value.locale === locale);
|
|
64
|
-
return { id: item?.id ?? 0,
|
|
63
|
+
return { id: item?.id ?? 0, target_key: targetKey, target_id: targetId, locale, name: item?.text || source };
|
|
65
64
|
});
|
|
66
65
|
}
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
v-model="dialog.visible"
|
|
18
18
|
ref="formDialogRef"
|
|
19
19
|
:title="t(dialog.titleKey, { resource: t('common.field.project') })"
|
|
20
|
-
width="
|
|
20
|
+
width="min(640px, calc(100vw - 32px))"
|
|
21
|
+
label-width="auto"
|
|
21
22
|
:model="formData"
|
|
22
23
|
:fields="formFields"
|
|
23
24
|
:rules="rules"
|