Merge branch 'ui' of 172.28.1.6:yangjian/chatgpt-plus into ui

This commit is contained in:
廖彦棋 2024-03-14 17:06:15 +08:00
commit ac5e67ea73
18 changed files with 140 additions and 5 deletions

View File

@ -162,8 +162,7 @@ func authorizeMiddleware(s *AppServer, client *redis.Client) gin.HandlerFunc {
strings.HasPrefix(c.Request.URL.Path, "/api/sms/") || strings.HasPrefix(c.Request.URL.Path, "/api/sms/") ||
strings.HasPrefix(c.Request.URL.Path, "/api/captcha/") || strings.HasPrefix(c.Request.URL.Path, "/api/captcha/") ||
strings.HasPrefix(c.Request.URL.Path, "/api/payment/") || strings.HasPrefix(c.Request.URL.Path, "/api/payment/") ||
strings.HasPrefix(c.Request.URL.Path, "/static/") || strings.HasPrefix(c.Request.URL.Path, "/static/") {
c.Request.URL.Path == "/api/admin/config/get" {
c.Next() c.Next()
return return
} }

View File

@ -30,6 +30,7 @@ const (
Success = BizCode(0) Success = BizCode(0)
Failed = BizCode(1) Failed = BizCode(1)
NotAuthorized = BizCode(400) // 未授权 NotAuthorized = BizCode(400) // 未授权
NotPermission = BizCode(403) // 没有权限
OkMsg = "Success" OkMsg = "Success"
ErrorMsg = "系统开小差了" ErrorMsg = "系统开小差了"

View File

@ -25,6 +25,11 @@ func NewSysPermissionHandler(app *core.AppServer, db *gorm.DB) *SysPermissionHan
} }
func (h *SysPermissionHandler) List(c *gin.Context) { 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 items []model.AdminPermission
var data = make([]vo.AdminPermission, 0) var data = make([]vo.AdminPermission, 0)
res := h.db.Find(&items) res := h.db.Find(&items)

View File

@ -26,12 +26,31 @@ func NewSysRoleHandler(app *core.AppServer, db *gorm.DB) *SysRoleHandler {
type permission struct { type permission struct {
Id int `json:"id"` Id int `json:"id"`
Name string `json:"name"` Name string `json:"name"`
Slug string `json:"slug"`
} }
func (h *SysRoleHandler) List(c *gin.Context) { 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 items []model.AdminRole
var data = make([]vo.AdminRole, 0) var data = make([]vo.AdminRole, 0)
res := h.db.Find(&items) 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 { if res.Error != nil {
resp.ERROR(c, "暂无数据") resp.ERROR(c, "暂无数据")
return return
@ -41,16 +60,18 @@ func (h *SysRoleHandler) List(c *gin.Context) {
err := utils.CopyObject(item, &adminRoleVo) err := utils.CopyObject(item, &adminRoleVo)
if err == nil { if err == nil {
var permissions []permission var permissions []permission
h.db.Raw("SELECT p.id,p.name "+ h.db.Raw("SELECT p.id,p.name,p.slug "+
"FROM chatgpt_admin_role_permissions as rp "+ "FROM chatgpt_admin_role_permissions as rp "+
"LEFT JOIN chatgpt_admin_permissions as p ON rp.permission_id = p.id "+ "LEFT JOIN chatgpt_admin_permissions as p ON rp.permission_id = p.id "+
"WHERE rp.role_id = ?", item.Id).Scan(&permissions) "WHERE rp.role_id = ?", item.Id).Scan(&permissions)
adminRoleVo.Permissions = permissions adminRoleVo.Permissions = permissions
adminRoleVo.CreatedAt = item.CreatedAt.Format("2006-01-02 15:04:05") adminRoleVo.CreatedAt = item.CreatedAt.Format("2006-01-02 15:04:05")
data = append(data, adminRoleVo) data = append(data, adminRoleVo)
} }
} }
resp.SUCCESS(c, data) pageVo := vo.NewPage(total, page, pageSize, data)
resp.SUCCESS(c, pageVo)
} }
func (h *SysRoleHandler) Save(c *gin.Context) { func (h *SysRoleHandler) Save(c *gin.Context) {

View File

@ -30,6 +30,11 @@ type role struct {
// List 用户列表 // List 用户列表
func (h *SysUserHandler) List(c *gin.Context) { 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) page := h.GetInt(c, "page", 1)
pageSize := h.GetInt(c, "page_size", 20) pageSize := h.GetInt(c, "page_size", 20)
username := h.GetTrim(c, "username") username := h.GetTrim(c, "username")

View File

@ -68,6 +68,11 @@ func (h *ApiKeyHandler) Save(c *gin.Context) {
} }
func (h *ApiKeyHandler) List(c *gin.Context) { func (h *ApiKeyHandler) List(c *gin.Context) {
if err := utils.CheckPermission(c, h.db); err != nil {
resp.NotPermission(c)
return
}
var items []model.ApiKey var items []model.ApiKey
var keys = make([]vo.ApiKey, 0) var keys = make([]vo.ApiKey, 0)
res := h.db.Find(&items) res := h.db.Find(&items)

View File

@ -35,6 +35,11 @@ type chatItemVo struct {
} }
func (h *ChatHandler) List(c *gin.Context) { func (h *ChatHandler) List(c *gin.Context) {
if err := utils.CheckPermission(c, h.db); err != nil {
resp.NotPermission(c)
return
}
var data struct { var data struct {
Title string `json:"title"` Title string `json:"title"`
UserId uint `json:"user_id"` UserId uint `json:"user_id"`

View File

@ -72,6 +72,11 @@ func (h *ChatModelHandler) Save(c *gin.Context) {
// List 模型列表 // List 模型列表
func (h *ChatModelHandler) List(c *gin.Context) { func (h *ChatModelHandler) List(c *gin.Context) {
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") enable := h.GetBool(c, "enable")
if enable { if enable {

View File

@ -53,6 +53,11 @@ func (h *ChatRoleHandler) Save(c *gin.Context) {
} }
func (h *ChatRoleHandler) List(c *gin.Context) { func (h *ChatRoleHandler) List(c *gin.Context) {
if err := utils.CheckPermission(c, h.db); err != nil {
resp.NotPermission(c)
return
}
var items []model.ChatRole var items []model.ChatRole
var roles = make([]vo.ChatRole, 0) var roles = make([]vo.ChatRole, 0)
res := h.db.Order("sort_num ASC").Find(&items) res := h.db.Order("sort_num ASC").Find(&items)

View File

@ -71,6 +71,11 @@ func (h *ConfigHandler) Update(c *gin.Context) {
// Get 获取指定的系统配置 // Get 获取指定的系统配置
func (h *ConfigHandler) Get(c *gin.Context) { func (h *ConfigHandler) Get(c *gin.Context) {
if err := utils.CheckPermission(c, h.db); err != nil {
resp.NotPermission(c)
return
}
key := c.Query("key") key := c.Query("key")
var config model.Config var config model.Config
res := h.db.Where("marker", key).First(&config) res := h.db.Where("marker", key).First(&config)

View File

@ -5,6 +5,7 @@ import (
"chatplus/core/types" "chatplus/core/types"
"chatplus/handler" "chatplus/handler"
"chatplus/store/model" "chatplus/store/model"
"chatplus/utils"
"chatplus/utils/resp" "chatplus/utils/resp"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/shopspring/decimal" "github.com/shopspring/decimal"
@ -32,6 +33,11 @@ type statsVo struct {
} }
func (h *DashboardHandler) Stats(c *gin.Context) { func (h *DashboardHandler) Stats(c *gin.Context) {
if err := utils.CheckPermission(c, h.db); err != nil {
resp.NotPermission(c)
return
}
stats := statsVo{} stats := statsVo{}
// new users statistic // new users statistic
var userCount int64 var userCount int64

View File

@ -74,6 +74,11 @@ func (h *FunctionHandler) Set(c *gin.Context) {
} }
func (h *FunctionHandler) List(c *gin.Context) { func (h *FunctionHandler) List(c *gin.Context) {
if err := utils.CheckPermission(c, h.db); err != nil {
resp.NotPermission(c)
return
}
var items []model.Function var items []model.Function
res := h.db.Find(&items) res := h.db.Find(&items)
if res.Error != nil { if res.Error != nil {

View File

@ -25,6 +25,11 @@ func NewOrderHandler(app *core.AppServer, db *gorm.DB) *OrderHandler {
} }
func (h *OrderHandler) List(c *gin.Context) { func (h *OrderHandler) List(c *gin.Context) {
if err := utils.CheckPermission(c, h.db); err != nil {
resp.NotPermission(c)
return
}
var data struct { var data struct {
OrderNo string `json:"order_no"` OrderNo string `json:"order_no"`
Status int `json:"status"` Status int `json:"status"`

View File

@ -70,6 +70,11 @@ func (h *ProductHandler) Save(c *gin.Context) {
// List 模型列表 // List 模型列表
func (h *ProductHandler) List(c *gin.Context) { func (h *ProductHandler) List(c *gin.Context) {
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") enable := h.GetBool(c, "enable")
if enable { if enable {

View File

@ -24,6 +24,11 @@ func NewRewardHandler(app *core.AppServer, db *gorm.DB) *RewardHandler {
} }
func (h *RewardHandler) List(c *gin.Context) { func (h *RewardHandler) List(c *gin.Context) {
if err := utils.CheckPermission(c, h.db); err != nil {
resp.NotPermission(c)
return
}
var items []model.Reward 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) var rewards = make([]vo.Reward, 0)

View File

@ -27,6 +27,11 @@ func NewUserHandler(app *core.AppServer, db *gorm.DB) *UserHandler {
// List 用户列表 // List 用户列表
func (h *UserHandler) List(c *gin.Context) { func (h *UserHandler) List(c *gin.Context) {
if err := utils.CheckPermission(c, h.db); err != nil {
resp.NotPermission(c)
return
}
page := h.GetInt(c, "page", 1) page := h.GetInt(c, "page", 1)
pageSize := h.GetInt(c, "page_size", 20) pageSize := h.GetInt(c, "page_size", 20)
username := h.GetTrim(c, "username") username := h.GetTrim(c, "username")

40
api/utils/permission.go Normal file
View File

@ -0,0 +1,40 @@
package utils
import (
"chatplus/core/types"
"chatplus/store/model"
"fmt"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"net/url"
"strings"
)
// CheckPermission Todo: 放在缓存
// CheckPermission 检查权限
func CheckPermission(c *gin.Context, db *gorm.DB) error {
u, err := url.Parse(c.Request.RequestURI)
if err != nil {
panic(err)
}
slug := strings.Replace(u.Path, "/", "_", -1)[1:]
// 用户名
userName, _ := c.Get(types.LoginUserID)
var manager model.AdminUser
db.Table("chatgpt_admin_users").Select("chatgpt_admin_users.id").Where("username = ?", userName).First(&manager)
// 超级管理员不判断
if manager.Id == 1 {
return nil
}
var roleIds []int
var count int64
db.Raw("SELECT `chatgpt_admin_user_roles`.role_id FROM `chatgpt_admin_users` LEFT JOIN `chatgpt_admin_user_roles` ON ( `chatgpt_admin_users`.id = `chatgpt_admin_user_roles`.admin_id ) WHERE `chatgpt_admin_users`.id = ?", manager.Id).Find(&roleIds)
db.Raw("SELECT `chatgpt_admin_permissions`.slug FROM `chatgpt_admin_permissions` LEFT JOIN `chatgpt_admin_role_permissions` ON (`chatgpt_admin_permissions`.id = `chatgpt_admin_role_permissions`.permission_id) WHERE `chatgpt_admin_role_permissions`.role_id IN ? and `chatgpt_admin_permissions`.slug = ? ", roleIds, slug).Count(&count)
if count > 0 {
return nil
}
return fmt.Errorf("没有权限")
}

View File

@ -34,3 +34,11 @@ func NotAuth(c *gin.Context, messages ...string) {
c.JSON(http.StatusOK, types.BizVo{Code: types.NotAuthorized, Message: "Not Authorized"}) c.JSON(http.StatusOK, types.BizVo{Code: types.NotAuthorized, Message: "Not Authorized"})
} }
} }
func NotPermission(c *gin.Context, messages ...string) {
if messages != nil {
c.JSON(http.StatusOK, types.BizVo{Code: types.NotPermission, Message: messages[0]})
} else {
c.JSON(http.StatusOK, types.BizVo{Code: types.NotPermission, Message: "Not Permission"})
}
}