提交 91659efa 编写于 作者: Mr.奇淼('s avatar Mr.奇淼(

gin-vue-admin 2.0代码重构

上级 f1b3a37d
.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/
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" ]
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
}
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,
})
}
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
}
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")
}
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
}
}
\ No newline at end of file
package modelInterface
// 因为我也不确定项目要不要多人维护 所以定义了CURD接口 作为接口参考
// 由于很多接口使用Restful模式 暂时不用泛型 有需要可以iss提供示例
type PageInfo struct {
Page int
PageSize int
}
//分页接口
type Paging interface {
GetInfoList(PageInfo) (err error, list interface{}, total int)
}
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) // 查询当前文件成功的切片
}
}
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
}
.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?

<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¥ |
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)
}
}
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)
}
}
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)
}
}
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)
}
}
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)
}
}
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)对下载的文件重命名
......
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)
}
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)
}
}
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 {
......
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)
}
}
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)
}
}
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)
}
}
{
"casbinconfig": {
"modelPath": "./static/rbacmodel/rbac_model.conf"
"modelPath": "./resource/rbac_model.conf"
},
"jwt": {
"signingKey": "qmPlus"
......
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())
}
......@@ -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": {
......
......@@ -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": {
......
......@@ -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
......
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
)
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,
})
}
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
}
package log
package init
// Custom Logger
type Logger interface {
......
package qmsql
package init
import (
"gin-vue-admin/config"
"gin-vue-admin/init/initlog"
"gin-vue-admin/global"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
var DEFAULTDB *gorm.DB
//初始化数据库并产生数据库全局变量
func InitMysql(admin config.MysqlAdmin) *gorm.DB {
func RegisterMysql(admin MysqlAdmin) {
if db, err := gorm.Open("mysql", admin.Username+":"+admin.Password+"@("+admin.Path+")/"+admin.Dbname+"?"+admin.Config); err != nil {
log.L.Error("DEFAULTDB数据库启动异常",err)
L.Error("DEFAULTDB数据库启动异常", err)
} else {
DEFAULTDB = db
DEFAULTDB.DB().SetMaxIdleConns(admin.MaxIdleConns)
DEFAULTDB.DB().SetMaxOpenConns(admin.MaxOpenConns)
DEFAULTDB.LogMode(admin.LogMode)
global.GVA_DB = db
global.GVA_DB.DB().SetMaxIdleConns(admin.MaxIdleConns)
global.GVA_DB.DB().SetMaxOpenConns(admin.MaxOpenConns)
global.GVA_DB.LogMode(admin.LogMode)
}
return DEFAULTDB
}
......@@ -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)
}
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
}
}
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")
}
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
}
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"
"gin-vue-admin/core"
"gin-vue-admin/global"
"gin-vue-admin/init"
"gin-vue-admin/init/qmlog"
"os"
//"runtime"
)
......@@ -31,33 +28,14 @@ func main() {
}
// 可以通过环境变量来覆盖配置值
// 未设定有效的环境变量时,使用配置值
mysqlConfig := config.GinVueAdminconfig.MysqlAdmin
if mysqlHost != "" && mysqlPort != "" {
mysqlConfig.Path = mysqlHost + ":" + mysqlPort
}
mysqlConfig := init.GinVueAdminconfig.MysqlAdmin
// 链接初始化数据库
db := qmsql.InitMysql(mysqlConfig) // 链接初始化数据库
if config.GinVueAdminconfig.System.UseMultipoint {
// 初始化redis服务
_ = initRedis.InitRedis()
}
init.RegisterMysql(mysqlConfig) // 链接初始化数据库
// 注册数据库表
registerTable.RegisterTable(db)
init.RegisterTable(global.GVA_DB)
// 程序结束前关闭数据库链接
defer qmsql.DEFAULTDB.Close()
// 注册路由
Router := initRouter.InitRouter()
defer global.GVA_DB.Close()
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)
//}
core.RunWindowsServer()
}
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
}
......
......@@ -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),
}
}
......
......@@ -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,
......
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
}
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
}
}
package dbModel
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"
)
......@@ -16,30 +14,31 @@ type ExaFileUploadAndDownload struct {
}
func (f *ExaFileUploadAndDownload) Upload() error {
err := qmsql.DEFAULTDB.Create(f).Error
err := global.GVA_DB.Create(f).Error
return err
}
func (f *ExaFileUploadAndDownload) DeleteFile() error {
err := qmsql.DEFAULTDB.Where("id = ?", f.ID).Unscoped().Delete(f).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 := qmsql.DEFAULTDB.Where("id = ?", f.ID).First(&file).Error
err := global.GVA_DB.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)
// 分页获取数据
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.Order("updated_at desc").Find(&fileLists).Error
err = db.Limit(limit).Offset(offset).Order("updated_at desc").Find(&fileLists).Error
return err, fileLists, total
}
}
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
}
......
package sysModel
package model
import (
"gin-vue-admin/controller/servers"
"gin-vue-admin/init/qmsql"
"gin-vue-admin/model/modelInterface"
"github.com/jinzhu/gorm"
"gin-vue-admin/global"
"github.com/pkg/errors"
"time"
)
type SysAuthority struct {
gorm.Model
AuthorityId string `json:"authorityId" gorm:"not null;unique"`
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_id"`
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 = qmsql.DEFAULTDB.Create(a).Error
err = global.GVA_DB.Create(a).Error
return err, a
}
// 删除角色
func (a *SysAuthority) DeleteAuthority() (err error) {
err = qmsql.DEFAULTDB.Where("authority_id = ?", a.AuthorityId).Find(&SysUser{}).Error
err = global.GVA_DB.Where("authority_id = ?", a.AuthorityId).Find(&SysUser{}).Error
if err != nil {
err = qmsql.DEFAULTDB.Where("parent_id = ?", a.AuthorityId).Find(&SysAuthority{}).Error
err = global.GVA_DB.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
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("此角色存在子角色不允许删除")
......@@ -40,15 +41,16 @@ func (a *SysAuthority) DeleteAuthority() (err error) {
return err
}
// 分页获取数据 需要分页实现这个接口即可
func (a *SysAuthority) GetInfoList(info modelInterface.PageInfo) (err error, list interface{}, total int) {
// 封装分页方法 调用即可 传入 当前的结构体和分页信息
err, db, total := servers.PagingServer(a, info)
// 分页获取数据
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.Preload("DataAuthorityId").Where("parent_id = 0").Find(&authority).Error
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])
......@@ -59,7 +61,7 @@ func (a *SysAuthority) GetInfoList(info modelInterface.PageInfo) (err error, lis
}
func findChildrenAuthority(authority *SysAuthority) (err error) {
err = qmsql.DEFAULTDB.Preload("DataAuthorityId").Where("parent_id = ?", authority.AuthorityId).Find(&authority.Children).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])
......@@ -70,12 +72,19 @@ func findChildrenAuthority(authority *SysAuthority) (err error) {
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
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 = qmsql.DEFAULTDB.Preload("DataAuthorityId").Where("authority_id = ?", a.AuthorityId).First(&sa).Error
err = global.GVA_DB.Preload("DataAuthorityId").Where("authority_id = ?", a.AuthorityId).First(&sa).Error
return err, sa
}
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])
}
......
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
......
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])
}
......
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
......
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
}
package sysModel
package model
import (
"gin-vue-admin/config"
"gin-vue-admin/tools"
"gin-vue-admin/global"
"gin-vue-admin/init"
"gin-vue-admin/utils"
)
//配置文件结构体
type System struct {
Config config.Config
Config init.Config
}
//读取配置文件
func (s *System) GetSystemConfig() (err error, conf config.Config) {
return nil, config.GinVueAdminconfig
func (s *System) GetSystemConfig() (err error, conf init.Config) {
return nil, global.GVA_CONFIG
}
//设置配置文件
func (s *System) SetSystemConfig() (err error) {
confs := tools.StructToMap(s.Config)
confs := utils.StructToMap(s.Config)
for k, v := range confs {
config.VTool.Set(k, v)
global.GVA_VP.Set(k, v)
}
err = config.VTool.WriteConfig()
err = global.GVA_VP.WriteConfig()
return err
}
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
}
}
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
}
......@@ -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
......@@ -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) => {
......
......@@ -2,8 +2,6 @@ package api
import (
"fmt"
"gin-vue-admin/controller/servers"
"gin-vue-admin/model/modelInterface"
// 请自行引入model路径
"github.com/gin-gonic/gin"
)
......@@ -98,11 +96,11 @@ func Find{{.StructName}}(c *gin.Context) {
// @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]
func Get{{.StructName}}List(c *gin.Context) {
var pageInfo modelInterface.PageInfo
var pageInfo model.PageInfo
_ = c.ShouldBindJSON(&pageInfo)
err, list, total := new({{.PackageName}}.{{.StructName}}).GetInfoList(pageInfo)
if err != nil {
......
......@@ -2,9 +2,7 @@
package {{.PackageName}}
import (
"gin-vue-admin/controller/servers"
"gin-vue-admin/init/qmsql"
"gin-vue-admin/model/modelInterface"
"github.com/jinzhu/gorm"
)
......@@ -38,14 +36,15 @@ func ({{.Abbreviation}} *{{.StructName}})FindById()(err error,re{{.Abbreviation}
}
// 分页获取{{.StructName}}
func ({{.Abbreviation}} *{{.StructName}})GetInfoList(info modelInterface.PageInfo)(err error, list interface{}, total int){
// 封装分页方法 调用即可 传入 当前的结构体和分页信息
err, db, total := servers.PagingServer({{.Abbreviation}}, info)
func ({{.Abbreviation}} *{{.StructName}})GetInfoList(info PageInfo)(err error, list interface{}, total int){
limit := info.PageSize
offset := info.PageSize * (info.Page - 1)
db:=qmsql.DEFAULTDB
if err != nil {
return
} else {
var re{{.StructName}}List []{{.StructName}}
err = db.Find(&re{{.StructName}}List).Error
err = db.Limit(limit).Offset(offset).Find(&re{{.StructName}}List).Error
return err, re{{.StructName}}List, total
}
}
\ No newline at end of file
package router
import (
"gin-vue-admin/controller/api"
"gin-vue-admin/api/v1"
"gin-vue-admin/middleware"
"github.com/gin-gonic/gin"
)
......@@ -9,10 +9,10 @@ import (
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) // 获取客户列表
ApiRouter.POST("createExaCustomer", v1.CreateExaCustomer) // 创建客户
ApiRouter.POST("updateExaCustomer", v1.UpdateExaCustomer) // 更新客户
ApiRouter.POST("deleteExaCustomer", v1.DeleteExaCustomer) // 删除客户
ApiRouter.POST("getExaCustomer", v1.GetExaCustomer) // 获取单一客户信息
ApiRouter.POST("getExaCustomerList", v1.GetExaCustomerList) // 获取客户列表
}
}
package router
import (
"gin-vue-admin/api/v1"
"github.com/gin-gonic/gin"
)
func InitFileUploadAndDownloadRouter(Router *gin.RouterGroup) {
FileUploadAndDownloadGroup := Router.Group("fileUploadAndDownload")
//.Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())
{
FileUploadAndDownloadGroup.POST("/upload", v1.UploadFile) // 上传文件
FileUploadAndDownloadGroup.POST("/getFileList", v1.GetFileList) // 获取上传文件列表
FileUploadAndDownloadGroup.POST("/deleteFile", v1.DeleteFile) // 删除指定文件
FileUploadAndDownloadGroup.POST("/breakpointContinue", v1.BreakpointContinue) // 断点续传
FileUploadAndDownloadGroup.GET("/findFile", v1.FindFile) // 查询当前文件成功的切片
FileUploadAndDownloadGroup.POST("/breakpointContinueFinish", v1.BreakpointContinueFinish) // 查询当前文件成功的切片
FileUploadAndDownloadGroup.POST("/removeChunk", v1.RemoveChunk) // 查询当前文件成功的切片
}
}
package router
import (
"gin-vue-admin/controller/api"
"gin-vue-admin/api/v1"
"gin-vue-admin/middleware"
"github.com/gin-gonic/gin"
)
......@@ -9,11 +9,11 @@ import (
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
ApiRouter.POST("createApi", v1.CreateApi) //创建Api
ApiRouter.POST("deleteApi", v1.DeleteApi) //删除Api
ApiRouter.POST("getApiList", v1.GetApiList) //获取Api列表
ApiRouter.POST("getApiById", v1.GetApiById) //获取单条Api消息
ApiRouter.POST("updateApi", v1.UpdateApi) //更新api
ApiRouter.POST("getAllApis", v1.GetAllApis) // 获取所有api
}
}
package router
import (
"gin-vue-admin/controller/api"
"gin-vue-admin/api/v1"
"gin-vue-admin/middleware"
"github.com/gin-gonic/gin"
)
......@@ -9,9 +9,9 @@ import (
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) //设置角色资源权限
AuthorityRouter.POST("createAuthority", v1.CreateAuthority) //创建角色
AuthorityRouter.POST("deleteAuthority", v1.DeleteAuthority) //删除角色
AuthorityRouter.POST("getAuthorityList", v1.GetAuthorityList) //获取角色列表
AuthorityRouter.POST("setDataAuthority", v1.SetDataAuthority) //设置角色资源权限
}
}
package router
import (
"gin-vue-admin/controller/api"
"gin-vue-admin/api/v1"
"gin-vue-admin/middleware"
"github.com/gin-gonic/gin"
)
......@@ -9,6 +9,6 @@ import (
func InitAutoCodeRouter(Router *gin.RouterGroup) {
AutoCodeRouter := Router.Group("autoCode").Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())
{
AutoCodeRouter.POST("createTemp", api.CreateTemp) //创建自动化代码
AutoCodeRouter.POST("createTemp", v1.CreateTemp) //创建自动化代码
}
}
package router
import (
"gin-vue-admin/controller/api"
"gin-vue-admin/api/v1"
"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)
BaseRouter.POST("register", v1.Register)
BaseRouter.POST("login", v1.Login)
BaseRouter.POST("captcha", v1.Captcha)
BaseRouter.GET("captcha/:captchaId", v1.CaptchaImg)
}
return BaseRouter
}
package router
import (
"gin-vue-admin/controller/api"
"gin-vue-admin/api/v1"
"gin-vue-admin/middleware"
"github.com/gin-gonic/gin"
)
......@@ -9,8 +9,8 @@ import (
func InitCasbinRouter(Router *gin.RouterGroup) {
CasbinRouter := Router.Group("casbin").Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())
{
CasbinRouter.POST("casbinPUpdate", api.CasbinPUpdate)
CasbinRouter.POST("getPolicyPathByAuthorityId", api.GetPolicyPathByAuthorityId)
CasbinRouter.GET("casbinTest/:pathParam", api.CasbinTest)
CasbinRouter.POST("casbinPUpdate", v1.CasbinPUpdate)
CasbinRouter.POST("getPolicyPathByAuthorityId", v1.GetPolicyPathByAuthorityId)
CasbinRouter.GET("casbinTest/:pathParam", v1.CasbinTest)
}
}
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册