feat: load preview page do not require user to login

This commit is contained in:
RockYang
2024-03-19 18:25:01 +08:00
parent 549f618cff
commit c5e583b215
57 changed files with 758 additions and 1550 deletions

View File

@@ -30,19 +30,15 @@ type Manager struct {
type ManagerHandler struct {
handler.BaseHandler
db *gorm.DB
redis *redis.Client
}
func NewAdminHandler(app *core.AppServer, db *gorm.DB, client *redis.Client) *ManagerHandler {
h := ManagerHandler{db: db, redis: client}
h.App = app
return &h
return &ManagerHandler{BaseHandler: handler.BaseHandler{DB: db, App: app}, redis: client}
}
// Login 登录
func (h *ManagerHandler) Login(c *gin.Context) {
var data Manager
if err := c.ShouldBindJSON(&data); err != nil {
resp.ERROR(c, types.InvalidArgs)
@@ -56,7 +52,7 @@ func (h *ManagerHandler) Login(c *gin.Context) {
}
var manager model.AdminUser
res := h.db.Model(&model.AdminUser{}).Where("username = ?", data.Username).First(&manager)
res := h.DB.Model(&model.AdminUser{}).Where("username = ?", data.Username).First(&manager)
if res.Error != nil {
resp.ERROR(c, "请检查用户名或者密码是否填写正确")
return
@@ -78,7 +74,7 @@ func (h *ManagerHandler) Login(c *gin.Context) {
"user_id": manager.Username,
"expired": time.Now().Add(time.Second * time.Duration(h.App.Config.Session.MaxAge)).Unix(),
})
tokenString, err := token.SignedString([]byte(h.App.Config.Session.SecretKey))
tokenString, err := token.SignedString([]byte(h.App.Config.AdminSession.SecretKey))
if err != nil {
resp.ERROR(c, "Failed to generate token, "+err.Error())
return
@@ -93,35 +89,19 @@ func (h *ManagerHandler) Login(c *gin.Context) {
// 更新最后登录时间和IP
manager.LastLoginIp = c.ClientIP()
manager.LastLoginAt = time.Now().Unix()
h.db.Model(&manager).Updates(manager)
h.DB.Model(&manager).Updates(manager)
permissions := h.GetAdminSlugs(manager.Id)
var result = struct {
IsSuperAdmin bool `json:"is_super_admin"`
Token string `json:"token"`
Permissions []string `json:"permissions"`
IsSuperAdmin bool `json:"is_super_admin"`
Token string `json:"token"`
}{
IsSuperAdmin: manager.Id == 1,
Token: tokenString,
Permissions: permissions,
}
resp.SUCCESS(c, result)
}
func (h *ManagerHandler) GetAdminSlugs(userId uint) []string {
var permissions []string
err := h.db.Raw("SELECT distinct p.slug "+
"FROM chatgpt_admin_user_roles as ur "+
"LEFT JOIN chatgpt_admin_role_permissions as rp ON ur.role_id = rp.role_id "+
"LEFT JOIN chatgpt_admin_permissions as p ON rp.permission_id = p.id "+
"WHERE ur.admin_id = ?", userId).Scan(&permissions)
if err.Error == nil {
return []string{}
}
return permissions
}
// Logout 注销
func (h *ManagerHandler) Logout(c *gin.Context) {
key := h.GetUserKey(c)

View File

@@ -1,132 +0,0 @@
package admin
import (
"chatplus/core"
"chatplus/core/types"
"chatplus/handler"
"chatplus/store/model"
"chatplus/store/vo"
"chatplus/utils"
"chatplus/utils/resp"
"fmt"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
type SysPermissionHandler struct {
handler.BaseHandler
db *gorm.DB
}
func NewSysPermissionHandler(app *core.AppServer, db *gorm.DB) *SysPermissionHandler {
h := SysPermissionHandler{db: db}
h.App = app
return &h
}
func (h *SysPermissionHandler) List(c *gin.Context) {
if err := utils.CheckPermission(c, h.db); err != nil {
resp.NotPermission(c)
return
}
var items []model.AdminPermission
var data = make([]vo.AdminPermission, 0)
res := h.db.Find(&items)
if res.Error != nil {
resp.ERROR(c, "暂无数据")
return
}
for _, item := range items {
adminPermissionVo := vo.AdminPermission{}
_ = utils.CopyObject(item, &adminPermissionVo)
data = append(data, adminPermissionVo)
}
data = ArrayToTree(data)
resp.SUCCESS(c, data)
}
func ArrayToTree(dates []vo.AdminPermission) []vo.AdminPermission {
group := make(map[int][]vo.AdminPermission, 0)
for _, node := range dates {
group[node.Pid] = append(group[node.Pid], node)
}
// 初始化递归,从根节点开始构建树
result := FindSiblings(group[0], group)
return result
}
func FindSiblings(siblings []vo.AdminPermission, group map[int][]vo.AdminPermission) []vo.AdminPermission {
result := make([]vo.AdminPermission, 0)
for _, sibling := range siblings {
children, ok := group[sibling.Id]
if ok {
sibling.Children = FindSiblings(children, group)
}
result = append(result, sibling)
}
return result
}
func (h *SysPermissionHandler) Save(c *gin.Context) {
var data struct {
Id int `json:"id"`
Name string `json:"name"`
Slug string `json:"slug"`
Sort int `json:"sort"`
Pid int `json:"pid"`
}
if err := c.ShouldBindJSON(&data); err != nil {
resp.ERROR(c, types.InvalidArgs)
return
}
var permission = model.AdminPermission{}
var res *gorm.DB
if data.Id > 0 { // 更新
permission.Id = data.Id
// 此处需要用 map 更新,用结构体无法更新 0 值
res = h.db.Model(&permission).Updates(map[string]interface{}{
"name": data.Name,
"slug": data.Slug,
"sort": data.Sort,
"pid": data.Pid,
})
} else {
p := model.AdminPermission{
Name: data.Name,
Slug: data.Slug,
Sort: data.Sort,
Pid: data.Pid,
}
res = h.db.Create(&p)
}
if res.Error != nil {
fmt.Println(res.Error)
resp.ERROR(c, "更新数据库失败")
return
}
resp.SUCCESS(c)
}
func (h *SysPermissionHandler) Remove(c *gin.Context) {
var data struct {
Id int
}
if err := c.ShouldBindJSON(&data); err != nil {
resp.ERROR(c, types.InvalidArgs)
return
}
if data.Id > 0 {
res := h.db.Where("id = ?", data.Id).Delete(&model.AdminPermission{})
if res.Error != nil {
resp.ERROR(c, "删除失败")
return
}
}
resp.SUCCESS(c)
}

View File

@@ -1,166 +0,0 @@
package admin
import (
"chatplus/core"
"chatplus/core/types"
"chatplus/handler"
"chatplus/store/model"
"chatplus/store/vo"
"chatplus/utils"
"chatplus/utils/resp"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
type SysRoleHandler struct {
handler.BaseHandler
db *gorm.DB
}
func NewSysRoleHandler(app *core.AppServer, db *gorm.DB) *SysRoleHandler {
h := SysRoleHandler{db: db}
h.App = app
return &h
}
type permission struct {
Id int `json:"id"`
Name string `json:"name"`
Slug string `json:"slug"`
}
func (h *SysRoleHandler) List(c *gin.Context) {
if err := utils.CheckPermission(c, h.db); err != nil {
resp.NotPermission(c)
return
}
page := h.GetInt(c, "page", 1)
pageSize := h.GetInt(c, "page_size", 20)
name := h.GetTrim(c, "name")
offset := (page - 1) * pageSize
var items []model.AdminRole
var data = make([]vo.AdminRole, 0)
var total int64
session := h.db.Session(&gorm.Session{})
if name != "" {
session = session.Where("name LIKE ?", "%"+name+"%")
}
session.Model(&model.AdminRole{}).Count(&total)
res := session.Offset(offset).Limit(pageSize).Find(&items)
if res.Error != nil {
resp.ERROR(c, "暂无数据")
return
}
for _, item := range items {
adminRoleVo := vo.AdminRole{}
err := utils.CopyObject(item, &adminRoleVo)
if err == nil {
var permissions []permission
h.db.Raw("SELECT p.id,p.name,p.slug "+
"FROM chatgpt_admin_role_permissions as rp "+
"LEFT JOIN chatgpt_admin_permissions as p ON rp.permission_id = p.id "+
"WHERE rp.role_id = ?", item.Id).Scan(&permissions)
adminRoleVo.Permissions = permissions
adminRoleVo.CreatedAt = item.CreatedAt.Format("2006-01-02 15:04:05")
data = append(data, adminRoleVo)
}
}
pageVo := vo.NewPage(total, page, pageSize, data)
resp.SUCCESS(c, pageVo)
}
func (h *SysRoleHandler) Save(c *gin.Context) {
var data struct {
Id int
Name string
Description string
Permissions []int
}
if err := c.ShouldBindJSON(&data); err != nil {
resp.ERROR(c, types.InvalidArgs)
return
}
var role = model.AdminRole{}
var res *gorm.DB
tx := h.db.Begin()
if data.Id > 0 { // 更新
role.Id = data.Id
//删除角色对应的权限
err := tx.Where("role_id = ?", role.Id).Delete(model.AdminRolePermission{})
if err.Error != nil {
tx.Rollback()
resp.ERROR(c, "更新数据库失败")
return
}
//更新角色名
res = tx.Model(&role).Updates(map[string]interface{}{
"name": data.Name,
"description": data.Description,
})
} else {
//新建角色
role.Name = data.Name
role.Description = data.Description
res = tx.Create(&role)
}
if res.Error != nil {
tx.Rollback()
resp.ERROR(c, "更新数据库失败")
return
}
rp := make([]model.AdminRolePermission, 0)
if len(data.Permissions) > 0 {
for _, per := range data.Permissions {
rp = append(rp, model.AdminRolePermission{
RoleId: role.Id,
PermissionId: per,
})
}
res2 := tx.CreateInBatches(rp, len(rp))
if res2.Error != nil {
tx.Rollback()
resp.ERROR(c, "更新数据库失败")
return
}
}
tx.Commit()
resp.SUCCESS(c)
}
func (h *SysRoleHandler) Remove(c *gin.Context) {
var data struct {
Id int
}
if err := c.ShouldBindJSON(&data); err != nil {
resp.ERROR(c, types.InvalidArgs)
return
}
if data.Id > 0 {
tx := h.db.Begin()
res := tx.Where("id = ?", data.Id).Delete(&model.AdminRole{})
if res.Error != nil {
tx.Rollback()
resp.ERROR(c, "删除失败")
return
}
res = tx.Where("role_id = ?", data.Id).Delete(&model.AdminRolePermission{})
if res.Error != nil {
tx.Rollback()
resp.ERROR(c, "删除失败")
return
}
tx.Commit()
}
resp.SUCCESS(c)
}

View File

@@ -1,219 +0,0 @@
package admin
import (
"chatplus/core"
"chatplus/core/types"
"chatplus/handler"
"chatplus/store/model"
"chatplus/store/vo"
"chatplus/utils"
"chatplus/utils/resp"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
type SysUserHandler struct {
handler.BaseHandler
db *gorm.DB
}
func NewSysUserHandler(app *core.AppServer, db *gorm.DB) *SysUserHandler {
h := SysUserHandler{db: db}
h.App = app
return &h
}
type role struct {
Id int `json:"id"`
Name string `json:"name"`
}
// List 用户列表
func (h *SysUserHandler) List(c *gin.Context) {
if err := utils.CheckPermission(c, h.db); err != nil {
resp.NotPermission(c)
return
}
page := h.GetInt(c, "page", 1)
pageSize := h.GetInt(c, "page_size", 20)
username := h.GetTrim(c, "username")
offset := (page - 1) * pageSize
var items []model.AdminUser
var users = make([]vo.AdminUser, 0)
var total int64
session := h.db.Session(&gorm.Session{})
if username != "" {
session = session.Where("username LIKE ?", "%"+username+"%")
}
// 查询total
session.Model(&model.AdminUser{}).Count(&total)
res := session.Offset(offset).Limit(pageSize).Find(&items)
if res.Error == nil {
for _, item := range items {
var userVo vo.AdminUser
err := utils.CopyObject(item, &userVo)
if err == nil {
var roles []role
h.db.Raw("SELECT r.id,r.name "+
"FROM chatgpt_admin_user_roles as ur "+
"LEFT JOIN chatgpt_admin_roles as r ON ur.role_id = r.id "+
"WHERE ur.admin_id = ?", item.Id).Scan(&roles)
userVo.Id = item.Id
userVo.CreatedAt = item.CreatedAt.Unix()
userVo.UpdatedAt = item.UpdatedAt.Unix()
userVo.RoleIds = roles
users = append(users, userVo)
} else {
logger.Error(err)
}
}
}
pageVo := vo.NewPage(total, page, pageSize, users)
resp.SUCCESS(c, pageVo)
}
// Save 更新或者新增
func (h *SysUserHandler) Save(c *gin.Context) {
var data struct {
Id uint `json:"id"`
Password string `json:"password"`
Username string `json:"username"`
Status bool `json:"status"`
RoleIds []int `json:"role_ids"`
}
if err := c.ShouldBindJSON(&data); err != nil {
resp.ERROR(c, types.InvalidArgs)
return
}
// 默认id为1是超级管理员
if data.Id == 1 {
resp.ERROR(c, "超级管理员不支持更新")
return
}
var user = model.AdminUser{}
var res *gorm.DB
var userVo vo.AdminUser
tx := h.db.Begin()
if data.Id > 0 { // 更新
user.Id = data.Id
err := tx.Where("admin_id = ?", user.Id).Delete(&model.AdminUserRole{})
if err.Error != nil {
tx.Rollback()
resp.ERROR(c, "更新数据库失败")
return
}
// 此处需要用 map 更新,用结构体无法更新 0 值
res = tx.Model(&user).Updates(map[string]interface{}{
"username": data.Username,
"status": data.Status,
})
} else {
salt := utils.RandString(8)
user.Username = data.Username
user.Password = utils.GenPassword(data.Password, salt)
user.Salt = salt
user.Status = true
res = tx.Create(&user)
_ = utils.CopyObject(user, &userVo)
userVo.Id = user.Id
userVo.CreatedAt = user.CreatedAt.Unix()
userVo.UpdatedAt = user.UpdatedAt.Unix()
}
if res.Error != nil {
tx.Rollback()
resp.ERROR(c, "更新数据库失败")
return
}
// 添加角色
userRole := make([]model.AdminUserRole, 0)
if len(data.RoleIds) > 0 {
for _, roleId := range data.RoleIds {
userRole = append(userRole, model.AdminUserRole{
AdminId: user.Id,
RoleId: roleId,
})
}
err := tx.CreateInBatches(userRole, len(userRole))
if err.Error != nil {
tx.Rollback()
resp.ERROR(c, "更新数据库失败")
return
}
}
tx.Commit()
resp.SUCCESS(c, userVo)
}
// ResetPass 重置密码
func (h *SysUserHandler) ResetPass(c *gin.Context) {
var data struct {
Id uint
Password string
}
if err := c.ShouldBindJSON(&data); err != nil {
resp.ERROR(c, types.InvalidArgs)
return
}
var user model.AdminUser
res := h.db.First(&user, data.Id)
if res.Error != nil {
resp.ERROR(c, "No user found")
return
}
password := utils.GenPassword(data.Password, user.Salt)
user.Password = password
res = h.db.Updates(&user)
if res.Error != nil {
resp.ERROR(c)
} else {
resp.SUCCESS(c)
}
}
// Remove 删除
func (h *SysUserHandler) Remove(c *gin.Context) {
var data struct {
Id uint
}
if err := c.ShouldBindJSON(&data); err != nil {
resp.ERROR(c, types.InvalidArgs)
return
}
// 默认id为1是超级管理员
if data.Id == 1 {
resp.ERROR(c, "超级管理员不能删除")
return
}
if data.Id > 0 {
tx := h.db.Begin()
res := tx.Where("id = ?", data.Id).Delete(&model.AdminUser{})
if res.Error != nil {
tx.Rollback()
resp.ERROR(c, "删除失败")
return
}
res2 := tx.Where("admin_id = ?", data.Id).Delete(&model.AdminUserRole{})
if res2.Error != nil {
tx.Rollback()
resp.ERROR(c, "删除失败")
return
}
tx.Commit()
}
resp.SUCCESS(c)
}

View File

@@ -14,13 +14,10 @@ import (
type ApiKeyHandler struct {
handler.BaseHandler
db *gorm.DB
}
func NewApiKeyHandler(app *core.AppServer, db *gorm.DB) *ApiKeyHandler {
h := ApiKeyHandler{db: db}
h.App = app
return &h
return &ApiKeyHandler{BaseHandler: handler.BaseHandler{DB: db, App: app}}
}
func (h *ApiKeyHandler) Save(c *gin.Context) {
@@ -41,7 +38,7 @@ func (h *ApiKeyHandler) Save(c *gin.Context) {
apiKey := model.ApiKey{}
if data.Id > 0 {
h.db.Find(&apiKey, data.Id)
h.DB.Find(&apiKey, data.Id)
}
apiKey.Platform = data.Platform
apiKey.Value = data.Value
@@ -50,7 +47,7 @@ func (h *ApiKeyHandler) Save(c *gin.Context) {
apiKey.Enabled = data.Enabled
apiKey.ProxyURL = data.ProxyURL
apiKey.Name = data.Name
res := h.db.Save(&apiKey)
res := h.DB.Save(&apiKey)
if res.Error != nil {
resp.ERROR(c, "更新数据库失败!")
return
@@ -68,14 +65,14 @@ func (h *ApiKeyHandler) Save(c *gin.Context) {
}
func (h *ApiKeyHandler) List(c *gin.Context) {
if err := utils.CheckPermission(c, h.db); err != nil {
if err := utils.CheckPermission(c, h.DB); err != nil {
resp.NotPermission(c)
return
}
var items []model.ApiKey
var keys = make([]vo.ApiKey, 0)
res := h.db.Find(&items)
res := h.DB.Find(&items)
if res.Error == nil {
for _, item := range items {
var key vo.ApiKey
@@ -105,7 +102,7 @@ func (h *ApiKeyHandler) Set(c *gin.Context) {
return
}
res := h.db.Model(&model.ApiKey{}).Where("id = ?", data.Id).Update(data.Filed, data.Value)
res := h.DB.Model(&model.ApiKey{}).Where("id = ?", data.Id).Update(data.Filed, data.Value)
if res.Error != nil {
resp.ERROR(c, "更新数据库失败!")
return
@@ -122,7 +119,7 @@ func (h *ApiKeyHandler) Remove(c *gin.Context) {
return
}
if data.Id > 0 {
res := h.db.Where("id = ?", data.Id).Delete(&model.ApiKey{})
res := h.DB.Where("id = ?", data.Id).Delete(&model.ApiKey{})
if res.Error != nil {
resp.ERROR(c, "更新数据库失败!")
return

View File

@@ -13,9 +13,7 @@ type CaptchaHandler struct {
}
func NewCaptchaHandler(app *core.AppServer) *CaptchaHandler {
h := CaptchaHandler{}
h.App = app
return &h
return &CaptchaHandler{BaseHandler: handler.BaseHandler{App: app}}
}
type CaptchaVo struct {

View File

@@ -14,13 +14,10 @@ import (
type ChatHandler struct {
handler.BaseHandler
db *gorm.DB
}
func NewChatHandler(app *core.AppServer, db *gorm.DB) *ChatHandler {
h := ChatHandler{db: db}
h.App = app
return &h
return &ChatHandler{BaseHandler: handler.BaseHandler{App: app, DB: db}}
}
type chatItemVo struct {
@@ -36,7 +33,7 @@ type chatItemVo struct {
}
func (h *ChatHandler) List(c *gin.Context) {
if err := utils.CheckPermission(c, h.db); err != nil {
if err := utils.CheckPermission(c, h.DB); err != nil {
resp.NotPermission(c)
return
}
@@ -54,7 +51,7 @@ func (h *ChatHandler) List(c *gin.Context) {
return
}
session := h.db.Session(&gorm.Session{})
session := h.DB.Session(&gorm.Session{})
if data.Title != "" {
session = session.Where("title LIKE ?", "%"+data.Title+"%")
}
@@ -88,9 +85,9 @@ func (h *ChatHandler) List(c *gin.Context) {
var messages []model.ChatMessage
var users []model.User
var roles []model.ChatRole
h.db.Where("chat_id IN ?", chatIds).Find(&messages)
h.db.Where("id IN ?", userIds).Find(&users)
h.db.Where("id IN ?", roleIds).Find(&roles)
h.DB.Where("chat_id IN ?", chatIds).Find(&messages)
h.DB.Where("id IN ?", userIds).Find(&users)
h.DB.Where("id IN ?", roleIds).Find(&roles)
tokenMap := make(map[string]int)
userMap := make(map[uint]string)
@@ -155,7 +152,7 @@ func (h *ChatHandler) Messages(c *gin.Context) {
return
}
session := h.db.Session(&gorm.Session{})
session := h.DB.Session(&gorm.Session{})
if data.Content != "" {
session = session.Where("content LIKE ?", "%"+data.Content+"%")
}
@@ -183,7 +180,7 @@ func (h *ChatHandler) Messages(c *gin.Context) {
userIds = append(userIds, item.UserId)
}
var users []model.User
h.db.Where("id IN ?", userIds).Find(&users)
h.DB.Where("id IN ?", userIds).Find(&users)
userMap := make(map[uint]string)
for _, user := range users {
userMap[user.Id] = user.Username
@@ -210,7 +207,7 @@ func (h *ChatHandler) History(c *gin.Context) {
chatId := c.Query("chat_id") // 会话 ID
var items []model.ChatMessage
var messages = make([]vo.HistoryMessage, 0)
res := h.db.Where("chat_id = ?", chatId).Find(&items)
res := h.DB.Where("chat_id = ?", chatId).Find(&items)
if res.Error != nil {
resp.ERROR(c, "No history message")
return
@@ -237,7 +234,7 @@ func (h *ChatHandler) RemoveChat(c *gin.Context) {
return
}
tx := h.db.Begin()
tx := h.DB.Begin()
// 删除聊天记录
res := tx.Unscoped().Debug().Where("chat_id = ?", chatId).Delete(&model.ChatMessage{})
if res.Error != nil {
@@ -260,7 +257,7 @@ func (h *ChatHandler) RemoveChat(c *gin.Context) {
// RemoveMessage 删除聊天记录
func (h *ChatHandler) RemoveMessage(c *gin.Context) {
id := h.GetInt(c, "id", 0)
tx := h.db.Unscoped().Where("id = ?", id).Delete(&model.ChatMessage{})
tx := h.DB.Unscoped().Where("id = ?", id).Delete(&model.ChatMessage{})
if tx.Error != nil {
resp.ERROR(c, "更新数据库失败!")
return

View File

@@ -15,13 +15,10 @@ import (
type ChatModelHandler struct {
handler.BaseHandler
db *gorm.DB
}
func NewChatModelHandler(app *core.AppServer, db *gorm.DB) *ChatModelHandler {
h := ChatModelHandler{db: db}
h.App = app
return &h
return &ChatModelHandler{BaseHandler: handler.BaseHandler{App: app, DB: db}}
}
func (h *ChatModelHandler) Save(c *gin.Context) {
@@ -59,7 +56,7 @@ func (h *ChatModelHandler) Save(c *gin.Context) {
if item.Id > 0 {
item.CreatedAt = time.Unix(data.CreatedAt, 0)
}
res := h.db.Save(&item)
res := h.DB.Save(&item)
if res.Error != nil {
resp.ERROR(c, "更新数据库失败!")
return
@@ -78,12 +75,12 @@ func (h *ChatModelHandler) Save(c *gin.Context) {
// List 模型列表
func (h *ChatModelHandler) List(c *gin.Context) {
if err := utils.CheckPermission(c, h.db); err != nil {
if err := utils.CheckPermission(c, h.DB); err != nil {
resp.NotPermission(c)
return
}
session := h.db.Session(&gorm.Session{})
session := h.DB.Session(&gorm.Session{})
enable := h.GetBool(c, "enable")
if enable {
session = session.Where("enabled", enable)
@@ -120,7 +117,7 @@ func (h *ChatModelHandler) Set(c *gin.Context) {
return
}
res := h.db.Model(&model.ChatModel{}).Where("id = ?", data.Id).Update(data.Filed, data.Value)
res := h.DB.Model(&model.ChatModel{}).Where("id = ?", data.Id).Update(data.Filed, data.Value)
if res.Error != nil {
resp.ERROR(c, "更新数据库失败!")
return
@@ -140,7 +137,7 @@ func (h *ChatModelHandler) Sort(c *gin.Context) {
}
for index, id := range data.Ids {
res := h.db.Model(&model.ChatModel{}).Where("id = ?", id).Update("sort_num", data.Sorts[index])
res := h.DB.Model(&model.ChatModel{}).Where("id = ?", id).Update("sort_num", data.Sorts[index])
if res.Error != nil {
resp.ERROR(c, "更新数据库失败!")
return
@@ -157,7 +154,7 @@ func (h *ChatModelHandler) Remove(c *gin.Context) {
return
}
res := h.db.Where("id = ?", id).Delete(&model.ChatModel{})
res := h.DB.Where("id = ?", id).Delete(&model.ChatModel{})
if res.Error != nil {
resp.ERROR(c, "更新数据库失败!")
return

View File

@@ -15,13 +15,10 @@ import (
type ChatRoleHandler struct {
handler.BaseHandler
db *gorm.DB
}
func NewChatRoleHandler(app *core.AppServer, db *gorm.DB) *ChatRoleHandler {
h := ChatRoleHandler{db: db}
h.App = app
return &h
return &ChatRoleHandler{BaseHandler: handler.BaseHandler{App: app, DB: db}}
}
// Save 创建或者更新某个角色
@@ -41,7 +38,7 @@ func (h *ChatRoleHandler) Save(c *gin.Context) {
if data.CreatedAt > 0 {
role.CreatedAt = time.Unix(data.CreatedAt, 0)
}
res := h.db.Save(&role)
res := h.DB.Save(&role)
if res.Error != nil {
resp.ERROR(c, "更新数据库失败!")
return
@@ -53,14 +50,14 @@ func (h *ChatRoleHandler) Save(c *gin.Context) {
}
func (h *ChatRoleHandler) List(c *gin.Context) {
if err := utils.CheckPermission(c, h.db); err != nil {
if err := utils.CheckPermission(c, h.DB); err != nil {
resp.NotPermission(c)
return
}
var items []model.ChatRole
var roles = make([]vo.ChatRole, 0)
res := h.db.Order("sort_num ASC").Find(&items)
res := h.DB.Order("sort_num ASC").Find(&items)
if res.Error != nil {
resp.ERROR(c, "No data found")
return
@@ -93,7 +90,7 @@ func (h *ChatRoleHandler) Sort(c *gin.Context) {
}
for index, id := range data.Ids {
res := h.db.Model(&model.ChatRole{}).Where("id = ?", id).Update("sort_num", data.Sorts[index])
res := h.DB.Model(&model.ChatRole{}).Where("id = ?", id).Update("sort_num", data.Sorts[index])
if res.Error != nil {
resp.ERROR(c, "更新数据库失败!")
return
@@ -115,7 +112,7 @@ func (h *ChatRoleHandler) Set(c *gin.Context) {
return
}
res := h.db.Model(&model.ChatRole{}).Where("id = ?", data.Id).Update(data.Filed, data.Value)
res := h.DB.Model(&model.ChatRole{}).Where("id = ?", data.Id).Update(data.Filed, data.Value)
if res.Error != nil {
resp.ERROR(c, "更新数据库失败!")
return
@@ -135,7 +132,7 @@ func (h *ChatRoleHandler) Remove(c *gin.Context) {
resp.ERROR(c, types.InvalidArgs)
return
}
res := h.db.Where("id = ?", data.Id).Delete(&model.ChatRole{})
res := h.DB.Where("id = ?", data.Id).Delete(&model.ChatRole{})
if res.Error != nil {
resp.ERROR(c, "删除失败!")
return

View File

@@ -14,13 +14,10 @@ import (
type ConfigHandler struct {
handler.BaseHandler
db *gorm.DB
}
func NewConfigHandler(app *core.AppServer, db *gorm.DB) *ConfigHandler {
h := ConfigHandler{db: db}
h.App = app
return &h
return &ConfigHandler{BaseHandler: handler.BaseHandler{App: app, DB: db}}
}
func (h *ConfigHandler) Update(c *gin.Context) {
@@ -40,7 +37,7 @@ func (h *ConfigHandler) Update(c *gin.Context) {
value := utils.JsonEncode(&data.Config)
config := model.Config{Key: data.Key, Config: value}
res := h.db.FirstOrCreate(&config, model.Config{Key: data.Key})
res := h.DB.FirstOrCreate(&config, model.Config{Key: data.Key})
if res.Error != nil {
resp.ERROR(c, res.Error.Error())
return
@@ -48,7 +45,7 @@ func (h *ConfigHandler) Update(c *gin.Context) {
if config.Id > 0 {
config.Config = value
res := h.db.Updates(&config)
res := h.DB.Updates(&config)
if res.Error != nil {
resp.ERROR(c, res.Error.Error())
return
@@ -56,7 +53,7 @@ func (h *ConfigHandler) Update(c *gin.Context) {
// update config cache for AppServer
var cfg model.Config
h.db.Where("marker", data.Key).First(&cfg)
h.DB.Where("marker", data.Key).First(&cfg)
var err error
if data.Key == "system" {
err = utils.JsonDecode(cfg.Config, &h.App.SysConfig)
@@ -73,14 +70,14 @@ func (h *ConfigHandler) Update(c *gin.Context) {
// Get 获取指定的系统配置
func (h *ConfigHandler) Get(c *gin.Context) {
if err := utils.CheckPermission(c, h.db); err != nil {
if err := utils.CheckPermission(c, h.DB); err != nil {
resp.NotPermission(c)
return
}
key := c.Query("key")
var config model.Config
res := h.db.Where("marker", key).First(&config)
res := h.DB.Where("marker", key).First(&config)
if res.Error != nil {
resp.ERROR(c, res.Error.Error())
return

View File

@@ -14,13 +14,10 @@ import (
type DashboardHandler struct {
handler.BaseHandler
db *gorm.DB
}
func NewDashboardHandler(app *core.AppServer, db *gorm.DB) *DashboardHandler {
h := DashboardHandler{db: db}
h.App = app
return &h
return &DashboardHandler{BaseHandler: handler.BaseHandler{App: app, DB: db}}
}
type statsVo struct {
@@ -37,35 +34,35 @@ func (h *DashboardHandler) Stats(c *gin.Context) {
var userCount int64
now := time.Now()
zeroTime := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
res := h.db.Model(&model.User{}).Where("created_at > ?", zeroTime).Count(&userCount)
res := h.DB.Model(&model.User{}).Where("created_at > ?", zeroTime).Count(&userCount)
if res.Error == nil {
stats.Users = userCount
}
// new chats statistic
var chatCount int64
res = h.db.Model(&model.ChatItem{}).Where("created_at > ?", zeroTime).Count(&chatCount)
res = h.DB.Model(&model.ChatItem{}).Where("created_at > ?", zeroTime).Count(&chatCount)
if res.Error == nil {
stats.Chats = chatCount
}
// tokens took stats
var historyMessages []model.ChatMessage
res = h.db.Where("created_at > ?", zeroTime).Find(&historyMessages)
res = h.DB.Where("created_at > ?", zeroTime).Find(&historyMessages)
for _, item := range historyMessages {
stats.Tokens += item.Tokens
}
// 众筹收入
var rewards []model.Reward
res = h.db.Where("created_at > ?", zeroTime).Find(&rewards)
res = h.DB.Where("created_at > ?", zeroTime).Find(&rewards)
for _, item := range rewards {
stats.Income += item.Amount
}
// 订单收入
var orders []model.Order
res = h.db.Where("status = ?", types.OrderPaidSuccess).Where("created_at > ?", zeroTime).Find(&orders)
res = h.DB.Where("status = ?", types.OrderPaidSuccess).Where("created_at > ?", zeroTime).Find(&orders)
for _, item := range orders {
stats.Income += item.Amount
}
@@ -84,7 +81,7 @@ func (h *DashboardHandler) Stats(c *gin.Context) {
// 统计用户7天增加的曲线
var users []model.User
res = h.db.Model(&model.User{}).Where("created_at > ?", startDate).Find(&users)
res = h.DB.Model(&model.User{}).Where("created_at > ?", startDate).Find(&users)
if res.Error == nil {
for _, item := range users {
userStatistic[item.CreatedAt.Format("2006-01-02")] += 1
@@ -92,20 +89,20 @@ func (h *DashboardHandler) Stats(c *gin.Context) {
}
// 统计7天Token 消耗
res = h.db.Where("created_at > ?", startDate).Find(&historyMessages)
res = h.DB.Where("created_at > ?", startDate).Find(&historyMessages)
for _, item := range historyMessages {
historyMessagesStatistic[item.CreatedAt.Format("2006-01-02")] += float64(item.Tokens)
}
// 浮点数相加?
// 统计最近7天的众筹
res = h.db.Where("created_at > ?", startDate).Find(&rewards)
res = h.DB.Where("created_at > ?", startDate).Find(&rewards)
for _, item := range rewards {
incomeStatistic[item.CreatedAt.Format("2006-01-02")], _ = decimal.NewFromFloat(incomeStatistic[item.CreatedAt.Format("2006-01-02")]).Add(decimal.NewFromFloat(item.Amount)).Float64()
}
// 统计最近7天的订单
res = h.db.Where("status = ?", types.OrderPaidSuccess).Where("created_at > ?", startDate).Find(&orders)
res = h.DB.Where("status = ?", types.OrderPaidSuccess).Where("created_at > ?", startDate).Find(&orders)
for _, item := range orders {
incomeStatistic[item.CreatedAt.Format("2006-01-02")], _ = decimal.NewFromFloat(incomeStatistic[item.CreatedAt.Format("2006-01-02")]).Add(decimal.NewFromFloat(item.Amount)).Float64()
}

View File

@@ -17,13 +17,10 @@ import (
type FunctionHandler struct {
handler.BaseHandler
db *gorm.DB
}
func NewFunctionHandler(app *core.AppServer, db *gorm.DB) *FunctionHandler {
h := FunctionHandler{db: db}
h.App = app
return &h
return &FunctionHandler{BaseHandler: handler.BaseHandler{App: app, DB: db}}
}
func (h *FunctionHandler) Save(c *gin.Context) {
@@ -44,7 +41,7 @@ func (h *FunctionHandler) Save(c *gin.Context) {
Enabled: data.Enabled,
}
res := h.db.Save(&f)
res := h.DB.Save(&f)
if res.Error != nil {
resp.ERROR(c, "error with save data:"+res.Error.Error())
return
@@ -65,7 +62,7 @@ func (h *FunctionHandler) Set(c *gin.Context) {
return
}
res := h.db.Model(&model.Function{}).Where("id = ?", data.Id).Update(data.Filed, data.Value)
res := h.DB.Model(&model.Function{}).Where("id = ?", data.Id).Update(data.Filed, data.Value)
if res.Error != nil {
resp.ERROR(c, "更新数据库失败!")
return
@@ -74,13 +71,13 @@ func (h *FunctionHandler) Set(c *gin.Context) {
}
func (h *FunctionHandler) List(c *gin.Context) {
if err := utils.CheckPermission(c, h.db); err != nil {
if err := utils.CheckPermission(c, h.DB); err != nil {
resp.NotPermission(c)
return
}
var items []model.Function
res := h.db.Find(&items)
res := h.DB.Find(&items)
if res.Error != nil {
resp.ERROR(c, "No data found")
return
@@ -102,7 +99,7 @@ func (h *FunctionHandler) Remove(c *gin.Context) {
id := h.GetInt(c, "id", 0)
if id > 0 {
res := h.db.Delete(&model.Function{Id: uint(id)})
res := h.DB.Delete(&model.Function{Id: uint(id)})
if res.Error != nil {
resp.ERROR(c, "更新数据库失败!")
return

View File

@@ -15,17 +15,14 @@ import (
type OrderHandler struct {
handler.BaseHandler
db *gorm.DB
}
func NewOrderHandler(app *core.AppServer, db *gorm.DB) *OrderHandler {
h := OrderHandler{db: db}
h.App = app
return &h
return &OrderHandler{BaseHandler: handler.BaseHandler{App: app, DB: db}}
}
func (h *OrderHandler) List(c *gin.Context) {
if err := utils.CheckPermission(c, h.db); err != nil {
if err := utils.CheckPermission(c, h.DB); err != nil {
resp.NotPermission(c)
return
}
@@ -42,7 +39,7 @@ func (h *OrderHandler) List(c *gin.Context) {
return
}
session := h.db.Session(&gorm.Session{})
session := h.DB.Session(&gorm.Session{})
if data.OrderNo != "" {
session = session.Where("order_no", data.OrderNo)
}
@@ -82,7 +79,7 @@ func (h *OrderHandler) Remove(c *gin.Context) {
if id > 0 {
var item model.Order
res := h.db.First(&item, id)
res := h.DB.First(&item, id)
if res.Error != nil {
resp.ERROR(c, "记录不存在!")
return
@@ -93,7 +90,7 @@ func (h *OrderHandler) Remove(c *gin.Context) {
return
}
res = h.db.Unscoped().Where("id = ?", id).Delete(&model.Order{})
res = h.DB.Unscoped().Where("id = ?", id).Delete(&model.Order{})
if res.Error != nil {
resp.ERROR(c, "更新数据库失败!")
return

View File

@@ -15,13 +15,10 @@ import (
type ProductHandler struct {
handler.BaseHandler
db *gorm.DB
}
func NewProductHandler(app *core.AppServer, db *gorm.DB) *ProductHandler {
h := ProductHandler{db: db}
h.App = app
return &h
return &ProductHandler{BaseHandler: handler.BaseHandler{App: app, DB: db}}
}
func (h *ProductHandler) Save(c *gin.Context) {
@@ -51,7 +48,7 @@ func (h *ProductHandler) Save(c *gin.Context) {
if item.Id > 0 {
item.CreatedAt = time.Unix(data.CreatedAt, 0)
}
res := h.db.Save(&item)
res := h.DB.Save(&item)
if res.Error != nil {
resp.ERROR(c, "更新数据库失败!")
return
@@ -70,12 +67,12 @@ func (h *ProductHandler) Save(c *gin.Context) {
// List 模型列表
func (h *ProductHandler) List(c *gin.Context) {
if err := utils.CheckPermission(c, h.db); err != nil {
if err := utils.CheckPermission(c, h.DB); err != nil {
resp.NotPermission(c)
return
}
session := h.db.Session(&gorm.Session{})
session := h.DB.Session(&gorm.Session{})
enable := h.GetBool(c, "enable")
if enable {
session = session.Where("enabled", enable)
@@ -111,7 +108,7 @@ func (h *ProductHandler) Enable(c *gin.Context) {
return
}
res := h.db.Model(&model.Product{}).Where("id = ?", data.Id).Update("enabled", data.Enabled)
res := h.DB.Model(&model.Product{}).Where("id = ?", data.Id).Update("enabled", data.Enabled)
if res.Error != nil {
resp.ERROR(c, "更新数据库失败!")
return
@@ -131,7 +128,7 @@ func (h *ProductHandler) Sort(c *gin.Context) {
}
for index, id := range data.Ids {
res := h.db.Model(&model.Product{}).Where("id = ?", id).Update("sort_num", data.Sorts[index])
res := h.DB.Model(&model.Product{}).Where("id = ?", id).Update("sort_num", data.Sorts[index])
if res.Error != nil {
resp.ERROR(c, "更新数据库失败!")
return
@@ -145,7 +142,7 @@ func (h *ProductHandler) Remove(c *gin.Context) {
id := h.GetInt(c, "id", 0)
if id > 0 {
res := h.db.Where("id = ?", id).Delete(&model.Product{})
res := h.DB.Where("id = ?", id).Delete(&model.Product{})
if res.Error != nil {
resp.ERROR(c, "更新数据库失败!")
return

View File

@@ -14,23 +14,20 @@ import (
type RewardHandler struct {
handler.BaseHandler
db *gorm.DB
}
func NewRewardHandler(app *core.AppServer, db *gorm.DB) *RewardHandler {
h := RewardHandler{db: db}
h.App = app
return &h
return &RewardHandler{BaseHandler: handler.BaseHandler{App: app, DB: db}}
}
func (h *RewardHandler) List(c *gin.Context) {
if err := utils.CheckPermission(c, h.db); err != nil {
if err := utils.CheckPermission(c, h.DB); err != nil {
resp.NotPermission(c)
return
}
var items []model.Reward
res := h.db.Order("id DESC").Find(&items)
res := h.DB.Order("id DESC").Find(&items)
var rewards = make([]vo.Reward, 0)
if res.Error == nil {
userIds := make([]uint, 0)
@@ -38,7 +35,7 @@ func (h *RewardHandler) List(c *gin.Context) {
userIds = append(userIds, v.UserId)
}
var users []model.User
h.db.Where("id IN ?", userIds).Find(&users)
h.DB.Where("id IN ?", userIds).Find(&users)
var userMap = make(map[uint]model.User)
for _, u := range users {
userMap[u.Id] = u
@@ -71,7 +68,7 @@ func (h *RewardHandler) Remove(c *gin.Context) {
return
}
if data.Id > 0 {
res := h.db.Where("id = ?", data.Id).Delete(&model.Reward{})
res := h.DB.Where("id = ?", data.Id).Delete(&model.Reward{})
if res.Error != nil {
resp.ERROR(c, "更新数据库失败!")
return

View File

@@ -13,14 +13,11 @@ import (
type UploadHandler struct {
handler.BaseHandler
db *gorm.DB
uploaderManager *oss.UploaderManager
}
func NewUploadHandler(app *core.AppServer, db *gorm.DB, manager *oss.UploaderManager) *UploadHandler {
adminHandler := &UploadHandler{db: db, uploaderManager: manager}
adminHandler.App = app
return adminHandler
return &UploadHandler{BaseHandler: handler.BaseHandler{DB: db, App: app}, uploaderManager: manager}
}
func (h *UploadHandler) Upload(c *gin.Context) {
@@ -30,7 +27,7 @@ func (h *UploadHandler) Upload(c *gin.Context) {
return
}
userId := 0
res := h.db.Create(&model.File{
res := h.DB.Create(&model.File{
UserId: userId,
Name: file.Name,
ObjKey: file.ObjKey,

View File

@@ -16,18 +16,15 @@ import (
type UserHandler struct {
handler.BaseHandler
db *gorm.DB
}
func NewUserHandler(app *core.AppServer, db *gorm.DB) *UserHandler {
h := UserHandler{db: db}
h.App = app
return &h
return &UserHandler{BaseHandler: handler.BaseHandler{App: app, DB: db}}
}
// List 用户列表
func (h *UserHandler) List(c *gin.Context) {
if err := utils.CheckPermission(c, h.db); err != nil {
if err := utils.CheckPermission(c, h.DB); err != nil {
resp.NotPermission(c)
return
}
@@ -41,7 +38,7 @@ func (h *UserHandler) List(c *gin.Context) {
var users = make([]vo.User, 0)
var total int64
session := h.db.Session(&gorm.Session{})
session := h.DB.Session(&gorm.Session{})
if username != "" {
session = session.Where("username LIKE ?", "%"+username+"%")
}
@@ -87,7 +84,7 @@ func (h *UserHandler) Save(c *gin.Context) {
if data.Id > 0 { // 更新
user.Id = data.Id
// 此处需要用 map 更新,用结构体无法更新 0 值
res = h.db.Model(&user).Updates(map[string]interface{}{
res = h.DB.Model(&user).Updates(map[string]interface{}{
"username": data.Username,
"status": data.Status,
"vip": data.Vip,
@@ -108,7 +105,7 @@ func (h *UserHandler) Save(c *gin.Context) {
ChatModels: utils.JsonEncode(data.ChatModels),
ExpiredTime: utils.Str2stamp(data.ExpiredTime),
}
res = h.db.Create(&u)
res = h.DB.Create(&u)
_ = utils.CopyObject(u, &userVo)
userVo.Id = u.Id
userVo.CreatedAt = u.CreatedAt.Unix()
@@ -135,7 +132,7 @@ func (h *UserHandler) ResetPass(c *gin.Context) {
}
var user model.User
res := h.db.First(&user, data.Id)
res := h.DB.First(&user, data.Id)
if res.Error != nil {
resp.ERROR(c, "No user found")
return
@@ -143,7 +140,7 @@ func (h *UserHandler) ResetPass(c *gin.Context) {
password := utils.GenPassword(data.Password, user.Salt)
user.Password = password
res = h.db.Updates(&user)
res = h.DB.Updates(&user)
if res.Error != nil {
resp.ERROR(c)
} else {
@@ -152,43 +149,33 @@ func (h *UserHandler) ResetPass(c *gin.Context) {
}
func (h *UserHandler) Remove(c *gin.Context) {
var data struct {
Id uint
}
if err := c.ShouldBindJSON(&data); err != nil {
id := h.GetInt(c, "id", 0)
if id <= 0 {
resp.ERROR(c, types.InvalidArgs)
return
}
if data.Id > 0 {
tx := h.db.Begin()
res := h.db.Where("id = ?", data.Id).Delete(&model.User{})
if res.Error != nil {
resp.ERROR(c, "删除失败")
return
}
// 删除聊天记录
res = h.db.Where("user_id = ?", data.Id).Delete(&model.ChatItem{})
if res.Error != nil {
tx.Rollback()
resp.ERROR(c, "删除失败")
return
}
// 删除聊天历史记录
res = h.db.Where("user_id = ?", data.Id).Delete(&model.ChatMessage{})
if res.Error != nil {
tx.Rollback()
resp.ERROR(c, "删除失败")
return
}
// 删除登录日志
res = h.db.Where("user_id = ?", data.Id).Delete(&model.UserLoginLog{})
if res.Error != nil {
tx.Rollback()
resp.ERROR(c, "删除失败")
return
}
tx.Commit()
// 删除用户
res := h.DB.Where("id = ?", id).Delete(&model.User{})
if res.Error != nil {
resp.ERROR(c, "删除失败")
return
}
// 删除聊天记录
h.DB.Where("user_id = ?", id).Delete(&model.ChatItem{})
// 删除聊天历史记录
h.DB.Where("user_id = ?", id).Delete(&model.ChatMessage{})
// 删除登录日志
h.DB.Where("user_id = ?", id).Delete(&model.UserLoginLog{})
// 删除算力日志
h.DB.Where("user_id = ?", id).Delete(&model.PowerLog{})
// 删除众筹日志
h.DB.Where("user_id = ?", id).Delete(&model.Reward{})
// 删除绘图任务
h.DB.Where("user_id = ?", id).Delete(&model.MidJourneyJob{})
h.DB.Where("user_id = ?", id).Delete(&model.SdJob{})
// 删除订单
h.DB.Where("user_id = ?", id).Delete(&model.Order{})
resp.SUCCESS(c)
}
@@ -196,10 +183,10 @@ func (h *UserHandler) LoginLog(c *gin.Context) {
page := h.GetInt(c, "page", 1)
pageSize := h.GetInt(c, "page_size", 20)
var total int64
h.db.Model(&model.UserLoginLog{}).Count(&total)
h.DB.Model(&model.UserLoginLog{}).Count(&total)
offset := (page - 1) * pageSize
var items []model.UserLoginLog
res := h.db.Offset(offset).Limit(pageSize).Order("id DESC").Find(&items)
res := h.DB.Offset(offset).Limit(pageSize).Order("id DESC").Find(&items)
if res.Error != nil {
resp.ERROR(c, "获取数据失败")
return