Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: support image generate #116

Merged
merged 3 commits into from
Mar 28, 2023
Merged

feat: support image generate #116

merged 3 commits into from
Mar 28, 2023

Conversation

ayangweb
Copy link
Member

No description provided.

@@ -101,6 +106,7 @@
"useCssModule": true,
"useCssVars": true,
"useDisableShortcuts": true,
"useInit": true,
"useObserverLink": true,
"useRoleStore": true,
"useSessionStore": true,
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这是一段代码的修改,主要增加了两个变量ImageCost和calcImageSize,以及三个函数getAiImage、getOpenAIImage和saveImageFromBase64。其中getAiImage和getOpenAIImage涉及到API调用,需要确保安全性;saveImageFromBase64可能会影响性能,可以考虑优化。建议在使用这些变量和函数时,要对它们进行必要的输入验证和异常处理,避免潜在的漏洞。另外,注释应该清晰明了,尽量避免歧义。

@@ -141,4 +141,4 @@ npm run build:icon

## License

[MIT](./LICENSE)
[MIT License](./LICENSE)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码看起来很简短,只是修改了许可证的标题。

我没有看到任何明显的错误风险。这个小修补程序不太可能引入新的错误,因为它只是一个文本编辑。

如果你想改进代码,那么将许可证URL替换成完整的URL可能会更好。其他可能的改进可能需要更多关于上下文和代码库的信息才能评估。

const reg = /name\s*=\s*"chatgpt-desktop"\s*version\s*=\s*"\d+\.\d+\.\d+"/
const reg = new RegExp(
`name\\s*=\\s*"${name}"\\s*version\\s*=\\s*"\\d+.\\d+.\\d+"`
)

content = content.replace(reg, `name = "${name}"\nversion = "${version}"`)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码是用于更新一个名为"chatgpt-desktop"的依赖包的版本号。以下是我的一些评价:

  • 变量name没有在代码片段中定义,因此需要在这个变量被使用之前确认是否已经定义了。
  • 在这个正则表达式中,\\d+被用来匹配一个或多个数字,并且这个匹配模式被用来确定版本号。然而,在实际的使用中,可能会遇到一些不符合此规则的版本信息,例如alpha、beta版本等。因此,应该使用更加灵活的方法来匹配版本信息。
  • 这个代码片段看起来只能匹配 tomlDirlockDir两种目录下的文件。如果需要更新其他目录下的依赖包版本信息,就需要额外的代码来处理这些目录下的文件。

对于改进,我建议进行以下操作:

  • 首先,应该保证能够安全地更新所有的依赖包版本信息。这可以通过更加智能的正则表达式来实现。例如,可以使用SemVer语义化版本号规范(https://semver.org/),以确保正确地匹配版本信息。
  • 其次,应该考虑将name变量作为输入参数传递给updateCargoVersion函数,以使得函数能够更新任何名称的依赖包的版本信息。

@ayangweb ayangweb merged commit 394036e into master Mar 28, 2023
checkVersion()
setInterval(() => {
checkVersion()
}, 1000 * 60 * 60 * 24)
</script>

<template>
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个代码片段中,已经有一些变量和函数被定义了:

  • isFix: 一个布尔值,代表是否需要修复程序
  • isLoading: 一个布尔值,代表应用程序是否正在加载中
  • windowClass: 一个字符串,代表窗口的 CSS 类名

代码中使用了一些 Vue3 的 API,例如 script setuprefwatchonMounted

在代码的开头,引入了两个 Tauri 的模块:@tauri-apps/api/window@tauri-apps/api/os,但在后面没有使用到它们。

onMounted 钩子中,调用了 initSQL 函数,但是这个函数并没有在代码片段中出现,可能是定义在其他地方的。除此之外,还对一些事件进行了监听和处理,例如窗口焦点的改变、鼠标右键菜单的禁用等。

最后,在模板部分没有任何内容。

至于改进的建议,首先可以移除未使用到的模块。其次,可以考虑将 isFixisLoading 的初始化逻辑放在 useInit 函数里,这样就避免了重复的代码。最后,可以将常量和变量的命名更加清晰明了,例如将 windowClass 改成 windowClassName 等。

},
body: Body.json(imageData)
})
}
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码补丁主要有两个改动:

  1. 引入了类型 ImageData,用于描述图像数据。
  2. 添加了导出函数 getOpenAIImage,用于根据提示生成图像。

代码本身没有明显的 bug 风险,但是可以考虑一些改进:

  1. 在 getOpenAIImage 函数中,如果没有传入图像数据,则直接返回。这样做可能会使调用者不知道该函数是否成功执行,建议增加一个异常抛出或者返回错误信息,以便提高代码可读性和鲁棒性。
  2. 在函数 getOpenAICreditApi 中,存在一个潜在的 bug 风险,即 CreditResponse 结构体中的 credit_remaining 属性可能为 null。建议增加一个判空操作或者给 credit_remaining 属性设置默认值,以避免空指针异常。
  3. 可以考虑优化 request 函数的实现方式,使用 axios 等第三方库来发送 HTTP 请求,同时也能够提供更多的配置选项和拦截器功能,提高代码的可扩展性和可维护性。

</template>
</a-dropdown>
</a-tooltip>
</template>
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码是一个Vue 3组件,通过使用<script setup>语法来编写组件逻辑。在模板中,它展示了一个下拉菜单,让用户选择当前会话的类型。

这段代码看起来没有明显的漏洞风险。以下是一些建议:

  • 在处理 handleSelect 函数时,应该考虑错误处理和用户反馈。例如,如果无法完成会话切换,或者出现其他问题,组件应该向用户发出警告或错误消息。
  • 可以尝试优化代码性能。例如,使用 computed 属性缓存计算结果,或避免不必要的重渲染。但此处代码量有限,似乎并不需要进行更多的优化。

总的来说,这段代码看起来良好,没有明显的问题,可以提交。

</template>
</a-dropdown>
</a-tooltip>
</template>
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码使用了 Vue.js 框架和 TypeScript 语言。下面是一些问题和改进建议:

  • 定义 disabled 计算属性时,应该将依赖项声明为响应式数据(即用 toRefs 转换),以保证每当相关的 store 数据更新时都能自动更新 disabled 值。
  • 在模板中使用 template 标签来定义插槽内容可以增加代码的可读性。
  • 如果只有一个元素需要插入到插槽中,则可以简化为直接将元素作为组件的嵌套子元素,不必使用 template 插槽。
  • 当下拉菜单选项过多时,应该添加滚动条或分页来避免占用过多空间。
  • 可以添加更多导出格式的选项,并在选择不同的格式时触发不同的方法。

除此之外,这段代码没有明显的 bug 风险。

</template>
</a-button>
</a-tooltip>
</template>
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码是一个Vue 3组件,包含了一些状态和处理函数。

从视觉上看,这段代码似乎很简短,大部分逻辑都被抽象成函数或变量。但是,仅凭这段代码本身,我们无法知道它所在的环境或更广泛的应用程序架构。因此,在进行代码审查时,请务必考虑代码的上下文和用途。

以下是我对这段代码的高层次审查:

  • 此组件名称未提供,建议添加组件名称以便更好理解组件功能。
  • <script setup> 块中使用了 useSessionStore()storeToRefs(),这表明该组件依赖于某种状态管理模式,需要进一步检查其实现是否正确并尽可能地遵循响应式编程范式。
  • handleClick() 函数中存在条件分支语句,这可能会增加代码分歧和难度。建议将其拆分为更具体的函数来改进可读性和维护性。
  • icon-stop 组件和 icon-refresh 组件是自定义组件,需要检查其实现以确保其功能正确且没有潜在的错误。
  • <a-tooltip><a-button> 是Ant Design Vue库中的组件,需要检查其用法以确保其与组件所依赖的其他库的兼容性。

总之,需要深入了解上下文和应用程序特定的需求才能更全面地进行代码审查。

</div>
</template>

<style scoped lang="scss"></style>
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码使用了 Vue3 的 script setup,并引入了两个 store 中的值。通过 watch 监听输入框内容和记忆模式切换,计算出角色描述、输入内容和记忆列表中字符数总和,最后将结果赋值给 tokenUsage

computed 计算属性 tokenExceed 判断 tokenUsage 是否超过阈值 3800,若超过则在 tooltip 中显示警告信息。

在模板中,根据是否处于记忆模式来判断是否需要显示“记忆模式”字样,同时展示预计消耗的 token 数量,若超过最大阈值则将数字标为红色。

至于存在的风险和改进建议,由于代码不完整,我无法准确评估代码。但是从这段代码片段的局部来看,没有发现特别明显的问题。如果代码集成在一个更大的项目中,可以考虑对其进行全面测试,以确保其正确性和稳定性。

<a-option v-for="i in 10" :key="i">{{ i }}</a-option>
</a-select>
</div>
</div>
</div>
</template>

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码主要是关于一个聊天界面的交互部分,其中包含了输入框以及相关的一些处理逻辑。以下是我对这段代码的简要评估:

  • 在第 4 行,增加了一个名为 currentSession 的变量。但是没有看到该变量定义在哪里,可能需要确认该变量的来源。
  • 第 7-10 行定义了一个 roleStore 变量,其中的 textAreaValuepopoverVisible 属性的类型和名称与原来的不同,需要确认是否有必要更改属性的名称。
  • 在第 14 行,定义了一个组件中的 textAreaElement 变量,但是并没有使用它,可能是多余的代码。
  • 在第 21-24 行,当用户按下回车键时会执行 getAiMessage(value)getAiIamge(value) 函数。但是没有看到这两个函数的定义,需要确认其实现是否正确。
  • 在第 31-42 行,增加了一个 div 元素用来处理图片生成的逻辑。建议将其封装成一个单独的组件,使得代码更易读和管理。

除此之外,这份代码看起来比较简洁和易懂,没有明显的错误和潜在风险。如果你能提供更多上下文和其他文件的话,我们可以做更深入的评估和优化建议。

{{ calcToken(data) }}
</span>
</div>
</template>
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码是一个Vue组件,通过props接收一个包含会话数据的对象,根据会话类型计算消耗的“token”,并在界面上展示出来。以下是我的一些建议:

  • 在 calcToken 函数中,有一个未定义的行为:在过滤 sessionDataList 过程中,使用了未定义的变量 data.id! < data.id!,这可能是笔误或者拷贝时不小心多复制了一遍。建议改成 data.id! < data.id(只留下一个感叹号)。
  • 目前针对图片消息的消耗token的逻辑被注释掉了,内部有一些TODO注释。如果这个组件处理图片消息的话,可以继续完善这个逻辑。
  • 建议将模板中的 Avatar 组件提取到单独的 props 中,使得这个组件更加通用,可以用于展示其他用户头像等。
  • 另外一些小优化,比如在 if 判断时可以使用 "===" 而不是 "==",简化代码可读性。

希望这些意见能够帮助你进一步完善代码!

</template>
</a-image>
</a-space>
</a-image-preview-group>
</div>
</div>
</div>
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码看起来有一些问题:

  1. useSettingsStore()useRoleStore() 似乎在此文件中未使用,因此可以删除这两个引用。
  2. calcToken 方法似乎也不是在此文件中使用,可以考虑将其移到另外一个文件或者删除它。
  3. watch 中,当 currentSession?.type === 'text' 时,会渲染一个没有内容的 <div> 元素,这看起来有点奇怪。可能需要检查是否需要给这个元素添加一些默认的文本或者其他内容。
  4. 关于代码改进的建议,可以考虑将 <SessionAvatar><div> 中的 <Avatar> 重构为同一组件,这样可以减少重复代码并提高组件的可维护性。

希望这些意见能对你有所帮助。

填写代理地址后,请点击<span class="mark cursor-pointer" @click="refresh"
填写代理地址后,请点击<span
class="mark cursor-pointer"
@click="relaunch"
>重启</span
>
</span>
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码补丁主要做了以下更改:

  1. 引入了 @tauri-apps/api/process 模块中的 relaunch 方法
  2. 删除了之前定义但未使用的 refresh 方法
  3. 在模板中增加了一个点击事件,点击后会调用 relaunch 方法

对于代码风格和语法上没有发现问题。关于代码风险和改进建议:

  1. relaunch 方法可能存在一定的风险,需谨慎使用。
  2. 模板中的注释可以进一步完善,提高代码可读性。
  3. 在判断是否需要重启应用时,可以增加更精细的逻辑判断,例如只有代理地址发生变化才需要重启应用。

'256x256' = 8000,
'512x512' = 9000,
'1024x1024' = 10000
}
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码补丁是在原来的代码中添加了一个名为"ImageCost"的枚举类型,其中包含三个属性:"256x256"、"512x512"和"1024x1024",它们的值分别为8000、9000和10000。这个枚举类型似乎没有什么问题,但是如果需要使用更大或者更小的图像尺寸,可以考虑对枚举类型进行扩展。

@@ -1,2 +1,3 @@
export * from './useObserverLink'
export * from './useDisableShortcuts'
export * from './useInit'
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码补丁很短,只是添加了一个新的导出项。从代码片段来看难以判断是否存在风险或漏洞,但可以提供一些潜在的改进建议。

首先,为了确保代码的可读性和可维护性,在文件的开头应该添加注释,说明此文件用途、作者、最后修改时间等信息。

其次,可以考虑使用默认导出而不是命名导出。默认导出可以更方便地导入模块,并且可以使代码更易于理解和扩展。

最后,对于添加的新功能useInit,可以考虑添加单元测试以确保其正确性和稳定性。

)

return { isLoading, windowClass }
}
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这是一个Vue的组合式函数,主要包含以下功能:

  1. 在组件挂载时初始化SQL数据库。
  2. 运行checkVersion函数以检查应用程序版本,并定期(每隔一天)检查版本。
  3. 禁用快捷键。
  4. 监听窗口焦点变化,并在失去焦点并且未启用“固定”模式时隐藏窗口。
  5. 根据操作系统不同,为窗口添加边框或圆角样式。
  6. 在生产环境下防止右键菜单。

目前代码没有明显的漏洞风险。对于改进,可能需要注意以下几个方面:

  1. checkVersion函数是否需要异步执行,否则可能会阻塞主线程。
  2. 为了更好的可读性和可维护性,可以考虑将某些功能封装成独立的函数或模块。
  3. 针对特定平台的条件语句可以考虑重构,使其更加简洁易懂。

以上仅为建议,具体根据项目需求进行适当调整。

`UPDATE ${tableName} SET ${updateParams.join()} WHERE id=${payload.id};`
`UPDATE ${tableName} SET ${updateParams.join()} WHERE id=${getValue(
payload.id
)};`
)
}

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

该代码补丁主要作用在 SQL 数据库表中添加列,主要的修改是:

  1. 在 "session" 表中添加 "type" 列,用于记录对话类型。
  2. 在 "initSQL" 函数中添加对 "session" 表的 "type" 列的创建和默认值设置。
  3. 在 "updateSQL" 函数中对参数进行了转义,以避免 SQL 注入攻击。

代码看起来没有明显的风险或漏洞。建议在代码提交之前执行测试用例,并根据需要添加更多细节注释以提高代码可读性。

@@ -118,6 +123,7 @@ export const useRoleStore = defineStore(
filterRoleList,
popoverVisible,
textAreaValue,
imageValue,
isEdit,
getRoleList,
getFilterRoleList,
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码看起来很简洁,没有明显的 bug 风险。这里有两个改进建议:

  1. useRoleStore 中使用 defineStore API 时,请确保在此之前已经安装了 @vue/runtime-core 模块,否则会抛出错误。

  2. 对于 imageValue,如果您打算将其用作全局状态,则可以使用 ref 替换 reactive,因为它只是一个简单的对象,并不需要响应式转换。

}
},
{
persist: {
paths: ['currentSession']
paths: ['currentSession', 'sessionType']
}
}
)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码的主要功能似乎是创建、更新和删除会话,以及添加和更新会话数据。

以下是可能存在的问题和建议:

  1. createNewSession 函数中使用了 currentSession.value,但没有清晰地说明它是什么,因此应该在函数开头添加注释或提供更好的命名。

  2. createNewSession 中,如果 currentSession.value 为假,则函数返回而不执行任何操作。这是意外的行为,应该抛出一个错误或允许在这种情况下继续执行。

  3. addSessionData 中,根据 messageType 的值,会话数据被插入到不同的表格中。如果有其他类型的消息,代码需要相应地更新。

  4. updateSession 中使用了字符串插值来构建 SQL 查询,这可能导致 SQL 注入攻击。应该使用参数化查询而不是字符串插值来防止 SQL 注入攻击。

  5. switchSession 中,函数首先清空了 sessionDataList.value 数组,然后异步调用多个方法。如果这些方法在 setTimeout 回调运行之前立即修改了 sessionDataList.value,则可能会导致数据不一致或错误的结果。建议在对所有异步操作完成后再清空数组。

  6. changeLastSessionContent 函数似乎只能修改最后一条消息的内容,并且没有检查是否可以修改。应该添加检查并返回错误或警告,以及提供一个更好的函数命名。

@@ -33,6 +43,7 @@ export interface SessionPayload {
role_id: number
update_time?: string
name?: string
type: MessageType
isEdit?: boolean
}

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码主要是 TypeScript 中定义了一些类型和接口。以下是我的一些建议:

  1. ImageData 接口中的 n 属性名不太直观,可以改为更有描述性的名称。
  2. MessageData 接口中的 content 属性应该有一个明确的类型定义,而不是使用 any
  3. SessionPayload 接口中新增的 type: MessageType 属性没有定义,需要在其他地方定义或者补充上来。
  4. 没有看到具体的实现代码,无法准确判断是否存在潜在的 bug 风险。

最后,建议添加更多注释以增强代码可读性。

@@ -4,4 +4,4 @@ export * from './keyMap'
export * from './saveImage'
export * from './copy'
export * from './saveMarkdown'
export * from './openai'
export * from './openAi'
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码仅仅是导出了几个模块,没有实际的执行内容。对于这个代码片段,我们可以从以下几个方面进行评估:

  • 命名风格:在第5行中,文件名为saveMarkdown,而不是saveMarkDown,其中"D"是大写的,这种不一致的命名风格可能会影响代码的可读性。因此,应该使用一致的命名风格。
  • 文件引入:在第7行中,从'./copy'中导出了一个未知的函数,这可能会导致调用该函数时出现问题。在这种情况下,应该查看'./copy'中导出的函数并确认它们是否符合预期。
  • 文件名:在第9行中,文件名为'./openai',但是在修改后的行中,文件名变成了'./openAi',这可能会导致找不到模块的错误。因此,需要检查文件名是否正确并确保代码的其他部分引用了正确的文件名。

总体来说,这段代码片段的主要问题是一致性和文件引入。应该修复命名风格和检查文件引入以提高代码的可维护性和可重用性。

} finally {
isThinking.value = false
}
}
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码看起来是一段 TypeScript 代码,主要用于调用 OpenAI 的 API 进行文本或者图片的生成,具体可分为两个部分:getAiMessage 和 getAiIamge。以下是我的一些建议和注意事项:

  1. 在 getAiMessage 中,可以将 try-catch 块中的错误信息改为 error.message,以更好地反映错误。

  2. 在 catch 块中,将 sessionDataList.value.at(-1)!.message.content 赋值给类型为 any 的 message 变量存在潜在的安全隐患,建议使用 as string 或者定义一个合适的类型。

  3. 在 getAiIamge 中,需要确保传入的 value 参数不为空,否则会抛出异常。

  4. 在添加正常提问时,可以先检查参数的合法性,以避免发生意外的错误。

  5. 修改最近一次会话内容的函数名 changeLastSessionContent 不够准确,应该改为 updateLastSessionContent 更符合其实际作用。

  6. 最后,在使用 try-catch 块时,尽量精确地捕获异常,以便于更好地排除错误。

以上是我的一些建议,希望对你有所帮助。

}

return
}
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码的作用是将指定节点的内容转换成图片,并保存到本地。以下是我的建议和风险提示:

1.引入类型时,使用相对路径(import type { ImageSize } from '@/types')。如果不是必须要使用绝对路径,请尽量使用相对路径。

2.在函数外部定义一个写入图片的函数(writeImage),可以使代码更模块化和易于管理。

3.在saveImageFromBase64函数中,需要将base64字符串转换为ArrayBuffer对象,而不是number[]数组。

4.计算图像大小的函数calcImageSize返回了undefined,因为异步操作img.onload无法同步返回值。您可以使用Promise或回调函数来处理该问题。

5.没有处理异常情况下的潜在错误,例如:无法写入文件、找不到id对应的元素等。请确保在执行异步操作之前检查元素是否存在,并捕获可能发生的异常。

6.最后,建议使用ESLint等工具来检查代码格式和潜在的问题,以确保代码的可读性和稳定性。

@@ -13,7 +13,7 @@ const marked = new MarkdownIt({
})

export const checkVersion = async () => {
const updateInfo = await checkUpdate()
const updateInfo = await checkUpdate().catch(() => null)

if (!updateInfo || !updateInfo.manifest) return

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段代码看起来比较简单,主要是导入了一个MarkdownIt库和一个异步函数checkVersion。在checkVersion函数中,它使用了一个异步函数checkUpdate()来检查更新信息,并且在调用checkUpdate()时通过.catch(() => null)捕获了可能的异常。

从风险角度看,如果checkUpdate()函数出现了错误并返回了无效的数据,那么这个函数就会继续执行而不会抛出任何错误。因此,我们需要确保checkUpdate()在出现错误时能够正确地处理异常情况,并且在必要的情况下抛出适当的错误。

另外,由于没有看到checkUpdate()函数的定义,我无法评估它的质量和安全性。因此,如果有必要的话,我们可能需要对checkUpdate()函数进行进一步的审核和测试。

关于改进建议,我建议可以添加更多的注释,以便其他开发人员更容易理解代码和实现细节。此外,如果代码被用于生产环境,还应该考虑添加日志记录和错误处理机制,以便更好地监控和管理应用程序的行为。

@ayangweb ayangweb deleted the dev/image branch March 29, 2023 08:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants