增加ai配置和ai广场功能

This commit is contained in:
hero920103 committed 2026-11-09 16:44:11 +08:00
1 parent 244b4bd9fd
commit d9a50e23dd
27 files changed
+3808 -57

No files matched your search

+44
View File
@@ -108,6 +108,34 @@ func (c *AuthLoginController) LoginPage() {
c.Data["LoginLogo"] = strings.TrimSpace(brand["login_logo"])
c.Data["LoginBg"] = strings.TrimSpace(brand["login_bg"])
// 登录方式开关(平台设置 → 登录方式):值 "0" 关闭,未配置默认开启。
// 三种方式全部关闭时禁止登录;只开一种时不显示 tab 直接展示对应面板。
loginEnabled := func(tag string) bool {
return strings.TrimSpace(brand[tag]) != "0"
}
pwdOn, smsOn, qrOn := loginEnabled("login_pwd_enabled"), loginEnabled("login_sms_enabled"), loginEnabled("login_qr_enabled")
c.Data["LoginPwdOn"] = pwdOn
c.Data["LoginSmsOn"] = smsOn
c.Data["LoginQrOn"] = qrOn
c.Data["LoginDisabled"] = !(pwdOn || smsOn || qrOn)
defaultTab := "account"
if !pwdOn {
if smsOn {
defaultTab = "sms"
} else {
defaultTab = "qr"
}
}
c.Data["LoginDefaultTab"] = defaultTab
methodCount := 0
for _, on := range []bool{pwdOn, smsOn, qrOn} {
if on {
methodCount++
}
}
// 只开启一种登录方式时不需要 tab 切换栏
c.Data["LoginShowTabs"] = methodCount > 1
c.TplName = "auth/login.tpl"
}
@@ -146,6 +174,22 @@ func (c *AuthLoginController) LoginSubmit() {
return
}
// 平台设置的登录方式开关兜底:账号密码被关或全部登录方式被关时直接拒绝
// (前端已隐藏入口,这里防止绕过页面直接调接口)
loginTags := models.GetPlatformSiteTagMap()
pwdOff := strings.TrimSpace(loginTags["login_pwd_enabled"]) == "0"
allOff := pwdOff &&
strings.TrimSpace(loginTags["login_sms_enabled"]) == "0" &&
strings.TrimSpace(loginTags["login_qr_enabled"]) == "0"
if allOff {
c.serveJSON(map[string]interface{}{"code": 403, "msg": "登录功能已关闭,请联系管理员"})
return
}
if pwdOff {
c.serveJSON(map[string]interface{}{"code": 403, "msg": "账号密码登录已关闭,请使用其他登录方式"})
return
}
// 开启人机验证时:先极验通过,再走账号密码校验
// 小程序端(yz-miniapp)无法集成极验 SDK 且运行于微信沙箱内,跳过人机验证
if strings.TrimSpace(req.ClientID) != "yz-miniapp" {
+66
View File
@@ -0,0 +1,66 @@
package controllers
import (
"encoding/json"
"io"
"strings"
"server/models"
"server/pkg/identity"
beego "github.com/beego/beego/v2/server/web"
)
// BackendOcrController 租户端 OCR 识别(OA 应用)
// OCR 配置由平台端「AI管理 → OCR配置」统一维护(yz_platform_site_setting 标签)。
// 识别实现(视觉模型 / 专用 OCR)后续接入;当前返回配置状态占位。
type BackendOcrController struct {
beego.Controller
}
func (c *BackendOcrController) jsonErr(httpStatus, bizCode int, msg string) {
c.Ctx.Output.SetStatus(httpStatus)
c.Data["json"] = map[string]any{"code": bizCode, "msg": msg}
_ = c.ServeJSON()
}
// Recognize POST /backend/ocr/recognize
// 入参 { image_base64 } 或 { image_url };占位阶段只校验配置并返回状态。
func (c *BackendOcrController) Recognize() {
if _, err := identity.Claims(c.Ctx.Request.Header.Get("Authorization"), identity.EndBackend); err != nil {
code := identity.Status(err)
c.jsonErr(code, code, err.Error())
return
}
raw, _ := io.ReadAll(c.Ctx.Request.Body)
var req struct {
ImageBase64 string `json:"image_base64"`
ImageURL string `json:"image_url"`
Prompt string `json:"prompt"`
}
_ = json.Unmarshal(raw, &req)
if strings.TrimSpace(req.ImageBase64) == "" && strings.TrimSpace(req.ImageURL) == "" {
c.jsonErr(400, 400, "请上传图片")
return
}
all := models.GetPlatformSiteTagMap()
enabled := strings.TrimSpace(all["ocr_enabled"]) == "1"
if !enabled {
c.jsonErr(403, 403, "OCR 识别未启用,请联系平台管理员在「AI管理」中开启")
return
}
c.Data["json"] = map[string]any{
"code": 200,
"msg": "success",
"data": map[string]any{
"recognized": false,
"placeholder": true,
"message": "OCR 识别服务待接入,平台配置已生效",
"provider_id": all["ocr_provider_id"],
"model": all["ocr_model"],
},
}
_ = c.ServeJSON()
}
File diff suppressed because it is too large. Load diff
+13 -3
View File
@@ -110,9 +110,14 @@ func (c *PlatformWebsiteSettingController) Save() {
_ = c.ServeJSON()
}
// loginBrandTags 登录页品牌配置项,存放于 yz_platform_site_setting,
// loginBrandTags 登录页品牌/登录方式配置项,存放于 yz_platform_site_setting,
// 统一认证中心 /auth/login 渲染时读取。
var loginBrandTags = []string{"login_title", "login_subtitle", "login_logo", "login_bg"}
// login_pwd_enabled / login_sms_enabled / login_qr_enabled:
// 值为 "0" 表示关闭该登录方式,未配置(空)默认开启;三者全关时登录页禁止登录。
var loginBrandTags = []string{
"login_title", "login_subtitle", "login_logo", "login_bg",
"login_pwd_enabled", "login_sms_enabled", "login_qr_enabled",
}
// LoginBrandInfo GET /platform/loginBrand
// 返回登录页品牌配置(主标题 / 副标题 / Logo / 背景图)。
@@ -172,8 +177,13 @@ func (c *PlatformWebsiteSettingController) SaveLoginBrand() {
c.jsonErr(400, 400, "副标题不能超过 120 个字符")
return
}
// 只校验本次提交了的图片字段,避免「登录方式」等只传开关的保存把品牌图清空
for _, tag := range []string{"login_logo", "login_bg"} {
img, ok := normalizeLoginBrandImage(values[tag])
raw, submitted := payload[tag]
if !submitted {
continue
}
img, ok := normalizeLoginBrandImage(raw)
if !ok {
c.jsonErr(400, 400, "图片地址必须是 HTTPS 或站内相对路径")
return