Compare commits

..

5 Commits

Author SHA1 Message Date
Dot.L d232269416 Merge pull request #167 from APIParkLab/feature/ai-balance
Feature/ai balance
2025-01-16 16:37:41 +08:00
ScarChin a6105cfc3c fix: 1.3-beta版本,超级管理员(admin)账户无法修改分类和添加子分类,页面显示无权限操作 (#164) 2025-01-14 17:52:07 +08:00
ScarChin 0aa5ffd2c2 fix: login page redirect multiple times (#166)
* fix: System Settings - General After changing the interface language, the internal pages do not automatically follow the language switch

* fix: login page language error
2025-01-13 18:33:55 +08:00
Dot.L 968f5b986f Merge pull request #165 from APIParkLab/feature/ai-balance
update docker run script
2025-01-13 11:25:50 +08:00
Dot.L a92baf09d9 Merge pull request #162 from APIParkLab/feature/ai-balance
Feature/ai balance
2025-01-08 11:26:18 +08:00
15 changed files with 255 additions and 288 deletions
+11 -17
View File
@@ -3,7 +3,6 @@ package main
import (
"context"
"encoding/json"
"fmt"
"log"
"strings"
"time"
@@ -28,8 +27,8 @@ func init() {
}
type NSQConfig struct {
Addr string `json:"addr" yaml:"addr"`
TopicPrefix string `json:"topic_prefix" yaml:"topic_prefix"`
Addr string `json:"addr"`
TopicPrefix string `json:"topic_prefix"`
}
// 定义 NSQ 消息结构
@@ -79,11 +78,6 @@ func convertInt(value interface{}) int {
}
}
func genAIKey(key string, provider string) string {
keys := strings.Split(key, "@")
return strings.TrimSuffix(keys[0], fmt.Sprintf("-%s", provider))
}
// HandleMessage 处理从 NSQ 读取的消息
func (h *NSQHandler) HandleMessage(message *nsq.Message) error {
log.Printf("Received message: %s", string(message.Body))
@@ -93,14 +87,14 @@ func (h *NSQHandler) HandleMessage(message *nsq.Message) error {
err := json.Unmarshal(message.Body, &data)
if err != nil {
log.Printf("Failed to unmarshal message: %v", err)
return nil
return err
}
// 将时间字符串转换为 time.Time
timestamp, err := time.Parse(time.RFC3339, data.TimeISO8601)
if err != nil {
log.Printf("Failed to parse timestamp: %v", err)
return nil
return err
}
day := time.Date(timestamp.Year(), timestamp.Month(), timestamp.Day(), 0, 0, 0, 0, timestamp.Location())
@@ -110,13 +104,14 @@ func (h *NSQHandler) HandleMessage(message *nsq.Message) error {
finalStatus := &AIProviderStatus{}
for _, s := range data.AI.ProviderStats {
status := ToKeyStatus(s.Status).Int()
key := genAIKey(s.Key, s.Provider)
keys := strings.Split(s.Key, "@")
key := keys[0]
err = h.aiKeyService.Save(ctx, key, &ai_key.Edit{
Status: &status,
})
if err != nil {
log.Printf("Failed to save AI key: %v", err)
return nil
return err
}
if s.Provider != data.AI.Provider {
@@ -133,12 +128,11 @@ func (h *NSQHandler) HandleMessage(message *nsq.Message) error {
finalStatus = &s
}
if finalStatus != nil {
//keys := strings.Split(finalStatus.Key, "@")
key := genAIKey(finalStatus.Key, finalStatus.Provider)
err = h.aiKeyService.IncrUseToken(ctx, key, convertInt(data.AI.TotalToken))
keys := strings.Split(finalStatus.Key, "@")
err = h.aiKeyService.IncrUseToken(ctx, keys[0], convertInt(data.AI.TotalToken))
if err != nil {
log.Printf("Failed to increment AI key token: %v", err)
return nil
return err
}
}
@@ -157,7 +151,7 @@ func (h *NSQHandler) HandleMessage(message *nsq.Message) error {
})
if err != nil {
log.Printf("Failed to call AI API: %v", err)
return nil
return err
}
log.Printf("Message processed and saved to MySQL: %+v", data)
@@ -4,48 +4,48 @@ import { Icon } from '@iconify/react/dist/iconify.js'
import { Button, Dropdown } from 'antd'
import { memo, useEffect, useMemo } from 'react'
const LanguageItems = [
{
key: 'en-US',
label: (
<Button key="en" type="text" className="flex items-center p-0 bg-transparent border-none">
English
</Button>
),
title: 'English'
},
{
key: 'ja-JP',
label: (
<Button key="jp" type="text" className="flex items-center p-0 bg-transparent border-none">
</Button>
),
title: '日本語'
},
{
key: 'zh-TW',
label: (
<Button key="tw" type="text" className="flex items-center p-0 bg-transparent border-none">
</Button>
),
title: '繁體中文'
},
{
key: 'zh-CN',
label: (
<Button key="cn" type="text" className="flex items-center p-0 bg-transparent border-none">
</Button>
),
title: '简体中文'
}
]
const LanguageSetting = ({ mode = 'light' }: { mode?: 'dark' | 'light' }) => {
const { dispatch, state } = useGlobalContext()
const items = [
{
key: 'en-US',
label: (
<Button key="en" type="text" className="flex items-center p-0 bg-transparent border-none">
English
</Button>
),
title: 'English'
},
{
key: 'ja-JP',
label: (
<Button key="jp" type="text" className="flex items-center p-0 bg-transparent border-none">
</Button>
),
title: '日本語'
},
{
key: 'zh-TW',
label: (
<Button key="tw" type="text" className="flex items-center p-0 bg-transparent border-none">
</Button>
),
title: '繁體中文'
},
{
key: 'zh-CN',
label: (
<Button key="cn" type="text" className="flex items-center p-0 bg-transparent border-none">
</Button>
),
title: '简体中文'
}
]
const langLabel = useMemo(() => items.find((item) => item?.key === state.language)?.title, [state.language])
const langLabel = useMemo(() => LanguageItems.find((item) => item?.key === state.language)?.title, [state.language])
useEffect(() => {
const savedLang = i18n.language || sessionStorage.getItem('i18nextLng')
@@ -53,17 +53,17 @@ const LanguageSetting = ({ mode = 'light' }: { mode?: 'dark' | 'light' }) => {
dispatch({ type: 'UPDATE_LANGUAGE', language: savedLang })
} else if (!savedLang) {
const browserLang = navigator.language
const supportedLang = items.find((item) => item.key === browserLang) ? browserLang : 'zh-CN'
const supportedLang = LanguageItems.find((item) => item.key === browserLang) ? browserLang : 'zh-CN'
if (state.language === supportedLang) return
dispatch({ type: 'UPDATE_LANGUAGE', language: supportedLang })
i18n.changeLanguage(supportedLang)
}
}, [])
return (
<Dropdown
trigger={['hover']}
menu={{
items,
items: LanguageItems,
style: { minWidth: '80px' },
onClick: (e) => {
const { key } = e
@@ -1,8 +1,8 @@
import { PERMISSION_DEFINITION } from '@common/const/permissions'
import { $t } from '@common/locales'
import { Button, Tooltip, Upload } from 'antd'
import { ReactElement, cloneElement, useEffect, useMemo, useState } from 'react'
import { useGlobalContext } from '../../contexts/GlobalStateContext'
import { PERMISSION_DEFINITION } from '@common/const/permissions'
import { $t } from '@common/locales'
type WithPermissionProps = {
access?: string | string[]
@@ -342,7 +342,7 @@ export const GlobalProvider: FC<{ children: ReactNode }> = ({ children }) => {
updateDate: '2024-07-01',
powered: 'Powered by https://apipark.com',
mainPage: '/guide/page',
language: 'en-US',
language: sessionStorage.getItem('i18nextLng') || 'en-US',
pluginsLoaded: false
})
const [accessData, setAccessData] = useState<Map<string, string[]>>(new Map())
@@ -510,7 +510,7 @@ export const useGlobalContext = () => {
updateDate: '',
powered: '',
mainPage: '',
language: 'en-US',
language: sessionStorage.getItem('i18nextLng') || 'en-US',
pluginsLoaded: false
},
dispatch: () => {},
+26 -6
View File
@@ -1,5 +1,5 @@
import i18n from 'i18next'
import { initReactI18next } from 'react-i18next'
import { initReactI18next, useTranslation } from 'react-i18next'
// i18next-browser-languagedetector插件 这是一个 i18next 语言检测插件,用于检测浏览器中的用户语言,
import crc32 from 'crc/crc32'
import LanguageDetector from 'i18next-browser-languagedetector'
@@ -39,23 +39,22 @@ i18n
.init({
// 初始化
resources, // 本地多语言数据
// fallbackLng: config.lang, // 默认当前环境的语言
supportedLngs: ['zh-CN', 'en-US', 'zh-TW', 'ja-JP'],
detection: {
caches: ['localStorage', 'sessionStorage', 'cookie']
}
})
// --------这里是i18next-scanner新增的配置-------------
// 用于非 React 组件中的翻译
export const $t = (key: string, params?: any[]): string => {
const hashKey = `K${crc32(key).toString(16)}` // 将中文转换成crc32格式去匹配对应的json语言包
// 将中文转换成crc32格式去匹配对应的json语言包
const hashKey = `K${crc32(key).toString(16)}`
let words = i18n.t(hashKey)
// const { t } = useTranslation(); // 通过hooks
// let words = t(hashKey);
if (words === hashKey) {
words = key
}
// 配置传递参数的场景, 目前仅支持数组,可在此拓展
if (Array.isArray(params)) {
const reg = /\((\d)\)/g
words = words.replace(reg, (a: string, b: number) => {
@@ -65,4 +64,25 @@ export const $t = (key: string, params?: any[]): string => {
return words
}
// 用于 React 组件中的翻译
export const useI18n = () => {
const { t } = useTranslation()
return (key: string, params?: any[]): string => {
const hashKey = `K${crc32(key).toString(16)}`
let words = t(hashKey)
if (words === hashKey) {
words = key
}
if (Array.isArray(params)) {
const reg = /\((\d)\)/g
words = words.replace(reg, (a: string, b: number) => {
return params[b]
})
}
return words
}
}
export default i18n
@@ -18,7 +18,11 @@ export const checkAccess: (access: AccessDataType, accessData: Map<string, strin
if (accLevel === 'team') {
accessSet = new Set(Array.from(accessSet).concat(accessData?.get('team') || []))
}
return accessSet!.size > 0 ? hasIntersection(neededBackendAccessArr, accessSet) : false
if (!accessSet!.size) {
return false
}
const hasAccess = hasIntersection(neededBackendAccessArr, accessSet)
return hasAccess
}
const hasIntersection = (arr1: string[], set1: Set<string>) => {
+6 -6
View File
@@ -151,15 +151,15 @@ function App() {
form={{ validateMessages }}
>
<PluginEventHubProvider>
<AppAntd className="h-full" message={{ maxCount: 1 }}>
<PluginSlotHubProvider>
<GlobalProvider>
<GlobalProvider>
<AppAntd className="h-full" message={{ maxCount: 1 }}>
<PluginSlotHubProvider>
<BreadcrumbProvider>
<RenderRoutes />
</BreadcrumbProvider>
</GlobalProvider>
</PluginSlotHubProvider>
</AppAntd>
</PluginSlotHubProvider>
</AppAntd>
</GlobalProvider>
</PluginEventHubProvider>
</ConfigProvider>
</StyleProvider>
@@ -1,5 +1,5 @@
import InsidePage from '@common/components/aoplatform/InsidePage'
import { $t } from '@common/locales'
import { useI18n } from '@common/locales'
import { Tabs } from 'antd'
import { useEffect, useState } from 'react'
import { useSearchParams } from 'react-router-dom'
@@ -10,6 +10,7 @@ import { AiSettingProvider } from './contexts/AiSettingContext'
const CONTENT_STYLE = { height: 'calc(-300px + 100vh)' } as const
const AiSettingContent = () => {
const $t = useI18n()
const [searchParams, setSearchParams] = useSearchParams()
const [activeKey, setActiveKey] = useState(searchParams.get('status') === 'unconfigure' ? 'config' : 'flow')
@@ -1,33 +1,26 @@
import InsidePage from "@common/components/aoplatform/InsidePage";
import { $t } from "@common/locales";
import ServiceCategory from "./ServiceCategory";
import ApiRequestSetting from "./ApiRequestSetting";
import { Row, Col } from "antd";
import InsidePage from '@common/components/aoplatform/InsidePage'
import { useI18n } from '@common/locales'
import { Col, Row } from 'antd'
import ApiRequestSetting from './ApiRequestSetting'
import ServiceCategory from './ServiceCategory'
export default function CommonPage(){
return (
<InsidePage
pageTitle={$t('常规设置')}
showBorder={false}
contentClassName="pr-PAGE_INSIDE_X"
scrollPage={false}
>
<Row className="mb-btnybase" >
<Col >
<span className="font-bold mr-[13px]">
{$t('API 请求设置')}
</span>
</Col>
</Row>
<ApiRequestSetting />
<Row className="mb-btnybase mt-[40px]">
<Col >
<span className="font-bold mr-[13px]">
{$t('服务分类')}
</span>
</Col>
</Row>
<ServiceCategory />
</InsidePage>
)
}
export default function CommonPage() {
const $t = useI18n()
return (
<InsidePage pageTitle={$t('常规设置')} showBorder={false} contentClassName="pr-PAGE_INSIDE_X" scrollPage={false}>
<Row className="mb-btnybase">
<Col>
<span className="font-bold mr-[13px]">{$t('API 请求设置')}</span>
</Col>
</Row>
<ApiRequestSetting />
<Row className="mb-btnybase mt-[40px]">
<Col>
<span className="font-bold mr-[13px]">{$t('服务分类')}</span>
</Col>
</Row>
<ServiceCategory />
</InsidePage>
)
}
@@ -28,7 +28,7 @@ export default function ServiceCategory() {
const { accessData } = useGlobalContext()
const [loading, setLoading] = useState<boolean>(false)
const onDrop: TreeProps['onDrop'] = info => {
const onDrop: TreeProps['onDrop'] = (info) => {
const dropKey = info.node.key
const dragKey = info.dragNode.key
const dropPos = info.node.pos.split('-')
@@ -59,7 +59,7 @@ export default function ServiceCategory() {
if (!info.dropToGap) {
// Drop on the content
loop(data, dropKey, item => {
loop(data, dropKey, (item) => {
item.children = item.children || []
// where to insert. New item was inserted to the start of the array in this example, but can be anywhere
item.children.unshift(dragObj)
@@ -129,9 +129,9 @@ export default function ServiceCategory() {
const treeData = useMemo(() => {
setExpandedKeys([])
const loop = (data: CategorizesType[]): DataNode[] =>
data?.map(item => {
data?.map((item) => {
if (item.children) {
setExpandedKeys(prev => [...prev, item.id])
setExpandedKeys((prev) => [...prev, item.id])
return {
title: (
<TreeWithMore stopClick={false} dropdownMenu={dropdownMenu(item as CategorizesType)}>
@@ -169,40 +169,22 @@ export default function ServiceCategory() {
return !checkAccess(permission, accessData)
}
const openModal = (
type: 'addCate' | 'addChildCate' | 'renameCate' | 'delete',
entity?: CategorizesType
) => {
const openModal = (type: 'addCate' | 'addChildCate' | 'renameCate' | 'delete', entity?: CategorizesType) => {
let title: string = ''
let content: string | React.ReactNode = ''
switch (type) {
case 'addCate':
case 'addCate': {
title = $t('添加分类')
content = (
<ServiceHubCategoryConfig WithPermission={WithPermission} ref={addRef} type={type} />
)
content = <ServiceHubCategoryConfig ref={addRef} type={type} />
break
}
case 'addChildCate':
title = $t('添加子分类')
content = (
<ServiceHubCategoryConfig
WithPermission={WithPermission}
ref={addChildRef}
type={type}
entity={entity}
/>
)
content = <ServiceHubCategoryConfig ref={addChildRef} type={type} entity={entity} />
break
case 'renameCate':
title = $t('重命名分类')
content = (
<ServiceHubCategoryConfig
WithPermission={WithPermission}
ref={renameRef}
type={type}
entity={entity}
/>
)
content = <ServiceHubCategoryConfig ref={renameRef} type={type} entity={entity} />
break
case 'delete':
title = $t('删除')
@@ -215,19 +197,19 @@ export default function ServiceCategory() {
onOk: () => {
switch (type) {
case 'addCate':
return addRef.current?.save().then(res => {
return addRef.current?.save().then((res) => {
if (res === true) getCategoryList()
})
case 'addChildCate':
return addChildRef.current?.save().then(res => {
return addChildRef.current?.save().then((res) => {
if (res === true) getCategoryList()
})
case 'renameCate':
return renameRef.current?.save().then(res => {
return renameRef.current?.save().then((res) => {
if (res === true) getCategoryList()
})
case 'delete':
return deleteCate(entity!).then(res => {
return deleteCate(entity!).then((res) => {
if (res === true) getCategoryList()
})
}
@@ -249,7 +231,7 @@ export default function ServiceCategory() {
method: 'DELETE',
eoParams: { catalogue: entity.id }
})
.then(response => {
.then((response) => {
const { code, msg } = response
if (code === STATUS_CODE.SUCCESS) {
message.success(msg || $t(RESPONSE_TIPS.success))
@@ -259,14 +241,14 @@ export default function ServiceCategory() {
reject(msg || $t(RESPONSE_TIPS.error))
}
})
.catch(errorInfo => reject(errorInfo))
.catch((errorInfo) => reject(errorInfo))
})
}
const sortCategories = (newData: CategorizesType[]) => {
setLoading(true)
fetchData<BasicResponse<null>>('catalogue/sort', { method: 'PUT', eoBody: newData })
.then(response => {
.then((response) => {
const { code, msg } = response
if (code === STATUS_CODE.SUCCESS) {
getCategoryList()
@@ -288,7 +270,7 @@ export default function ServiceCategory() {
fetchData<BasicResponse<{ catalogues: CategorizesType[]; tags: EntityItem[] }>>('catalogues', {
method: 'GET'
})
.then(response => {
.then((response) => {
const { code, data, msg } = response
if (code === STATUS_CODE.SUCCESS) {
setGData(data.catalogues)
@@ -308,11 +290,7 @@ export default function ServiceCategory() {
return (
<div className="border border-solid border-BORDER p-[20px] rounded-[10px] ">
<Spin
indicator={<LoadingOutlined style={{ fontSize: 24 }} spin />}
spinning={loading}
className=""
>
<Spin indicator={<LoadingOutlined style={{ fontSize: 24 }} spin />} spinning={loading} className="">
<Tree
showIcon
draggable
@@ -10,132 +10,131 @@ import {
import { App, Form, Input } from 'antd'
import { forwardRef, useEffect, useImperativeHandle } from 'react'
export const ServiceHubCategoryConfig = forwardRef<
ServiceHubCategoryConfigHandle,
ServiceHubCategoryConfigProps
>((props, ref) => {
const { message } = App.useApp()
const [form] = Form.useForm()
const { type, entity } = props
const { fetchData } = useFetch()
export const ServiceHubCategoryConfig = forwardRef<ServiceHubCategoryConfigHandle, ServiceHubCategoryConfigProps>(
(props, ref) => {
const { message } = App.useApp()
const [form] = Form.useForm()
const { type, entity } = props
const { fetchData } = useFetch()
const save: () => Promise<boolean | string> = () => {
const url: string = 'catalogue'
let method: string
switch (type) {
case 'addCate':
case 'addChildCate':
method = 'POST'
break
case 'renameCate':
method = 'PUT'
break
}
return new Promise((resolve, reject) => {
if (!url || !method) {
reject($t(RESPONSE_TIPS.error))
return
const save: () => Promise<boolean | string> = () => {
const url: string = 'catalogue'
let method: string
switch (type) {
case 'addCate':
case 'addChildCate':
method = 'POST'
break
case 'renameCate':
method = 'PUT'
break
}
form
.validateFields()
.then(value => {
fetchData<BasicResponse<null>>(url, {
method,
eoBody: value,
eoParams: { ...(type === 'renameCate' ? { catalogue: value.id } : undefined) }
})
.then(response => {
const { code, msg } = response
if (code === STATUS_CODE.SUCCESS) {
message.success(msg || $t(RESPONSE_TIPS.success))
resolve(true)
} else {
message.error(msg || $t(RESPONSE_TIPS.error))
reject(msg || $t(RESPONSE_TIPS.error))
}
return new Promise((resolve, reject) => {
if (!url || !method) {
reject($t(RESPONSE_TIPS.error))
return
}
form
.validateFields()
.then((value) => {
fetchData<BasicResponse<null>>(url, {
method,
eoBody: value,
eoParams: { ...(type === 'renameCate' ? { catalogue: value.id } : undefined) }
})
.catch(errorInfo => reject(errorInfo))
})
.catch(errorInfo => reject(errorInfo))
})
}
useImperativeHandle(ref, () => ({
save
}))
useEffect(() => {
switch (type) {
case 'addCate':
form.setFieldsValue({})
break
case 'addChildCate':
form.setFieldsValue({ parent: entity!.id })
break
case 'renameCate':
form.setFieldsValue(entity)
break
.then((response) => {
const { code, msg } = response
if (code === STATUS_CODE.SUCCESS) {
message.success(msg || $t(RESPONSE_TIPS.success))
resolve(true)
} else {
message.error(msg || $t(RESPONSE_TIPS.error))
reject(msg || $t(RESPONSE_TIPS.error))
}
})
.catch((errorInfo) => reject(errorInfo))
})
.catch((errorInfo) => reject(errorInfo))
})
}
}, [])
return (
<WithPermission
access={
type === 'addCate'
? 'system.api_market.service_classification.add'
: 'system.api_market.service_classification.edit'
useImperativeHandle(ref, () => ({
save
}))
useEffect(() => {
switch (type) {
case 'addCate':
form.setFieldsValue({})
break
case 'addChildCate':
form.setFieldsValue({ parent: entity!.id })
break
case 'renameCate':
form.setFieldsValue(entity)
break
}
>
<Form
layout="vertical"
scrollToFirstError
labelAlign="left"
form={form}
className="mx-auto"
name="serviceHubCategoryConfig"
autoComplete="off"
>
{type === 'renameCate' && (
<Form.Item<ServiceHubCategoryConfigFieldType>
label={$t('ID')}
name="id"
hidden
rules={[{ required: true, whitespace: true }]}
>
<Input className="w-INPUT_NORMAL" placeholder={$t(PLACEHOLDER.input)} />
</Form.Item>
)}
{(type === 'addCate' || type === 'renameCate') && (
<Form.Item<ServiceHubCategoryConfigFieldType>
label={$t('分类名称')}
name="name"
rules={[{ required: true, whitespace: true }]}
>
<Input className="w-INPUT_NORMAL" placeholder={$t(PLACEHOLDER.input)} />
</Form.Item>
)}
}, [])
{type === 'addChildCate' && (
<>
return (
<WithPermission
access={
type === 'addCate'
? 'system.api_market.service_classification.add'
: 'system.api_market.service_classification.edit'
}
>
<Form
layout="vertical"
scrollToFirstError
labelAlign="left"
form={form}
className="mx-auto"
name="serviceHubCategoryConfig"
autoComplete="off"
>
{type === 'renameCate' && (
<Form.Item<ServiceHubCategoryConfigFieldType>
label={$t('父分类 ID')}
name="parent"
label={$t('ID')}
name="id"
hidden
rules={[{ required: true, whitespace: true }]}
>
<Input className="w-INPUT_NORMAL" placeholder={$t(PLACEHOLDER.input)} />
</Form.Item>
)}
{(type === 'addCate' || type === 'renameCate') && (
<Form.Item<ServiceHubCategoryConfigFieldType>
label={$t('分类名称')}
label={$t('分类名称')}
name="name"
rules={[{ required: true, whitespace: true }]}
>
<Input className="w-INPUT_NORMAL" placeholder={$t(PLACEHOLDER.input)} />
</Form.Item>
</>
)}
</Form>
</WithPermission>
)
})
)}
{type === 'addChildCate' && (
<>
<Form.Item<ServiceHubCategoryConfigFieldType>
label={$t('父分类 ID')}
name="parent"
hidden
rules={[{ required: true, whitespace: true }]}
>
<Input className="w-INPUT_NORMAL" placeholder={$t(PLACEHOLDER.input)} />
</Form.Item>
<Form.Item<ServiceHubCategoryConfigFieldType>
label={$t('子分类名称')}
name="name"
rules={[{ required: true, whitespace: true }]}
>
<Input className="w-INPUT_NORMAL" placeholder={$t(PLACEHOLDER.input)} />
</Form.Item>
</>
)}
</Form>
</WithPermission>
)
}
)
@@ -1,7 +1,6 @@
import { DefaultOptionType } from 'antd/es/select'
import { EntityItem } from '@common/const/type'
import { SubscribeEnum, SubscribeFromEnum } from '@core/const/system/const'
import WithPermission from '@common/components/aoplatform/WithPermission'
import { DefaultOptionType } from 'antd/es/select'
export type ServiceBasicInfoType = {
app: EntityItem
@@ -37,7 +36,6 @@ export type ServiceHubCategoryConfigFieldType = {
export type ServiceHubCategoryConfigProps = {
type: 'addCate' | 'addChildCate' | 'renameCate'
entity?: { [k: string]: unknown }
WithPermission: typeof WithPermission
}
export type ServiceHubCategoryConfigHandle = {
@@ -5,7 +5,7 @@ import WithPermission from '@common/components/aoplatform/WithPermission'
import { BasicResponse, DATA_SHOW_TYPE_OPTIONS, RESPONSE_TIPS, STATUS_CODE } from '@common/const/const'
import { SimpleTeamItem } from '@common/const/type'
import { useBreadcrumb } from '@common/contexts/BreadcrumbContext'
import { GlobalProvider, useGlobalContext } from '@common/contexts/GlobalStateContext'
import { useGlobalContext } from '@common/contexts/GlobalStateContext'
import { useFetch } from '@common/hooks/http'
import { $t } from '@common/locales'
import { RouterParams } from '@core/components/aoplatform/RenderRoutes'
@@ -158,28 +158,8 @@ export default function ServiceHubManagement() {
switch (type) {
case 'add':
title = $t('添加消费者')
content = (
<GlobalProvider>
<ManagementConfig ref={addManagementRef} dataShowType={dataShowType} type={type} teamId={teamId!} />
</GlobalProvider>
)
content = <ManagementConfig ref={addManagementRef} dataShowType={dataShowType} type={type} teamId={teamId!} />
break
// case 'edit':{
// title='配置 Open Api'
// message.loading('正在加载数据')
// const {code,data,msg} = await fetchData<BasicResponse<{app:ManagementConfigFieldType}>>('external-app',{method:'GET',eoParams:{id:entity!.id}})
// message.destroy()
// if(code === STATUS_CODE.SUCCESS){
// content=<ManagementConfig ref={editManagementRef} type={type} entity={data.app}/>
// }else{
// message.error(msg || $t(RESPONSE_TIPS.error))
// return
// }
// break;}
// case 'delete':
// title='删除'
// content='该数据删除后将无法找回,请确认是否删除?'
// break;
}
modal.confirm({
+1 -1
View File
@@ -28,7 +28,7 @@
b: "subscription_service:#{application}"
response:
status_code: 403
content_type: "text/plan"
content_typ: "text/plan"
charset: "utf-8"
body: "Forbidden"
+2 -2
View File
@@ -1,4 +1,4 @@
version: v8
version: v7
sort:
- "access_log"
- "monitor"
@@ -41,7 +41,7 @@ plugin:
b: "subscription_service:#{application}"
response:
status_code: 403
content_type: "text/plan"
content_typ: "text/plan"
charset: "utf-8"
body: "Forbidden"