增加ai配置和ai广场功能
This commit is contained in:
1 parent
244b4bd9fd
commit
d9a50e23dd
27 files changed
+3808
-57
No files matched your search
@@ -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" {
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
Reference in new issue
Block a user