Files
dify-plus/admin/server/service/system/sys_user_extend.go
T
npc0-hue 17832f2424 fix: Dify 1.8.1问题修复
本次提交整合了多个功能改进和问题修复:

主要功能:
- 批量工作流处理功能完善,支持 Excel 上传和进度跟踪
- 管理中心反向代理和转发配置优化
- 用户同步添加互斥锁,防止并发问题
- 计费系统和额度显示优化
- AI 绘图功能扩展

前端改进:
- 文本生成应用显示修复
- 批量任务进度展示优化
- 按钮样式和 CSS 优化,禁止换行
- 多语言支持完善(新增印尼语等)
- 构建镜像逻辑优化
- 批量处理进度管理器实现

后端改进:
- Docker Compose 配置升级
- 队列任务和 Worker Pool 优化
- Admin API 初始化和验证逻辑改进
- 数据库迁移和初始化完善
- 静态变量处理优化
- URL 签名助手实现
- Celery 扩展优化
- 代码和导入包问题修复(idea 自动调整代码位置)

技术改进:
- 兼容性修复 (flask-restx, jschardet)
- 钉钉 Web API 版本更新
- 代码格式化和导入包问题修复
- 日志处理优化
- 工作流循环管理优化

Docker 相关:
- Nginx 配置更新
- 容器启动脚本优化
- 镜像构建流程改进
- docker-compose.dify-plus.yaml 大幅更新

管理后台:
- 工作流批量处理 API 实现
- 工作池初始化
- 批量工作流服务实现
- 转发扩展配置
- 用户服务扩展
2025-10-17 23:04:25 +08:00

166 lines
4.8 KiB
Go

package system
import (
"fmt"
"strings"
"sync"
"github.com/flipped-aurora/gin-vue-admin/server/global"
"github.com/flipped-aurora/gin-vue-admin/server/model/gaia"
"github.com/flipped-aurora/gin-vue-admin/server/model/system"
"github.com/flipped-aurora/gin-vue-admin/server/utils"
"github.com/gofrs/uuid/v5"
)
// 全局互斥锁,防止SyncUser并发执行
var syncUserMutex sync.Mutex
//@author: [piexlmax](https://github.com/piexlmax)
//@function: Register
//@description: 用户注册
//@param: u model.SysUser
//@return: userInter system.SysUser, err error
type UserExtendService struct{}
//@author: [piexlmax](https://github.com/piexlmax)
//@author: [SliverHorn](https://github.com/SliverHorn)
//@function: OaLogin
//@description: 用户登录(不检查密码)
//@param: u *model.SysUser
//@return: err error, userInter *model.SysUser
func (userService *UserExtendService) OaLogin(u *system.SysUser) (userInter *system.SysUser, err error) {
if nil == global.GVA_DB {
return nil, fmt.Errorf("db not init")
}
var user system.SysUser
err = global.GVA_DB.Where("username = ?", u.Username).Preload("Authorities").Preload("Authority").First(&user).Error
if err == nil {
MenuServiceApp.UserAuthorityDefaultRouter(&user)
}
return &user, err
}
// SyncUser
// @author: [piexlmax](https://github.com/piexlmax)
// @author: [SliverHorn](https://github.com/SliverHorn)
// @function: SyncUser
// @description: 用户同步
// @param: u *model.SysUser
// @return: err error, userInter *model.SysUser
func (userService *UserExtendService) SyncUser() {
// 使用互斥锁防止并发执行
syncUserMutex.Lock()
defer syncUserMutex.Unlock()
// init
var err error
var isInit = true
var user []system.SysUser
var accountList []gaia.Account
var mailDick = make(map[string]string)
if global.GVA_DB == nil {
global.GVA_LOG.Info("数据库未初始化,同步用户失败")
return
}
// 遍历后台用户表
if err = global.GVA_DB.Select("email", "username").Find(&user).Error; err != nil {
global.GVA_LOG.Error("SyncUser gaia表查询失败,原因: " + err.Error())
return
}
// 循环用户列表
if len(user) > 0 {
isInit = false
}
var emailList []string
for _, v := range user {
emailList = append(emailList, v.Email)
mailDick[v.Email] = v.Username
}
// 查询gaia用户表
db := global.GVA_DB
if len(emailList) > 0 {
db = db.Where("email NOT IN (?)", emailList)
}
if err = db.Where("status = ?", gaia.UserActive).Order("created_at ASC").Find(&accountList).Error; err != nil {
global.GVA_LOG.Error("SyncUser gaia表查询失败,原因: " + err.Error())
return
}
var adminAuthorities, userAuthorities []system.SysAuthority
userAuthorities = append(userAuthorities, system.SysAuthority{
AuthorityId: system.DefaultGroupID,
})
adminAuthorities = append(adminAuthorities, system.SysAuthority{
AuthorityId: system.AdminGroupID,
})
// 循环结果
for i, v := range accountList {
// 创建相关用户
var integrate gaia.AccountIntegrate
if username, ok := mailDick[v.Email]; ok {
if integrate, err = v.GetAccount(username); err != nil {
global.GVA_LOG.Debug("SyncUser GetAccount: " + err.Error())
}
}
// 是否配置了多余信息获取接口
var name = v.Name
var phone, ding string
if mailList := strings.Split(v.Email, "@"); len(integrate.OpenID) == 0 && len(mailList) == 2 {
integrate.OpenID = mailList[0]
}
// 创建用户
s := UserService{}
uuidStr, _ := uuid.NewV1()
if len(ding) > 0 {
if err = global.GVA_DB.Create(gaia.AccountDingTalkExtend{
ID: v.ID,
DingTalk: ding,
}).Error; err != nil {
global.GVA_LOG.Error("SyncUser Create AccountDingTalkExtend: " + err.Error())
}
}
// 注册
AuthorityId := system.DefaultGroupID
authorities := userAuthorities
if isInit && i == 0 {
// admin
AuthorityId = system.AdminGroupID
authorities = adminAuthorities
// 并设置管理员配置
if global.GVA_CONFIG.Gaia.SuperAdminTenantId == "" || global.GVA_CONFIG.Gaia.SuperAdminAccountId == "" {
global.GVA_CONFIG.Gaia.SuperAdminAccountId = v.ID.String()
// TODO 需要查询默认空间的id
var Tenant gaia.Tenants
global.GVA_CONFIG.Gaia.SuperAdminTenantId = Tenant.GetSuperAdminTenantId()
cs := utils.StructToMap(global.GVA_CONFIG)
for k, v := range cs {
global.GVA_VP.Set(k, v)
}
err = global.GVA_VP.WriteConfig()
if err != nil {
return
}
}
}
// Register
if _, err = s.Register(system.SysUser{
HeaderImg: "",
UUID: v.ID,
NickName: name,
Phone: phone,
Email: v.Email,
AuthorityId: AuthorityId,
Authorities: authorities,
Username: integrate.OpenID,
Password: uuidStr.String(),
Enable: system.UserActive,
}, ""); err != nil {
global.GVA_LOG.Error("SyncUser Register system.SysUser: " + err.Error())
}
}
}