Przeglądaj źródła

gin-vue-admin 2.0代码重构

QM303176530 5 lat temu
rodzic
commit
91659efaf5
100 zmienionych plików z 1072 dodań i 1256 usunięć
  1. 24 0
      .gitignore
  2. 0 3
      QMPlusServer/.gitignore
  3. 0 16
      QMPlusServer/Dockerfile
  4. 0 16
      QMPlusServer/controller/servers/paging.go
  5. 0 16
      QMPlusServer/controller/servers/reportformat.go
  6. 0 25
      QMPlusServer/init/initRedis/init_redis.go
  7. 0 23
      QMPlusServer/init/qmsql/initMysql.go
  8. 0 26
      QMPlusServer/init/registTerable/regist_table.go
  9. 0 63
      QMPlusServer/main.go
  10. 0 68
      QMPlusServer/model/dbModel/exa_customer.go
  11. 0 45
      QMPlusServer/model/dbModel/exa_fileUploadAndDownload.go
  12. 0 14
      QMPlusServer/model/modelInterface/interface.go
  13. 0 81
      QMPlusServer/model/sysModel/sys_authority.go
  14. 0 26
      QMPlusServer/model/sysModel/sys_system.go
  15. 0 18
      QMPlusServer/router/exp_customer.go
  16. 0 20
      QMPlusServer/router/exp_fileUploadAndDownload.go
  17. 0 19
      QMPlusServer/router/sys_api.go
  18. 0 17
      QMPlusServer/router/sys_authority.go
  19. 0 17
      QMPlusServer/router/sys_base.go
  20. 0 23
      QMPlusServer/router/sys_menu.go
  21. 0 17
      QMPlusServer/router/sys_user.go
  22. 0 21
      QMPlusVuePage/.gitignore
  23. 253 253
      README.md
  24. 23 22
      server/api/v1/exa_breakpoint_continue.go
  25. 22 23
      server/api/v1/exa_customer.go
  26. 24 22
      server/api/v1/exa_file_upload_download.go
  27. 27 29
      server/api/v1/sys_api.go
  28. 19 22
      server/api/v1/sys_authority.go
  29. 5 5
      server/api/v1/sys_auto_code.go
  30. 0 0
      server/api/v1/sys_captcha.go
  31. 11 11
      server/api/v1/sys_casbin.go
  32. 8 8
      server/api/v1/sys_jwt_blacklist.go
  33. 15 16
      server/api/v1/sys_menu.go
  34. 12 13
      server/api/v1/sys_system.go
  35. 45 45
      server/api/v1/sys_user.go
  36. 6 6
      server/api/v1/sys_work_flow.go
  37. 1 1
      server/config.json
  38. 13 10
      server/core/server.go
  39. 0 0
      server/db/casbin_rule.sql
  40. 0 0
      server/db/ch_cities.sql
  41. 0 0
      server/db/ch_provinces.sql
  42. 0 0
      server/db/ch_t_d_areainfo.sql
  43. 0 0
      server/db/exa_customers.sql
  44. 0 0
      server/db/exa_file_chunks.sql
  45. 0 0
      server/db/exa_file_upload_and_downloads.sql
  46. 0 0
      server/db/exa_files.sql
  47. 0 0
      server/db/jwt_blacklists.sql
  48. 0 0
      server/db/qmplus.sql
  49. 0 0
      server/db/sys_apis.sql
  50. 0 0
      server/db/sys_authorities.sql
  51. 0 0
      server/db/sys_base_menus.sql
  52. 0 0
      server/db/sys_data_authority_id.sql
  53. 0 0
      server/db/sys_menus.sql
  54. 0 0
      server/db/sys_users.sql
  55. 0 0
      server/db/sys_workflow_step_infos.sql
  56. 0 0
      server/db/sys_workflows.sql
  57. 8 8
      server/docs/docs.go
  58. 8 8
      server/docs/swagger.json
  59. 8 8
      server/docs/swagger.yaml
  60. 16 0
      server/global/global.go
  61. 26 0
      server/global/response/response.go
  62. 0 0
      server/go.mod
  63. 11 13
      server/init/config.go
  64. 1 1
      server/init/log.go
  65. 19 0
      server/init/mysql.go
  66. 12 14
      server/init/qmlog/log.go
  67. 21 0
      server/init/redis.go
  68. 24 0
      server/init/regist_table.go
  69. 6 7
      server/init/router.go
  70. 41 0
      server/main.go
  71. 4 5
      server/middleware/casbin_rcba.go
  72. 0 0
      server/middleware/cors.go
  73. 13 13
      server/middleware/jwt.go
  74. 0 0
      server/middleware/loadtls.go
  75. 3 3
      server/middleware/logger.go
  76. 9 9
      server/model/exa_breakpoint_continue.go
  77. 66 0
      server/model/exa_customer.go
  78. 44 0
      server/model/exa_file_upload_download.go
  79. 22 23
      server/model/sys_api.go
  80. 90 0
      server/model/sys_authority.go
  81. 11 12
      server/model/sys_authority_menu.go
  82. 5 5
      server/model/sys_auto_code.go
  83. 33 28
      server/model/sys_base_menu.go
  84. 5 6
      server/model/sys_casbin.go
  85. 6 7
      server/model/sys_jwt_blacklist.go
  86. 27 0
      server/model/sys_system.go
  87. 19 20
      server/model/sys_user.go
  88. 3 3
      server/model/sys_workflow.go
  89. 1 1
      server/model/sys_workflow_process.go
  90. 0 0
      server/resource/page/css/index.d8b172cd.css
  91. 0 0
      server/resource/page/favicon.ico
  92. 0 0
      server/resource/page/img/logo.e1bc3747.png
  93. 0 0
      server/resource/page/index.html
  94. 0 0
      server/resource/page/js/chunk-vendors.788511b0.js
  95. 0 0
      server/resource/page/js/index.b3720c41.js
  96. 0 0
      server/resource/page/js/preview.7fecf17e.js
  97. 0 0
      server/resource/page/preview.html
  98. 1 1
      server/resource/rbac_model.conf
  99. 1 1
      server/resource/template/fe/api.js.tpl
  100. 0 0
      server/resource/template/readme.txt.tpl

+ 24 - 0
.gitignore

@@ -1 +1,25 @@
 .idea/
+/web/node_modules
+
+.DS_Store
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+go.sum
+/server/log/

+ 0 - 3
QMPlusServer/.gitignore

@@ -1,3 +0,0 @@
-go.sum
-.idea/
-log/

+ 0 - 16
QMPlusServer/Dockerfile

@@ -1,16 +0,0 @@
-FROM golang:1.12 AS build
-
-WORKDIR /go/src/gin-vue-admin
-COPY . .
-
-ENV GO111MODULE=on
-ENV GOPROXY=https://goproxy.cn
-RUN go get ./... \
-    && go build -o gin-vue-admin
-
-FROM golang:1.12 AS serve
-
-COPY --from=build /go/src/gin-vue-admin /go/src/gin-vue-admin
-
-EXPOSE 8080
-ENTRYPOINT [ "./gin-vue-admin" ]

+ 0 - 16
QMPlusServer/controller/servers/paging.go

@@ -1,16 +0,0 @@
-package servers
-
-import (
-	"gin-vue-admin/init/qmsql"
-	"gin-vue-admin/model/modelInterface"
-	"github.com/jinzhu/gorm"
-)
-
-//获取分页功能 接收实现了分页接口的结构体 返回搜索完成的结果 许需要自行scan 或者find
-func PagingServer(paging modelInterface.Paging, info modelInterface.PageInfo) (err error, db *gorm.DB, total int) {
-	limit := info.PageSize
-	offset := info.PageSize * (info.Page - 1)
-	err = qmsql.DEFAULTDB.Model(paging).Count(&total).Error
-	db = qmsql.DEFAULTDB.Limit(limit).Offset(offset).Order("id desc")
-	return err, db, total
-}

+ 0 - 16
QMPlusServer/controller/servers/reportformat.go

@@ -1,16 +0,0 @@
-package servers
-
-import (
-	"net/http"
-
-	"github.com/gin-gonic/gin"
-)
-
-func ReportFormat(c *gin.Context, success bool, msg string, json gin.H) {
-	// 开始时间
-	c.JSON(http.StatusOK, gin.H{
-		"success": success,
-		"msg":     msg,
-		"data":    json,
-	})
-}

+ 0 - 25
QMPlusServer/init/initRedis/init_redis.go

@@ -1,25 +0,0 @@
-package initRedis
-
-import (
-	"gin-vue-admin/config"
-	"gin-vue-admin/init/initlog"
-	"github.com/go-redis/redis"
-)
-
-var DEFAULTREDIS *redis.Client
-
-func InitRedis() (client *redis.Client) {
-	client = redis.NewClient(&redis.Options{
-		Addr:     config.GinVueAdminconfig.RedisAdmin.Addr,
-		Password: config.GinVueAdminconfig.RedisAdmin.Password, // no password set
-		DB:       config.GinVueAdminconfig.RedisAdmin.DB,       // use default DB
-	})
-	pong, err := client.Ping().Result()
-	if err != nil {
-		log.L.Error(err)
-	} else {
-		log.L.Info("redis connect ping response:", pong)
-		DEFAULTREDIS = client
-	}
-	return client
-}

+ 0 - 23
QMPlusServer/init/qmsql/initMysql.go

@@ -1,23 +0,0 @@
-package qmsql
-
-import (
-	"gin-vue-admin/config"
-	"gin-vue-admin/init/initlog"
-	"github.com/jinzhu/gorm"
-	_ "github.com/jinzhu/gorm/dialects/mysql"
-)
-
-var DEFAULTDB *gorm.DB
-
-//初始化数据库并产生数据库全局变量
-func InitMysql(admin config.MysqlAdmin) *gorm.DB {
-	if db, err := gorm.Open("mysql", admin.Username+":"+admin.Password+"@("+admin.Path+")/"+admin.Dbname+"?"+admin.Config); err != nil {
-		log.L.Error("DEFAULTDB数据库启动异常",err)
-	} else {
-		DEFAULTDB = db
-		DEFAULTDB.DB().SetMaxIdleConns(admin.MaxIdleConns)
-		DEFAULTDB.DB().SetMaxOpenConns(admin.MaxOpenConns)
-		DEFAULTDB.LogMode(admin.LogMode)
-	}
-	return DEFAULTDB
-}

+ 0 - 26
QMPlusServer/init/registTerable/regist_table.go

@@ -1,26 +0,0 @@
-package registerTable
-
-import (
-	"gin-vue-admin/init/initlog"
-	"gin-vue-admin/model/dbModel"
-	"gin-vue-admin/model/sysModel"
-	"github.com/jinzhu/gorm"
-)
-
-//注册数据库表专用
-func RegisterTable(db *gorm.DB) {
-	db.AutoMigrate(sysModel.SysUser{},
-		sysModel.SysAuthority{},
-		sysModel.SysMenu{},
-		sysModel.SysApi{},
-		sysModel.SysBaseMenu{},
-		sysModel.JwtBlacklist{},
-		sysModel.SysWorkflow{},
-		sysModel.SysWorkflowStepInfo{},
-		dbModel.ExaFileUploadAndDownload{},
-		dbModel.ExaFile{},
-		dbModel.ExaFileChunk{},
-		dbModel.ExaCustomer{},
-	)
-	log.L.Debug("register table success")
-}

+ 0 - 63
QMPlusServer/main.go

@@ -1,63 +0,0 @@
-package main
-
-import (
-	"gin-vue-admin/cmd"
-	"gin-vue-admin/config"
-	"gin-vue-admin/init/initRedis"
-	"gin-vue-admin/init/initRouter"
-	"gin-vue-admin/init/initlog/qmlog"
-	"gin-vue-admin/init/qmsql"
-	"gin-vue-admin/init/registTerable"
-	"os"
-	//"runtime"
-)
-
-// @title Swagger Example API
-// @version 0.0.1
-// @description This is a sample Server pets
-// @securityDefinitions.apikey ApiKeyAuth
-// @in header
-// @name x-token
-// @BasePath /
-
-var (
-	mysqlHost = os.Getenv("MYSQLHOST")
-	mysqlPort = os.Getenv("MYSQLPORT")
-)
-
-func main() {
-	if err := qmlog.NewLogger(); err != nil {
-		panic(err)
-	}
-	// 可以通过环境变量来覆盖配置值
-	// 未设定有效的环境变量时,使用配置值
-	mysqlConfig := config.GinVueAdminconfig.MysqlAdmin
-	if mysqlHost != "" && mysqlPort != "" {
-		mysqlConfig.Path = mysqlHost + ":" + mysqlPort
-	}
-	// 链接初始化数据库
-	db := qmsql.InitMysql(mysqlConfig) // 链接初始化数据库
-	if config.GinVueAdminconfig.System.UseMultipoint {
-		// 初始化redis服务
-		_ = initRedis.InitRedis()
-	}
-	// 注册数据库表
-	registerTable.RegisterTable(db)
-	// 程序结束前关闭数据库链接
-	defer qmsql.DEFAULTDB.Close()
-	// 注册路由
-	Router := initRouter.InitRouter()
-
-	Router.Static("/form-generator", "./static/form-generator")
-	//Router.RunTLS(":443","ssl.pem", "ssl.key")  // https支持 需要添加中间件
-	//sysType := runtime.GOOS
-	//
-	//if sysType == "linux" {
-	//	// LINUX系统
-	//	//	借助endless开发无感知重启后台 以及前端接口重启后台功能
-	//}
-	//if sysType == "windows" {
-	// WIN系统
-	cmd.RunWindowsServer(Router)
-	//}
-}

+ 0 - 68
QMPlusServer/model/dbModel/exa_customer.go

@@ -1,68 +0,0 @@
-package dbModel
-
-import (
-	"gin-vue-admin/controller/servers"
-	"gin-vue-admin/init/qmsql"
-	"gin-vue-admin/model/modelInterface"
-	"gin-vue-admin/model/sysModel"
-	"github.com/jinzhu/gorm"
-)
-
-type ExaCustomer struct {
-	gorm.Model
-	CustomerName string `json:"customerName"`
-	CustomerPhoneData string `json:"customerPhoneData"`
-	SysUserID uint `json:"sysUserId"`
-	SysUserAuthorityID string `json:"sysUserAuthorityID"`
-	SysUser sysModel.SysUser `json:"sysUser"`
-}
-
-//创建用户
-func (e *ExaCustomer)CreateExaCustomer()(err error){
-	err = qmsql.DEFAULTDB.Create(e).Error
-	return err
-}
-
-//删除用户
-func (e *ExaCustomer)DeleteExaCustomer()(err error){
-	err = qmsql.DEFAULTDB.Delete(e).Error
-	return err
-}
-
-//更新用户
-func (e *ExaCustomer)UpdateExaCustomer()(err error){
-	err = qmsql.DEFAULTDB.Save(e).Error
-	return err
-}
-
-//获取用户信息
-func (e *ExaCustomer)GetExaCustomer()(err error,customer ExaCustomer){
-	err= qmsql.DEFAULTDB.Where("id = ?",e.ID).First(&customer).Error
-	return
-}
-
-//获取用户列表
-// 分页获取数据  需要分页实现这个接口即可
-func (e *ExaCustomer) GetInfoList(info modelInterface.PageInfo) (err error, list interface{}, total int) {
-	// 封装分页方法 调用即可 传入 当前的结构体和分页信息
-	err, db, total := servers.PagingServer(e, info)
-	if err != nil {
-		return
-	} else {
-		var a sysModel.SysAuthority
-		a.AuthorityId = e.SysUserAuthorityID
-		err,auth := a.GetAuthorityInfo()
-		var dataId []string
-		for _,v := range auth.DataAuthorityId{
-			dataId = append(dataId, v.AuthorityId)
-		}
-		var CustomerList []ExaCustomer
-		err = db.Where("sys_user_authority_id in (?)",dataId).Find(&CustomerList).Count(&total).Error
-		if err!=nil{
-			return err, CustomerList, total
-		}else{
-			err = db.Preload("SysUser").Where("sys_user_authority_id in (?)",dataId).Find(&CustomerList).Error
-		}
-		return err, CustomerList, total
-	}
-}

+ 0 - 45
QMPlusServer/model/dbModel/exa_fileUploadAndDownload.go

@@ -1,45 +0,0 @@
-package dbModel
-
-import (
-	"gin-vue-admin/controller/servers"
-	"gin-vue-admin/init/qmsql"
-	"gin-vue-admin/model/modelInterface"
-	"github.com/jinzhu/gorm"
-)
-
-type ExaFileUploadAndDownload struct {
-	gorm.Model
-	Name string `json:"name"`
-	Url  string `json:"url"`
-	Tag  string `json:"tag"`
-	Key  string `json:"key"`
-}
-
-func (f *ExaFileUploadAndDownload) Upload() error {
-	err := qmsql.DEFAULTDB.Create(f).Error
-	return err
-}
-
-func (f *ExaFileUploadAndDownload) DeleteFile() error {
-	err := qmsql.DEFAULTDB.Where("id = ?", f.ID).Unscoped().Delete(f).Error
-	return err
-}
-
-func (f *ExaFileUploadAndDownload) FindFile() (error, ExaFileUploadAndDownload) {
-	var file ExaFileUploadAndDownload
-	err := qmsql.DEFAULTDB.Where("id = ?", f.ID).First(&file).Error
-	return err, file
-}
-
-// 分页获取数据  需要分页实现这个接口即可
-func (f *ExaFileUploadAndDownload) GetInfoList(info modelInterface.PageInfo) (err error, list interface{}, total int) {
-	// 封装分页方法 调用即可 传入 当前的结构体和分页信息
-	err, db, total := servers.PagingServer(f, info)
-	if err != nil {
-		return
-	} else {
-		var fileLists []ExaFileUploadAndDownload
-		err = db.Order("updated_at desc").Find(&fileLists).Error
-		return err, fileLists, total
-	}
-}

+ 0 - 14
QMPlusServer/model/modelInterface/interface.go

@@ -1,14 +0,0 @@
-package modelInterface
-
-// 因为我也不确定项目要不要多人维护 所以定义了CURD接口 作为接口参考
-// 由于很多接口使用Restful模式 暂时不用泛型 有需要可以iss提供示例
-
-type PageInfo struct {
-	Page     int
-	PageSize int
-}
-
-//分页接口
-type Paging interface {
-	GetInfoList(PageInfo) (err error, list interface{}, total int)
-}

+ 0 - 81
QMPlusServer/model/sysModel/sys_authority.go

@@ -1,81 +0,0 @@
-package sysModel
-
-import (
-	"gin-vue-admin/controller/servers"
-	"gin-vue-admin/init/qmsql"
-	"gin-vue-admin/model/modelInterface"
-	"github.com/jinzhu/gorm"
-	"github.com/pkg/errors"
-)
-
-type SysAuthority struct {
-	gorm.Model
-	AuthorityId     string         `json:"authorityId" gorm:"not null;unique"`
-	AuthorityName   string         `json:"authorityName"`
-	ParentId        string         `json:"parentId"`
-	DataAuthorityId []SysAuthority `json:"dataAuthorityId" gorm:"many2many:sys_data_authority_id;association_jointable_foreignkey:data_id"`
-	Children        []SysAuthority `json:"children"`
-}
-
-// 创建角色
-func (a *SysAuthority) CreateAuthority() (err error, authority *SysAuthority) {
-	err = qmsql.DEFAULTDB.Create(a).Error
-	return err, a
-}
-
-// 删除角色
-func (a *SysAuthority) DeleteAuthority() (err error) {
-	err = qmsql.DEFAULTDB.Where("authority_id = ?", a.AuthorityId).Find(&SysUser{}).Error
-	if err != nil {
-		err = qmsql.DEFAULTDB.Where("parent_id = ?", a.AuthorityId).Find(&SysAuthority{}).Error
-		if err != nil {
-			err = qmsql.DEFAULTDB.Where("authority_id = ?", a.AuthorityId).First(a).Unscoped().Delete(a).Error
-			new(CasbinModel).clearCasbin(0, a.AuthorityId)
-		} else {
-			err = errors.New("此角色存在子角色不允许删除")
-		}
-	} else {
-		err = errors.New("此角色有用户正在使用禁止删除")
-	}
-	return err
-}
-
-// 分页获取数据  需要分页实现这个接口即可
-func (a *SysAuthority) GetInfoList(info modelInterface.PageInfo) (err error, list interface{}, total int) {
-	// 封装分页方法 调用即可 传入 当前的结构体和分页信息
-	err, db, total := servers.PagingServer(a, info)
-	if err != nil {
-		return
-	} else {
-		var authority []SysAuthority
-		err = db.Preload("DataAuthorityId").Where("parent_id = 0").Find(&authority).Error
-		if len(authority) > 0 {
-			for k, _ := range authority {
-				err = findChildrenAuthority(&authority[k])
-			}
-		}
-		return err, authority, total
-	}
-}
-
-func findChildrenAuthority(authority *SysAuthority) (err error) {
-	err = qmsql.DEFAULTDB.Preload("DataAuthorityId").Where("parent_id = ?", authority.AuthorityId).Find(&authority.Children).Error
-	if len(authority.Children) > 0 {
-		for k, _ := range authority.Children {
-			err = findChildrenAuthority(&authority.Children[k])
-		}
-	}
-	return err
-}
-
-func (a *SysAuthority) SetDataAuthority() error {
-	var s SysAuthority
-	qmsql.DEFAULTDB.Preload("DataAuthorityId").First(&s, "id = ?", a.ID)
-	err := qmsql.DEFAULTDB.Model(&s).Association("DataAuthorityId").Replace(&a.DataAuthorityId).Error
-	return err
-}
-
-func (a *SysAuthority) GetAuthorityInfo() (err error, sa SysAuthority) {
-	err = qmsql.DEFAULTDB.Preload("DataAuthorityId").Where("authority_id = ?", a.AuthorityId).First(&sa).Error
-	return err, sa
-}

+ 0 - 26
QMPlusServer/model/sysModel/sys_system.go

@@ -1,26 +0,0 @@
-package sysModel
-
-import (
-	"gin-vue-admin/config"
-	"gin-vue-admin/tools"
-)
-
-//配置文件结构体
-type System struct {
-	Config config.Config
-}
-
-//读取配置文件
-func (s *System) GetSystemConfig() (err error, conf config.Config) {
-	return nil, config.GinVueAdminconfig
-}
-
-//设置配置文件
-func (s *System) SetSystemConfig() (err error) {
-	confs := tools.StructToMap(s.Config)
-	for k, v := range confs {
-		config.VTool.Set(k, v)
-	}
-	err = config.VTool.WriteConfig()
-	return err
-}

+ 0 - 18
QMPlusServer/router/exp_customer.go

@@ -1,18 +0,0 @@
-package router
-
-import (
-	"gin-vue-admin/controller/api"
-	"gin-vue-admin/middleware"
-	"github.com/gin-gonic/gin"
-)
-
-func InitCustomerRouter(Router *gin.RouterGroup) {
-	ApiRouter := Router.Group("customer").Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())
-	{
-		ApiRouter.POST("createExaCustomer", api.CreateExaCustomer)   // 创建客户
-		ApiRouter.POST("updateExaCustomer", api.UpdateExaCustomer)   // 更新客户
-		ApiRouter.POST("deleteExaCustomer", api.DeleteExaCustomer) // 删除客户
-		ApiRouter.POST("getExaCustomer", api.GetExaCustomer) // 获取单一客户信息
-		ApiRouter.POST("getExaCustomerList", api.GetExaCustomerList)   // 获取客户列表
-	}
-}

+ 0 - 20
QMPlusServer/router/exp_fileUploadAndDownload.go

@@ -1,20 +0,0 @@
-package router
-
-import (
-	"gin-vue-admin/controller/api"
-	"github.com/gin-gonic/gin"
-)
-
-func InitFileUploadAndDownloadRouter(Router *gin.RouterGroup) {
-	FileUploadAndDownloadGroup := Router.Group("fileUploadAndDownload")
-	//.Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())
-	{
-		FileUploadAndDownloadGroup.POST("/upload", api.UploadFile)                                 // 上传文件
-		FileUploadAndDownloadGroup.POST("/getFileList", api.GetFileList)                           // 获取上传文件列表
-		FileUploadAndDownloadGroup.POST("/deleteFile", api.DeleteFile)                             // 删除指定文件
-		FileUploadAndDownloadGroup.POST("/breakpointContinue", api.BreakpointContinue)             // 断点续传
-		FileUploadAndDownloadGroup.GET("/findFile", api.FindFile)                                  // 查询当前文件成功的切片
-		FileUploadAndDownloadGroup.POST("/breakpointContinueFinish", api.BreakpointContinueFinish) // 查询当前文件成功的切片
-		FileUploadAndDownloadGroup.POST("/removeChunk", api.RemoveChunk)                           // 查询当前文件成功的切片
-	}
-}

+ 0 - 19
QMPlusServer/router/sys_api.go

@@ -1,19 +0,0 @@
-package router
-
-import (
-	"gin-vue-admin/controller/api"
-	"gin-vue-admin/middleware"
-	"github.com/gin-gonic/gin"
-)
-
-func InitApiRouter(Router *gin.RouterGroup) {
-	ApiRouter := Router.Group("api").Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())
-	{
-		ApiRouter.POST("createApi", api.CreateApi)   //创建Api
-		ApiRouter.POST("deleteApi", api.DeleteApi)   //删除Api
-		ApiRouter.POST("getApiList", api.GetApiList) //获取Api列表
-		ApiRouter.POST("getApiById", api.GetApiById) //获取单条Api消息
-		ApiRouter.POST("updateApi", api.UpdateApi)   //更新api
-		ApiRouter.POST("getAllApis", api.GetAllApis) // 获取所有api
-	}
-}

+ 0 - 17
QMPlusServer/router/sys_authority.go

@@ -1,17 +0,0 @@
-package router
-
-import (
-	"gin-vue-admin/controller/api"
-	"gin-vue-admin/middleware"
-	"github.com/gin-gonic/gin"
-)
-
-func InitAuthorityRouter(Router *gin.RouterGroup) {
-	AuthorityRouter := Router.Group("authority").Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())
-	{
-		AuthorityRouter.POST("createAuthority", api.CreateAuthority)   //创建角色
-		AuthorityRouter.POST("deleteAuthority", api.DeleteAuthority)   //删除角色
-		AuthorityRouter.POST("getAuthorityList", api.GetAuthorityList) //获取角色列表
-		AuthorityRouter.POST("setDataAuthority", api.SetDataAuthority) //设置角色资源权限
-	}
-}

+ 0 - 17
QMPlusServer/router/sys_base.go

@@ -1,17 +0,0 @@
-package router
-
-import (
-	"gin-vue-admin/controller/api"
-	"github.com/gin-gonic/gin"
-)
-
-func InitBaseRouter(Router *gin.RouterGroup) (R gin.IRoutes) {
-	BaseRouter := Router.Group("base")
-	{
-		BaseRouter.POST("register", api.Register)
-		BaseRouter.POST("login", api.Login)
-		BaseRouter.POST("captcha", api.Captcha)
-		BaseRouter.GET("captcha/:captchaId", api.CaptchaImg)
-	}
-	return BaseRouter
-}

+ 0 - 23
QMPlusServer/router/sys_menu.go

@@ -1,23 +0,0 @@
-package router
-
-import (
-	"gin-vue-admin/controller/api"
-	"gin-vue-admin/middleware"
-	"github.com/gin-gonic/gin"
-)
-
-func InitMenuRouter(Router *gin.RouterGroup) (R gin.IRoutes) {
-	MenuRouter := Router.Group("menu").Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())
-	{
-		MenuRouter.POST("getMenu", api.GetMenu)                   //获取菜单树
-		MenuRouter.POST("getMenuList", api.GetMenuList)           // 分页获取基础menu列表
-		MenuRouter.POST("addBaseMenu", api.AddBaseMenu)           // 新增菜单
-		MenuRouter.POST("getBaseMenuTree", api.GetBaseMenuTree)   // 获取用户动态路由
-		MenuRouter.POST("addMenuAuthority", api.AddMenuAuthority) //	增加menu和角色关联关系
-		MenuRouter.POST("getMenuAuthority", api.GetMenuAuthority) // 获取指定角色menu
-		MenuRouter.POST("deleteBaseMenu", api.DeleteBaseMenu)     // 删除菜单
-		MenuRouter.POST("updateBaseMenu", api.UpdateBaseMenu)     // 更新菜单
-		MenuRouter.POST("getBaseMenuById", api.GetBaseMenuById)   //根据id获取菜单
-	}
-	return MenuRouter
-}

+ 0 - 17
QMPlusServer/router/sys_user.go

@@ -1,17 +0,0 @@
-package router
-
-import (
-	"gin-vue-admin/controller/api"
-	"github.com/gin-gonic/gin"
-)
-
-func InitUserRouter(Router *gin.RouterGroup) {
-	UserRouter := Router.Group("user")
-	//.Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())
-	{
-		UserRouter.POST("changePassword", api.ChangePassword)     // 修改密码
-		UserRouter.POST("uploadHeaderImg", api.UploadHeaderImg)   //上传头像
-		UserRouter.POST("getUserList", api.GetUserList)           // 分页获取用户列表
-		UserRouter.POST("setUserAuthority", api.SetUserAuthority) //设置用户权限
-	}
-}

+ 0 - 21
QMPlusVuePage/.gitignore

@@ -1,21 +0,0 @@
-.DS_Store
-node_modules
-/dist
-
-# local env files
-.env.local
-.env.*.local
-
-# Log files
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-
-# Editor directories and files
-.idea
-.vscode
-*.suo
-*.ntvs*
-*.njsproj
-*.sln
-*.sw?

+ 253 - 253
README.md

@@ -1,253 +1,253 @@
-
-<div align=center>
-<img src="http://qmplusimg.henrongyi.top/gvalogo.jpg" width=300" height="300" />
-</div>
-<div align=center>
-<img src="https://img.shields.io/badge/vue-2.6.10-brightgreen"/>
-<img src="https://img.shields.io/badge/element--ui-2.12.0-green"/>
-<img src="https://img.shields.io/badge/golang-1.12-blue"/>
-<img src="https://img.shields.io/badge/gin-1.4.0-lightBlue"/>
-<img src="https://img.shields.io/badge/gorm-1.9.10-red"/>
-</div>
-
-## 开发文档
-[在线文档](http://doc.henrongyi.top/) [http://doc.henrongyi.top/](http://doc.henrongyi.top/)
-
-本模板使用前端ui框架为 element-ui https://element.eleme.cn/#/zh-CN 前端组件可查看elementUi文档使用
-
-## 基本介绍
->GIN-VUE-ADMIN是一个基于vue和gin开发的全栈前后端分离的后台管理系统,拥有jwt鉴权,动态路由,动态菜单,casbin鉴权,表单生成器,代码生成器等功能,提供了多种示例文件,让大家把更多时间专注在业务开发上。
-
-## 技术选型
-1. 后端采用golang框架gin,快速搭建基础restful风格API
-
-2. 前端项目采用VUE框架,构建基础页面
-
-3. 数据库采用Mysql(5.6.44)版本不同可能会导致SQL导入失败
-
-4. 使用redis实现记录当前活跃用户的jwt令牌并实现多点登录限制
-
-5. 使用swagger构建自动化文档
-
-6. 使用fsnotify和viper实现json格式配置文件
-
-7. 使用logrus实现日志记录
-
-8. 使用gorm实现对数据库的基本操作
-
-## 项目目录
-
-```
-    ├─QMPlusServer  	(后端文件夹)
-    │  ├─cmd     	(启动文件)
-    │  ├─config    	(配置包)
-    │  ├─controller  	(api和servers存放位置)
-    │  ├─db       	(数据库脚本)
-    │  ├─docs  	(swagger文档目录)
-    │  ├─init      	(初始化路由 数据库 日志等)
-    │  ├─log     	(日志存放地址)
-    │  ├─middleware   	(中间件)
-    │  ├─model            	(结构体层)
-    │  ├─router          	(路层)
-    │  ├─static	(静态文件--配置文件 casbin模型等)
-    │  ├─tools  (后端工具包)
-    │  └─tpl		(自动化代码模板)
-    └─QMPlusVuePage	(前端文件)
-        ├─public	(发布模板)
-        └─src
-            ├─api	(向后台发送ajax的封装层)
-            ├─assets	(静态文件)
-            ├─components(组件)
-            ├─router	(前端路由)
-            ├─store	(vuex 状态管理仓)
-            ├─style	(通用样式文件)
-            ├─utils	(前端工具库)
-            └─view	(前端页面)
-
-```
-
-## 主要功能
-1. 权限管理:基于jwt和casbin实现的权限管理 
-
-2. 文件上传下载:实现基于七牛云的文件上传操作(需提前注册七牛云账号) (为了方便大家测试,我公开了自己的七牛测试号的各种重要token,恳请大家不要乱传东西)
-
-3. 分页封装:等装了分页方法,实现分页接口并且复制粘贴就可使用分页,前端分页mixin封装 分页方法调用mixins即可 
-
-4. 用户管理:系统管理员分配用户角色和角色权限。
-
-5. 角色管理:创建权限控制的主要对象,可以给角色分配不同api权限和菜单权限。
-
-6. 菜单管理:实现用户动态菜单配置,实现不同角色不同菜单。
-
-7. api管理:不同用户可调用的api接口的权限不同。
-
-8. 配置管理:配置文件可前台修改(测试环境不开放此功能)
-
-9. 富文本编辑器:富文本编辑器,MarkDown编辑器功能嵌入 
-
-10. 条件搜索:增加条件搜索示例 前端文件参考src\view\superAdmin\api\api.vue 后台文件参考 model\dnModel\api.go √
-
-11. 多点登录限制:体验需要再 static\config中 把 system中的useMultipoint 修改为 true(需要自行配置redis和config中的redis参数)(测试阶段,有bug请及时反馈)
-
-12. 分片长传:提供文件分片上传和大文件分片上传功能示例 
-
-13. 表单生成器:表单生成器借助 [@form-generator](https://github.com/JakHuang/form-generator)
-
-14. 代码生成器:后台基础逻辑以及简单curd的代码生成器 
-
-## 计划任务
-1. 导入,导出Excel
-
-2. Echart图表支持
-
-3. 工作流,任务交接功能开发
-
-4. 单独前端使用模式以及数据模拟
-## 使用说明
-1. golang api server 基于go.mod 如果golang版本低于1.11 请自行升级golang版本
-
-2. 支持go.mod的golang版本在运行go list 和 编译之前都会自动下载所需要的依赖包
-
-3. go server建议使用goland运行 减少出错可能性
-
-4. 前端项目node建议高于V8.6.0
-
-5. 到前端项目目录下运行 npm i 安装所需依赖
-
-6. 依赖安装完成直接运行 npm run serve即可启动项目
-
-7. 如果要使用swagger自动化文档 首先需要安装 swagger
-
-````
-go get -u github.com/swaggo/swag/cmd/swag
-````
-
-由于国内没法安装到X包下面的东西 如果可以翻墙 上面的命令就可以让你安心使用swagger了
-如果没有翻墙的办法那就先装一下 gopm
-
-````
-go get -v -u github.com/gpmgo/gopm
-````
-
-此时你就可以使用 gopm了
-这时候执行
-
-````
-gopm get -g -v github.com/swaggo/swag/cmd/swag
-````
-
-等待安装完成以后
-到我们GOPATH下面的/src/github.com/swaggo/swag/cmd/swag路径
-执行
-
-````
-go install
-````
-
-安装完成过后在项目目录下运行
-
-````
-swag init
-````
-
-项目文件夹下面会有 doc文件夹出现
-
-这时候登录 localhost:8888/swagger/index.html
-
-就可以看到 swagger文档啦
-
-## 团队博客
-    https://blog.henrongyi.top,内有前端框架教学视频,GOLANG基础入门视频正在筹备中。
-    如果觉得项目对您有所帮助可以添加我的个人微信:shouzi_1994,欢迎您提出宝贵的需求。
-    
-## docker镜像
-   感谢 [@chenlinzhong](https://github.com/chenlinzhong)提供docker镜像
-   
-      #启动容器
-      docker run -itd --net=host --name=go_container shareclz/go_node /bin/bash;
-      
-      #进入容器
-      docker exec -it go_container /bin/bash;
-      git clone https://github.com/piexlmax/gin-vue-admin.git /data1/www/htdocs/go/admin;
-      
-      #启动前端
-      cd /data1/www/htdocs/go/admin/QMPlusVuePage;
-      cnpm i ;
-      npm run serve;
-      
-      #修改数据库配置
-      vi /data1/www/htdocs/go/admin/QMPlusServer/static/dbconfig/config.json;
-      
-      #启动后端
-      cd /data1/www/htdocs/go/admin/QMPlusServer;
-      go run main.go;
-      
-## 一点建议
-    各位在clone项目以后,把db文件导入自己创建的库后,最好前往七牛云申请自己的空间地址,
-    替换掉项目中的七牛云公钥,私钥,仓名和默认url地址,以免发生测试文件数据错乱
-    
-## 测试环境地址
-
-测试环境:[http://qmplus.henrongyi.top/](http://qmplus.henrongyi.top/)
- 
-账号/密码: admin/123456
-
-## 环境搭建教学视频
-
-腾讯视频:https://v.qq.com/x/page/e3008xjxqtu.html    (等待最新视频录制)
-    
-## 模板使用教学及展示视频
-
-腾讯视频:https://v.qq.com/x/page/c3008y2ukba.html    (等待最新视频录制)
-
-## 联系方式
-
-|  奇淼   | krank666  |qq群|
-|  :---:  |  :---: | :---: |
-|  <img src="http://qmplusimg.henrongyi.top/jjz.jpg" width="180"/>  |  <img src="http://qmplusimg.henrongyi.top/yx.jpg" width="180"/> | <img src="http://qmplusimg.henrongyi.top/qq.jpg" width="180"/> |
-
-<div align=center>
-<h3>qq交流群:622360840</h3>
-<h3>微信交流群可以添加任意一位开发者备注"加入gin-vue-admin交流群"</h3>
-</div>
-
-## 开发者(贡献者)列表
-
-|  开发者   | 功能  | 姓名  |
-|  ----  | ----  | ----  |
-| [@piexlmax](https://github.com/piexlmax)  | 项目发起者 | 蒋\*兆 |
-| [@krank666](https://github.com/krank666)  | 前端联合作者 | 尹\* |
-| [@1319612909](https://github.com/1319612909)  | 前端css优化 |  杜\*兰 |
-| [@granty1](https://github.com/granty1)  | 代码积极贡献者 | 印\*林 |
-
-## 更新日志
-
-|  日期   | 日志  |
-|  :---:  | --- |
-|2020/01/07| 角色增加数据资源功能 增加数据资源关联返回 演示环境代码已同步 开启了多点登录拦截 可能会被其他人挤掉 |
-|2020/01/13| 增加了配置管理功能 此功能不发表至测试环境 待保护机制以及服务重启机制发开完成后才会发表值测试环境 请自行clone且导入sql体验 |
-|2020/02/21| 修改了casbin的自定义鉴权方法,使其完全支持RESTFUL的/:params以及?query= 的接口模式 |
-|2020/03/17| 增加了验证码功能 使用了 [@dchest/captcha](https://github.com/dchest/captcha)库 |
-|2020/03/30| 代码生成器开发完成 表单生成器开发完成 使用了[@form-generator](https://github.com/JakHuang/form-generator) 库 |
-|2020/04/01| 增加前端历史页签功能,增加(修改)条件查询示例,前端背景色调修改为白色 如不需要此功能可以在 view\/layout\/index\/   屏蔽HistoryComponent 背景色调 为本页260行 &.el-main 的background |
-
-## golang基础教学视频录制中...
-地址:https://space.bilibili.com/322210472/channel/detail?cid=108884
-
-
-## 捐赠
-如果你想请团队喝可乐
-
-|  支付宝   | 微信  |
-|  :---:  | :---: |
-| ![markdown](http://qmplusimg.henrongyi.top/zfb.png "支付宝") |  ![markdown](http://qmplusimg.henrongyi.top/wxzf.png "微信") |
-
-
-## 捐赠列表
-
-|  捐赠者   | 金额  |
-|  :---:  | :---: |
-| 老**途 |  100¥ |
-| y*g |  10¥ |
-| *波 |  50¥ |
-| *雄 |  15¥ |
+
+<div align=center>
+<img src="http://qmplusimg.henrongyi.top/gvalogo.jpg" width=300" height="300" />
+</div>
+<div align=center>
+<img src="https://img.shields.io/badge/vue-2.6.10-brightgreen"/>
+<img src="https://img.shields.io/badge/element--ui-2.12.0-green"/>
+<img src="https://img.shields.io/badge/golang-1.12-blue"/>
+<img src="https://img.shields.io/badge/gin-1.4.0-lightBlue"/>
+<img src="https://img.shields.io/badge/gorm-1.9.10-red"/>
+</div>
+
+## 开发文档
+[在线文档](http://doc.henrongyi.top/) [http://doc.henrongyi.top/](http://doc.henrongyi.top/)
+
+本模板使用前端ui框架为 element-ui https://element.eleme.cn/#/zh-CN 前端组件可查看elementUi文档使用
+
+## 基本介绍
+>GIN-VUE-ADMIN是一个基于vue和gin开发的全栈前后端分离的后台管理系统,拥有jwt鉴权,动态路由,动态菜单,casbin鉴权,表单生成器,代码生成器等功能,提供了多种示例文件,让大家把更多时间专注在业务开发上。
+
+## 技术选型
+1. 后端采用golang框架gin,快速搭建基础restful风格API
+
+2. 前端项目采用VUE框架,构建基础页面
+
+3. 数据库采用Mysql(5.6.44)版本不同可能会导致SQL导入失败
+
+4. 使用redis实现记录当前活跃用户的jwt令牌并实现多点登录限制
+
+5. 使用swagger构建自动化文档
+
+6. 使用fsnotify和viper实现json格式配置文件
+
+7. 使用logrus实现日志记录
+
+8. 使用gorm实现对数据库的基本操作
+
+## 项目目录
+
+```
+    ├─QMPlusServer  	(后端文件夹)
+    │  ├─cmd     	(启动文件)
+    │  ├─config    	(配置包)
+    │  ├─controller  	(api和servers存放位置)
+    │  ├─db       	(数据库脚本)
+    │  ├─docs  	(swagger文档目录)
+    │  ├─init      	(初始化路由 数据库 日志等)
+    │  ├─log     	(日志存放地址)
+    │  ├─middleware   	(中间件)
+    │  ├─model            	(结构体层)
+    │  ├─router          	(路层)
+    │  ├─static	(静态文件--配置文件 casbin模型等)
+    │  ├─tools  (后端工具包)
+    │  └─tpl		(自动化代码模板)
+    └─QMPlusVuePage	(前端文件)
+        ├─public	(发布模板)
+        └─src
+            ├─api	(向后台发送ajax的封装层)
+            ├─assets	(静态文件)
+            ├─components(组件)
+            ├─router	(前端路由)
+            ├─store	(vuex 状态管理仓)
+            ├─style	(通用样式文件)
+            ├─utils	(前端工具库)
+            └─view	(前端页面)
+
+```
+
+## 主要功能
+1. 权限管理:基于jwt和casbin实现的权限管理 
+
+2. 文件上传下载:实现基于七牛云的文件上传操作(需提前注册七牛云账号) (为了方便大家测试,我公开了自己的七牛测试号的各种重要token,恳请大家不要乱传东西)
+
+3. 分页封装:等装了分页方法,实现分页接口并且复制粘贴就可使用分页,前端分页mixin封装 分页方法调用mixins即可 
+
+4. 用户管理:系统管理员分配用户角色和角色权限。
+
+5. 角色管理:创建权限控制的主要对象,可以给角色分配不同api权限和菜单权限。
+
+6. 菜单管理:实现用户动态菜单配置,实现不同角色不同菜单。
+
+7. api管理:不同用户可调用的api接口的权限不同。
+
+8. 配置管理:配置文件可前台修改(测试环境不开放此功能)
+
+9. 富文本编辑器:富文本编辑器,MarkDown编辑器功能嵌入 
+
+10. 条件搜索:增加条件搜索示例 前端文件参考src\view\superAdmin\api\api.vue 后台文件参考 model\dnModel\api.go √
+
+11. 多点登录限制:体验需要再 static\config中 把 system中的useMultipoint 修改为 true(需要自行配置redis和config中的redis参数)(测试阶段,有bug请及时反馈)
+
+12. 分片长传:提供文件分片上传和大文件分片上传功能示例 
+
+13. 表单生成器:表单生成器借助 [@form-generator](https://github.com/JakHuang/form-generator)
+
+14. 代码生成器:后台基础逻辑以及简单curd的代码生成器 
+
+## 计划任务
+1. 导入,导出Excel
+
+2. Echart图表支持
+
+3. 工作流,任务交接功能开发
+
+4. 单独前端使用模式以及数据模拟
+## 使用说明
+1. golang api server 基于go.mod 如果golang版本低于1.11 请自行升级golang版本
+
+2. 支持go.mod的golang版本在运行go list 和 编译之前都会自动下载所需要的依赖包
+
+3. go server建议使用goland运行 减少出错可能性
+
+4. 前端项目node建议高于V8.6.0
+
+5. 到前端项目目录下运行 npm i 安装所需依赖
+
+6. 依赖安装完成直接运行 npm run serve即可启动项目
+
+7. 如果要使用swagger自动化文档 首先需要安装 swagger
+
+````
+go get -u github.com/swaggo/swag/cmd/swag
+````
+
+由于国内没法安装到X包下面的东西 如果可以翻墙 上面的命令就可以让你安心使用swagger了
+如果没有翻墙的办法那就先装一下 gopm
+
+````
+go get -v -u github.com/gpmgo/gopm
+````
+
+此时你就可以使用 gopm了
+这时候执行
+
+````
+gopm get -g -v github.com/swaggo/swag/cmd/swag
+````
+
+等待安装完成以后
+到我们GOPATH下面的/src/github.com/swaggo/swag/cmd/swag路径
+执行
+
+````
+go install
+````
+
+安装完成过后在项目目录下运行
+
+````
+swag init
+````
+
+项目文件夹下面会有 doc文件夹出现
+
+这时候登录 localhost:8888/swagger/index.html
+
+就可以看到 swagger文档啦
+
+## 团队博客
+    https://blog.henrongyi.top,内有前端框架教学视频,GOLANG基础入门视频正在筹备中。
+    如果觉得项目对您有所帮助可以添加我的个人微信:shouzi_1994,欢迎您提出宝贵的需求。
+    
+## docker镜像
+   感谢 [@chenlinzhong](https://github.com/chenlinzhong)提供docker镜像
+   
+      #启动容器
+      docker run -itd --net=host --name=go_container shareclz/go_node /bin/bash;
+      
+      #进入容器
+      docker exec -it go_container /bin/bash;
+      git clone https://github.com/piexlmax/gin-vue-admin.git /data1/www/htdocs/go/admin;
+      
+      #启动前端
+      cd /data1/www/htdocs/go/admin/QMPlusVuePage;
+      cnpm i ;
+      npm run serve;
+      
+      #修改数据库配置
+      vi /data1/www/htdocs/go/admin/QMPlusServer/static/dbconfig/config.json;
+      
+      #启动后端
+      cd /data1/www/htdocs/go/admin/QMPlusServer;
+      go run main.go;
+      
+## 一点建议
+    各位在clone项目以后,把db文件导入自己创建的库后,最好前往七牛云申请自己的空间地址,
+    替换掉项目中的七牛云公钥,私钥,仓名和默认url地址,以免发生测试文件数据错乱
+    
+## 测试环境地址
+
+测试环境:[http://qmplus.henrongyi.top/](http://qmplus.henrongyi.top/)
+ 
+账号/密码: admin/123456
+
+## 环境搭建教学视频
+
+腾讯视频:https://v.qq.com/x/page/e3008xjxqtu.html    (等待最新视频录制)
+    
+## 模板使用教学及展示视频
+
+腾讯视频:https://v.qq.com/x/page/c3008y2ukba.html    (等待最新视频录制)
+
+## 联系方式
+
+|  奇淼   | krank666  |qq群|
+|  :---:  |  :---: | :---: |
+|  <img src="http://qmplusimg.henrongyi.top/jjz.jpg" width="180"/>  |  <img src="http://qmplusimg.henrongyi.top/yx.jpg" width="180"/> | <img src="http://qmplusimg.henrongyi.top/qq.jpg" width="180"/> |
+
+<div align=center>
+<h3>qq交流群:622360840</h3>
+<h3>微信交流群可以添加任意一位开发者备注"加入gin-vue-admin交流群"</h3>
+</div>
+
+## 开发者(贡献者)列表
+
+|  开发者   | 功能  | 姓名  |
+|  ----  | ----  | ----  |
+| [@piexlmax](https://github.com/piexlmax)  | 项目发起者 | 蒋\*兆 |
+| [@krank666](https://github.com/krank666)  | 前端联合作者 | 尹\* |
+| [@1319612909](https://github.com/1319612909)  | 前端css优化 |  杜\*兰 |
+| [@granty1](https://github.com/granty1)  | 代码积极贡献者 | 印\*林 |
+
+## 更新日志
+
+|  日期   | 日志  |
+|  :---:  | --- |
+|2020/01/07| 角色增加数据资源功能 增加数据资源关联返回 演示环境代码已同步 开启了多点登录拦截 可能会被其他人挤掉 |
+|2020/01/13| 增加了配置管理功能 此功能不发表至测试环境 待保护机制以及服务重启机制发开完成后才会发表值测试环境 请自行clone且导入sql体验 |
+|2020/02/21| 修改了casbin的自定义鉴权方法,使其完全支持RESTFUL的/:params以及?query= 的接口模式 |
+|2020/03/17| 增加了验证码功能 使用了 [@dchest/captcha](https://github.com/dchest/captcha)库 |
+|2020/03/30| 代码生成器开发完成 表单生成器开发完成 使用了[@form-generator](https://github.com/JakHuang/form-generator) 库 |
+|2020/04/01| 增加前端历史页签功能,增加(修改)条件查询示例,前端背景色调修改为白色 如不需要此功能可以在 view\/layout\/index\/   屏蔽HistoryComponent 背景色调 为本页260行 &.el-main 的background |
+
+## golang基础教学视频录制中...
+地址:https://space.bilibili.com/322210472/channel/detail?cid=108884
+
+
+## 捐赠
+如果你想请团队喝可乐
+
+|  支付宝   | 微信  |
+|  :---:  | :---: |
+| ![markdown](http://qmplusimg.henrongyi.top/zfb.png "支付宝") |  ![markdown](http://qmplusimg.henrongyi.top/wxzf.png "微信") |
+
+
+## 捐赠列表
+
+|  捐赠者   | 金额  |
+|  :---:  | :---: |
+| 老**途 |  100¥ |
+| y*g |  10¥ |
+| *波 |  50¥ |
+| *雄 |  15¥ |

+ 23 - 22
QMPlusServer/controller/api/exa_breakpoint_continue.go → server/api/v1/exa_breakpoint_continue.go

@@ -1,9 +1,10 @@
-package api
+package v1
 
 import (
 	"fmt"
-	"gin-vue-admin/controller/servers"
-	"gin-vue-admin/model/dbModel"
+	"gin-vue-admin/global/response"
+	"gin-vue-admin/model"
+	"gin-vue-admin/utils"
 	"github.com/gin-gonic/gin"
 	"io/ioutil"
 	"strconv"
@@ -25,28 +26,28 @@ func BreakpointContinue(c *gin.Context) {
 	chunkTotal, _ := strconv.Atoi(c.Request.FormValue("chunkTotal"))
 	_, FileHeader, err := c.Request.FormFile("file")
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("%v", err), gin.H{})
+		response.Result(response.SUCCESS, nil, fmt.Sprintf("%v", err), c)
 	} else {
 		f, err := FileHeader.Open()
 		if err != nil {
-			servers.ReportFormat(c, false, fmt.Sprintf("%v", err), gin.H{})
+			response.Result(response.ERROR, nil, fmt.Sprintf("%v", err), c)
 		} else {
 			cen, _ := ioutil.ReadAll(f)
 			defer f.Close()
-			if flag := servers.CheckMd5(cen, chunkMd5); flag {
-				err, file := new(dbModel.ExaFile).FindOrCreateFile(fileMd5, fileName, chunkTotal)
+			if flag := utils.CheckMd5(cen, chunkMd5); flag {
+				err, file := new(model.ExaFile).FindOrCreateFile(fileMd5, fileName, chunkTotal)
 				if err != nil {
-					servers.ReportFormat(c, false, fmt.Sprintf("%v", err), gin.H{})
+					response.Result(response.ERROR, nil, fmt.Sprintf("%v", err), c)
 				} else {
-					err, pathc := servers.BreakPointContinue(cen, fileName, chunkNumber, chunkTotal, fileMd5)
+					err, pathc := utils.BreakPointContinue(cen, fileName, chunkNumber, chunkTotal, fileMd5)
 					if err != nil {
-						servers.ReportFormat(c, false, fmt.Sprintf("%v", err), gin.H{})
+						response.Result(response.ERROR, nil, fmt.Sprintf("%v", err), c)
 					} else {
 						err = file.CreateFileChunk(pathc, chunkNumber)
 						if err != nil {
-							servers.ReportFormat(c, false, fmt.Sprintf("%v", err), gin.H{})
+							response.Result(response.ERROR, nil, fmt.Sprintf("%v", err), c)
 						} else {
-							servers.ReportFormat(c, true, "切片创建成功", gin.H{})
+							response.Result(response.SUCCESS, nil, "切片创建成功", c)
 						}
 					}
 				}
@@ -68,11 +69,11 @@ func FindFile(c *gin.Context) {
 	fileMd5 := c.Query("fileMd5")
 	fileName := c.Query("fileName")
 	chunkTotal, _ := strconv.Atoi(c.Query("chunkTotal"))
-	err, file := new(dbModel.ExaFile).FindOrCreateFile(fileMd5, fileName, chunkTotal)
+	err, file := new(model.ExaFile).FindOrCreateFile(fileMd5, fileName, chunkTotal)
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("查找失败:%v", err), gin.H{})
+		response.Result(response.ERROR, nil, fmt.Sprintf("查找失败:%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "查找成功", gin.H{"file": file})
+		response.Result(response.SUCCESS, gin.H{"file": file}, "查找成功", c)
 	}
 }
 
@@ -87,11 +88,11 @@ func FindFile(c *gin.Context) {
 func BreakpointContinueFinish(c *gin.Context) {
 	fileMd5 := c.Query("fileMd5")
 	fileName := c.Query("fileName")
-	err, filePath := servers.MakeFile(fileName, fileMd5)
+	err, filePath := utils.MakeFile(fileName, fileMd5)
 	if err != nil {
-		servers.ReportFormat(c, true, fmt.Sprintf("文件创建失败:%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{"filePath": filePath}, fmt.Sprintf("文件创建失败:%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "文件创建成功", gin.H{"filePath": filePath})
+		response.Result(response.SUCCESS, gin.H{"filePath": filePath}, "文件创建成功", c)
 	}
 }
 
@@ -107,11 +108,11 @@ func RemoveChunk(c *gin.Context) {
 	fileMd5 := c.Query("fileMd5")
 	fileName := c.Query("fileName")
 	filePath := c.Query("filePath")
-	err := servers.RemoveChunk(fileMd5)
-	err = new(dbModel.ExaFile).DeleteFileChunk(fileMd5, fileName, filePath)
+	err := utils.RemoveChunk(fileMd5)
+	err = new(model.ExaFile).DeleteFileChunk(fileMd5, fileName, filePath)
 	if err != nil {
-		servers.ReportFormat(c, true, fmt.Sprintf("缓存切片删除失败:%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{"filePath": filePath}, fmt.Sprintf("缓存切片删除失败:%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "缓存切片删除成功", gin.H{})
+		response.Result(response.SUCCESS, gin.H{"filePath": filePath}, "缓存切片删除成功", c)
 	}
 }

+ 22 - 23
QMPlusServer/controller/api/exa_customer.go → server/api/v1/exa_customer.go

@@ -1,11 +1,10 @@
-package api
+package v1
 
 import (
 	"fmt"
-	"gin-vue-admin/controller/servers"
+	"gin-vue-admin/global/response"
 	"gin-vue-admin/middleware"
-	"gin-vue-admin/model/dbModel"
-	"gin-vue-admin/model/modelInterface"
+	"gin-vue-admin/model"
 	"github.com/gin-gonic/gin"
 )
 
@@ -18,7 +17,7 @@ import (
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
 // @Router /customer/createExaCustomer [post]
 func CreateExaCustomer(c *gin.Context) {
-	var cu dbModel.ExaCustomer
+	var cu model.ExaCustomer
 	_ = c.ShouldBindJSON(&cu)
 	claims, _ := c.Get("claims")
 	waitUse := claims.(*middleware.CustomClaims)
@@ -26,9 +25,9 @@ func CreateExaCustomer(c *gin.Context) {
 	cu.SysUserAuthorityID = waitUse.AuthorityId
 	err := cu.CreateExaCustomer()
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("创建失败:%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("创建失败:%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "创建成功", gin.H{})
+		response.Result(response.SUCCESS, gin.H{}, "创建成功", c)
 	}
 }
 
@@ -41,13 +40,13 @@ func CreateExaCustomer(c *gin.Context) {
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
 // @Router /customer/deleteExaCustomer [post]
 func DeleteExaCustomer(c *gin.Context) {
-	var cu dbModel.ExaCustomer
+	var cu model.ExaCustomer
 	_ = c.ShouldBindJSON(&cu)
 	err := cu.DeleteExaCustomer()
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("创建失败:%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("删除失败:%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "创建成功", gin.H{})
+		response.Result(response.SUCCESS, gin.H{}, "删除成功", c)
 	}
 }
 
@@ -60,13 +59,13 @@ func DeleteExaCustomer(c *gin.Context) {
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
 // @Router /customer/updateExaCustomer [post]
 func UpdateExaCustomer(c *gin.Context) {
-	var cu dbModel.ExaCustomer
+	var cu model.ExaCustomer
 	_ = c.ShouldBindJSON(&cu)
 	err := cu.UpdateExaCustomer()
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("创建失败:%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("更新失败:%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "创建成功", gin.H{})
+		response.Result(response.SUCCESS, gin.H{}, "更新成功", c)
 	}
 }
 
@@ -79,15 +78,15 @@ func UpdateExaCustomer(c *gin.Context) {
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
 // @Router /customer/getExaCustomer [post]
 func GetExaCustomer(c *gin.Context) {
-	var cu dbModel.ExaCustomer
+	var cu model.ExaCustomer
 	_ = c.ShouldBindJSON(&cu)
 	err, customer := cu.GetExaCustomer()
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("创建失败:%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("获取失败:%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "创建成功", gin.H{
+		response.Result(response.SUCCESS, gin.H{
 			"customer": customer,
-		})
+		}, "创建", c)
 	}
 }
 
@@ -96,25 +95,25 @@ func GetExaCustomer(c *gin.Context) {
 // @Security ApiKeyAuth
 // @accept application/json
 // @Produce application/json
-// @Param data body modelInterface.PageInfo true "获取权限客户列表"
+// @Param data body model.PageInfo true "获取权限客户列表"
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
 // @Router /customer/getExaCustomerList [post]
 func GetExaCustomerList(c *gin.Context) {
 	claims, _ := c.Get("claims")
 	waitUse := claims.(*middleware.CustomClaims)
-	var cu dbModel.ExaCustomer
+	var cu model.ExaCustomer
 	cu.SysUserAuthorityID = waitUse.AuthorityId
-	var pageInfo modelInterface.PageInfo
+	var pageInfo model.PageInfo
 	_ = c.ShouldBindJSON(&pageInfo)
 	err, customerList, total := cu.GetInfoList(pageInfo)
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("创建失败:%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("创建失败:%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "创建成功", gin.H{
+		response.Result(response.SUCCESS, gin.H{
 			"customer": customerList,
 			"total":    total,
 			"page":     pageInfo.Page,
 			"pageSize": pageInfo.PageSize,
-		})
+		}, "创建成功", c)
 	}
 }

+ 24 - 22
QMPlusServer/controller/api/exa_fileUploadAndDownload.go → server/api/v1/exa_file_upload_download.go

@@ -1,10 +1,10 @@
-package api
+package v1
 
 import (
 	"fmt"
-	"gin-vue-admin/controller/servers"
-	"gin-vue-admin/model/dbModel"
-	"gin-vue-admin/model/modelInterface"
+	"gin-vue-admin/global/response"
+	"gin-vue-admin/model"
+	"gin-vue-admin/utils"
 	"github.com/gin-gonic/gin"
 	"strings"
 )
@@ -21,15 +21,15 @@ func UploadFile(c *gin.Context) {
 	noSave := c.DefaultQuery("noSave", "0")
 	_, header, err := c.Request.FormFile("file")
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("上传文件失败,%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("上传文件失败,%v", err), c)
 	} else {
 		//文件上传后拿到文件路径
-		err, filePath, key := servers.Upload(header, USER_HEADER_BUCKET, USER_HEADER_IMG_PATH)
+		err, filePath, key := utils.Upload(header, USER_HEADER_BUCKET, USER_HEADER_IMG_PATH)
 		if err != nil {
-			servers.ReportFormat(c, false, fmt.Sprintf("接收返回值失败,%v", err), gin.H{})
+			response.Result(response.ERROR, gin.H{}, fmt.Sprintf("接收返回值失败,%v", err), c)
 		} else {
 			//修改数据库后得到修改后的user并且返回供前端使用
-			var file dbModel.ExaFileUploadAndDownload
+			var file model.ExaFileUploadAndDownload
 			file.Url = filePath
 			file.Name = header.Filename
 			s := strings.Split(file.Name, ".")
@@ -39,9 +39,10 @@ func UploadFile(c *gin.Context) {
 				err = file.Upload()
 			}
 			if err != nil {
-				servers.ReportFormat(c, false, fmt.Sprintf("修改数据库链接失败,%v", err), gin.H{})
+				response.Result(response.ERROR, gin.H{}, fmt.Sprintf("修改数据库链接失败,%v", err), c)
 			} else {
-				servers.ReportFormat(c, true, "上传成功", gin.H{"file": file})
+				response.Result(response.SUCCESS, gin.H{"file": file}, "上传成功", c)
+
 			}
 		}
 	}
@@ -55,21 +56,22 @@ func UploadFile(c *gin.Context) {
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"返回成功"}"
 // @Router /fileUploadAndDownload/deleteFile [post]
 func DeleteFile(c *gin.Context) {
-	var file dbModel.ExaFileUploadAndDownload
+	var file model.ExaFileUploadAndDownload
 	_ = c.ShouldBindJSON(&file)
 	err, f := file.FindFile()
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("删除失败,%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("删除失败,%v", err), c)
 	} else {
-		err = servers.DeleteFile(USER_HEADER_BUCKET, f.Key)
+		err = utils.DeleteFile(USER_HEADER_BUCKET, f.Key)
 		if err != nil {
-			servers.ReportFormat(c, false, fmt.Sprintf("删除失败,%v", err), gin.H{})
+			response.Result(response.ERROR, gin.H{}, fmt.Sprintf("删除失败,%v", err), c)
+
 		} else {
 			err = f.DeleteFile()
 			if err != nil {
-				servers.ReportFormat(c, false, fmt.Sprintf("删除失败,%v", err), gin.H{})
+				response.Result(response.ERROR, gin.H{}, fmt.Sprintf("删除失败,%v", err), c)
 			} else {
-				servers.ReportFormat(c, true, fmt.Sprintf("删除成功,%v", err), gin.H{})
+				response.Result(response.SUCCESS, gin.H{}, "删除成功", c)
 			}
 		}
 	}
@@ -80,21 +82,21 @@ func DeleteFile(c *gin.Context) {
 // @Security ApiKeyAuth
 // @accept application/json
 // @Produce application/json
-// @Param data body modelInterface.PageInfo true "分页获取文件户列表"
+// @Param data body model.PageInfo true "分页获取文件户列表"
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
 // @Router /fileUploadAndDownload/getFileList [post]
 func GetFileList(c *gin.Context) {
-	var pageInfo modelInterface.PageInfo
+	var pageInfo model.PageInfo
 	_ = c.ShouldBindJSON(&pageInfo)
-	err, list, total := new(dbModel.ExaFileUploadAndDownload).GetInfoList(pageInfo)
+	err, list, total := new(model.ExaFileUploadAndDownload).GetInfoList(pageInfo)
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("获取数据失败,%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("获取数据失败,%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "获取数据成功", gin.H{
+		response.Result(response.SUCCESS, gin.H{
 			"list":     list,
 			"total":    total,
 			"page":     pageInfo.Page,
 			"pageSize": pageInfo.PageSize,
-		})
+		}, "获取数据成功", c)
 	}
 }

+ 27 - 29
QMPlusServer/controller/api/sys_api.go → server/api/v1/sys_api.go

@@ -1,10 +1,9 @@
-package api
+package v1
 
 import (
 	"fmt"
-	"gin-vue-admin/controller/servers"
-	"gin-vue-admin/model/modelInterface"
-	"gin-vue-admin/model/sysModel"
+	"gin-vue-admin/global/response"
+	"gin-vue-admin/model"
 	"github.com/gin-gonic/gin"
 )
 
@@ -26,13 +25,13 @@ type DeleteApiParams struct {
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
 // @Router /api/createApi [post]
 func CreateApi(c *gin.Context) {
-	var api sysModel.SysApi
+	var api model.SysApi
 	_ = c.ShouldBindJSON(&api)
 	err := api.CreateApi()
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("创建失败:%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("创建失败,%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "创建成功", gin.H{})
+		response.Result(response.SUCCESS, gin.H{}, "创建成功", c)
 	}
 }
 
@@ -45,13 +44,13 @@ func CreateApi(c *gin.Context) {
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
 // @Router /api/deleteApi [post]
 func DeleteApi(c *gin.Context) {
-	var a sysModel.SysApi
+	var a model.SysApi
 	_ = c.ShouldBindJSON(&a)
 	err := a.DeleteApi()
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("删除失败:%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("删除失败,%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "删除成功", gin.H{})
+		response.Result(response.SUCCESS, gin.H{}, "删除成功", c)
 	}
 }
 
@@ -67,28 +66,27 @@ type AuthAndPathIn struct {
 // @Security ApiKeyAuth
 // @accept application/json
 // @Produce application/json
-// @Param data body modelInterface.PageInfo true "分页获取API列表"
+// @Param data body model.PageInfo true "分页获取API列表"
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
 // @Router /api/getApiList [post]
 func GetApiList(c *gin.Context) {
 	// 此结构体仅本方法使用
 	type searchParams struct {
-		sysModel.SysApi
-		modelInterface.PageInfo
+		model.SysApi
+		model.PageInfo
 	}
 	var sp searchParams
 	_ = c.ShouldBindJSON(&sp)
 	err, list, total := sp.SysApi.GetInfoList(sp.PageInfo)
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("获取数据失败,%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("获取数据失败,%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "获取数据成功", gin.H{
+		response.Result(response.SUCCESS, gin.H{
 			"list":     list,
 			"total":    total,
 			"page":     sp.PageInfo.Page,
 			"pageSize": sp.PageInfo.PageSize,
-		})
-
+		}, "删除成功", c)
 	}
 }
 
@@ -97,19 +95,19 @@ func GetApiList(c *gin.Context) {
 // @Security ApiKeyAuth
 // @accept application/json
 // @Produce application/json
-// @Param data body modelInterface.PageInfo true "分页获取用户列表"
+// @Param data body model.PageInfo true "分页获取用户列表"
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
 // @Router /api/getApiById [post]
 func GetApiById(c *gin.Context) {
 	var idInfo GetById
 	_ = c.ShouldBindJSON(&idInfo)
-	err, api := new(sysModel.SysApi).GetApiById(idInfo.Id)
+	err, api := new(model.SysApi).GetApiById(idInfo.Id)
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("获取数据失败,%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("获取数据失败,%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "获取数据成功", gin.H{
+		response.Result(response.SUCCESS, gin.H{
 			"api": api,
-		})
+		}, "获取数据成功", c)
 
 	}
 }
@@ -123,13 +121,13 @@ func GetApiById(c *gin.Context) {
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
 // @Router /api/updateApi [post]
 func UpdateApi(c *gin.Context) {
-	var api sysModel.SysApi
+	var api model.SysApi
 	_ = c.ShouldBindJSON(&api)
 	err := api.UpdateApi()
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("修改数据失败,%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("修改数据失败,%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "修改数据成功", gin.H{})
+		response.Result(response.SUCCESS, gin.H{}, "修改数据成功", c)
 	}
 }
 
@@ -141,12 +139,12 @@ func UpdateApi(c *gin.Context) {
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
 // @Router /api/getAllApis [post]
 func GetAllApis(c *gin.Context) {
-	err, apis := new(sysModel.SysApi).GetAllApis()
+	err, apis := new(model.SysApi).GetAllApis()
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("获取数据失败,%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("获取数据失败,%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "获取数据成功", gin.H{
+		response.Result(response.SUCCESS, gin.H{
 			"apis": apis,
-		})
+		}, "获取数据成功", c)
 	}
 }

+ 19 - 22
QMPlusServer/controller/api/sys_authority.go → server/api/v1/sys_authority.go

@@ -1,10 +1,9 @@
-package api
+package v1
 
 import (
 	"fmt"
-	"gin-vue-admin/controller/servers"
-	"gin-vue-admin/model/modelInterface"
-	"gin-vue-admin/model/sysModel"
+	"gin-vue-admin/global/response"
+	"gin-vue-admin/model"
 	"github.com/gin-gonic/gin"
 )
 
@@ -17,17 +16,15 @@ import (
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
 // @Router /authority/createAuthority [post]
 func CreateAuthority(c *gin.Context) {
-	var auth sysModel.SysAuthority
+	var auth model.SysAuthority
 	_ = c.ShouldBindJSON(&auth)
 	err, authBack := auth.CreateAuthority()
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("创建失败:%v", err), gin.H{
-			"authority": authBack,
-		})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("创建失败,%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "创建成功", gin.H{
+		response.Result(response.SUCCESS, gin.H{
 			"authority": authBack,
-		})
+		}, fmt.Sprintf("创建成功,%v", err), c)
 	}
 }
 
@@ -40,14 +37,14 @@ func CreateAuthority(c *gin.Context) {
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
 // @Router /authority/deleteAuthority [post]
 func DeleteAuthority(c *gin.Context) {
-	var a sysModel.SysAuthority
+	var a model.SysAuthority
 	_ = c.ShouldBindJSON(&a)
 	//删除角色之前需要判断是否有用户正在使用此角色
 	err := a.DeleteAuthority()
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("删除失败:%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("删除失败,%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "删除成功", gin.H{})
+		response.Result(response.SUCCESS, gin.H{}, "删除失败", c)
 	}
 }
 
@@ -56,22 +53,22 @@ func DeleteAuthority(c *gin.Context) {
 // @Security ApiKeyAuth
 // @accept application/json
 // @Produce application/json
-// @Param data body modelInterface.PageInfo true "分页获取用户列表"
+// @Param data body model.PageInfo true "分页获取用户列表"
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
 // @Router /authority/getAuthorityList [post]
 func GetAuthorityList(c *gin.Context) {
-	var pageInfo modelInterface.PageInfo
+	var pageInfo model.PageInfo
 	_ = c.ShouldBindJSON(&pageInfo)
-	err, list, total := new(sysModel.SysAuthority).GetInfoList(pageInfo)
+	err, list, total := new(model.SysAuthority).GetInfoList(pageInfo)
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("获取数据失败,%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("获取数据失败,%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "获取数据成功", gin.H{
+		response.Result(response.SUCCESS, gin.H{
 			"list":     list,
 			"total":    total,
 			"page":     pageInfo.Page,
 			"pageSize": pageInfo.PageSize,
-		})
+		}, "获取数据成功", c)
 	}
 }
 
@@ -84,12 +81,12 @@ func GetAuthorityList(c *gin.Context) {
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"设置成功"}"
 // @Router /authority/setDataAuthority [post]
 func SetDataAuthority(c *gin.Context) {
-	var auth sysModel.SysAuthority
+	var auth model.SysAuthority
 	_ = c.ShouldBindJSON(&auth)
 	err := auth.SetDataAuthority()
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("设置关联失败,%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("设置关联失败,%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "设置关联成功", gin.H{})
+		response.Result(response.SUCCESS, gin.H{}, "获取数据成功", c)
 	}
 }

+ 5 - 5
QMPlusServer/controller/api/sys_autoCode.go → server/api/v1/sys_auto_code.go

@@ -1,9 +1,9 @@
-package api
+package v1
 
 import (
 	"fmt"
-	"gin-vue-admin/controller/servers"
-	"gin-vue-admin/model/autoCodeModel"
+	"gin-vue-admin/global/response"
+	"gin-vue-admin/model"
 	"github.com/gin-gonic/gin"
 	"os"
 )
@@ -17,11 +17,11 @@ import (
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"创建成功"}"
 // @Router /autoCode/createTemp [post]
 func CreateTemp(c *gin.Context) {
-	var a autoCodeModel.AutoCodeStruct
+	var a model.AutoCodeStruct
 	_ = c.ShouldBindJSON(&a)
 	err := a.CreateTemp()
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("创建失败:%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("创建失败,%v", err), c)
 		os.Remove("./ginvueadmin.zip")
 	} else {
 		c.Writer.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", "ginvueadmin.zip")) //fmt.Sprintf("attachment; filename=%s", filename)对下载的文件重命名

+ 0 - 0
QMPlusServer/controller/api/sys_captcha.go → server/api/v1/sys_captcha.go


+ 11 - 11
QMPlusServer/controller/api/sys_casbin.go → server/api/v1/sys_casbin.go

@@ -1,9 +1,9 @@
-package api
+package v1
 
 import (
 	"fmt"
-	"gin-vue-admin/controller/servers"
-	"gin-vue-admin/model/sysModel"
+	"gin-vue-admin/global/response"
+	"gin-vue-admin/model"
 	"github.com/gin-gonic/gin"
 )
 
@@ -16,13 +16,13 @@ import (
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
 // @Router /casbin/casbinPUpdate [post]
 func CasbinPUpdate(c *gin.Context) {
-	var cmr sysModel.CasbinInReceive
+	var cmr model.CasbinInReceive
 	_ = c.ShouldBindJSON(&cmr)
-	err := new(sysModel.CasbinModel).CasbinPUpdate(cmr.AuthorityId, cmr.CasbinInfos)
+	err := new(model.CasbinModel).CasbinPUpdate(cmr.AuthorityId, cmr.CasbinInfos)
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("添加规则失败,%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("添加规则失败,%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "添加规则成功", gin.H{})
+		response.Result(response.SUCCESS, gin.H{}, "添加规则成功", c)
 	}
 }
 
@@ -35,10 +35,10 @@ func CasbinPUpdate(c *gin.Context) {
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
 // @Router /casbin/getPolicyPathByAuthorityId [post]
 func GetPolicyPathByAuthorityId(c *gin.Context) {
-	var cmr sysModel.CasbinInReceive
+	var cmr model.CasbinInReceive
 	_ = c.ShouldBindJSON(&cmr)
-	paths := new(sysModel.CasbinModel).GetPolicyPathByAuthorityId(cmr.AuthorityId)
-	servers.ReportFormat(c, true, "获取规则成功", gin.H{"paths": paths})
+	paths := new(model.CasbinModel).GetPolicyPathByAuthorityId(cmr.AuthorityId)
+	response.Result(response.SUCCESS, gin.H{"paths": paths}, "获取规则成功", c)
 }
 
 // @Tags casbin
@@ -53,5 +53,5 @@ func CasbinTest(c *gin.Context) {
 	// 测试restful以及占位符代码  随意书写
 	pathParam := c.Param("pathParam")
 	query := c.Query("query")
-	servers.ReportFormat(c, true, "获取规则成功", gin.H{"pathParam": pathParam, "query": query})
+	response.Result(response.SUCCESS, gin.H{"pathParam": pathParam, "query": query}, "获取规则成功", c)
 }

+ 8 - 8
QMPlusServer/controller/api/sys_jwt_blacklist.go → server/api/v1/sys_jwt_blacklist.go

@@ -1,9 +1,9 @@
-package api
+package v1
 
 import (
 	"fmt"
-	"gin-vue-admin/controller/servers"
-	"gin-vue-admin/model/sysModel"
+	"gin-vue-admin/global/response"
+	"gin-vue-admin/model"
 	"github.com/gin-gonic/gin"
 )
 
@@ -14,15 +14,15 @@ import (
 // @Produce application/json
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"拉黑成功"}"
 // @Router /jwt/jsonInBlacklist [post]
-func JsonInBlacklist(c *gin.Context){
+func JsonInBlacklist(c *gin.Context) {
 	token := c.Request.Header.Get("x-token")
-	ModelJwt := sysModel.JwtBlacklist{
-		Jwt:token,
+	ModelJwt := model.JwtBlacklist{
+		Jwt: token,
 	}
 	err := ModelJwt.JsonInBlacklist()
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("jwt作废失败,%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("jwt作废失败,%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "jwt作废成功", gin.H{})
+		response.Result(response.SUCCESS, gin.H{}, "jwt作废成功", c)
 	}
 }

+ 15 - 16
QMPlusServer/controller/api/sys_menu.go → server/api/v1/sys_menu.go

@@ -1,11 +1,9 @@
-package api
+package v1
 
 import (
 	"fmt"
-	"gin-vue-admin/controller/servers"
 	"gin-vue-admin/middleware"
-	"gin-vue-admin/model/modelInterface"
-	"gin-vue-admin/model/sysModel"
+	"gin-vue-admin/model"
 	"github.com/gin-gonic/gin"
 )
 
@@ -19,7 +17,7 @@ import (
 func GetMenu(c *gin.Context) {
 	claims, _ := c.Get("claims")
 	waitUse := claims.(*middleware.CustomClaims)
-	err, menus := new(sysModel.SysMenu).GetMenuTree(waitUse.AuthorityId)
+	err, menus := new(model.SysMenu).GetMenuTree(waitUse.AuthorityId)
 	if err != nil {
 		servers.ReportFormat(c, false, fmt.Sprintf("获取失败:%v", err), gin.H{"menus": menus})
 	} else {
@@ -32,13 +30,13 @@ func GetMenu(c *gin.Context) {
 // @Security ApiKeyAuth
 // @accept application/json
 // @Produce application/json
-// @Param data body modelInterface.PageInfo true "分页获取基础menu列表"
+// @Param data body model.PageInfo true "分页获取基础menu列表"
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
 // @Router /menu/getMenuList [post]
 func GetMenuList(c *gin.Context) {
-	var pageInfo modelInterface.PageInfo
+	var pageInfo model.PageInfo
 	_ = c.ShouldBindJSON(&pageInfo)
-	err, menuList, total := new(sysModel.SysBaseMenu).GetInfoList(pageInfo)
+	err, menuList, total := new(model.SysBaseMenu).GetInfoList(pageInfo)
 	if err != nil {
 		servers.ReportFormat(c, false, fmt.Sprintf("获取数据失败,%v", err), gin.H{})
 	} else {
@@ -60,7 +58,7 @@ func GetMenuList(c *gin.Context) {
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
 // @Router /menu/addBaseMenu [post]
 func AddBaseMenu(c *gin.Context) {
-	var addMenu sysModel.SysBaseMenu
+	var addMenu model.SysBaseMenu
 	_ = c.ShouldBindJSON(&addMenu)
 	err := addMenu.AddBaseMenu()
 	if err != nil {
@@ -78,7 +76,7 @@ func AddBaseMenu(c *gin.Context) {
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"返回成功"}"
 // @Router /menu/getBaseMenuTree [post]
 func GetBaseMenuTree(c *gin.Context) {
-	err, menus := new(sysModel.SysBaseMenu).GetBaseMenuTree()
+	err, menus := new(model.SysBaseMenu).GetBaseMenuTree()
 	if err != nil {
 		servers.ReportFormat(c, false, fmt.Sprintf("获取失败:%v", err), gin.H{"menus": menus})
 	} else {
@@ -87,7 +85,7 @@ func GetBaseMenuTree(c *gin.Context) {
 }
 
 type AddMenuAuthorityInfo struct {
-	Menus       []sysModel.SysBaseMenu
+	Menus       []model.SysBaseMenu
 	AuthorityId string
 }
 
@@ -102,7 +100,8 @@ type AddMenuAuthorityInfo struct {
 func AddMenuAuthority(c *gin.Context) {
 	var addMenuAuthorityInfo AddMenuAuthorityInfo
 	_ = c.ShouldBindJSON(&addMenuAuthorityInfo)
-	err := new(sysModel.SysMenu).AddMenuAuthority(addMenuAuthorityInfo.Menus, addMenuAuthorityInfo.AuthorityId)
+
+	err := new(model.SysMenu).AddMenuAuthority(addMenuAuthorityInfo.Menus, addMenuAuthorityInfo.AuthorityId)
 	if err != nil {
 		servers.ReportFormat(c, false, fmt.Sprintf("添加失败,%v", err), gin.H{})
 	} else {
@@ -125,7 +124,7 @@ type AuthorityIdInfo struct {
 func GetMenuAuthority(c *gin.Context) {
 	var authorityIdInfo AuthorityIdInfo
 	_ = c.ShouldBindJSON(&authorityIdInfo)
-	err, menus := new(sysModel.SysMenu).GetMenuAuthority(authorityIdInfo.AuthorityId)
+	err, menus := new(model.SysMenu).GetMenuAuthority(authorityIdInfo.AuthorityId)
 	if err != nil {
 		servers.ReportFormat(c, false, fmt.Sprintf("获取失败:%v", err), gin.H{"menus": menus})
 	} else {
@@ -148,7 +147,7 @@ type IdInfo struct {
 func DeleteBaseMenu(c *gin.Context) {
 	var idInfo IdInfo
 	_ = c.ShouldBindJSON(&idInfo)
-	err := new(sysModel.SysBaseMenu).DeleteBaseMenu(idInfo.Id)
+	err := new(model.SysBaseMenu).DeleteBaseMenu(idInfo.Id)
 	if err != nil {
 		servers.ReportFormat(c, false, fmt.Sprintf("删除失败:%v", err), gin.H{})
 	} else {
@@ -165,7 +164,7 @@ func DeleteBaseMenu(c *gin.Context) {
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
 // @Router /menu/updateBaseMenu [post]
 func UpdateBaseMenu(c *gin.Context) {
-	var menu sysModel.SysBaseMenu
+	var menu model.SysBaseMenu
 	_ = c.ShouldBindJSON(&menu)
 	err := menu.UpdateBaseMenu()
 	if err != nil {
@@ -190,7 +189,7 @@ type GetById struct {
 func GetBaseMenuById(c *gin.Context) {
 	var idInfo GetById
 	_ = c.ShouldBindJSON(&idInfo)
-	err, menu := new(sysModel.SysBaseMenu).GetBaseMenuById(idInfo.Id)
+	err, menu := new(model.SysBaseMenu).GetBaseMenuById(idInfo.Id)
 	if err != nil {
 		servers.ReportFormat(c, false, fmt.Sprintf("查询失败:%v", err), gin.H{})
 	} else {

+ 12 - 13
QMPlusServer/controller/api/sys_system.go → server/api/v1/sys_system.go

@@ -1,9 +1,9 @@
-package api
+package v1
 
 import (
 	"fmt"
-	"gin-vue-admin/controller/servers"
-	"gin-vue-admin/model/sysModel"
+	"gin-vue-admin/global/response"
+	"gin-vue-admin/model"
 	"github.com/gin-gonic/gin"
 )
 
@@ -14,11 +14,11 @@ import (
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"返回成功"}"
 // @Router /system/getSystemConfig [post]
 func GetSystemConfig(c *gin.Context) {
-	err, config := new(sysModel.System).GetSystemConfig()
+	err, config := new(model.System).GetSystemConfig()
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("获取失败:%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("获取失败,%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "获取成功", gin.H{"config": config})
+		response.Result(response.SUCCESS, gin.H{"config": config}, "获取成功", c)
 	}
 }
 
@@ -30,17 +30,16 @@ func GetSystemConfig(c *gin.Context) {
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"返回成功"}"
 // @Router /system/setSystemConfig [post]
 func SetSystemConfig(c *gin.Context) {
-	var sys sysModel.System
+	var sys model.System
 	_ = c.ShouldBindJSON(&sys)
 	err := sys.SetSystemConfig()
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("设置失败:%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("设置失败,%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "设置成功", gin.H{})
+		response.Result(response.SUCCESS, gin.H{}, "设置成功", c)
 	}
 }
 
-
 //本方法开发中 开发者windows系统 缺少linux系统所需的包 因此搁置
 // @Tags system
 // @Summary 设置配置文件内容
@@ -50,12 +49,12 @@ func SetSystemConfig(c *gin.Context) {
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"返回成功"}"
 // @Router /system/ReloadSystem [post]
 func ReloadSystem(c *gin.Context) {
-	var sys sysModel.System
+	var sys model.System
 	_ = c.ShouldBindJSON(&sys)
 	err := sys.SetSystemConfig()
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("设置失败:%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("设置失败,%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "设置成功", gin.H{})
+		response.Result(response.SUCCESS, gin.H{}, "设置成功", c)
 	}
 }

+ 45 - 45
QMPlusServer/controller/api/sys_user.go → server/api/v1/sys_user.go

@@ -1,12 +1,12 @@
-package api
+package v1
 
 import (
 	"fmt"
-	"gin-vue-admin/config"
-	"gin-vue-admin/controller/servers"
+	"gin-vue-admin/global"
+	"gin-vue-admin/global/response"
 	"gin-vue-admin/middleware"
-	"gin-vue-admin/model/modelInterface"
-	"gin-vue-admin/model/sysModel"
+	"gin-vue-admin/model"
+	"gin-vue-admin/utils"
 	"github.com/dchest/captcha"
 	"github.com/dgrijalva/jwt-go"
 	"github.com/gin-gonic/gin"
@@ -45,16 +45,16 @@ type RegestStuct struct {
 func Register(c *gin.Context) {
 	var R RegestStuct
 	_ = c.ShouldBindJSON(&R)
-	user := &sysModel.SysUser{Username: R.Username, NickName: R.NickName, Password: R.Password, HeaderImg: R.HeaderImg, AuthorityId: R.AuthorityId}
+	user := &model.SysUser{Username: R.Username, NickName: R.NickName, Password: R.Password, HeaderImg: R.HeaderImg, AuthorityId: R.AuthorityId}
 	err, user := user.Register()
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("%v", err), gin.H{
+		response.Result(response.ERROR, gin.H{
 			"user": user,
-		})
+		}, fmt.Sprintf("%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "创建成功", gin.H{
+		response.Result(response.SUCCESS, gin.H{
 			"user": user,
-		})
+		}, "注册成功", c)
 	}
 }
 
@@ -68,22 +68,22 @@ func Login(c *gin.Context) {
 	var L RegisterAndLoginStuct
 	_ = c.ShouldBindJSON(&L)
 	if captcha.VerifyString(L.CaptchaId, L.Captcha) {
-		U := &sysModel.SysUser{Username: L.Username, Password: L.Password}
+		U := &model.SysUser{Username: L.Username, Password: L.Password}
 		if err, user := U.Login(); err != nil {
-			servers.ReportFormat(c, false, fmt.Sprintf("用户名密码错误或%v", err), gin.H{})
+			response.Result(response.ERROR, gin.H{}, fmt.Sprintf("用户名密码错误或%v", err), c)
 		} else {
 			tokenNext(c, *user)
 		}
 	} else {
-		servers.ReportFormat(c, false, "验证码错误", gin.H{})
+		response.Result(response.ERROR, gin.H{}, "验证码错误", c)
 	}
 
 }
 
 //登录以后签发jwt
-func tokenNext(c *gin.Context, user sysModel.SysUser) {
+func tokenNext(c *gin.Context, user model.SysUser) {
 	j := &middleware.JWT{
-		[]byte(config.GinVueAdminconfig.JWT.SigningKey), // 唯一签名
+		[]byte(global.GVA_CONFIG.JWT.SigningKey), // 唯一签名
 	}
 	clams := middleware.CustomClaims{
 		UUID:        user.UUID,
@@ -98,38 +98,38 @@ func tokenNext(c *gin.Context, user sysModel.SysUser) {
 	}
 	token, err := j.CreateToken(clams)
 	if err != nil {
-		servers.ReportFormat(c, false, "获取token失败", gin.H{})
+		response.Result(response.ERROR, gin.H{}, "获取token失败", c)
 	} else {
-		if config.GinVueAdminconfig.System.UseMultipoint {
-			var loginJwt sysModel.JwtBlacklist
+		if global.GVA_CONFIG.System.UseMultipoint {
+			var loginJwt model.JwtBlacklist
 			loginJwt.Jwt = token
 			err, jwtStr := loginJwt.GetRedisJWT(user.Username)
 			if err == redis.Nil {
 				err2 := loginJwt.SetRedisJWT(user.Username)
 				if err2 != nil {
-					servers.ReportFormat(c, false, "设置登录状态失败", gin.H{})
+					response.Result(response.ERROR, gin.H{}, "设置登录状态失败", c)
 				} else {
-					servers.ReportFormat(c, true, "登录成功", gin.H{"user": user, "token": token, "expiresAt": clams.StandardClaims.ExpiresAt * 1000})
+					response.Result(response.SUCCESS, gin.H{"user": user, "token": token, "expiresAt": clams.StandardClaims.ExpiresAt * 1000}, "登录成功", c)
 				}
 			} else if err != nil {
-				servers.ReportFormat(c, false, fmt.Sprintf("%v", err), gin.H{})
+				response.Result(response.ERROR, gin.H{}, fmt.Sprintf("%v", err), c)
 			} else {
-				var blackjWT sysModel.JwtBlacklist
+				var blackjWT model.JwtBlacklist
 				blackjWT.Jwt = jwtStr
 				err3 := blackjWT.JsonInBlacklist()
 				if err3 != nil {
-					servers.ReportFormat(c, false, "jwt作废失败", gin.H{})
+					response.Result(response.ERROR, gin.H{}, "jwt作废失败", c)
 				} else {
 					err2 := loginJwt.SetRedisJWT(user.Username)
 					if err2 != nil {
-						servers.ReportFormat(c, false, "设置登录状态失败", gin.H{})
+						response.Result(response.ERROR, gin.H{}, "设置登录状态失败", c)
 					} else {
-						servers.ReportFormat(c, true, "登录成功", gin.H{"user": user, "token": token, "expiresAt": clams.StandardClaims.ExpiresAt * 1000})
+						response.Result(response.SUCCESS, gin.H{"user": user, "token": token, "expiresAt": clams.StandardClaims.ExpiresAt * 1000}, "登录成功", c)
 					}
 				}
 			}
 		} else {
-			servers.ReportFormat(c, true, "登录成功", gin.H{"user": user, "token": token, "expiresAt": clams.StandardClaims.ExpiresAt * 1000})
+			response.Result(response.SUCCESS, gin.H{"user": user, "token": token, "expiresAt": clams.StandardClaims.ExpiresAt * 1000}, "登录成功", c)
 		}
 	}
 }
@@ -146,15 +146,15 @@ type ChangePasswordStutrc struct {
 // @Produce  application/json
 // @Param data body api.ChangePasswordStutrc true "用户修改密码"
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"修改成功"}"
-// @Router /user/changePassword [post]
+// @Router /user/changePassword [put]
 func ChangePassword(c *gin.Context) {
 	var params ChangePasswordStutrc
 	_ = c.ShouldBindJSON(&params)
-	U := &sysModel.SysUser{Username: params.Username, Password: params.Password}
+	U := &model.SysUser{Username: params.Username, Password: params.Password}
 	if err, _ := U.ChangePassword(params.NewPassword); err != nil {
-		servers.ReportFormat(c, false, "修改失败,请检查用户名密码", gin.H{})
+		response.Result(response.ERROR, gin.H{}, "修改失败,请检查用户名密码", c)
 	} else {
-		servers.ReportFormat(c, true, "修改成功", gin.H{})
+		response.Result(response.SUCCESS, gin.H{}, "修改成功", c)
 	}
 }
 
@@ -180,19 +180,19 @@ func UploadHeaderImg(c *gin.Context) {
 	_, header, err := c.Request.FormFile("headerImg")
 	//便于找到用户 以后从jwt中取
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("上传文件失败,%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("上传文件失败,%v", err), c)
 	} else {
 		//文件上传后拿到文件路径
-		err, filePath, _ := servers.Upload(header, USER_HEADER_BUCKET, USER_HEADER_IMG_PATH)
+		err, filePath, _ := utils.Upload(header, USER_HEADER_BUCKET, USER_HEADER_IMG_PATH)
 		if err != nil {
-			servers.ReportFormat(c, false, fmt.Sprintf("接收返回值失败,%v", err), gin.H{})
+			response.Result(response.ERROR, gin.H{}, fmt.Sprintf("接收返回值失败,%v", err), c)
 		} else {
 			//修改数据库后得到修改后的user并且返回供前端使用
-			err, user := new(sysModel.SysUser).UploadHeaderImg(uuid, filePath)
+			err, user := new(model.SysUser).UploadHeaderImg(uuid, filePath)
 			if err != nil {
-				servers.ReportFormat(c, false, fmt.Sprintf("修改数据库链接失败,%v", err), gin.H{})
+				response.Result(response.ERROR, gin.H{}, fmt.Sprintf("修改数据库链接失败,%v", err), c)
 			} else {
-				servers.ReportFormat(c, true, "上传成功", gin.H{"user": user})
+				response.Result(response.SUCCESS, gin.H{"user": user}, "上传成功", c)
 			}
 		}
 	}
@@ -203,22 +203,22 @@ func UploadHeaderImg(c *gin.Context) {
 // @Security ApiKeyAuth
 // @accept application/json
 // @Produce application/json
-// @Param data body modelInterface.PageInfo true "分页获取用户列表"
+// @Param data body model.PageInfo true "分页获取用户列表"
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
 // @Router /user/getUserList [post]
 func GetUserList(c *gin.Context) {
-	var pageInfo modelInterface.PageInfo
+	var pageInfo model.PageInfo
 	_ = c.ShouldBindJSON(&pageInfo)
-	err, list, total := new(sysModel.SysUser).GetInfoList(pageInfo)
+	err, list, total := new(model.SysUser).GetInfoList(pageInfo)
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("获取数据失败,%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("获取数据失败,%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "获取数据成功", gin.H{
+		response.Result(response.SUCCESS, gin.H{
 			"userList": list,
 			"total":    total,
 			"page":     pageInfo.Page,
 			"pageSize": pageInfo.PageSize,
-		})
+		}, "获取数据成功", c)
 	}
 }
 
@@ -238,10 +238,10 @@ type SetUserAuth struct {
 func SetUserAuthority(c *gin.Context) {
 	var sua SetUserAuth
 	_ = c.ShouldBindJSON(&sua)
-	err := new(sysModel.SysUser).SetUserAuthority(sua.UUID, sua.AuthorityId)
+	err := new(model.SysUser).SetUserAuthority(sua.UUID, sua.AuthorityId)
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("修改失败,%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("修改失败,%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "修改成功", gin.H{})
+		response.Result(response.SUCCESS, gin.H{}, "修改成功", c)
 	}
 }

+ 6 - 6
QMPlusServer/controller/api/sys_workFlow.go → server/api/v1/sys_work_flow.go

@@ -1,9 +1,9 @@
-package api
+package v1
 
 import (
 	"fmt"
-	"gin-vue-admin/controller/servers"
-	"gin-vue-admin/model/sysModel"
+	"gin-vue-admin/global/response"
+	"gin-vue-admin/model"
 	"github.com/gin-gonic/gin"
 )
 
@@ -14,12 +14,12 @@ import (
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"注册成功"}"
 // @Router /workflow/createWorkFlow [post]
 func CreateWorkFlow(c *gin.Context) {
-	var wk sysModel.SysWorkflow
+	var wk model.SysWorkflow
 	_ = c.ShouldBindJSON(&wk)
 	err := wk.Create()
 	if err != nil {
-		servers.ReportFormat(c, false, fmt.Sprintf("获取失败:%v", err), gin.H{})
+		response.Result(response.ERROR, gin.H{}, fmt.Sprintf("获取失败:%v", err), c)
 	} else {
-		servers.ReportFormat(c, true, "获取成功", gin.H{})
+		response.Result(response.SUCCESS, gin.H{}, "获取成功", c)
 	}
 }

+ 1 - 1
QMPlusServer/static/config/config.json → server/config.json

@@ -1,6 +1,6 @@
 {
     "casbinconfig": {
-        "modelPath": "./static/rbacmodel/rbac_model.conf"
+        "modelPath": "./resource/rbac_model.conf"
     },
     "jwt": {
         "signingKey": "qmPlus"

+ 13 - 10
QMPlusServer/cmd/windows.go → server/core/server.go

@@ -1,16 +1,21 @@
-package cmd
+package core
 
 import (
 	"fmt"
-	"gin-vue-admin/config"
-	"gin-vue-admin/init/initlog"
-	"github.com/gin-gonic/gin"
+	"gin-vue-admin/global"
+	"gin-vue-admin/init"
 	"net/http"
 	"time"
 )
 
-func RunWindowsServer(Router *gin.Engine) {
-	address := fmt.Sprintf(":%d", config.GinVueAdminconfig.System.Addr)
+func RunWindowsServer() {
+	if global.GVA_CONFIG.System.UseMultipoint {
+		// 初始化redis服务
+		init.RegisterRedis()
+	}
+	Router := init.RegisterRouter()
+	Router.Static("/form-generator", "./resource/page")
+	address := fmt.Sprintf(":%d", global.GVA_CONFIG.System.Addr)
 	s := &http.Server{
 		Addr:           address,
 		Handler:        Router,
@@ -19,13 +24,11 @@ func RunWindowsServer(Router *gin.Engine) {
 		MaxHeaderBytes: 1 << 20,
 	}
 	time.Sleep(10 * time.Microsecond)
-	log.L.Debug("server run success on ", address)
+	init.L.Debug("server run success on ", address)
 
 	fmt.Printf(`欢迎使用 Gin-Vue-Admin
-	作者:奇淼 And Spike666
-	微信:shouzi_1994
 	默认自动化文档地址:http://127.0.0.1%s/swagger/index.html
 	默认前端文件运行地址:http://127.0.0.1:8080
 `, s.Addr)
-	_ = s.ListenAndServe()
+	 init.L.Error(s.ListenAndServe())
 }

+ 0 - 0
QMPlusServer/db/casbin_rule.sql → server/db/casbin_rule.sql


+ 0 - 0
QMPlusServer/db/ch_cities.sql → server/db/ch_cities.sql


+ 0 - 0
QMPlusServer/db/ch_provinces.sql → server/db/ch_provinces.sql


+ 0 - 0
QMPlusServer/db/ch_t_d_areainfo.sql → server/db/ch_t_d_areainfo.sql


+ 0 - 0
QMPlusServer/db/exa_customers.sql → server/db/exa_customers.sql


+ 0 - 0
QMPlusServer/db/exa_file_chunks.sql → server/db/exa_file_chunks.sql


+ 0 - 0
QMPlusServer/db/exa_file_upload_and_downloads.sql → server/db/exa_file_upload_and_downloads.sql


+ 0 - 0
QMPlusServer/db/exa_files.sql → server/db/exa_files.sql


+ 0 - 0
QMPlusServer/db/jwt_blacklists.sql → server/db/jwt_blacklists.sql


+ 0 - 0
QMPlusServer/db/qmplus.sql → server/db/qmplus.sql


+ 0 - 0
QMPlusServer/db/sys_apis.sql → server/db/sys_apis.sql


+ 0 - 0
QMPlusServer/db/sys_authorities.sql → server/db/sys_authorities.sql


+ 0 - 0
QMPlusServer/db/sys_base_menus.sql → server/db/sys_base_menus.sql


+ 0 - 0
QMPlusServer/db/sys_data_authority_id.sql → server/db/sys_data_authority_id.sql


+ 0 - 0
QMPlusServer/db/sys_menus.sql → server/db/sys_menus.sql


+ 0 - 0
QMPlusServer/db/sys_users.sql → server/db/sys_users.sql


+ 0 - 0
QMPlusServer/db/sys_workflow_step_infos.sql → server/db/sys_workflow_step_infos.sql


+ 0 - 0
QMPlusServer/db/sys_workflows.sql → server/db/sys_workflows.sql


+ 8 - 8
QMPlusServer/docs/docs.go → server/docs/docs.go

@@ -156,7 +156,7 @@ var doc = `{
                         "required": true,
                         "schema": {
                             "type": "object",
-                            "$ref": "#/definitions/modelInterface.PageInfo"
+                            "$ref": "#/definitions/model.PageInfo"
                         }
                     }
                 ],
@@ -195,7 +195,7 @@ var doc = `{
                         "required": true,
                         "schema": {
                             "type": "object",
-                            "$ref": "#/definitions/modelInterface.PageInfo"
+                            "$ref": "#/definitions/model.PageInfo"
                         }
                     }
                 ],
@@ -351,7 +351,7 @@ var doc = `{
                         "required": true,
                         "schema": {
                             "type": "object",
-                            "$ref": "#/definitions/modelInterface.PageInfo"
+                            "$ref": "#/definitions/model.PageInfo"
                         }
                     }
                 ],
@@ -779,7 +779,7 @@ var doc = `{
                         "required": true,
                         "schema": {
                             "type": "object",
-                            "$ref": "#/definitions/modelInterface.PageInfo"
+                            "$ref": "#/definitions/model.PageInfo"
                         }
                     }
                 ],
@@ -965,7 +965,7 @@ var doc = `{
                         "required": true,
                         "schema": {
                             "type": "object",
-                            "$ref": "#/definitions/modelInterface.PageInfo"
+                            "$ref": "#/definitions/model.PageInfo"
                         }
                     }
                 ],
@@ -1331,7 +1331,7 @@ var doc = `{
                         "required": true,
                         "schema": {
                             "type": "object",
-                            "$ref": "#/definitions/modelInterface.PageInfo"
+                            "$ref": "#/definitions/model.PageInfo"
                         }
                     }
                 ],
@@ -1541,7 +1541,7 @@ var doc = `{
                         "required": true,
                         "schema": {
                             "type": "object",
-                            "$ref": "#/definitions/modelInterface.PageInfo"
+                            "$ref": "#/definitions/model.PageInfo"
                         }
                     }
                 ],
@@ -1923,7 +1923,7 @@ var doc = `{
                 }
             }
         },
-        "modelInterface.PageInfo": {
+        "model.PageInfo": {
             "type": "object",
             "properties": {
                 "page": {

+ 8 - 8
QMPlusServer/docs/swagger.json → server/docs/swagger.json

@@ -139,7 +139,7 @@
                         "required": true,
                         "schema": {
                             "type": "object",
-                            "$ref": "#/definitions/modelInterface.PageInfo"
+                            "$ref": "#/definitions/model.PageInfo"
                         }
                     }
                 ],
@@ -178,7 +178,7 @@
                         "required": true,
                         "schema": {
                             "type": "object",
-                            "$ref": "#/definitions/modelInterface.PageInfo"
+                            "$ref": "#/definitions/model.PageInfo"
                         }
                     }
                 ],
@@ -334,7 +334,7 @@
                         "required": true,
                         "schema": {
                             "type": "object",
-                            "$ref": "#/definitions/modelInterface.PageInfo"
+                            "$ref": "#/definitions/model.PageInfo"
                         }
                     }
                 ],
@@ -762,7 +762,7 @@
                         "required": true,
                         "schema": {
                             "type": "object",
-                            "$ref": "#/definitions/modelInterface.PageInfo"
+                            "$ref": "#/definitions/model.PageInfo"
                         }
                     }
                 ],
@@ -948,7 +948,7 @@
                         "required": true,
                         "schema": {
                             "type": "object",
-                            "$ref": "#/definitions/modelInterface.PageInfo"
+                            "$ref": "#/definitions/model.PageInfo"
                         }
                     }
                 ],
@@ -1314,7 +1314,7 @@
                         "required": true,
                         "schema": {
                             "type": "object",
-                            "$ref": "#/definitions/modelInterface.PageInfo"
+                            "$ref": "#/definitions/model.PageInfo"
                         }
                     }
                 ],
@@ -1524,7 +1524,7 @@
                         "required": true,
                         "schema": {
                             "type": "object",
-                            "$ref": "#/definitions/modelInterface.PageInfo"
+                            "$ref": "#/definitions/model.PageInfo"
                         }
                     }
                 ],
@@ -1906,7 +1906,7 @@
                 }
             }
         },
-        "modelInterface.PageInfo": {
+        "model.PageInfo": {
             "type": "object",
             "properties": {
                 "page": {

+ 8 - 8
QMPlusServer/docs/swagger.yaml → server/docs/swagger.yaml

@@ -165,7 +165,7 @@ definitions:
       url:
         type: string
     type: object
-  modelInterface.PageInfo:
+  model.PageInfo:
     properties:
       page:
         type: integer
@@ -382,7 +382,7 @@ paths:
         name: data
         required: true
         schema:
-          $ref: '#/definitions/modelInterface.PageInfo'
+          $ref: '#/definitions/model.PageInfo'
           type: object
       produces:
       - application/json
@@ -406,7 +406,7 @@ paths:
         name: data
         required: true
         schema:
-          $ref: '#/definitions/modelInterface.PageInfo'
+          $ref: '#/definitions/model.PageInfo'
           type: object
       produces:
       - application/json
@@ -502,7 +502,7 @@ paths:
         name: data
         required: true
         schema:
-          $ref: '#/definitions/modelInterface.PageInfo'
+          $ref: '#/definitions/model.PageInfo'
           type: object
       produces:
       - application/json
@@ -766,7 +766,7 @@ paths:
         name: data
         required: true
         schema:
-          $ref: '#/definitions/modelInterface.PageInfo'
+          $ref: '#/definitions/model.PageInfo'
           type: object
       produces:
       - application/json
@@ -880,7 +880,7 @@ paths:
         name: data
         required: true
         schema:
-          $ref: '#/definitions/modelInterface.PageInfo'
+          $ref: '#/definitions/model.PageInfo'
           type: object
       produces:
       - application/json
@@ -1104,7 +1104,7 @@ paths:
         name: data
         required: true
         schema:
-          $ref: '#/definitions/modelInterface.PageInfo'
+          $ref: '#/definitions/model.PageInfo'
           type: object
       produces:
       - application/json
@@ -1232,7 +1232,7 @@ paths:
         name: data
         required: true
         schema:
-          $ref: '#/definitions/modelInterface.PageInfo'
+          $ref: '#/definitions/model.PageInfo'
           type: object
       produces:
       - application/json

+ 16 - 0
server/global/global.go

@@ -0,0 +1,16 @@
+package global
+
+import (
+	"gin-vue-admin/init"
+	"github.com/go-redis/redis"
+	"github.com/jinzhu/gorm"
+	"github.com/spf13/viper"
+)
+
+var (
+	GVA_DB     *gorm.DB
+	GVA_REDIS  *redis.Client
+	GVA_LOG    init.Logger
+	GVA_CONFIG init.Config
+	GVA_VP     *viper.Viper
+)

+ 26 - 0
server/global/response/response.go

@@ -0,0 +1,26 @@
+package response
+
+import (
+	"github.com/gin-gonic/gin"
+	"net/http"
+)
+
+type response struct {
+	code int
+	data interface{}
+	msg  string
+}
+
+const (
+	ERROR   = 7
+	SUCCESS = 0
+)
+
+func Result(code int, data interface{}, msg string, c *gin.Context) {
+	// 开始时间
+	c.JSON(http.StatusOK, response{
+		code,
+		data,
+		msg,
+	})
+}

+ 0 - 0
QMPlusServer/go.mod → server/go.mod


+ 11 - 13
QMPlusServer/config/config.go → server/init/config.go

@@ -1,7 +1,8 @@
-package config
+package init
 
 import (
 	"fmt"
+	"gin-vue-admin/global"
 	"github.com/fsnotify/fsnotify"
 	"github.com/spf13/viper"
 )
@@ -70,22 +71,19 @@ Log Config
 */
 type Log struct {
 	// log 打印的前缀
-	Prefix  string   `json:"prefix"`
+	Prefix string `json:"prefix"`
 	// 是否显示打印log的文件具体路径
-	LogFile bool     `json:"logFile"`
+	LogFile bool `json:"logFile"`
 	// 在控制台打印log的级别, []默认不打印
-	Stdout  []string `json:"stdout"`
+	Stdout []string `json:"stdout"`
 	// 在文件中打印log的级别   []默认不打印
-	File    []string `json:"file"`
+	File []string `json:"file"`
 }
 
-var GinVueAdminconfig Config
-var VTool *viper.Viper
-
 func init() {
 	v := viper.New()
-	v.SetConfigName("config")           //  设置配置文件名 (不带后缀)
-	v.AddConfigPath("./static/config/") // 第一个搜索路径
+	v.SetConfigName("config") //  设置配置文件名 (不带后缀)
+	v.AddConfigPath("/")      // 第一个搜索路径
 	v.SetConfigType("json")
 	err := v.ReadInConfig() // 搜索路径,并读取配置数据
 	if err != nil {
@@ -94,12 +92,12 @@ func init() {
 	v.WatchConfig()
 	v.OnConfigChange(func(e fsnotify.Event) {
 		fmt.Println("config file changed:", e.Name)
-		if err := v.Unmarshal(&GinVueAdminconfig); err != nil {
+		if err := v.Unmarshal(&global.GVA_CONFIG); err != nil {
 			fmt.Println(err)
 		}
 	})
-	if err := v.Unmarshal(&GinVueAdminconfig); err != nil {
+	if err := v.Unmarshal(&global.GVA_CONFIG); err != nil {
 		fmt.Println(err)
 	}
-	VTool = v
+	global.GVA_VP = v
 }

+ 1 - 1
QMPlusServer/init/initlog/log.go → server/init/log.go

@@ -1,4 +1,4 @@
-package log
+package init
 
 // Custom Logger
 type Logger interface {

+ 19 - 0
server/init/mysql.go

@@ -0,0 +1,19 @@
+package init
+
+import (
+	"gin-vue-admin/global"
+	"github.com/jinzhu/gorm"
+	_ "github.com/jinzhu/gorm/dialects/mysql"
+)
+
+//初始化数据库并产生数据库全局变量
+func RegisterMysql(admin MysqlAdmin) {
+	if db, err := gorm.Open("mysql", admin.Username+":"+admin.Password+"@("+admin.Path+")/"+admin.Dbname+"?"+admin.Config); err != nil {
+		L.Error("DEFAULTDB数据库启动异常", err)
+	} else {
+		global.GVA_DB = db
+		global.GVA_DB.DB().SetMaxIdleConns(admin.MaxIdleConns)
+		global.GVA_DB.DB().SetMaxOpenConns(admin.MaxOpenConns)
+		global.GVA_DB.LogMode(admin.LogMode)
+	}
+}

+ 12 - 14
QMPlusServer/init/initlog/qmlog/log.go → server/init/qmlog/log.go

@@ -4,9 +4,8 @@ package qmlog
 import (
 	"errors"
 	"fmt"
-	"gin-vue-admin/config"
-	"gin-vue-admin/init/initlog"
-	"gin-vue-admin/tools"
+	"gin-vue-admin/init"
+	"gin-vue-admin/utils"
 	rotatelogs "github.com/lestrrat/go-file-rotatelogs"
 	oplogging "github.com/op/go-logging"
 	"io"
@@ -16,9 +15,9 @@ import (
 )
 
 const (
-	logDir = "log"
+	logDir      = "log"
 	logSoftLink = "api.log"
-	module = "gin-vue-admin"
+	module      = "gin-vue-admin"
 )
 
 var (
@@ -27,12 +26,12 @@ var (
 	defaultFormatter = `%{time:2006/01/02 - 15:04:05.000} %{longfile} %{color:bold}▶ [%{level:.6s}] %{message}%{color:reset}`
 )
 
-type Logger struct{
+type Logger struct {
 	logger *oplogging.Logger
 }
 
 func NewLogger() error {
-	c := config.GinVueAdminconfig.Log
+	c := init.GinVueAdminconfig.Log
 	if c.Prefix == "" {
 		return configNotFound
 	}
@@ -42,11 +41,11 @@ func NewLogger() error {
 	backends = registerFile(c, backends)
 
 	oplogging.SetBackend(backends...)
-	log.SetLogger(logger)
+	init.SetLogger(logger)
 	return nil
 }
 
-func registerStdout(c config.Log, backends []oplogging.Backend) []oplogging.Backend {
+func registerStdout(c init.Log, backends []oplogging.Backend) []oplogging.Backend {
 	for _, v := range c.Stdout {
 		level, err := oplogging.LogLevel(v)
 		if err != nil {
@@ -59,9 +58,9 @@ func registerStdout(c config.Log, backends []oplogging.Backend) []oplogging.Back
 	return backends
 }
 
-func registerFile(c config.Log, backends []oplogging.Backend) []oplogging.Backend {
+func registerFile(c init.Log, backends []oplogging.Backend) []oplogging.Backend {
 	if len(c.File) > 0 {
-		if ok, _ := tools.PathExists(logDir); !ok {
+		if ok, _ := utils.PathExists(logDir); !ok {
 			// directory not exist
 			fmt.Println("create log directory")
 			_ = os.Mkdir(logDir, os.ModePerm)
@@ -93,7 +92,7 @@ func registerFile(c config.Log, backends []oplogging.Backend) []oplogging.Backen
 	return backends
 }
 
-func createBackend(w io.Writer, c config.Log, level oplogging.Level) oplogging.Backend {
+func createBackend(w io.Writer, c init.Log, level oplogging.Level) oplogging.Backend {
 	backend := oplogging.NewLogBackend(w, c.Prefix, 0)
 	stdoutWriter := false
 	if w == os.Stdout {
@@ -105,7 +104,7 @@ func createBackend(w io.Writer, c config.Log, level oplogging.Level) oplogging.B
 	return backendLeveled
 }
 
-func getLogFormatter(c config.Log, stdoutWriter bool) oplogging.Formatter {
+func getLogFormatter(c init.Log, stdoutWriter bool) oplogging.Formatter {
 	pattern := defaultFormatter
 	if !stdoutWriter {
 		// Color is only required for console output
@@ -143,4 +142,3 @@ func (l Logger) Critical(v ...interface{}) {
 func (l Logger) Fatal(v ...interface{}) {
 	l.logger.Fatal(v)
 }
-

+ 21 - 0
server/init/redis.go

@@ -0,0 +1,21 @@
+package init
+
+import (
+	"gin-vue-admin/global"
+	"github.com/go-redis/redis"
+)
+
+func RegisterRedis() {
+	client := redis.NewClient(&redis.Options{
+		Addr:     GinVueAdminconfig.RedisAdmin.Addr,
+		Password: GinVueAdminconfig.RedisAdmin.Password, // no password set
+		DB:       GinVueAdminconfig.RedisAdmin.DB,       // use default DB
+	})
+	pong, err := client.Ping().Result()
+	if err != nil {
+		L.Error(err)
+	} else {
+		L.Info("redis connect ping response:", pong)
+		global.GVA_REDIS = client
+	}
+}

+ 24 - 0
server/init/regist_table.go

@@ -0,0 +1,24 @@
+package init
+
+import (
+	"gin-vue-admin/model"
+	"github.com/jinzhu/gorm"
+)
+
+//注册数据库表专用
+func RegisterTable(db *gorm.DB) {
+	db.AutoMigrate(model.SysUser{},
+		model.SysAuthority{},
+		model.SysMenu{},
+		model.SysApi{},
+		model.SysBaseMenu{},
+		model.JwtBlacklist{},
+		model.SysWorkflow{},
+		model.SysWorkflowStepInfo{},
+		model.ExaFileUploadAndDownload{},
+		model.ExaFile{},
+		model.ExaFileChunk{},
+		model.ExaCustomer{},
+	)
+	L.Debug("register table success")
+}

+ 6 - 7
QMPlusServer/init/initRouter/init_router.go → server/init/router.go

@@ -1,8 +1,7 @@
-package initRouter
+package init
 
 import (
 	_ "gin-vue-admin/docs"
-	"gin-vue-admin/init/initlog"
 	"gin-vue-admin/middleware"
 	"gin-vue-admin/router"
 	"github.com/gin-gonic/gin"
@@ -11,18 +10,18 @@ import (
 )
 
 //初始化总路由
-func InitRouter() *gin.Engine {
+func RegisterRouter() *gin.Engine {
 	var Router = gin.Default()
 
 	//Router.Use(middleware.LoadTls())  // 打开就能玩https了
 	// 如果不需要日志 请关闭这里
 	Router.Use(middleware.Logger())
-	log.L.Debug("use middleware logger")
+	L.Debug("use middleware logger")
 	// 跨域
 	Router.Use(middleware.Cors())
-	log.L.Debug("use middleware cors")
+	L.Debug("use middleware cors")
 	Router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
-	log.L.Debug("register swagger handler")
+	L.Debug("register swagger handler")
 	// 方便统一添加路由组前缀 多服务器上线使用
 	ApiGroup := Router.Group("")
 	router.InitUserRouter(ApiGroup)                  // 注册用户路由
@@ -37,6 +36,6 @@ func InitRouter() *gin.Engine {
 	router.InitSystemRouter(ApiGroup)                // system相关路由
 	router.InitCustomerRouter(ApiGroup)              // 客户路由
 	router.InitAutoCodeRouter(ApiGroup)              // 创建自动化代码
-	log.L.Info("router register success")
+	L.Info("router register success")
 	return Router
 }

+ 41 - 0
server/main.go

@@ -0,0 +1,41 @@
+package main
+
+import (
+	"gin-vue-admin/core"
+	"gin-vue-admin/global"
+	"gin-vue-admin/init"
+	"gin-vue-admin/init/qmlog"
+	"os"
+	//"runtime"
+)
+
+// @title Swagger Example API
+// @version 0.0.1
+// @description This is a sample Server pets
+// @securityDefinitions.apikey ApiKeyAuth
+// @in header
+// @name x-token
+// @BasePath /
+
+var (
+	mysqlHost = os.Getenv("MYSQLHOST")
+	mysqlPort = os.Getenv("MYSQLPORT")
+)
+
+func main() {
+	if err := qmlog.NewLogger(); err != nil {
+		panic(err)
+	}
+	// 可以通过环境变量来覆盖配置值
+	// 未设定有效的环境变量时,使用配置值
+	mysqlConfig := init.GinVueAdminconfig.MysqlAdmin
+	// 链接初始化数据库
+	init.RegisterMysql(mysqlConfig) // 链接初始化数据库
+
+	// 注册数据库表
+	init.RegisterTable(global.GVA_DB)
+	// 程序结束前关闭数据库链接
+	defer global.GVA_DB.Close()
+
+	core.RunWindowsServer()
+}

+ 4 - 5
QMPlusServer/middleware/casbin_rcba.go → server/middleware/casbin_rcba.go

@@ -1,9 +1,8 @@
 package middleware
 
 import (
-	"fmt"
-	"gin-vue-admin/controller/servers"
-	"gin-vue-admin/model/sysModel"
+	"gin-vue-admin/global/response"
+	"gin-vue-admin/model"
 	"github.com/gin-gonic/gin"
 )
 
@@ -18,12 +17,12 @@ func CasbinHandler() gin.HandlerFunc {
 		act := c.Request.Method
 		//获取用户的角色
 		sub := waitUse.AuthorityId
-		e := sysModel.Casbin()
+		e := model.Casbin()
 		//判断策略中是否存在
 		if e.Enforce(sub, obj, act) {
 			c.Next()
 		} else {
-			servers.ReportFormat(c, false, fmt.Sprintf("权限不足"), gin.H{})
+			response.Result(response.ERROR, gin.H{}, "权限不足", c)
 			c.Abort()
 			return
 		}

+ 0 - 0
QMPlusServer/middleware/cors.go → server/middleware/cors.go


+ 13 - 13
QMPlusServer/middleware/jwt.go → server/middleware/jwt.go

@@ -2,9 +2,9 @@ package middleware
 
 import (
 	"errors"
-	"gin-vue-admin/config"
-	"gin-vue-admin/controller/servers"
-	"gin-vue-admin/model/sysModel"
+	"gin-vue-admin/global"
+	"gin-vue-admin/global/response"
+	"gin-vue-admin/model"
 	"github.com/dgrijalva/jwt-go"
 	"github.com/gin-gonic/gin"
 	uuid "github.com/satori/go.uuid"
@@ -15,20 +15,20 @@ func JWTAuth() gin.HandlerFunc {
 	return func(c *gin.Context) {
 		// 我们这里jwt鉴权取头部信息 x-token 登录时回返回token信息 这里前端需要把token存储到cookie或者本地localSstorage中 不过需要跟后端协商过期时间 可以约定刷新令牌或者重新登录
 		token := c.Request.Header.Get("x-token")
-		ModelToken := sysModel.JwtBlacklist{
+		ModelToken := model.JwtBlacklist{
 			Jwt: token,
 		}
 		if token == "" {
-			servers.ReportFormat(c, false, "未登录或非法访问", gin.H{
+			response.Result(response.ERROR, gin.H{
 				"reload": true,
-			})
+			}, "未登录或非法访问", c)
 			c.Abort()
 			return
 		}
 		if ModelToken.IsBlacklist(token) {
-			servers.ReportFormat(c, false, "您的帐户异地登陆或令牌失效", gin.H{
+			response.Result(response.ERROR, gin.H{
 				"reload": true,
-			})
+			}, "您的帐户异地登陆或令牌失效", c)
 			c.Abort()
 			return
 		}
@@ -37,15 +37,15 @@ func JWTAuth() gin.HandlerFunc {
 		claims, err := j.ParseToken(token)
 		if err != nil {
 			if err == TokenExpired {
-				servers.ReportFormat(c, false, "授权已过期", gin.H{
+				response.Result(response.ERROR, gin.H{
 					"reload": true,
-				})
+				}, "授权已过期", c)
 				c.Abort()
 				return
 			}
-			servers.ReportFormat(c, false, err.Error(), gin.H{
+			response.Result(response.ERROR, gin.H{
 				"reload": true,
-			})
+			}, err.Error(), c)
 			c.Abort()
 			return
 		}
@@ -75,7 +75,7 @@ type CustomClaims struct {
 
 func NewJWT() *JWT {
 	return &JWT{
-		[]byte(config.GinVueAdminconfig.JWT.SigningKey),
+		[]byte(global.GVA_CONFIG.JWT.SigningKey),
 	}
 }
 

+ 0 - 0
QMPlusServer/middleware/loadtls.go → server/middleware/loadtls.go


+ 3 - 3
QMPlusServer/middleware/logger.go → server/middleware/logger.go

@@ -2,7 +2,7 @@ package middleware
 
 import (
 	"bytes"
-	"gin-vue-admin/init/initlog"
+	"gin-vue-admin/init"
 	"net/http/httputil"
 	"strings"
 	"time"
@@ -27,7 +27,7 @@ func Logger() gin.HandlerFunc {
 		// copy request content
 		req, _ := httputil.DumpRequest(c.Request, true)
 		if logFlag {
-			log.L.Debug(
+			init.L.Debug(
 				"Request:", method, clientIP, path, string(req))
 		}
 		// replace writer
@@ -44,7 +44,7 @@ func Logger() gin.HandlerFunc {
 		latency := end.Sub(start)
 		statusCode := c.Writer.Status()
 		if logFlag {
-			log.L.Debug(
+			init.L.Debug(
 				"Response:",
 				statusCode,
 				latency,

+ 9 - 9
QMPlusServer/model/dbModel/exa_breakpoint_continue.go → server/model/exa_breakpoint_continue.go

@@ -1,7 +1,7 @@
-package dbModel
+package model
 
 import (
-	"gin-vue-admin/init/qmsql"
+	"gin-vue-admin/global"
 	"github.com/jinzhu/gorm"
 )
 
@@ -30,7 +30,7 @@ func (f *ExaFile) FileCreateComplete(FileMd5 string, FileName string, FilePath s
 	upDateFile := make(map[string]interface{})
 	upDateFile["FilePath"] = FilePath
 	upDateFile["IsFinish"] = true
-	err := qmsql.DEFAULTDB.Where("file_md5 = ? AND file_name = ?", FileMd5, FileName).First(&file).Updates(upDateFile).Error
+	err := global.GVA_DB.Where("file_md5 = ? AND file_name = ?", FileMd5, FileName).First(&file).Updates(upDateFile).Error
 	return err
 }
 
@@ -40,14 +40,14 @@ func (f *ExaFile) FindOrCreateFile(FileMd5 string, FileName string, ChunkTotal i
 	cfile.FileMd5 = FileMd5
 	cfile.FileName = FileName
 	cfile.ChunkTotal = ChunkTotal
-	notHaveSameMd5Finish := qmsql.DEFAULTDB.Where("file_md5 = ? AND is_finish = ?", FileMd5, true).First(&file).RecordNotFound()
+	notHaveSameMd5Finish := global.GVA_DB.Where("file_md5 = ? AND is_finish = ?", FileMd5, true).First(&file).RecordNotFound()
 	if notHaveSameMd5Finish {
-		err = qmsql.DEFAULTDB.Where("file_md5 = ? AND file_name = ?", FileMd5, FileName).Preload("ExaFileChunk").FirstOrCreate(&file, cfile).Error
+		err = global.GVA_DB.Where("file_md5 = ? AND file_name = ?", FileMd5, FileName).Preload("ExaFileChunk").FirstOrCreate(&file, cfile).Error
 		return err, file
 	} else {
 		cfile.IsFinish = true
 		cfile.FilePath = file.FilePath
-		err = qmsql.DEFAULTDB.Create(&cfile).Error
+		err = global.GVA_DB.Create(&cfile).Error
 		return err, cfile
 	}
 }
@@ -58,7 +58,7 @@ func (f *ExaFile) CreateFileChunk(FileChunkPath string, FileChunkNumber int) err
 	chunk.FileChunkPath = FileChunkPath
 	chunk.ExaFileId = f.ID
 	chunk.FileChunkNumber = FileChunkNumber
-	err := qmsql.DEFAULTDB.Create(&chunk).Error
+	err := global.GVA_DB.Create(&chunk).Error
 	return err
 }
 
@@ -66,7 +66,7 @@ func (f *ExaFile) CreateFileChunk(FileChunkPath string, FileChunkNumber int) err
 func (f *ExaFile) DeleteFileChunk(fileMd5 string, fileName string, filePath string) error {
 	var chunks []ExaFileChunk
 	var file ExaFile
-	err := qmsql.DEFAULTDB.Where("file_md5 = ? AND file_name = ?", fileMd5, fileName).First(&file).Update("IsFinish", true).Update("file_path", filePath).Error
-	err = qmsql.DEFAULTDB.Where("exa_file_id = ?", file.ID).Delete(&chunks).Unscoped().Error
+	err := global.GVA_DB.Where("file_md5 = ? AND file_name = ?", fileMd5, fileName).First(&file).Update("IsFinish", true).Update("file_path", filePath).Error
+	err = global.GVA_DB.Where("exa_file_id = ?", file.ID).Delete(&chunks).Unscoped().Error
 	return err
 }

+ 66 - 0
server/model/exa_customer.go

@@ -0,0 +1,66 @@
+package model
+
+import (
+	"gin-vue-admin/global"
+	"github.com/jinzhu/gorm"
+)
+
+type ExaCustomer struct {
+	gorm.Model
+	CustomerName       string  `json:"customerName"`
+	CustomerPhoneData  string  `json:"customerPhoneData"`
+	SysUserID          uint    `json:"sysUserId"`
+	SysUserAuthorityID string  `json:"sysUserAuthorityID"`
+	SysUser            SysUser `json:"sysUser"`
+}
+
+//创建用户
+func (e *ExaCustomer) CreateExaCustomer() (err error) {
+	err = global.GVA_DB.Create(e).Error
+	return err
+}
+
+//删除用户
+func (e *ExaCustomer) DeleteExaCustomer() (err error) {
+	err = global.GVA_DB.Delete(e).Error
+	return err
+}
+
+//更新用户
+func (e *ExaCustomer) UpdateExaCustomer() (err error) {
+	err = global.GVA_DB.Save(e).Error
+	return err
+}
+
+//获取用户信息
+func (e *ExaCustomer) GetExaCustomer() (err error, customer ExaCustomer) {
+	err = global.GVA_DB.Where("id = ?", e.ID).First(&customer).Error
+	return
+}
+
+//获取用户列表
+// 分页获取数据
+func (e *ExaCustomer) GetInfoList(info PageInfo) (err error, list interface{}, total int) {
+	limit := info.PageSize
+	offset := info.PageSize * (info.Page - 1)
+	db := global.GVA_DB
+	if err != nil {
+		return
+	} else {
+		var a SysAuthority
+		a.AuthorityId = e.SysUserAuthorityID
+		err, auth := a.GetAuthorityInfo()
+		var dataId []string
+		for _, v := range auth.DataAuthorityId {
+			dataId = append(dataId, v.AuthorityId)
+		}
+		var CustomerList []ExaCustomer
+		err = db.Where("sys_user_authority_id in (?)", dataId).Find(&CustomerList).Count(&total).Error
+		if err != nil {
+			return err, CustomerList, total
+		} else {
+			err = db.Limit(limit).Offset(offset).Preload("SysUser").Where("sys_user_authority_id in (?)", dataId).Find(&CustomerList).Error
+		}
+		return err, CustomerList, total
+	}
+}

+ 44 - 0
server/model/exa_file_upload_download.go

@@ -0,0 +1,44 @@
+package model
+
+import (
+	"gin-vue-admin/global"
+	"github.com/jinzhu/gorm"
+)
+
+type ExaFileUploadAndDownload struct {
+	gorm.Model
+	Name string `json:"name"`
+	Url  string `json:"url"`
+	Tag  string `json:"tag"`
+	Key  string `json:"key"`
+}
+
+func (f *ExaFileUploadAndDownload) Upload() error {
+	err := global.GVA_DB.Create(f).Error
+	return err
+}
+
+func (f *ExaFileUploadAndDownload) DeleteFile() error {
+	err := global.GVA_DB.Where("id = ?", f.ID).Unscoped().Delete(f).Error
+	return err
+}
+
+func (f *ExaFileUploadAndDownload) FindFile() (error, ExaFileUploadAndDownload) {
+	var file ExaFileUploadAndDownload
+	err := global.GVA_DB.Where("id = ?", f.ID).First(&file).Error
+	return err, file
+}
+
+// 分页获取数据
+func (f *ExaFileUploadAndDownload) GetInfoList(info PageInfo) (err error, list interface{}, total int) {
+	limit := info.PageSize
+	offset := info.PageSize * (info.Page - 1)
+	db := global.GVA_DB
+	if err != nil {
+		return
+	} else {
+		var fileLists []ExaFileUploadAndDownload
+		err = db.Limit(limit).Offset(offset).Order("updated_at desc").Find(&fileLists).Error
+		return err, fileLists, total
+	}
+}

+ 22 - 23
QMPlusServer/model/sysModel/sys_api.go → server/model/sys_api.go

@@ -1,9 +1,7 @@
-package sysModel
+package model
 
 import (
-	"gin-vue-admin/controller/servers"
-	"gin-vue-admin/init/qmsql"
-	"gin-vue-admin/model/modelInterface"
+	"gin-vue-admin/global"
 	"github.com/jinzhu/gorm"
 	"github.com/pkg/errors"
 )
@@ -12,24 +10,24 @@ type SysApi struct {
 	gorm.Model
 	Path        string `json:"path"`
 	Description string `json:"description"`
-	Group       string `json:"group"`
+	ApiGroup    string `json:"apiGroup"`
 	Method      string `json:"method" gorm:"default:'POST'"`
 }
 
 //新增基础api
 func (a *SysApi) CreateApi() (err error) {
-	findOne := qmsql.DEFAULTDB.Where("path = ?", a.Path).Find(&SysMenu{}).Error
+	findOne := global.GVA_DB.Where("path = ?", a.Path).Find(&SysApi{}).Error
 	if findOne == nil {
 		return errors.New("存在相同api")
 	} else {
-		err = qmsql.DEFAULTDB.Create(a).Error
+		err = global.GVA_DB.Create(a).Error
 	}
 	return err
 }
 
 //删除基础api
 func (a *SysApi) DeleteApi() (err error) {
-	err = qmsql.DEFAULTDB.Delete(a).Error
+	err = global.GVA_DB.Delete(a).Error
 	new(CasbinModel).clearCasbin(1, a.Path)
 	return err
 }
@@ -37,11 +35,11 @@ func (a *SysApi) DeleteApi() (err error) {
 //更新api
 func (a *SysApi) UpdateApi() (err error) {
 	var oldA SysApi
-	flag := qmsql.DEFAULTDB.Where("path = ?", a.Path).RecordNotFound()
+	flag := global.GVA_DB.Where("path = ?", a.Path).Find(&SysApi{}).RecordNotFound()
 	if !flag {
 		return errors.New("存在相同api路径")
 	}
-	err = qmsql.DEFAULTDB.Where("id = ?", a.ID).First(&oldA).Error
+	err = global.GVA_DB.Where("id = ?", a.ID).First(&oldA).Error
 	if err != nil {
 		return err
 	} else {
@@ -49,7 +47,7 @@ func (a *SysApi) UpdateApi() (err error) {
 		if err != nil {
 			return err
 		} else {
-			err = qmsql.DEFAULTDB.Save(a).Error
+			err = global.GVA_DB.Save(a).Error
 		}
 	}
 	return err
@@ -57,44 +55,45 @@ func (a *SysApi) UpdateApi() (err error) {
 
 //获取选中角色所拥有的api
 func (a *SysApi) GetApiById(id float64) (err error, api SysApi) {
-	err = qmsql.DEFAULTDB.Where("id = ?", id).First(&api).Error
+	err = global.GVA_DB.Where("id = ?", id).First(&api).Error
 	return
 }
 
 // 获取所有api信息
 func (a *SysApi) GetAllApis() (err error, apis []SysApi) {
-	err = qmsql.DEFAULTDB.Find(&apis).Error
+	err = global.GVA_DB.Find(&apis).Error
 	return
 }
 
-// 分页获取数据  需要分页实现这个接口即可
-func (a *SysApi) GetInfoList(info modelInterface.PageInfo) (err error, list interface{}, total int) {
-	// 封装分页方法 调用即可 传入 当前的结构体和分页信息
-	err, db, total := servers.PagingServer(a, info)
+// 分页获取数据
+func (a *SysApi) GetInfoList(info PageInfo) (err error, list interface{}, total int) {
+	limit := info.PageSize
+	offset := info.PageSize * (info.Page - 1)
+	db := global.GVA_DB
+
 	if err != nil {
 		return
 	} else {
 		var apiList []SysApi
-		model := qmsql.DEFAULTDB.Model(info)
+
 		if a.Path != "" {
-			model = model.Where("path LIKE ?", "%"+a.Path+"%")
 			db = db.Where("path LIKE ?", "%"+a.Path+"%")
 		}
 
 		if a.Description != "" {
-			model = model.Where("description LIKE ?", "%"+a.Description+"%")
 			db = db.Where("description LIKE ?", "%"+a.Description+"%")
 		}
 
 		if a.Method != "" {
-			model = model.Where("method = ?", a.Method)
 			db = db.Where("method = ?", a.Method)
 		}
-		err = model.Find(&apiList).Count(&total).Error
+
+		err = db.Find(&apiList).Count(&total).Error
+
 		if err != nil {
 			return err, apiList, total
 		} else {
-			err = db.Order("group", true).Find(&apiList).Error
+			err = db.Limit(limit).Offset(offset).Order("api_group", true).Find(&apiList).Error
 		}
 		return err, apiList, total
 	}

+ 90 - 0
server/model/sys_authority.go

@@ -0,0 +1,90 @@
+package model
+
+import (
+	"gin-vue-admin/global"
+	"github.com/pkg/errors"
+	"time"
+)
+
+type SysAuthority struct {
+	CreatedAt       time.Time
+	UpdatedAt       time.Time
+	DeletedAt       *time.Time     `sql:"index"`
+	AuthorityId     string         `json:"authorityId" gorm:"not null;unique;primary_key"`
+	AuthorityName   string         `json:"authorityName"`
+	ParentId        string         `json:"parentId"`
+	DataAuthorityId []SysAuthority `json:"dataAuthorityId" gorm:"many2many:sys_data_authority_id;association_jointable_foreignkey:data_authority_id"`
+	Children        []SysAuthority `json:"children"`
+	SysBaseMenus    []SysBaseMenu  `json:"menus" gorm:"many2many:sys_authority_menus;"`
+}
+
+// 创建角色
+func (a *SysAuthority) CreateAuthority() (err error, authority *SysAuthority) {
+	err = global.GVA_DB.Create(a).Error
+	return err, a
+}
+
+// 删除角色
+func (a *SysAuthority) DeleteAuthority() (err error) {
+	err = global.GVA_DB.Where("authority_id = ?", a.AuthorityId).Find(&SysUser{}).Error
+	if err != nil {
+		err = global.GVA_DB.Where("parent_id = ?", a.AuthorityId).Find(&SysAuthority{}).Error
+		if err != nil {
+			err = global.GVA_DB.Where("authority_id = ?", a.AuthorityId).First(a).Unscoped().Delete(a).Error
+			new(CasbinModel).clearCasbin(0, a.AuthorityId)
+		} else {
+			err = errors.New("此角色存在子角色不允许删除")
+		}
+	} else {
+		err = errors.New("此角色有用户正在使用禁止删除")
+	}
+	return err
+}
+
+// 分页获取数据
+func (a *SysAuthority) GetInfoList(info PageInfo) (err error, list interface{}, total int) {
+	limit := info.PageSize
+	offset := info.PageSize * (info.Page - 1)
+	db := global.GVA_DB
+	if err != nil {
+		return
+	} else {
+		var authority []SysAuthority
+		err = db.Limit(limit).Offset(offset).Preload("DataAuthorityId").Where("parent_id = 0").Find(&authority).Error
+		if len(authority) > 0 {
+			for k, _ := range authority {
+				err = findChildrenAuthority(&authority[k])
+			}
+		}
+		return err, authority, total
+	}
+}
+
+func findChildrenAuthority(authority *SysAuthority) (err error) {
+	err = global.GVA_DB.Preload("DataAuthorityId").Where("parent_id = ?", authority.AuthorityId).Find(&authority.Children).Error
+	if len(authority.Children) > 0 {
+		for k, _ := range authority.Children {
+			err = findChildrenAuthority(&authority.Children[k])
+		}
+	}
+	return err
+}
+
+func (a *SysAuthority) SetDataAuthority() error {
+	var s SysAuthority
+	global.GVA_DB.Preload("DataAuthorityId").First(&s, "authority_id = ?", a.AuthorityId)
+	err := global.GVA_DB.Model(&s).Association("DataAuthorityId").Replace(&a.DataAuthorityId).Error
+	return err
+}
+
+func (a *SysAuthority) SetMuneAuthority() error {
+	var s SysAuthority
+	global.GVA_DB.Preload("SysBaseMenus").First(&s, "authority_id = ?", a.AuthorityId)
+	err := global.GVA_DB.Model(&s).Association("SysBaseMenus").Replace(&a.SysBaseMenus).Error
+	return err
+}
+
+func (a *SysAuthority) GetAuthorityInfo() (err error, sa SysAuthority) {
+	err = global.GVA_DB.Preload("DataAuthorityId").Where("authority_id = ?", a.AuthorityId).First(&sa).Error
+	return err, sa
+}

+ 11 - 12
QMPlusServer/model/sysModel/sys_menu_authority.go → server/model/sys_authority_menu.go

@@ -1,8 +1,8 @@
-package sysModel
+package model
 
 import (
 	"fmt"
-	"gin-vue-admin/init/qmsql"
+	"gin-vue-admin/global"
 )
 
 // menu需要构建的点有点多 这里关联关系表直接把所有数据拿过来 用代码实现关联  后期实现主外键模式
@@ -13,37 +13,36 @@ type SysMenu struct {
 	Children    []SysMenu `json:"children"`
 }
 
-type Meta struct {
-	Title string `json:"title"`
-	Icon  string `json:"icon"`
-}
-
 // 为角色增加menu树
 func (m *SysMenu) AddMenuAuthority(menus []SysBaseMenu, authorityId string) (err error) {
 	var menu SysMenu
-	qmsql.DEFAULTDB.Where("authority_id = ? ", authorityId).Unscoped().Delete(&SysMenu{})
+	global.GVA_DB.Where("authority_id = ? ", authorityId).Unscoped().Delete(&SysMenu{})
 	for _, v := range menus {
 		menu.SysBaseMenu = v
 		menu.AuthorityId = authorityId
 		menu.MenuId = fmt.Sprintf("%v", v.ID)
 		menu.ID = 0
-		err = qmsql.DEFAULTDB.Create(&menu).Error
+		err = global.GVA_DB.Create(&menu).Error
 		if err != nil {
 			return err
 		}
 	}
+	var auth SysAuthority
+	auth.AuthorityId = authorityId
+	auth.SysBaseMenus = menus
+	auth.SetMuneAuthority()
 	return nil
 }
 
 // 查看当前角色树
 func (m *SysMenu) GetMenuAuthority(authorityId string) (err error, menus []SysMenu) {
-	err = qmsql.DEFAULTDB.Where("authority_id = ?", authorityId).Find(&menus).Error
+	err = global.GVA_DB.Where("authority_id = ?", authorityId).Find(&menus).Error
 	return err, menus
 }
 
 //获取动态路由树
 func (m *SysMenu) GetMenuTree(authorityId string) (err error, menus []SysMenu) {
-	err = qmsql.DEFAULTDB.Where("authority_id = ? AND parent_id = ?", authorityId, 0).Order("sort", true).Find(&menus).Error
+	err = global.GVA_DB.Where("authority_id = ? AND parent_id = ?", authorityId, 0).Order("sort", true).Find(&menus).Error
 	for i := 0; i < len(menus); i++ {
 		err = getChildrenList(&menus[i])
 	}
@@ -51,7 +50,7 @@ func (m *SysMenu) GetMenuTree(authorityId string) (err error, menus []SysMenu) {
 }
 
 func getChildrenList(menu *SysMenu) (err error) {
-	err = qmsql.DEFAULTDB.Where("authority_id = ? AND parent_id = ?", menu.AuthorityId, menu.MenuId).Order("sort", true).Find(&menu.Children).Error
+	err = global.GVA_DB.Where("authority_id = ? AND parent_id = ?", menu.AuthorityId, menu.MenuId).Order("sort", true).Find(&menu.Children).Error
 	for i := 0; i < len(menu.Children); i++ {
 		err = getChildrenList(&menu.Children[i])
 	}

+ 5 - 5
QMPlusServer/model/autoCodeModel/autoCode.go → server/model/sys_auto_code.go

@@ -1,7 +1,7 @@
-package autoCodeModel
+package model
 
 import (
-	"gin-vue-admin/tools"
+	"gin-vue-admin/utils"
 	"html/template"
 	"os"
 )
@@ -22,7 +22,7 @@ type Field struct {
 }
 
 func (a *AutoCodeStruct) CreateTemp() (err error) {
-	basePath := "./tpl"
+	basePath := "./template"
 	modelTmpl, err := template.ParseFiles(basePath + "/te/model.go.tpl")
 	if err != nil {
 		return err
@@ -114,7 +114,7 @@ func (a *AutoCodeStruct) CreateTemp() (err error) {
 		_fe + a.PackageName + "/api/api.js",
 		_autoCode + "readme.txt",
 	}
-	err = tools.ZipFiles("./ginvueadmin.zip", fileList, ".", ".")
+	err = utils.ZipFiles("./ginvueadmin.zip", fileList, ".", ".")
 	if err != nil {
 		return err
 	}
@@ -128,7 +128,7 @@ func (a *AutoCodeStruct) CreateTemp() (err error) {
 //批量创建文件夹
 func createDir(dirs ...string) (err error) {
 	for _, v := range dirs {
-		exist, err := tools.PathExists(v)
+		exist, err := utils.PathExists(v)
 		if err != nil {
 			//log.L.Info(fmt.Sprintf("get dir error![%v]\n", err))
 			return err

+ 33 - 28
QMPlusServer/model/sysModel/sys_base_menu.go → server/model/sys_base_menu.go

@@ -1,34 +1,38 @@
-package sysModel
+package model
 
 import (
 	"fmt"
-	"gin-vue-admin/controller/servers"
-	"gin-vue-admin/init/qmsql"
-	"gin-vue-admin/model/modelInterface"
+	"gin-vue-admin/global"
 	"github.com/jinzhu/gorm"
 	"github.com/pkg/errors"
 )
 
 type SysBaseMenu struct {
 	gorm.Model
-	MenuLevel uint   `json:"-"`
-	ParentId  string `json:"parentId"`
-	Path      string `json:"path"`
-	Name      string `json:"name"`
-	Hidden    bool   `json:"hidden"`
-	Component string `json:"component"`
-	Sort      string `json:"sort"`
-	Meta      `json:"meta"`
-	NickName  string        `json:"nickName"`
-	Children  []SysBaseMenu `json:"children"`
+	MenuLevel     uint   `json:"-"`
+	ParentId      string `json:"parentId"`
+	Path          string `json:"path"`
+	Name          string `json:"name"`
+	Hidden        bool   `json:"hidden"`
+	Component     string `json:"component"`
+	Sort          string `json:"sort"`
+	Meta          `json:"meta"`
+	NickName      string         `json:"nickName"`
+	SysAuthoritys []SysAuthority `json:"authoritys" gorm:"many2many:sys_authority_menus;"`
+	Children      []SysBaseMenu  `json:"children"`
+}
+
+type Meta struct {
+	Title string `json:"title"`
+	Icon  string `json:"icon"`
 }
 
 //增加基础路由
 func (b *SysBaseMenu) AddBaseMenu() (err error) {
-	findOne := qmsql.DEFAULTDB.Where("name = ?", b.Name).Find(&SysBaseMenu{}).Error
+	findOne := global.GVA_DB.Where("name = ?", b.Name).Find(&SysBaseMenu{}).Error
 	if findOne != nil {
 		b.NickName = b.Title
-		err = qmsql.DEFAULTDB.Create(b).Error
+		err = global.GVA_DB.Create(b).Error
 	} else {
 		err = errors.New("存在重复name,请修改name")
 	}
@@ -37,10 +41,10 @@ func (b *SysBaseMenu) AddBaseMenu() (err error) {
 
 //删除基础路由
 func (b *SysBaseMenu) DeleteBaseMenu(id float64) (err error) {
-	err = qmsql.DEFAULTDB.Where("parent_id = ?", id).First(&SysBaseMenu{}).Error
+	err = global.GVA_DB.Where("parent_id = ?", id).First(&SysBaseMenu{}).Error
 	if err != nil {
-		err = qmsql.DEFAULTDB.Where("id = ?", id).Delete(&b).Error
-		err = qmsql.DEFAULTDB.Where("menu_id = ?", id).Unscoped().Delete(&SysMenu{}).Error
+		err = global.GVA_DB.Where("id = ?", id).Delete(&b).Error
+		err = global.GVA_DB.Where("menu_id = ?", id).Unscoped().Delete(&SysMenu{}).Error
 	} else {
 		return errors.New("此菜单存在子菜单不可删除")
 	}
@@ -59,27 +63,28 @@ func (b *SysBaseMenu) UpdateBaseMenu() (err error) {
 	upDateMap["icon"] = b.Icon
 	upDateMap["sort"] = b.Sort
 	upDateMap["nick_name"] = b.Title
-	err = qmsql.DEFAULTDB.Where("id = ?", b.ID).Find(&SysBaseMenu{}).Updates(upDateMap).Error
-	err1 := qmsql.DEFAULTDB.Where("menu_id = ?", b.ID).Find(&[]SysMenu{}).Updates(upDateMap).Error
+	err = global.GVA_DB.Where("id = ?", b.ID).Find(&SysBaseMenu{}).Updates(upDateMap).Error
+	err1 := global.GVA_DB.Where("menu_id = ?", b.ID).Find(&[]SysMenu{}).Updates(upDateMap).Error
 	fmt.Printf("菜单修改时候,关联菜单err1:%v,err:%v", err1, err)
 	return err
 }
 
 //当前选中角色所拥有的路由
 func (b *SysBaseMenu) GetBaseMenuById(id float64) (err error, menu SysBaseMenu) {
-	err = qmsql.DEFAULTDB.Where("id = ?", id).First(&menu).Error
+	err = global.GVA_DB.Where("id = ?", id).First(&menu).Error
 	return
 }
 
 //获取路由分页
-func (b *SysBaseMenu) GetInfoList(info modelInterface.PageInfo) (err error, list interface{}, total int) {
-	// 封装分页方法 调用即可 传入 当前的结构体和分页信息
-	err, db, total := servers.PagingServer(b, info)
+func (b *SysBaseMenu) GetInfoList(info PageInfo) (err error, list interface{}, total int) {
+	limit := info.PageSize
+	offset := info.PageSize * (info.Page - 1)
+	db := global.GVA_DB
 	if err != nil {
 		return
 	} else {
 		var menuList []SysBaseMenu
-		err = db.Where("parent_id = 0").Order("sort", true).Find(&menuList).Error
+		err = db.Limit(limit).Offset(offset).Where("parent_id = 0").Order("sort", true).Find(&menuList).Error
 		for i := 0; i < len(menuList); i++ {
 			err = getBaseChildrenList(&menuList[i])
 		}
@@ -89,7 +94,7 @@ func (b *SysBaseMenu) GetInfoList(info modelInterface.PageInfo) (err error, list
 
 //获取基础路由树
 func (m *SysBaseMenu) GetBaseMenuTree() (err error, menus []SysBaseMenu) {
-	err = qmsql.DEFAULTDB.Where(" parent_id = ?", 0).Order("sort", true).Find(&menus).Error
+	err = global.GVA_DB.Where(" parent_id = ?", 0).Order("sort", true).Find(&menus).Error
 	for i := 0; i < len(menus); i++ {
 		err = getBaseChildrenList(&menus[i])
 	}
@@ -97,7 +102,7 @@ func (m *SysBaseMenu) GetBaseMenuTree() (err error, menus []SysBaseMenu) {
 }
 
 func getBaseChildrenList(menu *SysBaseMenu) (err error) {
-	err = qmsql.DEFAULTDB.Where("parent_id = ?", menu.ID).Order("sort", true).Find(&menu.Children).Error
+	err = global.GVA_DB.Where("parent_id = ?", menu.ID).Order("sort", true).Find(&menu.Children).Error
 	for i := 0; i < len(menu.Children); i++ {
 		err = getBaseChildrenList(&menu.Children[i])
 	}

+ 5 - 6
QMPlusServer/model/sysModel/sys_casbin.go → server/model/sys_casbin.go

@@ -1,9 +1,8 @@
-package sysModel
+package model
 
 import (
 	"errors"
-	"gin-vue-admin/config"
-	"gin-vue-admin/init/qmsql"
+	"gin-vue-admin/global"
 	"github.com/casbin/casbin"
 	"github.com/casbin/casbin/util"
 	gormadapter "github.com/casbin/gorm-adapter"
@@ -52,7 +51,7 @@ func (c *CasbinModel) CasbinPUpdate(AuthorityId string, casbinInfos []CasbinInfo
 // API更新随动
 func (c *CasbinModel) CasbinApiUpdate(oldPath string, newPath string) error {
 	var cs []CasbinModel
-	err := qmsql.DEFAULTDB.Table("casbin_rule").Where("v1 = ?", oldPath).Find(&cs).Update("v1", newPath).Error
+	err := global.GVA_DB.Table("casbin_rule").Where("v1 = ?", oldPath).Find(&cs).Update("v1", newPath).Error
 	return err
 }
 
@@ -97,8 +96,8 @@ func ParamsMatchFunc(args ...interface{}) (interface{}, error) {
 
 //持久化到数据库  引入自定义规则
 func Casbin() *casbin.Enforcer {
-	a := gormadapter.NewAdapterByDB(qmsql.DEFAULTDB)
-	e := casbin.NewEnforcer(config.GinVueAdminconfig.CasbinConfig.ModelPath, a)
+	a := gormadapter.NewAdapterByDB(global.GVA_DB)
+	e := casbin.NewEnforcer(global.GVA_CONFIG.CasbinConfig.ModelPath, a)
 	e.AddFunction("ParamsMatch", ParamsMatchFunc)
 	e.LoadPolicy()
 	return e

+ 6 - 7
QMPlusServer/model/sysModel/sys_jwt_blacklist.go → server/model/sys_jwt_blacklist.go

@@ -1,8 +1,7 @@
-package sysModel
+package model
 
 import (
-	"gin-vue-admin/init/initRedis"
-	"gin-vue-admin/init/qmsql"
+	"gin-vue-admin/global"
 	"github.com/jinzhu/gorm"
 )
 
@@ -12,24 +11,24 @@ type JwtBlacklist struct {
 }
 
 func (j *JwtBlacklist) JsonInBlacklist() (err error) {
-	err = qmsql.DEFAULTDB.Create(j).Error
+	err = global.GVA_DB.Create(j).Error
 	return
 }
 
 //判断JWT是否在黑名单内部
 func (j *JwtBlacklist) IsBlacklist(Jwt string) bool {
-	isNotFound := qmsql.DEFAULTDB.Where("jwt = ?", Jwt).First(j).RecordNotFound()
+	isNotFound := global.GVA_DB.Where("jwt = ?", Jwt).First(j).RecordNotFound()
 	return !isNotFound
 }
 
 //判断当前用户是否在线
 func (j *JwtBlacklist) GetRedisJWT(userName string) (err error, RedisJWT string) {
-	RedisJWT, err = initRedis.DEFAULTREDIS.Get(userName).Result()
+	RedisJWT, err = global.GVA_REDIS.Get(userName).Result()
 	return err, RedisJWT
 }
 
 //设置当前用户在线
 func (j *JwtBlacklist) SetRedisJWT(userName string) (err error) {
-	err = initRedis.DEFAULTREDIS.Set(userName, j.Jwt, 1000*1000*1000*60*60*24*7).Err()
+	err = global.GVA_REDIS.Set(userName, j.Jwt, 1000*1000*1000*60*60*24*7).Err()
 	return err
 }

+ 27 - 0
server/model/sys_system.go

@@ -0,0 +1,27 @@
+package model
+
+import (
+	"gin-vue-admin/global"
+	"gin-vue-admin/init"
+	"gin-vue-admin/utils"
+)
+
+//配置文件结构体
+type System struct {
+	Config init.Config
+}
+
+//读取配置文件
+func (s *System) GetSystemConfig() (err error, conf init.Config) {
+	return nil, global.GVA_CONFIG
+}
+
+//设置配置文件
+func (s *System) SetSystemConfig() (err error) {
+	confs := utils.StructToMap(s.Config)
+	for k, v := range confs {
+		global.GVA_VP.Set(k, v)
+	}
+	err = global.GVA_VP.WriteConfig()
+	return err
+}

+ 19 - 20
QMPlusServer/model/sysModel/sys_user.go → server/model/sys_user.go

@@ -1,10 +1,8 @@
-package sysModel
+package model
 
 import (
-	"gin-vue-admin/controller/servers"
-	"gin-vue-admin/init/qmsql"
-	"gin-vue-admin/model/modelInterface"
-	"gin-vue-admin/tools"
+	"gin-vue-admin/global"
+	"gin-vue-admin/utils"
 	"github.com/jinzhu/gorm"
 	"github.com/pkg/errors"
 	uuid "github.com/satori/go.uuid"
@@ -29,15 +27,15 @@ type SysUser struct {
 func (u *SysUser) Register() (err error, userInter *SysUser) {
 	var user SysUser
 	//判断用户名是否注册
-	notResigt := qmsql.DEFAULTDB.Where("username = ?", u.Username).First(&user).RecordNotFound()
+	notResigt := global.GVA_DB.Where("username = ?", u.Username).First(&user).RecordNotFound()
 	//notResigt为false表明读取到了 不能注册
 	if !notResigt {
 		return errors.New("用户名已注册"), nil
 	} else {
 		// 否则 附加uuid 密码md5简单加密 注册
-		u.Password = tools.MD5V([]byte(u.Password))
+		u.Password = utils.MD5V([]byte(u.Password))
 		u.UUID = uuid.NewV4()
-		err = qmsql.DEFAULTDB.Create(u).Error
+		err = global.GVA_DB.Create(u).Error
 	}
 	return err, u
 }
@@ -46,45 +44,46 @@ func (u *SysUser) Register() (err error, userInter *SysUser) {
 func (u *SysUser) ChangePassword(newPassword string) (err error, userInter *SysUser) {
 	var user SysUser
 	//后期修改jwt+password模式
-	u.Password = tools.MD5V([]byte(u.Password))
-	err = qmsql.DEFAULTDB.Where("username = ? AND password = ?", u.Username, u.Password).First(&user).Update("password", tools.MD5V([]byte(newPassword))).Error
+	u.Password = utils.MD5V([]byte(u.Password))
+	err = global.GVA_DB.Where("username = ? AND password = ?", u.Username, u.Password).First(&user).Update("password", utils.MD5V([]byte(newPassword))).Error
 	return err, u
 }
 
 //用户更新接口
 func (u *SysUser) SetUserAuthority(uuid uuid.UUID, AuthorityId string) (err error) {
-	err = qmsql.DEFAULTDB.Where("uuid = ?", uuid).First(&SysUser{}).Update("authority_id", AuthorityId).Error
+	err = global.GVA_DB.Where("uuid = ?", uuid).First(&SysUser{}).Update("authority_id", AuthorityId).Error
 	return err
 }
 
 //用户登录
 func (u *SysUser) Login() (err error, userInter *SysUser) {
 	var user SysUser
-	u.Password = tools.MD5V([]byte(u.Password))
-	err = qmsql.DEFAULTDB.Where("username = ? AND password = ?", u.Username, u.Password).First(&user).Error
+	u.Password = utils.MD5V([]byte(u.Password))
+	err = global.GVA_DB.Where("username = ? AND password = ?", u.Username, u.Password).First(&user).Error
 	if err != nil {
 		return err, &user
 	}
-	err = qmsql.DEFAULTDB.Where("authority_id = ?", user.AuthorityId).First(&user.Authority).Error
+	err = global.GVA_DB.Where("authority_id = ?", user.AuthorityId).First(&user.Authority).Error
 	return err, &user
 }
 
 // 用户头像上传更新地址
 func (u *SysUser) UploadHeaderImg(uuid uuid.UUID, filePath string) (err error, userInter *SysUser) {
 	var user SysUser
-	err = qmsql.DEFAULTDB.Where("uuid = ?", uuid).First(&user).Update("header_img", filePath).First(&user).Error
+	err = global.GVA_DB.Where("uuid = ?", uuid).First(&user).Update("header_img", filePath).First(&user).Error
 	return err, &user
 }
 
-// 分页获取数据  需要分页实现这个接口即可
-func (u *SysUser) GetInfoList(info modelInterface.PageInfo) (err error, list interface{}, total int) {
-	// 封装分页方法 调用即可 传入 当前的结构体和分页信息
-	err, db, total := servers.PagingServer(u, info)
+// 分页获取数据
+func (u *SysUser) GetInfoList(info PageInfo) (err error, list interface{}, total int) {
+	limit := info.PageSize
+	offset := info.PageSize * (info.Page - 1)
+	db := global.GVA_DB
 	if err != nil {
 		return
 	} else {
 		var userList []SysUser
-		err = db.Preload("Authority").Find(&userList).Error
+		err = db.Limit(limit).Offset(offset).Preload("Authority").Find(&userList).Error
 		return err, userList, total
 	}
 }

+ 3 - 3
QMPlusServer/model/sysModel/sys_worfFlow.go → server/model/sys_workflow.go

@@ -1,7 +1,7 @@
-package sysModel
+package model
 
 import (
-	"gin-vue-admin/init/qmsql"
+	"gin-vue-admin/global"
 	"github.com/jinzhu/gorm"
 )
 
@@ -27,6 +27,6 @@ type SysWorkflowStepInfo struct {
 
 //创建工作流
 func (wk *SysWorkflow) Create() error {
-	err := qmsql.DEFAULTDB.Create(&wk).Error
+	err := global.GVA_DB.Create(&wk).Error
 	return err
 }

+ 1 - 1
QMPlusServer/model/sysModel/sys_workFlowProcess.go → server/model/sys_workflow_process.go

@@ -1,4 +1,4 @@
-package sysModel
+package model
 
 import "github.com/jinzhu/gorm"
 

+ 0 - 0
QMPlusServer/static/form-generator/css/index.d8b172cd.css → server/resource/page/css/index.d8b172cd.css


+ 0 - 0
QMPlusServer/static/form-generator/favicon.ico → server/resource/page/favicon.ico


+ 0 - 0
QMPlusServer/static/form-generator/img/logo.e1bc3747.png → server/resource/page/img/logo.e1bc3747.png


+ 0 - 0
QMPlusServer/static/form-generator/index.html → server/resource/page/index.html


+ 0 - 0
QMPlusServer/static/form-generator/js/chunk-vendors.788511b0.js → server/resource/page/js/chunk-vendors.788511b0.js


+ 0 - 0
QMPlusServer/static/form-generator/js/index.b3720c41.js → server/resource/page/js/index.b3720c41.js


+ 0 - 0
QMPlusServer/static/form-generator/js/preview.7fecf17e.js → server/resource/page/js/preview.7fecf17e.js


+ 0 - 0
QMPlusServer/static/form-generator/preview.html → server/resource/page/preview.html


+ 1 - 1
QMPlusServer/static/rbacmodel/rbac_model.conf → server/resource/rbac_model.conf

@@ -11,4 +11,4 @@ g = _, _
 e = some(where (p.eft == allow))
 
 [matchers]
-m = r.sub == p.sub && ParamsMatch(r.obj, p.obj) && r.act == p.act
+m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

+ 1 - 1
QMPlusServer/tpl/fe/api.js.tpl → server/resource/template/fe/api.js.tpl

@@ -72,7 +72,7 @@ export const create{{.StructName}} = (data) => {
 // @Security ApiKeyAuth
 // @accept application/json
 // @Produce application/json
-// @Param data body modelInterface.PageInfo true "分页获取{{.StructName}}列表"
+// @Param data body model.PageInfo true "分页获取{{.StructName}}列表"
 // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
 // @Router /{{.Abbreviation}}/get{{.StructName}}List [post]
  export const get{{.StructName}}List = (data) => {

+ 0 - 0
QMPlusServer/tpl/readme.txt.tpl → server/resource/template/readme.txt.tpl


Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików