feat(release): migrate GeekAI v4.3.0 to open source

- Sync backend and frontend from GeekAI Plus v4.3.0

- Remove commercial License flows and update open-source deployment defaults

- Preserve Docker Compose deployment and bump image tags to v4.3.0

BREAKING CHANGE: commercial License configuration and related endpoints are removed
This commit is contained in:
RockYang
2026-08-11 14:51:20 +08:00
parent 37e024acea
commit 9ccff4efbc
219 changed files with 29212 additions and 10802 deletions
+197 -6
View File
@@ -34,6 +34,21 @@
placeholder="请输入文件存储URL,如:/static/upload"
/>
</el-form-item>
<el-form-item>
<label class="form-label"
>缩略图模板
<el-tooltip placement="top">
<template #content>
使用{width}{height}作为变量占位符<br />默认?imageView2/4/w/{width}/h/{height}/q/75<br />留空则使用默认模板
</template>
<i class="iconfont icon-info"></i>
</el-tooltip>
</label>
<el-input
v-model="local.thumb_template"
placeholder="?imageView2/4/w/{width}/h/{height}/q/75"
/>
</el-form-item>
</el-form>
</el-tab-pane>
@@ -55,6 +70,23 @@
<el-form-item label="Bucket"><el-input v-model="minio.bucket" /></el-form-item>
<el-form-item label="UseSSL"><el-switch v-model="minio.use_ssl" /></el-form-item>
<el-form-item label="Domain"><el-input v-model="minio.domain" /></el-form-item>
<el-form-item>
<template #label>
<label
>缩略图模板
<el-tooltip
placement="top"
content="使用{width}和{height}作为变量占位符。MinIO不支持缩略图,留空则返回原图"
>
<i class="iconfont icon-info"></i>
</el-tooltip>
</label>
</template>
<el-input
v-model="minio.thumb_template"
placeholder="留空则返回原图(MinIO不支持缩略图)"
/>
</el-form-item>
</el-form>
</el-tab-pane>
@@ -92,6 +124,23 @@
<el-form-item label="Domain"
><el-input v-model="qiniu.domain" placeholder="请输入七牛云Bucket绑定的域名"
/></el-form-item>
<el-form-item>
<template #label>
<label
>缩略图模板
<el-tooltip
placement="top"
content="使用{width}和{height}作为变量占位符。默认:?imageView2/4/w/{width}/h/{height}/q/75"
>
<i class="iconfont icon-info"></i>
</el-tooltip>
</label>
</template>
<el-input
v-model="qiniu.thumb_template"
placeholder="?imageView2/4/w/{width}/h/{height}/q/75"
/>
</el-form-item>
</el-form>
</el-tab-pane>
@@ -112,6 +161,76 @@
/></el-form-item>
<el-form-item label="Bucket"><el-input v-model="aliyun.bucket" /></el-form-item>
<el-form-item label="Domain"><el-input v-model="aliyun.domain" /></el-form-item>
<el-form-item>
<template #label>
<label
>缩略图模板
<el-tooltip
placement="top"
content="使用{width}和{height}作为变量占位符。默认:?x-oss-process=image/resize,m_lfit,w_{width},h_{height}"
>
<i class="iconfont icon-info"></i>
</el-tooltip>
</label>
</template>
<el-input
v-model="aliyun.thumb_template"
placeholder="?x-oss-process=image/resize,m_lfit,w_{width},h_{height}"
/>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="腾讯云COS" name="tencent">
<Alert type="info">
如果你不知道怎么获取这些配置信息请参考文档
<a href="https://cloud.tencent.com/document/product/436" target="_blank">腾讯云COS配置</a
>
</Alert>
<el-form :model="tencent" class="mt-4" label-position="top">
<el-form-item label="Region">
<el-select
v-model="tencent.region"
filterable
allow-create
placeholder="请选择或输入区域"
style="width: 100%"
>
<el-option
v-for="region in tencentRegions"
:key="region.value"
:label="region.label"
:value="region.value"
/>
</el-select>
</el-form-item>
<el-form-item label="SecretId"><el-input v-model="tencent.secret_id" /></el-form-item>
<el-form-item label="SecretKey"
><el-input v-model="tencent.secret_key" type="password" show-password
/></el-form-item>
<el-form-item label="Bucket"><el-input v-model="tencent.bucket" /></el-form-item>
<el-form-item label="Domain"
><el-input
v-model="tencent.domain"
placeholder="请输入自定义域名,留空则使用COS默认域名"
/></el-form-item>
<el-form-item>
<template #label>
<label
>缩略图模板
<el-tooltip
placement="top"
content="使用{width}和{height}作为变量占位符。默认:?imageView2/1/w/{width}/h/{height}/format/jpg"
>
<i class="iconfont icon-info"></i>
</el-tooltip>
</label>
</template>
<el-input
v-model="tencent.thumb_template"
placeholder="?imageView2/1/w/{width}/h/{height}/format/jpg"
/>
</el-form-item>
</el-form>
</el-tab-pane>
</el-tabs>
@@ -123,6 +242,7 @@
<el-radio value="aliyun" border>阿里云</el-radio>
<el-radio value="qiniu" border>七牛云</el-radio>
<el-radio value="minio" border>Minio</el-radio>
<el-radio value="tencent" border>腾讯云</el-radio>
</el-radio-group>
</div>
@@ -141,7 +261,17 @@ import Alert from '@/components/ui/Alert.vue'
const loading = ref(true)
const activeTab = ref('local')
const active = ref('local')
const local = ref({ base_path: './static/upload', base_url: '/static/upload' })
// 默认缩略图模板
const DEFAULT_LOCAL_THUMB = '?imageView2/4/w/{width}/h/{height}/q/75'
const DEFAULT_QINIU_THUMB = '?imageView2/4/w/{width}/h/{height}/q/75'
const DEFAULT_ALIYUN_THUMB = '?x-oss-process=image/resize,m_lfit,w_{width},h_{height}'
const DEFAULT_TENCENT_THUMB = '?imageView2/1/w/{width}/h/{height}/format/jpg'
const local = ref({
base_path: './static/upload',
base_url: '/static/upload',
thumb_template: DEFAULT_LOCAL_THUMB,
})
const minio = ref({
endpoint: '',
access_key: '',
@@ -149,6 +279,7 @@ const minio = ref({
bucket: '',
use_ssl: false,
domain: '',
thumb_template: '', // MinIO不支持缩略图,留空
})
const qiniu = ref({
zone: 'z2',
@@ -156,6 +287,7 @@ const qiniu = ref({
access_secret: '',
bucket: '',
domain: '',
thumb_template: DEFAULT_QINIU_THUMB,
})
const aliyun = ref({
endpoint: '',
@@ -163,6 +295,31 @@ const aliyun = ref({
access_secret: '',
bucket: '',
domain: '',
thumb_template: DEFAULT_ALIYUN_THUMB,
})
// 腾讯云 COS 常见地区选项
const tencentRegions = [
{ label: '北京 (ap-beijing)', value: 'ap-beijing' },
{ label: '南京 (ap-nanjing)', value: 'ap-nanjing' },
{ label: '上海 (ap-shanghai)', value: 'ap-shanghai' },
{ label: '广州 (ap-guangzhou)', value: 'ap-guangzhou' },
{ label: '成都 (ap-chengdu)', value: 'ap-chengdu' },
{ label: '重庆 (ap-chongqing)', value: 'ap-chongqing' },
{ label: '中国香港 (ap-hongkong)', value: 'ap-hongkong' },
{ label: '新加坡 (ap-singapore)', value: 'ap-singapore' },
{ label: '雅加达 (ap-jakarta)', value: 'ap-jakarta' },
{ label: '首尔 (ap-seoul)', value: 'ap-seoul' },
{ label: '曼谷 (ap-bangkok)', value: 'ap-bangkok' },
{ label: '东京 (ap-tokyo)', value: 'ap-tokyo' },
]
const tencent = ref({
region: 'ap-beijing',
secret_id: '',
secret_key: '',
bucket: '',
domain: '',
thumb_template: DEFAULT_TENCENT_THUMB,
})
onMounted(() => {
@@ -170,14 +327,45 @@ onMounted(() => {
.then((res) => {
const data = res.data || {}
active.value = data.active.toLowerCase() || active.value
local.value = data.local || local.value
minio.value = data.minio || minio.value
qiniu.value = data.qiniu || qiniu.value
aliyun.value = data.aliyun || aliyun.value
// 合并配置,如果服务器返回的配置中没有thumb_template或为空,则使用默认值
if (data.local) {
local.value = { ...local.value, ...data.local }
if (!data.local.thumb_template) {
local.value.thumb_template = DEFAULT_LOCAL_THUMB
}
}
if (data.minio) {
minio.value = { ...minio.value, ...data.minio }
// MinIO不支持缩略图,保持为空
}
if (data.qiniu) {
qiniu.value = { ...qiniu.value, ...data.qiniu }
if (!data.qiniu.thumb_template) {
qiniu.value.thumb_template = DEFAULT_QINIU_THUMB
}
}
if (data.aliyun) {
aliyun.value = { ...aliyun.value, ...data.aliyun }
if (!data.aliyun.thumb_template) {
aliyun.value.thumb_template = DEFAULT_ALIYUN_THUMB
}
}
if (data.tencent) {
tencent.value = { ...tencent.value, ...data.tencent }
if (!data.tencent.thumb_template) {
tencent.value.thumb_template = DEFAULT_TENCENT_THUMB
}
}
minio.value.bucket = minio.value.bucket || 'geekai'
qiniu.value.bucket = qiniu.value.bucket || 'geekai'
aliyun.value.bucket = aliyun.value.bucket || 'geekai'
tencent.value.bucket = tencent.value.bucket || 'geekai'
})
.catch(() => {})
.finally(() => (loading.value = false))
@@ -190,8 +378,11 @@ const save = () => {
minio: minio.value,
qiniu: qiniu.value,
aliyun: aliyun.value,
tencent: tencent.value,
})
.then(() => ElMessage.success('保存成功'))
.then(() => {
ElMessage.success('保存成功')
})
.catch((e) => ElMessage.error(e.message))
}
</script>