修改文件目录

This commit is contained in:
linwenxiang
2020-09-04 00:21:52 +08:00
parent 41b06c806a
commit 01ea376015
109 changed files with 180 additions and 172 deletions
+43
View File
@@ -0,0 +1,43 @@
package actions
import (
"errors"
"github.com/gin-gonic/gin"
dto2 "go-admin/common/dto"
"go-admin/common/models"
"gorm.io/gorm"
"go-admin/tools"
"go-admin/tools/app"
)
// CreateAction 通用新增动作
func CreateAction(control dto2.Control) gin.HandlerFunc {
return func(c *gin.Context) {
req := control.Generate()
var err error
idb, exist := c.Get("db")
if !exist {
err = errors.New("db connect not exist")
tools.HasError(err, "", 500)
}
switch idb.(type) {
case *gorm.DB:
//新增操作
db := idb.(*gorm.DB)
err = req.Bind(c)
tools.HasError(err, "参数验证失败", 422)
var object models.ActiveRecord
object, err = req.GenerateM()
tools.HasError(err, "模型生成失败", 422)
object.SetCreateBy(tools.GetUserIdUint(c))
err = db.WithContext(c).Create(object).Error
tools.HasError(err, "创建失败", 500)
app.OK(c, object.GetId(), "创建成功")
c.Next()
default:
err = errors.New("db connect not exist")
tools.HasError(err, "", 500)
}
}
}
+55
View File
@@ -0,0 +1,55 @@
package actions
import (
"errors"
dto2 "go-admin/common/dto"
"go-admin/common/models"
"go-admin/tools/app"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"go-admin/tools"
)
// DeleteAction 通用删除动作
func DeleteAction(control dto2.Control) gin.HandlerFunc {
return func(c *gin.Context) {
var err error
idb, exist := c.Get("db")
if !exist {
err = errors.New("db connect not exist")
tools.HasError(err, "", 500)
}
switch idb.(type) {
case *gorm.DB:
//删除操作
db := idb.(*gorm.DB)
req := control.Generate()
err = req.Bind(c)
tools.HasError(err, "参数验证失败", 422)
var object models.ActiveRecord
object, err = req.GenerateM()
tools.HasError(err, "模型生成失败", 500)
object.SetUpdateBy(tools.GetUserIdUint(c))
//数据权限检查
p := getPermissionFromContext(c)
db = db.WithContext(c).Scopes(
Permission(object.TableName(), p),
).Where(req.GetId()).Delete(object)
tools.HasError(db.Error, "删除失败", 500)
if db.RowsAffected == 0 {
err = errors.New("无权删除该数据")
tools.HasError(err, "", 403)
}
app.OK(c, object.GetId(), "删除成功")
c.Next()
default:
err = errors.New("db connect not exist")
tools.HasError(err, "", 500)
}
}
}
+58
View File
@@ -0,0 +1,58 @@
package actions
import (
"errors"
dto2 "go-admin/common/dto"
"go-admin/common/models"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"go-admin/tools"
"go-admin/tools/app"
)
// IndexAction 通用查询动作
func IndexAction(m models.ActiveRecord, d dto2.Index, f func() interface{}) gin.HandlerFunc {
return func(c *gin.Context) {
list := f()
object := m.Generate()
req := d.Generate()
var err error
idb, exist := c.Get("db")
if !exist {
err = errors.New("db connect not exist")
tools.HasError(err, "", 500)
}
var count int64
switch idb.(type) {
case *gorm.DB:
//查询列表
db := idb.(*gorm.DB)
err = c.Bind(req)
tools.HasError(err, "参数验证失败", 422)
err = req.Bind(c)
tools.HasError(err, "参数验证失败", 422)
//数据权限检查
p := getPermissionFromContext(c)
err = db.WithContext(c).Model(object).
Scopes(
dto2.MakeCondition(req.GetNeedSearch()),
dto2.Paginate(req.GetPageSize(), req.GetPageIndex()),
Permission(object.TableName(), p),
).
Find(list).Limit(-1).Offset(-1).
Count(&count).Error
if !errors.Is(err, gorm.ErrRecordNotFound) {
tools.HasError(err, "查询失败", 500)
}
app.PageOK(c, list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
c.Next()
default:
err = errors.New("db connect not exist")
tools.HasError(err, "", 500)
}
}
}
+102
View File
@@ -0,0 +1,102 @@
package actions
import (
"errors"
"fmt"
"github.com/gin-gonic/gin"
"go-admin/tools/config"
"gorm.io/gorm"
"go-admin/tools"
)
type dataPermission struct {
DataScope string
UserId int
DeptId int
RoleId int
}
func PermissionAction() gin.HandlerFunc {
return func(c *gin.Context) {
var err error
idb, exist := c.Get("db")
if !exist {
err = errors.New("db connect not exist")
tools.HasError(err, "", 500)
}
switch idb.(type) {
case *gorm.DB:
db := idb.(*gorm.DB)
var p = new(dataPermission)
if userId := tools.GetUserIdStr(c); userId != "" {
p, err = newDataPermission(db, userId)
if err != nil {
c.JSON(500, gin.H{
"code": 500,
"msg": fmt.Sprintf("权限范围鉴定错误, error:%v", err),
})
c.Abort()
return
}
}
c.Set(PermissionKey, p)
default:
c.JSON(500, gin.H{
"code": 500,
"msg": "db connect not exist",
})
c.Abort()
return
}
c.Next()
}
}
func newDataPermission(tx *gorm.DB, userId interface{}) (*dataPermission, error) {
var err error
p := &dataPermission{}
err = tx.Table("sys_user").
Select("sys_user.user_id", "sys_role.role_id", "sys_user.dept_id", "sys_role.data_scope").
Joins("left join sys_role on sys_role.role_id = sys_user.role_id").
Where("sys_user.user_id = ?", userId).
Scan(&p).Error
if err != nil {
err = errors.New("获取用户数据出错 msg:" + err.Error())
return nil, err
}
return p, nil
}
func Permission(tableName string, p *dataPermission) func(db *gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
if !config.ApplicationConfig.EnableDP {
return db
}
switch p.DataScope {
case "2":
return db.Where(tableName+".create_by in (select sys_user.user_id from sys_role_dept left join sys_user on sys_user.dept_id=sys_role_dept.dept_id where sys_role_dept.role_id = ?)", p.RoleId)
case "3":
return db.Where(tableName+".create_by in (SELECT user_id from sys_user where dept_id = ? )", p.DeptId)
case "4":
return db.Where(tableName+".create_by in (SELECT user_id from sys_user where sys_user.dept_id in(select dept_id from sys_dept where dept_path like ? ))", "%"+tools.IntToString(p.DeptId)+"%")
case "5":
return db.Where(tableName+".create_by = ?", p.UserId)
default:
return db
}
}
}
func getPermissionFromContext(c *gin.Context) *dataPermission {
p := new(dataPermission)
if pm, ok := c.Get(PermissionKey); ok {
switch pm.(type) {
case *dataPermission:
p = pm.(*dataPermission)
}
}
return p
}
+5
View File
@@ -0,0 +1,5 @@
package actions
const (
PermissionKey = "dataPermission"
)
+53
View File
@@ -0,0 +1,53 @@
package actions
import (
"errors"
"github.com/gin-gonic/gin"
dto2 "go-admin/common/dto"
"go-admin/common/models"
"gorm.io/gorm"
"go-admin/tools"
"go-admin/tools/app"
)
// UpdateAction 通用更新动作
func UpdateAction(control dto2.Control) gin.HandlerFunc {
return func(c *gin.Context) {
req := control.Generate()
var err error
idb, exist := c.Get("db")
if !exist {
err = errors.New("db connect not exist")
tools.HasError(err, "", 500)
}
switch idb.(type) {
case *gorm.DB:
//更新操作
db := idb.(*gorm.DB)
err = req.Bind(c)
tools.HasError(err, "参数验证失败", 422)
var object models.ActiveRecord
object, err = req.GenerateM()
tools.HasError(err, "参数验证失败", 422)
object.SetUpdateBy(tools.GetUserIdUint(c))
//数据权限检查
p := getPermissionFromContext(c)
db = db.WithContext(c).Scopes(
Permission(object.TableName(), p),
).Where(req.GetId()).Updates(object)
tools.HasError(db.Error, "更新失败", 500)
if db.RowsAffected == 0 {
err = errors.New("无权更新该数据")
tools.HasError(err, "", 403)
}
app.OK(c, object.GetId(), "更新成功")
c.Next()
default:
err = errors.New("db connect not exist")
tools.HasError(err, "", 500)
}
}
}
+52
View File
@@ -0,0 +1,52 @@
package actions
import (
"errors"
dto2 "go-admin/common/dto"
"go-admin/common/models"
"go-admin/tools/app"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"go-admin/tools"
)
// ViewAction 通用详情动作
func ViewAction(control dto2.Control) gin.HandlerFunc {
return func(c *gin.Context) {
var err error
idb, exist := c.Get("db")
if !exist {
err = errors.New("db connect not exist")
tools.HasError(err, "", 500)
}
switch idb.(type) {
case *gorm.DB:
//查看详情
db := idb.(*gorm.DB)
req := control.Generate()
err = req.Bind(c)
tools.HasError(err, "参数验证失败", 422)
var object models.ActiveRecord
object, err = req.GenerateM()
tools.HasError(err, "模型生成失败", 500)
//数据权限检查
p := getPermissionFromContext(c)
err = db.WithContext(c).Scopes(
Permission(object.TableName(), p),
).Where(req.GetId()).First(object).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
tools.HasError(err, "查看失败", 404)
}
tools.HasError(err, "查看失败", 500)
app.OK(c, object, "查看成功")
c.Next()
default:
err = errors.New("db connect not exist")
tools.HasError(err, "", 500)
}
}
}
+20
View File
@@ -0,0 +1,20 @@
package database
func Setup(driver string) {
dbType := driver
if dbType == "mysql" {
var db = new(Mysql)
db.Setup()
}
//TODO 如果需要sqlite3请开启下面注释
//if dbType == "sqlite3" {
// var db = new(SqLite)
// db.Setup()
//}
if dbType == "postgres" {
var db = new(PgSql)
db.Setup()
}
}
+10
View File
@@ -0,0 +1,10 @@
package database
import "gorm.io/gorm"
type Database interface {
Setup()
Open(conn string, cfg *gorm.Config) (db *gorm.DB, err error)
GetConnect() string
GetDriver() string
}
+61
View File
@@ -0,0 +1,61 @@
package database
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/gorm/schema"
"log"
"os"
"time"
"go-admin/common/global"
"go-admin/tools"
"go-admin/tools/config"
)
type Mysql struct {
}
func (e *Mysql) Setup() {
var err error
global.Source = e.GetConnect()
global.Logger.Info(tools.Green(global.Source))
global.Eloquent, err = e.Open(e.GetConnect(), &gorm.Config{
NamingStrategy: schema.NamingStrategy{
SingularTable: true,
},
})
if err != nil {
global.Logger.Fatal(tools.Red(e.GetDriver()+" connect error :"), err)
} else {
global.Logger.Info(tools.Green(e.GetDriver() + " connect success !"))
}
if global.Eloquent.Error != nil {
global.Logger.Fatal(tools.Red(" database error :"), global.Eloquent.Error)
}
if config.LoggerConfig.EnabledDB {
global.Eloquent.Logger = logger.New(log.New(os.Stdout, "\r\n", log.LstdFlags), logger.Config{
SlowThreshold: time.Second,
Colorful: true,
LogLevel: logger.Info,
})
}
}
// 打开数据库连接
func (e *Mysql) Open(conn string, cfg *gorm.Config) (db *gorm.DB, err error) {
return gorm.Open(mysql.Open(conn), cfg)
}
// 获取数据库连接
func (e *Mysql) GetConnect() string {
return config.DatabaseConfig.Source
}
func (e *Mysql) GetDriver() string {
return config.DatabaseConfig.Driver
}
+61
View File
@@ -0,0 +1,61 @@
package database
import (
"log"
"os"
"time"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/gorm/schema"
"go-admin/common/global"
"go-admin/tools/config"
)
type PgSql struct {
}
func (e *PgSql) Setup() {
var err error
global.Source = e.GetConnect()
log.Println(global.Source)
global.Eloquent, err = e.Open(e.GetDriver(), &gorm.Config{
NamingStrategy: schema.NamingStrategy{
SingularTable: true,
},
})
if err != nil {
log.Fatalf("%s connect error %v", e.GetDriver(), err)
} else {
log.Printf("%s connect success!", e.GetDriver())
}
if global.Eloquent.Error != nil {
log.Fatalf("database error %v", global.Eloquent.Error)
}
if config.LoggerConfig.EnabledDB {
global.Eloquent.Logger = logger.New(log.New(os.Stdout, "\r\n", log.LstdFlags), logger.Config{
SlowThreshold: time.Second,
Colorful: true,
LogLevel: logger.Info,
})
}
}
// 打开数据库连接
func (*PgSql) Open(conn string, cfg *gorm.Config) (db *gorm.DB, err error) {
eloquent, err := gorm.Open(postgres.Open(conn), cfg)
return eloquent, err
}
func (e *PgSql) GetConnect() string {
return config.DatabaseConfig.Source
}
func (e *PgSql) GetDriver() string {
return config.DatabaseConfig.Driver
}
+64
View File
@@ -0,0 +1,64 @@
// +build sqlite3
package database
import (
"log"
"os"
"time"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/gorm/schema"
"go-admin/common/global"
"go-admin/tools/config"
)
type SqLite struct {
}
func (e *SqLite) Setup() {
var err error
global.Source = e.GetConnect()
log.Println(global.Source)
global.Eloquent, err = e.Open(e.GetDriver(), &gorm.Config{
NamingStrategy: schema.NamingStrategy{
SingularTable: true,
},
})
if err != nil {
log.Fatalf("%s connect error %v", e.GetDriver(), err)
} else {
log.Printf("%s connect success!", e.GetDriver())
}
if global.Eloquent.Error != nil {
log.Fatalf("database error %v", global.Eloquent.Error)
}
if config.LoggerConfig.EnabledDB {
global.Eloquent.Logger = logger.New(log.New(os.Stdout, "\r\n", log.LstdFlags), logger.Config{
SlowThreshold: time.Second,
Colorful: true,
LogLevel: logger.Info,
})
}
}
// 打开数据库连接
func (*SqLite) Open(conn string, cfg *gorm.Config) (db *gorm.DB, err error) {
eloquent, err := gorm.Open(sqlite.Open(conn), cfg)
return eloquent, err
}
func (e *SqLite) GetConnect() string {
return config.DatabaseConfig.Source
}
func (e *SqLite) GetDriver() string {
return config.DatabaseConfig.Driver
}
+85
View File
@@ -0,0 +1,85 @@
package dto
import (
"go-admin/tools/config"
"github.com/matchstalk/go-admin-core/search"
"gorm.io/gorm"
)
type GeneralDelDto struct {
Id int `uri:"id" json:"id" validate:"required"`
Ids []int `json:"ids"`
}
func (g GeneralDelDto) GetIds() []int {
ids := make([]int, 0)
if g.Id != 0 {
ids = append(ids, g.Id)
}
if len(g.Ids) > 0 {
for _, id := range g.Ids {
if id > 0 {
ids = append(ids, id)
}
}
} else {
if g.Id > 0 {
ids = append(ids, g.Id)
}
}
if len(ids) <= 0 {
//方式全部删除
ids = append(ids, 0)
}
return ids
}
type GeneralGetDto struct {
Id int `uri:"id" json:"id" validate:"required"`
}
func MakeCondition(q interface{}) func(db *gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
condition := &search.GormCondition{
GormPublic: search.GormPublic{},
Join: make([]*search.GormJoin, 0),
}
search.ResolveSearchQuery(config.DatabaseConfig.Driver, q, condition)
for _, join := range condition.Join {
if join == nil {
continue
}
db = db.Joins(join.JoinOn)
for k, v := range join.Where {
db = db.Where(k, v...)
}
for k, v := range join.Or {
db = db.Or(k, v...)
}
for _, o := range join.Order {
db = db.Order(o)
}
}
for k, v := range condition.Where {
db = db.Where(k, v...)
}
for k, v := range condition.Or {
db = db.Or(k, v...)
}
for _, o := range condition.Order {
db = db.Order(o)
}
return db
}
}
func Paginate(pageSize, pageIndex int) func(db *gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
offset := (pageIndex - 1) * pageSize
if offset < 0 {
offset = 0
}
return db.Offset(offset).Limit(pageSize)
}
}
+21
View File
@@ -0,0 +1,21 @@
package dto
import (
"github.com/gin-gonic/gin"
"go-admin/common/models"
)
type Index interface {
Generate() Index
Bind(ctx *gin.Context) error
GetPageIndex() int
GetPageSize() int
GetNeedSearch() interface{}
}
type Control interface {
Generate() Control
Bind(ctx *gin.Context) error
GenerateM() (models.ActiveRecord, error)
GetId() interface{}
}
+34
View File
@@ -0,0 +1,34 @@
package global
import (
"github.com/casbin/casbin/v2"
"github.com/gin-gonic/gin"
"github.com/gogf/gf/os/glog"
"github.com/robfig/cron/v3"
"gorm.io/gorm"
)
var GinEngine *gin.Engine
var CasbinEnforcer *casbin.SyncedEnforcer
var Eloquent *gorm.DB
var GADMCron *cron.Cron
var (
Source string
Driver string
DBName string
)
// go-admin Version Info
var Version string
func init() {
Version = "1.2.0"
}
var (
Logger *glog.Logger
JobLogger *glog.Logger
RequestLogger *glog.Logger
)
+1
View File
@@ -0,0 +1 @@
package global
+17
View File
@@ -0,0 +1,17 @@
package middleware
import (
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
func WithContextDb(dbMap map[string]*gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
if db, ok := dbMap["*"]; ok {
c.Set("db", db)
} else {
c.Set("db", dbMap[c.Request.Host])
}
c.Next()
}
}
+6
View File
@@ -0,0 +1,6 @@
package models
type ControlBy struct {
CreateBy uint `gorm:"index;comment:'创建者'"`
UpdateBy uint `gorm:"index;comment:'更新者'"`
}
+11
View File
@@ -0,0 +1,11 @@
package models
import "gorm.io/gorm/schema"
type ActiveRecord interface {
schema.Tabler
SetCreateBy(createBy uint)
SetUpdateBy(updateBy uint)
Generate() ActiveRecord
GetId() interface{}
}