后台管理支持上传与清空网站 Logo

- 新增 PUT /api/site/logo(multipart、仅图片,立即生效)与 DELETE /api/site/logo,均仅管理员可用
- Logo 文件引用计数自动管理:上传占用、替换/清空/切换外链释放旧文件;PUT /site 手填地址同样处理,挂载不存在的本地文件返回 400
- 抽出 file.IsImageUpload 供头像与 Logo 共用(按文件头探测图片)
- 后台管理 Logo 区保留外链输入,新增上传/清空按钮(无裁剪,校验类型与大小),三语文案补齐
- 补充引用计数、权限与校验测试并重新生成 Swagger 文档
This commit is contained in:
2026-09-21 21:10:23 +08:00
parent 9bf397064d
commit 067ade546f
14 files changed
+775 -41

No files matched your search

+110 -2
View File
@@ -889,7 +889,7 @@ const docTemplate = `{
"BearerAuth": []
}
],
"description": "Admin only. Update the site name, logo URL, and footer text; returns the updated settings.",
"description": "Admin only. Update the site name, logo URL, and footer text; logo files hosted on this site have their reference count managed automatically. Returns the updated settings.",
"consumes": [
"application/json"
],
@@ -919,7 +919,7 @@ const docTemplate = `{
}
},
"400": {
"description": "invalid request",
"description": "invalid request or logo file not found",
"schema": {
"$ref": "#/definitions/httpx.ErrorResponse"
}
@@ -945,6 +945,114 @@ const docTemplate = `{
}
}
},
"/site/logo": {
"put": {
"security": [
{
"BearerAuth": []
}
],
"description": "Admin only. Upload an image as the site logo (multipart field file, image only); the logo takes effect immediately and file references are managed automatically.",
"consumes": [
"multipart/form-data"
],
"produces": [
"application/json"
],
"tags": [
"admin"
],
"summary": "Upload site logo",
"parameters": [
{
"type": "file",
"description": "Logo image",
"name": "file",
"in": "formData",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/model.SiteSetting"
}
},
"400": {
"description": "invalid request, empty file, or not an image",
"schema": {
"$ref": "#/definitions/httpx.ErrorResponse"
}
},
"401": {
"description": "unauthorized or session expired",
"schema": {
"$ref": "#/definitions/httpx.ErrorResponse"
}
},
"403": {
"description": "admin permission required or account disabled",
"schema": {
"$ref": "#/definitions/httpx.ErrorResponse"
}
},
"413": {
"description": "file too large",
"schema": {
"$ref": "#/definitions/httpx.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/httpx.ErrorResponse"
}
}
}
},
"delete": {
"security": [
{
"BearerAuth": []
}
],
"description": "Admin only. Clear the site logo and release the reference of the locally stored logo file.",
"produces": [
"application/json"
],
"tags": [
"admin"
],
"summary": "Delete site logo",
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/model.SiteSetting"
}
},
"401": {
"description": "unauthorized or session expired",
"schema": {
"$ref": "#/definitions/httpx.ErrorResponse"
}
},
"403": {
"description": "admin permission required or account disabled",
"schema": {
"$ref": "#/definitions/httpx.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/httpx.ErrorResponse"
}
}
}
}
},
"/user-groups": {
"get": {
"security": [
+110 -2
View File
@@ -882,7 +882,7 @@
"BearerAuth": []
}
],
"description": "Admin only. Update the site name, logo URL, and footer text; returns the updated settings.",
"description": "Admin only. Update the site name, logo URL, and footer text; logo files hosted on this site have their reference count managed automatically. Returns the updated settings.",
"consumes": [
"application/json"
],
@@ -912,7 +912,7 @@
}
},
"400": {
"description": "invalid request",
"description": "invalid request or logo file not found",
"schema": {
"$ref": "#/definitions/httpx.ErrorResponse"
}
@@ -938,6 +938,114 @@
}
}
},
"/site/logo": {
"put": {
"security": [
{
"BearerAuth": []
}
],
"description": "Admin only. Upload an image as the site logo (multipart field file, image only); the logo takes effect immediately and file references are managed automatically.",
"consumes": [
"multipart/form-data"
],
"produces": [
"application/json"
],
"tags": [
"admin"
],
"summary": "Upload site logo",
"parameters": [
{
"type": "file",
"description": "Logo image",
"name": "file",
"in": "formData",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/model.SiteSetting"
}
},
"400": {
"description": "invalid request, empty file, or not an image",
"schema": {
"$ref": "#/definitions/httpx.ErrorResponse"
}
},
"401": {
"description": "unauthorized or session expired",
"schema": {
"$ref": "#/definitions/httpx.ErrorResponse"
}
},
"403": {
"description": "admin permission required or account disabled",
"schema": {
"$ref": "#/definitions/httpx.ErrorResponse"
}
},
"413": {
"description": "file too large",
"schema": {
"$ref": "#/definitions/httpx.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/httpx.ErrorResponse"
}
}
}
},
"delete": {
"security": [
{
"BearerAuth": []
}
],
"description": "Admin only. Clear the site logo and release the reference of the locally stored logo file.",
"produces": [
"application/json"
],
"tags": [
"admin"
],
"summary": "Delete site logo",
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/model.SiteSetting"
}
},
"401": {
"description": "unauthorized or session expired",
"schema": {
"$ref": "#/definitions/httpx.ErrorResponse"
}
},
"403": {
"description": "admin permission required or account disabled",
"schema": {
"$ref": "#/definitions/httpx.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/httpx.ErrorResponse"
}
}
}
}
},
"/user-groups": {
"get": {
"security": [
+76 -3
View File
@@ -944,8 +944,9 @@ paths:
put:
consumes:
- application/json
description: Admin only. Update the site name, logo URL, and footer text; returns
the updated settings.
description: Admin only. Update the site name, logo URL, and footer text; logo
files hosted on this site have their reference count managed automatically.
Returns the updated settings.
parameters:
- description: Site settings
in: body
@@ -961,7 +962,7 @@ paths:
schema:
$ref: '#/definitions/model.SiteSetting'
"400":
description: invalid request
description: invalid request or logo file not found
schema:
$ref: '#/definitions/httpx.ErrorResponse'
"401":
@@ -981,6 +982,78 @@ paths:
summary: Update site settings
tags:
- admin
/site/logo:
delete:
description: Admin only. Clear the site logo and release the reference of the
locally stored logo file.
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/model.SiteSetting'
"401":
description: unauthorized or session expired
schema:
$ref: '#/definitions/httpx.ErrorResponse'
"403":
description: admin permission required or account disabled
schema:
$ref: '#/definitions/httpx.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/httpx.ErrorResponse'
security:
- BearerAuth: []
summary: Delete site logo
tags:
- admin
put:
consumes:
- multipart/form-data
description: Admin only. Upload an image as the site logo (multipart field file,
image only); the logo takes effect immediately and file references are managed
automatically.
parameters:
- description: Logo image
in: formData
name: file
required: true
type: file
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/model.SiteSetting'
"400":
description: invalid request, empty file, or not an image
schema:
$ref: '#/definitions/httpx.ErrorResponse'
"401":
description: unauthorized or session expired
schema:
$ref: '#/definitions/httpx.ErrorResponse'
"403":
description: admin permission required or account disabled
schema:
$ref: '#/definitions/httpx.ErrorResponse'
"413":
description: file too large
schema:
$ref: '#/definitions/httpx.ErrorResponse'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/httpx.ErrorResponse'
security:
- BearerAuth: []
summary: Upload site logo
tags:
- admin
/user-groups:
get:
description: List user groups ordered by id ASC. page starts at 1; page_size