mirror of
https://github.com/yangjian102621/geekai.git
synced 2025-11-12 12:13:46 +08:00
merge and resolve conflicts
This commit is contained in:
@@ -1,5 +1,11 @@
|
|||||||
# 更新日志
|
# 更新日志
|
||||||
|
|
||||||
|
## v4.1.9
|
||||||
|
|
||||||
|
- 功能优化:优化系统配置,移除已废弃的配置项
|
||||||
|
- 功能优化:GPT-O1 模型支持流式输出
|
||||||
|
- 功能优化:优化代码引用快样式,支持主题切换
|
||||||
|
|
||||||
## v4.1.8
|
## v4.1.8
|
||||||
|
|
||||||
- 功能优化:**UI 全新改版,支持主题切换**。 :rocket: :rocket: :rocket:
|
- 功能优化:**UI 全新改版,支持主题切换**。 :rocket: :rocket: :rocket:
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ type SystemConfig struct {
|
|||||||
AdminTitle string `json:"admin_title,omitempty"` // 管理后台标题
|
AdminTitle string `json:"admin_title,omitempty"` // 管理后台标题
|
||||||
Logo string `json:"logo,omitempty"` // 方形 Logo
|
Logo string `json:"logo,omitempty"` // 方形 Logo
|
||||||
InitPower int `json:"init_power,omitempty"` // 新用户注册赠送算力值
|
InitPower int `json:"init_power,omitempty"` // 新用户注册赠送算力值
|
||||||
DailyPower int `json:"daily_power,omitempty"` // 每日签到赠送算力
|
DailyPower int `json:"daily_power,omitempty"` // 每日签到赠送算力
|
||||||
InvitePower int `json:"invite_power,omitempty"` // 邀请新用户赠送算力值
|
InvitePower int `json:"invite_power,omitempty"` // 邀请新用户赠送算力值
|
||||||
VipMonthPower int `json:"vip_month_power,omitempty"` // VIP 会员每月赠送的算力值
|
VipMonthPower int `json:"vip_month_power,omitempty"` // VIP 会员每月赠送的算力值
|
||||||
|
|
||||||
@@ -146,7 +146,7 @@ type SystemConfig struct {
|
|||||||
MjPower int `json:"mj_power,omitempty"` // MJ 绘画消耗算力
|
MjPower int `json:"mj_power,omitempty"` // MJ 绘画消耗算力
|
||||||
MjActionPower int `json:"mj_action_power,omitempty"` // MJ 操作(放大,变换)消耗算力
|
MjActionPower int `json:"mj_action_power,omitempty"` // MJ 操作(放大,变换)消耗算力
|
||||||
SdPower int `json:"sd_power,omitempty"` // SD 绘画消耗算力
|
SdPower int `json:"sd_power,omitempty"` // SD 绘画消耗算力
|
||||||
DallPower int `json:"dall_power,omitempty"` // DALL-E-3 绘图消耗算力
|
DallPower int `json:"dall_power,omitempty"` // DALL-E-3 绘图消耗算力
|
||||||
SunoPower int `json:"suno_power,omitempty"` // Suno 生成歌曲消耗算力
|
SunoPower int `json:"suno_power,omitempty"` // Suno 生成歌曲消耗算力
|
||||||
LumaPower int `json:"luma_power,omitempty"` // Luma 生成视频消耗算力
|
LumaPower int `json:"luma_power,omitempty"` // Luma 生成视频消耗算力
|
||||||
AdvanceVoicePower int `json:"advance_voice_power,omitempty"` // 高级语音对话消耗算力
|
AdvanceVoicePower int `json:"advance_voice_power,omitempty"` // 高级语音对话消耗算力
|
||||||
@@ -160,7 +160,6 @@ type SystemConfig struct {
|
|||||||
SdNegPrompt string `json:"sd_neg_prompt"` // SD 默认反向提示词
|
SdNegPrompt string `json:"sd_neg_prompt"` // SD 默认反向提示词
|
||||||
MjMode string `json:"mj_mode"` // midjourney 默认的API模式,relax, fast, turbo
|
MjMode string `json:"mj_mode"` // midjourney 默认的API模式,relax, fast, turbo
|
||||||
|
|
||||||
IndexBgURL string `json:"index_bg_url"` // 前端首页背景图片
|
|
||||||
IndexNavs []int `json:"index_navs"` // 首页显示的导航菜单
|
IndexNavs []int `json:"index_navs"` // 首页显示的导航菜单
|
||||||
Copyright string `json:"copyright"` // 版权信息
|
Copyright string `json:"copyright"` // 版权信息
|
||||||
MarkMapText string `json:"mark_map_text"` // 思维导入的默认文本
|
MarkMapText string `json:"mark_map_text"` // 思维导入的默认文本
|
||||||
|
|||||||
@@ -101,8 +101,8 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session *types.ChatSessio
|
|||||||
}
|
}
|
||||||
// 兼容 GPT-O1 模型
|
// 兼容 GPT-O1 模型
|
||||||
if strings.HasPrefix(session.Model.Value, "o1-") {
|
if strings.HasPrefix(session.Model.Value, "o1-") {
|
||||||
utils.SendChunkMsg(ws, "AI 正在思考...\n")
|
utils.SendChunkMsg(ws, "> AI 正在思考...\n")
|
||||||
req.Stream = false
|
req.Stream = session.Stream
|
||||||
session.Start = time.Now().Unix()
|
session.Start = time.Now().Unix()
|
||||||
} else {
|
} else {
|
||||||
req.MaxTokens = session.Model.MaxTokens
|
req.MaxTokens = session.Model.MaxTokens
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ func (h *ChatHandler) sendOpenAiMessage(
|
|||||||
start := time.Now()
|
start := time.Now()
|
||||||
var apiKey = model.ApiKey{}
|
var apiKey = model.ApiKey{}
|
||||||
response, err := h.doRequest(ctx, req, session, &apiKey)
|
response, err := h.doRequest(ctx, req, session, &apiKey)
|
||||||
logger.Info("HTTP请求完成,耗时:", time.Now().Sub(start))
|
logger.Info("HTTP请求完成,耗时:", time.Since(start))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if strings.Contains(err.Error(), "context canceled") {
|
if strings.Contains(err.Error(), "context canceled") {
|
||||||
return fmt.Errorf("用户取消了请求:%s", prompt)
|
return fmt.Errorf("用户取消了请求:%s", prompt)
|
||||||
@@ -89,6 +89,12 @@ func (h *ChatHandler) sendOpenAiMessage(
|
|||||||
var function model.Function
|
var function model.Function
|
||||||
var toolCall = false
|
var toolCall = false
|
||||||
var arguments = make([]string, 0)
|
var arguments = make([]string, 0)
|
||||||
|
|
||||||
|
if strings.HasPrefix(req.Model, "o1-") {
|
||||||
|
content := fmt.Sprintf("AI 思考结束,耗时:%d 秒。\n\n", time.Now().Unix()-session.Start)
|
||||||
|
utils.SendChunkMsg(ws, content)
|
||||||
|
}
|
||||||
|
|
||||||
scanner := bufio.NewScanner(response.Body)
|
scanner := bufio.NewScanner(response.Body)
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
line := scanner.Text()
|
line := scanner.Text()
|
||||||
@@ -150,10 +156,10 @@ func (h *ChatHandler) sendOpenAiMessage(
|
|||||||
// output stopped
|
// output stopped
|
||||||
if responseBody.Choices[0].FinishReason != "" {
|
if responseBody.Choices[0].FinishReason != "" {
|
||||||
break // 输出完成或者输出中断了
|
break // 输出完成或者输出中断了
|
||||||
} else {
|
} else { // 正常输出结果
|
||||||
content := responseBody.Choices[0].Delta.Content
|
content := responseBody.Choices[0].Delta.Content
|
||||||
contents = append(contents, utils.InterfaceToString(content))
|
contents = append(contents, utils.InterfaceToString(content))
|
||||||
utils.SendChunkMsg(ws, responseBody.Choices[0].Delta.Content)
|
utils.SendChunkMsg(ws, content)
|
||||||
}
|
}
|
||||||
} // end for
|
} // end for
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,6 @@ VUE_APP_ADMIN_USER=admin
|
|||||||
VUE_APP_ADMIN_PASS=admin123
|
VUE_APP_ADMIN_PASS=admin123
|
||||||
VUE_APP_KEY_PREFIX=GeekAI_DEV_
|
VUE_APP_KEY_PREFIX=GeekAI_DEV_
|
||||||
VUE_APP_TITLE="Geek-AI 创作系统"
|
VUE_APP_TITLE="Geek-AI 创作系统"
|
||||||
VUE_APP_VERSION=v4.1.8
|
VUE_APP_VERSION=v4.1.9
|
||||||
VUE_APP_DOCS_URL=https://docs.geekai.me
|
VUE_APP_DOCS_URL=https://docs.geekai.me
|
||||||
VUE_APP_GIT_URL=https://github.com/yangjian102621/geekai
|
VUE_APP_GIT_URL=https://github.com/yangjian102621/geekai
|
||||||
|
|||||||
@@ -2,6 +2,6 @@ VUE_APP_API_HOST=
|
|||||||
VUE_APP_WS_HOST=
|
VUE_APP_WS_HOST=
|
||||||
VUE_APP_KEY_PREFIX=GeekAI_
|
VUE_APP_KEY_PREFIX=GeekAI_
|
||||||
VUE_APP_TITLE="Geek-AI 创作系统"
|
VUE_APP_TITLE="Geek-AI 创作系统"
|
||||||
VUE_APP_VERSION=v4.1.8
|
VUE_APP_VERSION=v4.1.9
|
||||||
VUE_APP_DOCS_URL=https://docs.geekai.me
|
VUE_APP_DOCS_URL=https://docs.geekai.me
|
||||||
VUE_APP_GIT_URL=https://github.com/yangjian102621/geekai
|
VUE_APP_GIT_URL=https://github.com/yangjian102621/geekai
|
||||||
|
|||||||
@@ -85,4 +85,8 @@
|
|||||||
--van-tabbar-background: #141a36;
|
--van-tabbar-background: #141a36;
|
||||||
--van-nav-bar-background: #1B244A;
|
--van-nav-bar-background: #1B244A;
|
||||||
--van-dropdown-menu-background: #141a36;
|
--van-dropdown-menu-background: #141a36;
|
||||||
|
|
||||||
|
// 引用快样式
|
||||||
|
--quote-bg-color: #1F243F;
|
||||||
|
--quote-text-color: #fff;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,6 +48,10 @@
|
|||||||
// code 标签背景
|
// code 标签背景
|
||||||
--code-bg-color: #ececec;
|
--code-bg-color: #ececec;
|
||||||
--code-text-color: var(--el-color-primary);
|
--code-text-color: var(--el-color-primary);
|
||||||
|
|
||||||
|
// 引用快样式
|
||||||
|
--quote-bg-color: #e0dfff;
|
||||||
|
--quote-text-color: #333;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="chat-item">
|
<div class="chat-item">
|
||||||
<div class="content" v-html="md.render(processContent(data.content))"></div>
|
<div class="content-wrapper" v-html="md.render(processContent(data.content))"></div>
|
||||||
<div class="bar" v-if="data.created_at">
|
<div class="bar" v-if="data.created_at">
|
||||||
<span class="bar-item"
|
<span class="bar-item"
|
||||||
><el-icon><Clock /></el-icon> {{ dateFormat(data.created_at) }}</span
|
><el-icon><Clock /></el-icon> {{ dateFormat(data.created_at) }}</span
|
||||||
@@ -172,48 +172,10 @@ const reGenerate = (prompt) => {
|
|||||||
--font-family: Menlo,"微软雅黑","Roboto Mono","Courier New",Courier,monospace,"Inter",sans-serif;
|
--font-family: Menlo,"微软雅黑","Roboto Mono","Courier New",Courier,monospace,"Inter",sans-serif;
|
||||||
font-family: var(--font-family);
|
font-family: var(--font-family);
|
||||||
|
|
||||||
.chat-line-reply-list {
|
.chat-line {
|
||||||
justify-content: center;
|
.chat-item {
|
||||||
background-color: var(--chat-list-bg);
|
.content-wrapper {
|
||||||
color:var(--theme-text-color-primary);
|
|
||||||
width 100%
|
|
||||||
padding-bottom: 1.5rem;
|
|
||||||
padding-top: 1.5rem;
|
|
||||||
border-bottom: 0.5px solid var(--el-border-color);
|
|
||||||
|
|
||||||
.chat-line-inner {
|
|
||||||
display flex;
|
|
||||||
width 100%;
|
|
||||||
max-width 900px;
|
|
||||||
padding-left 10px;
|
|
||||||
|
|
||||||
.chat-icon {
|
|
||||||
margin-right 20px;
|
|
||||||
|
|
||||||
img {
|
img {
|
||||||
width: 36px;
|
|
||||||
height: 36px;
|
|
||||||
border-radius: 50%;
|
|
||||||
padding: 1px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-item {
|
|
||||||
width 100%
|
|
||||||
position: relative;
|
|
||||||
padding: 0;
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
.content {
|
|
||||||
min-height 20px;
|
|
||||||
word-break break-word;
|
|
||||||
padding: 0
|
|
||||||
color:var(--theme-text-color-primary);
|
|
||||||
font-size: var(--content-font-size);
|
|
||||||
border-radius: 5px;
|
|
||||||
overflow auto;
|
|
||||||
|
|
||||||
img {
|
|
||||||
max-width: 600px;
|
max-width: 600px;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
}
|
}
|
||||||
@@ -224,11 +186,6 @@ const reGenerate = (prompt) => {
|
|||||||
code {
|
code {
|
||||||
color:var(--theme-text-color-primary);
|
color:var(--theme-text-color-primary);
|
||||||
font-weight 600
|
font-weight 600
|
||||||
// color:#fff
|
|
||||||
// background-color var(--el-color-primary-light-3)
|
|
||||||
// background-color: var(--el-color-primary);
|
|
||||||
// padding 3px 5px;
|
|
||||||
// border-radius 5px;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -305,12 +262,57 @@ const reGenerate = (prompt) => {
|
|||||||
|
|
||||||
blockquote {
|
blockquote {
|
||||||
margin 0
|
margin 0
|
||||||
background-color: #ebfffe;
|
background-color: var(--quote-bg-color);
|
||||||
padding: 0.8rem 1.5rem;
|
padding: 0.8rem 1.5rem;
|
||||||
border-left: 0.5rem solid;
|
color: var(--quote-text-color);
|
||||||
border-color: #026863;
|
border-left: 0.4rem solid #6b50e1; /* 紫色边框 */
|
||||||
color: #2c3e50;
|
font-size: 1.1rem;
|
||||||
|
line-height: 1.6;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-line-reply-list {
|
||||||
|
justify-content: center;
|
||||||
|
background-color: var(--chat-list-bg);
|
||||||
|
color:var(--theme-text-color-primary);
|
||||||
|
width 100%
|
||||||
|
padding-bottom: 1.5rem;
|
||||||
|
padding-top: 1.5rem;
|
||||||
|
border-bottom: 0.5px solid var(--el-border-color);
|
||||||
|
|
||||||
|
.chat-line-inner {
|
||||||
|
display flex;
|
||||||
|
width 100%;
|
||||||
|
max-width 900px;
|
||||||
|
padding-left 10px;
|
||||||
|
|
||||||
|
.chat-icon {
|
||||||
|
margin-right 20px;
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 36px;
|
||||||
|
height: 36px;
|
||||||
|
border-radius: 50%;
|
||||||
|
padding: 1px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-item {
|
||||||
|
width 100%
|
||||||
|
position: relative;
|
||||||
|
padding: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.content-wrapper {
|
||||||
|
min-height 20px;
|
||||||
|
word-break break-word;
|
||||||
|
padding: 0
|
||||||
|
color:var(--theme-text-color-primary);
|
||||||
|
font-size: var(--content-font-size);
|
||||||
|
border-radius: 5px;
|
||||||
|
overflow auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -388,106 +390,7 @@ const reGenerate = (prompt) => {
|
|||||||
overflow auto;
|
overflow auto;
|
||||||
// background-color #F5F5F5
|
// background-color #F5F5F5
|
||||||
background-color :var(--chat-content-bg);
|
background-color :var(--chat-content-bg);
|
||||||
|
|
||||||
border-radius: 0 10px 10px 10px;
|
border-radius: 0 10px 10px 10px;
|
||||||
|
|
||||||
img {
|
|
||||||
max-width: 600px;
|
|
||||||
border-radius: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
line-height 1.5
|
|
||||||
|
|
||||||
code {
|
|
||||||
color:var(--code-text-color);
|
|
||||||
font-weight bold
|
|
||||||
font-family: var(--font-family);
|
|
||||||
background-color: var(--code-bg-color);
|
|
||||||
border-radius: 4px;
|
|
||||||
padding: .2rem .4rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
p:last-child {
|
|
||||||
margin-bottom: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
p:first-child {
|
|
||||||
margin-top 0
|
|
||||||
}
|
|
||||||
|
|
||||||
.code-container {
|
|
||||||
position relative
|
|
||||||
display flex
|
|
||||||
|
|
||||||
.hljs {
|
|
||||||
border-radius 10px
|
|
||||||
width 100%
|
|
||||||
}
|
|
||||||
|
|
||||||
.copy-code-btn {
|
|
||||||
position: absolute;
|
|
||||||
right 10px
|
|
||||||
top 10px
|
|
||||||
cursor pointer
|
|
||||||
font-size 12px
|
|
||||||
color #c1c1c1
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
color #20a0ff
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.lang-name {
|
|
||||||
position absolute;
|
|
||||||
right 10px
|
|
||||||
bottom 20px
|
|
||||||
padding 2px 6px 4px 6px
|
|
||||||
background-color #444444
|
|
||||||
border-radius 10px
|
|
||||||
color #00e0e0
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 设置表格边框
|
|
||||||
|
|
||||||
table {
|
|
||||||
width 100%
|
|
||||||
margin-bottom 1rem
|
|
||||||
color #212529
|
|
||||||
border-collapse collapse;
|
|
||||||
border 1px solid #dee2e6;
|
|
||||||
background-color:var(--chat-content-bg);
|
|
||||||
color:var(--theme-text-color-primary);
|
|
||||||
|
|
||||||
thead {
|
|
||||||
th {
|
|
||||||
border 1px solid #dee2e6
|
|
||||||
vertical-align: bottom
|
|
||||||
border-bottom: 2px solid #dee2e6
|
|
||||||
padding 10px
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
td {
|
|
||||||
border 1px solid #dee2e6
|
|
||||||
padding 10px
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 代码快
|
|
||||||
|
|
||||||
blockquote {
|
|
||||||
margin 0
|
|
||||||
background-color: #ebfffe;
|
|
||||||
padding: 0.8rem 1.5rem;
|
|
||||||
border-left: 0.5rem solid;
|
|
||||||
border-color: #026863;
|
|
||||||
color: #2c3e50;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,32 +27,6 @@
|
|||||||
</el-input>
|
</el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item>
|
|
||||||
<template #label>
|
|
||||||
<div class="label-title">
|
|
||||||
首页背景图
|
|
||||||
<el-tooltip effect="dark" content="网站首页背景图片" raw-content placement="right">
|
|
||||||
<el-icon>
|
|
||||||
<InfoFilled />
|
|
||||||
</el-icon>
|
|
||||||
</el-tooltip>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<div class="d-flex justify-between w-100">
|
|
||||||
<el-input v-model="system['index_bg_url']" placeholder="网站首页背景图片">
|
|
||||||
<template #append>
|
|
||||||
<el-upload :auto-upload="true" :show-file-list="false" @click="beforeUpload('index_bg_url')" :http-request="uploadImg">
|
|
||||||
<el-icon class="uploader-icon">
|
|
||||||
<UploadFilled />
|
|
||||||
</el-icon>
|
|
||||||
</el-upload>
|
|
||||||
</template>
|
|
||||||
</el-input>
|
|
||||||
<el-button class="ml-1" type="primary" @click="system.index_bg_url = 'https://api.dujin.org/bing/1920.php'">使用动态背景</el-button>
|
|
||||||
<el-button class="ml-1" @click="system.index_bg_url = 'color'">使用纯色背景</el-button>
|
|
||||||
</div>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<template #label>
|
<template #label>
|
||||||
<div class="label-title">
|
<div class="label-title">
|
||||||
@@ -229,27 +203,15 @@
|
|||||||
</template>
|
</template>
|
||||||
<el-input v-model.number="system['mj_power']" placeholder="" />
|
<el-input v-model.number="system['mj_power']" placeholder="" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
|
||||||
<template #label>
|
|
||||||
<div class="label-title">
|
|
||||||
MJ操作算力
|
|
||||||
<el-tooltip effect="dark" content="放大,变换,重绘操作一次消耗的算力" raw-content placement="right">
|
|
||||||
<el-icon>
|
|
||||||
<InfoFilled />
|
|
||||||
</el-icon>
|
|
||||||
</el-tooltip>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<el-input v-model.number="system['mj_action_power']" placeholder="" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="Stable-Diffusion算力" prop="sd_power">
|
<el-form-item label="Stable-Diffusion算力" prop="sd_power">
|
||||||
<el-input v-model.number="system['sd_power']" placeholder="使用Stable-Diffusion画一张图消耗算力" />
|
<el-input v-model.number="system['sd_power']" placeholder="使用Stable-Diffusion画一张图消耗算力" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="DALL-E-3算力" prop="dall_power">
|
<el-form-item>
|
||||||
<template #label>
|
<template #label>
|
||||||
<div class="label-title">
|
<div class="label-title">
|
||||||
MJ操作算力
|
DALL-E-3算力
|
||||||
<el-tooltip effect="dark" content="主要用户函数调用 DALL-E-3 进行绘画" raw-content placement="right">
|
<el-tooltip effect="dark" content="使用DALL-E-3画一张图消耗算力" raw-content placement="right">
|
||||||
<el-icon>
|
<el-icon>
|
||||||
<InfoFilled />
|
<InfoFilled />
|
||||||
</el-icon>
|
</el-icon>
|
||||||
|
|||||||
Reference in New Issue
Block a user