diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 00000000..2e08b34c --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,51 @@ +name: "CodeQL" + +on: + push: + branches: [ master ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ master ] + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + language: [ 'go' ] + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v1 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 diff --git a/.github/workflows/dev-lwx.yml b/.github/workflows/dev-lwx.yml new file mode 100644 index 00000000..b62a4c6b --- /dev/null +++ b/.github/workflows/dev-lwx.yml @@ -0,0 +1,60 @@ +name: build + +on: + push: + branches: [ dev-lwx ] + pull_request: + branches: [ dev-lwx ] + +jobs: + build: + name: Build + runs-on: ubuntu-latest + steps: + - name: Set up Go 1.15 + uses: actions/setup-go@v1 + with: + go-version: 1.15 + id: go + + - name: Check out code into the Go module directory + uses: actions/checkout@v2 + - name: Get dependencies + run: | + go get -v -t -d ./... + if [ -f Gopkg.toml ]; then + curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh + dep ensure + fi + - name: Build + run: | + CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -a -installsuffix cgo -o go-admin . + mv go-admin ./scripts + + - uses: Azure/docker-login@v1 + with: + login-server: registry.cn-shanghai.aliyuncs.com + username: ${{ secrets.REGISTRY_USERNAME }} + password: ${{ secrets.REGISTRY_PASSWORD }} + - run: | + docker build ./scripts -t registry.cn-shanghai.aliyuncs.com/go-admin-team/go-admin:${{ github.sha }} + docker push registry.cn-shanghai.aliyuncs.com/go-admin-team/go-admin:${{ github.sha }} + - uses: Azure/k8s-set-context@v1 + with: + kubeconfig: ${{ secrets.KUBE_CONFIG }} + + - uses: Azure/k8s-create-secret@v1 + with: + namespace: 'go-admin' + container-registry-url: registry.cn-shanghai.aliyuncs.com + container-registry-username: ${{ secrets.REGISTRY_USERNAME }} + container-registry-password: ${{ secrets.REGISTRY_PASSWORD }} + secret-name: aliyuncs-k8s-secret + + - uses: Azure/k8s-deploy@v1 + with: + namespace: 'go-admin' + manifests: 'scripts/k8s/deploy.yml' + images: 'registry.cn-shanghai.aliyuncs.com/go-admin-team/go-admin:${{ github.sha }}' + imagepullsecrets: 'aliyuncs-k8s-secret' + kubectl-version: 'latest' diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 91d18fff..64457815 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -13,10 +13,10 @@ jobs: runs-on: ubuntu-latest steps: - - name: Set up Go 1.13 + - name: Set up Go 1.14 uses: actions/setup-go@v1 with: - go-version: 1.13 + go-version: 1.14 id: go - name: Check out code into the Go module directory diff --git a/.gitignore b/.gitignore index d3f12f85..ce6fd6bd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .idea .vscode +*/.DS_Store static/uploadfile main.exe go-admin @@ -14,4 +15,10 @@ config/settings.dev.*.yml.log temp/logs config/settings.dev.yml.log config/settings.b.dev.yml -cmd/migrate/migration/version_local/* +cmd/migrate/migration/version-local/* +!cmd/migrate/migration/version-local/doc.go +*/.DS_Store + +# go sum +go.sum +config/settings.deva.yml diff --git a/Dockerfile b/Dockerfile index 94dc8c03..71c81a82 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,6 @@ - FROM golang:alpine as builder -MAINTAINER xxx +MAINTAINER lwnmengjing ENV GOPROXY https://goproxy.cn/ @@ -9,7 +8,7 @@ WORKDIR /go/release RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories RUN apk update && apk add tzdata -COPY ./go.mod ./go.mod +COPY go.mod ./go.mod RUN go mod download COPY . . RUN pwd && ls @@ -19,11 +18,9 @@ RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -a -installsuffix cgo -o FROM alpine COPY --from=builder /go/release/go-admin / -COPY --from=builder /go/release/config/ /config/ COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /etc/localtime EXPOSE 8000 -CMD ["/go-admin","server","-c", "/config/settings.yml"] - +CMD ["/go-admin","server","-c", "/config/settings.yml"] \ No newline at end of file diff --git a/README.en.md b/README.en.md index 6e997ba0..196790d9 100644 --- a/README.en.md +++ b/README.en.md @@ -23,6 +23,10 @@ - GORM-based database storage that can expand many types of databases - Simple model mapping of configuration files to quickly get the desired configuration + +- Form builder + +- Multi command mode - TODO: unit test @@ -39,102 +43,90 @@ 8. Operation log: system normal operation log record and query; system exception information log record and query. 9. Login log: The system login log record query contains login exceptions. 10. System interface: Automatically generate related api interface documents according to business code. +11. Multi command mode code generation: according to the data table structure to generate the corresponding business, all visual programming, basic business can be 0 code. +12. Form construction: Customize page style, drag and drop to achieve page layout. +13. Service monitoring: view the basic information of some servers. -## Configuration details +## 🗞 System architecture -1. Configuration file description -```yml -settings: - application: - # Project launch environment - env: dev - # When env: demo, prompts for request operations other than GET - envmsg: "谢谢您的参与,但为了大家更好的体验,所以本次提交就算了吧!" - # Host IP or domain name, default 0.0.0.0 - host: 0.0.0.0 - # Whether to initialize the database structure and basic data; true: required; false: not required - isinit: false - # JWT encrypted string - jwtsecret: 123abc - # log storage path - logpath: temp/logs/log.log - # application name - name: go-admin - # application port - port: 8000 - readtimeout: 1 - writertimeout: 2 - database: - # database name - database: dbname - # database type - dbtype: mysql - # database host - host: 127.0.0.1 - # database password - password: password - # database port - port: 3306 - # database username - username: root - redis: - # redis addresss - addr: 0.0.0.0:6379 - # db - db: 0 - # password - password: password - # read timeout - readtimeout: 50 -``` +

+ +

-2. file path go-admin/config/settings.yml +## 📦 Local development - -## 📦 evelopment - - -First start instructions +### Create development directory ```bash -# Get the code -git clone https://github.com/wenjianzhang/go-admin.git +mkdir goadmin +cd goadmin +``` -# Enter working path +### Get code + +> Key points: two projects must be placed in the same folder; + +```bash +# Get backend code +git clone https://github.com/go-admin-team/go-admin.git + +# Get front end code +git clone https://github.com/go-admin-team/go-admin-ui.git + +``` + + +### Start up instructions + +#### Server startup instructions + +```bash +# Enter the go-admin backend project cd ./go-admin -# Build the project +# Compile project go build -# Change setting -vi ./config/setting.yml (Note: Change isinit and database connection) +# Configuration +# file path go-admin/config/settings.yml +vi ./config/setting.yml -# 1. Database information in the configuration file -# Note: the corresponding configuration data under settings.database -# 2. Confirm database initialization parameters -# Note: If this is the first time settings.application.isinit is set, please set the current value to true, the system will automatically initialize the database structure and basic data information; -# 3. Confirm the log path +# 1. Modifying database information in configuration file +# settings.database Corresponding configuration data under +# 2. Confirm log path +``` + +#### Initialize the database and start the service +``` +# The first configuration needs to initialize the database resource information +./go-admin migrate -c config/settings.yml -# Start the project or debug with the IDE -./go-admin +# Start the project, you can also debug with IDE +./go-admin server -c config/settings.yml + +``` + +#### Using docker to compile and start + +```shell +# Compile image +docker build -t go-admin . + +# Start the container. The first go admin is the container name and the second go admin is the image name +docker run --name go-admin -p 8000:8000 -v /config/settings.yml:/config/settings.yml -d go-admin -# See also instructions in WIKI ``` -Document generation + +#### Document generation + ```bash -swag init +go generate ``` -If there is no `swag` command go get installed -```bash -go get -u github.com/swaggo/swag/cmd/swag -``` - - -Cross compilation +#### Cross compiling ```bash env GOOS=windows GOARCH=amd64 go build main.go @@ -143,11 +135,56 @@ env GOOS=windows GOARCH=amd64 go build main.go env GOOS=linux GOARCH=amd64 go build main.go ``` +### UI interactive terminal startup description -## 🔗 Online Demo +```bash +# Installation dependency +npm install + +# It is recommended that you do not use cnpm to install dependencies directly. There will be all kinds of weird bugs. The problem of slow download speed of NPM can be solved by the following operations +npm install --registry=https://registry.npm.taobao.org + +# Start the service +npm run dev +``` + +## 🎬 Online Demo > admin / 123456 -Demo address:[http://www.zhangwj.com](http://www.zhangwj.com/#/login) +Demo:[http://www.go-admin.dev](http://www.go-admin.dev/#/login) + + +## 📨 Interaction + + + + + + + + + + + + +
WeChatThis QQ group is fullgo-admin技术交流乙号
+ +## 💎 Member + + + + + + + + +## JetBrains Open source certificate support + +The go admin project has always been developed in the GoLand integrated development environment of JetBrains company, based on the * * free JetBrains open source license (s) * * genuine free license. I would like to express my thanks. + + + + ## 🤝 Open source projects used @@ -169,20 +206,10 @@ Demo address:[http://www.zhangwj.com](http://www.zhangwj.com/#/login) -## Version - -#### 2020-03-15 New Features and Optimization - -1. Add user avatar upload -2. Add user password modification -3. Operation log page adjustment -4. Optimize captcha background color - -I saw a lot of friends who experience the wrong verification code, so I adjusted the contrast for everyone to experience! - ## 🤝 Thanks -[chengxiao](https://github.com/chengxiao) +2. [chengxiao](https://github.com/chengxiao) + ## License @@ -191,4 +218,4 @@ I saw a lot of friends who experience the wrong verification code, so I adjusted Copyright (c) 2020 wenjianzhang -[中文]qq technical exchange group: 74520518 +[中文]qq technical exchange group: 74520518 \ No newline at end of file diff --git a/README.md b/README.md index dd22d0fb..52190193 100644 --- a/README.md +++ b/README.md @@ -18,18 +18,20 @@ go-admin已经从wenjianzhang/go-admin 迁移到go-admin-team/go-admin,为了

- [English](https://github.com/wenjianzhang/go-admin/blob/master/README.en.md) | 简体中文 + [English](https://github.com/go-admin-team/go-admin/blob/master/README.en.md) | 简体中文 ##### 基于Gin + Vue + Element UI的前后端分离权限管理系统 系统初始化极度简单,只需要配置文件中,修改数据库连接,系统启动后会自动初始化数据库信息以及必须的基础数据 -[在线文档国际](https://wenjianzhang.github.io/go-admin-site) +[在线文档](https://doc.go-admin.dev) -[在线文档国内](http://mydearzwj.gitee.io/go-admin-site/) +[github在线文档](https://wenjianzhang.github.io) -[前端项目](https://github.com/wenjianzhang/go-admin-ui) +[gitee在线文档](http://mydearzwj.gitee.io/go-admin-doc/) + +[前端项目](https://github.com/go-admin-team/go-admin-ui) [视频教程](https://space.bilibili.com/565616721/channel/detail?cid=125737) @@ -130,10 +132,10 @@ cd goadmin ```bash # 获取后端代码 -git clone https://github.com/wenjianzhang/go-admin.git +git clone https://github.com/go-admin-team/go-admin.git # 获取前端代码 -git clone https://github.com/wenjianzhang/go-admin-ui.git +git clone https://github.com/go-admin-team/go-admin-ui.git ``` @@ -158,15 +160,44 @@ vi ./config/setting.yml # 2. 确认log路径 ``` -#### 初始化数据库,以及服务启动 +:::tip ⚠️注意 在windows环境如果没有安装中CGO,会出现这个问题; + +```bash +E:\go-admin>go build +# github.com/mattn/go-sqlite3 +cgo: exec /missing-cc: exec: "/missing-cc": file does not exist ``` + +or + +```bash +D:\Code\go-admin>go build +# github.com/mattn/go-sqlite3 +cgo: exec gcc: exec: "gcc": executable file not found in %PATH% +``` + +[解决cgo问题进入](https://doc.go-admin.dev/guide/other/faq.html#_5-cgo-exec-missing-cc-exec-missing-cc-file-does-not-exist) + +::: + +#### 初始化数据库,以及服务启动 + +``` bash # 首次配置需要初始化数据库资源信息 -./go-admin migrate -c config/settings.yml -m dev +# macOS or linux 下使用 +$ ./go-admin migrate -c=config/settings.dev.yml + +# ⚠️注意:windows 下使用 +$ go-admin.exe migrate -c=config/settings.dev.yml # 启动项目,也可以用IDE进行调试 -./go-admin server -c config/settings.yml -p 8000 -m dev +# macOS or linux 下使用 +$ ./go-admin server -c config/settings.yml + +# ⚠️注意:windows 下使用 +$ go-admin.exe server -c config/settings.yml ``` #### 使用docker 编译启动 @@ -176,7 +207,8 @@ vi ./config/setting.yml docker build -t go-admin . # 启动容器,第一个go-admin是容器名字,第二个go-admin是镜像名称 -docker run --name go-admin -p 8000:8000 -d go-admin +# -v 映射配置文件 本地路径:容器路径 +docker run --name go-admin -p 8000:8000 -v /config/settings.yml:/config/settings.yml -d go-admin-server ``` @@ -184,18 +216,16 @@ docker run --name go-admin -p 8000:8000 -d go-admin #### 文档生成 ```bash -swag init - -# 如果没有swag命令 go get安装一下即可 -go get -u github.com/swaggo/swag/cmd/swag +go generate ``` #### 交叉编译 ```bash +# windows env GOOS=windows GOARCH=amd64 go build main.go # or - +# linux env GOOS=linux GOARCH=amd64 go build main.go ``` @@ -215,7 +245,7 @@ npm run dev ## 🎬 在线体验 > admin / 123456 -演示地址:[http://www.zhangwj.com](http://www.zhangwj.com/#/login) +演示地址:[http://www.go-admin.dev](http://www.go-admin.dev/#/login) ## 📨 互动 @@ -232,18 +262,33 @@ npm run dev go-admin技术交流乙号 - + +## 💎 主要成员 + + + + + + + + +## JetBrains 开源证书支持 + +`go-admin` 项目一直以来都是在 JetBrains 公司旗下的 GoLand 集成开发环境中进行开发,基于 **free JetBrains Open Source license(s)** 正版免费授权,在此表达我的谢意。 + + + ## 🤝 特别感谢 -[chengxiao](https://github.com/chengxiao) -[gin](https://github.com/gin-gonic/gin) -[casbin](https://github.com/casbin/casbin) -[spf13/viper](https://github.com/spf13/viper) -[gorm](https://github.com/jinzhu/gorm) -[gin-swagger](https://github.com/swaggo/gin-swagger) -[jwt-go](https://github.com/dgrijalva/jwt-go) -[vue-element-admin](https://github.com/PanJiaChen/vue-element-admin) -[ruoyi-vue](https://gitee.com/y_project/RuoYi-Vue) +1. [chengxiao](https://github.com/chengxiao) +2. [gin](https://github.com/gin-gonic/gin) +2. [casbin](https://github.com/casbin/casbin) +2. [spf13/viper](https://github.com/spf13/viper) +2. [gorm](https://github.com/jinzhu/gorm) +2. [gin-swagger](https://github.com/swaggo/gin-swagger) +2. [jwt-go](https://github.com/dgrijalva/jwt-go) +2. [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin) +2. [ruoyi-vue](https://gitee.com/y_project/RuoYi-Vue) ## 🤟 打赏 @@ -258,9 +303,11 @@ npm run dev zhuqiyun LLL狐 星星之火 cjj770 Sam 唐*i 晓聪 aLong *渊 海马 魏镇坪 + 111 *哥 我的宇哥哥 *声 *节 +## 🤝 链接 +[Go开发者成长线路图](http://www.golangroadmap.com/) + ## 🔑 License -[MIT](https://github.com/wenjianzhang/go-admin/blob/master/LICENSE.md) +[MIT](https://github.com/go-admin-team/go-admin/blob/master/LICENSE.md) Copyright (c) 2020 wenjianzhang - diff --git a/app/admin/apis/log/loginlog.go b/app/admin/apis/log/loginlog.go deleted file mode 100644 index 6f36f402..00000000 --- a/app/admin/apis/log/loginlog.go +++ /dev/null @@ -1,134 +0,0 @@ -package log - -import ( - "net/http" - - "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" - - "go-admin/app/admin/models" - "go-admin/tools" - "go-admin/tools/app" -) - -// @Summary 登录日志列表 -// @Description 获取JSON -// @Tags 登录日志 -// @Param status query string false "status" -// @Param dictCode query string false "dictCode" -// @Param dictType query string false "dictType" -// @Param pageSize query int false "页条数" -// @Param pageIndex query int false "页码" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/loginloglist [get] -// @Security Bearer -func GetLoginLogList(c *gin.Context) { - var data models.LoginLog - var err error - var pageSize = 10 - var pageIndex = 1 - - size := c.Request.FormValue("pageSize") - if size != "" { - pageSize, err = tools.StringToInt(size) - } - - index := c.Request.FormValue("pageIndex") - if index != "" { - pageIndex, err = tools.StringToInt(index) - } - - data.Username = c.Request.FormValue("username") - data.Status = c.Request.FormValue("status") - data.Ipaddr = c.Request.FormValue("ipaddr") - result, count, err := data.GetPage(pageSize, pageIndex) - tools.HasError(err, "", -1) - - var mp = make(map[string]interface{}, 3) - mp["list"] = result - mp["count"] = count - mp["pageIndex"] = pageIndex - mp["pageSize"] = pageSize - - var res app.Response - res.Data = mp - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 通过编码获取登录日志 -// @Description 获取JSON -// @Tags 登录日志 -// @Param infoId path int true "infoId" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/loginlog/{infoId} [get] -// @Security Bearer -func GetLoginLog(c *gin.Context) { - var LoginLog models.LoginLog - LoginLog.InfoId, _ = tools.StringToInt(c.Param("infoId")) - result, err := LoginLog.Get() - tools.HasError(err, "抱歉未找到相关信息", -1) - - var res app.Response - res.Data = result - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 添加登录日志 -// @Description 获取JSON -// @Tags 登录日志 -// @Accept application/json -// @Product application/json -// @Param data body models.LoginLog true "data" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/loginlog [post] -// @Security Bearer -func InsertLoginLog(c *gin.Context) { - var data models.LoginLog - err := c.BindWith(&data, binding.JSON) - tools.HasError(err, "", 500) - result, err := data.Create() - tools.HasError(err, "", -1) - var res app.Response - res.Data = result - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 修改登录日志 -// @Description 获取JSON -// @Tags 登录日志 -// @Accept application/json -// @Product application/json -// @Param data body models.LoginLog true "body" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/loginlog [put] -// @Security Bearer -func UpdateLoginLog(c *gin.Context) { - var data models.LoginLog - err := c.BindWith(&data, binding.JSON) - tools.HasError(err, "", -1) - result, err := data.Update(data.InfoId) - tools.HasError(err, "", -1) - var res app.Response - res.Data = result - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 批量删除登录日志 -// @Description 删除数据 -// @Tags 登录日志 -// @Param infoId path string true "以逗号(,)分割的infoId" -// @Success 200 {string} string "{"code": 200, "message": "删除成功"}" -// @Success 200 {string} string "{"code": -1, "message": "删除失败"}" -// @Router /api/v1/loginlog/{infoId} [delete] -func DeleteLoginLog(c *gin.Context) { - var data models.LoginLog - data.UpdateBy = tools.GetUserIdStr(c) - IDS := tools.IdsStrToIdsIntGroup("infoId", c) - _, err := data.BatchDelete(IDS) - tools.HasError(err, "修改失败", 500) - var res app.Response - res.Msg = "删除成功" - c.JSON(http.StatusOK, res.ReturnOK()) -} diff --git a/app/admin/apis/log/operlog.go b/app/admin/apis/log/operlog.go deleted file mode 100644 index 2e5a8dd6..00000000 --- a/app/admin/apis/log/operlog.go +++ /dev/null @@ -1,113 +0,0 @@ -package log - -import ( - "net/http" - - "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" - - "go-admin/app/admin/models" - "go-admin/tools" - "go-admin/tools/app" -) - -// @Summary 登录日志列表 -// @Description 获取JSON -// @Tags 登录日志 -// @Param status query string false "status" -// @Param dictCode query string false "dictCode" -// @Param dictType query string false "dictType" -// @Param pageSize query int false "页条数" -// @Param pageIndex query int false "页码" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/operloglist [get] -// @Security Bearer -func GetOperLogList(c *gin.Context) { - var data models.SysOperLog - var err error - var pageSize = 10 - var pageIndex = 1 - - size := c.Request.FormValue("pageSize") - if size != "" { - pageSize, err = tools.StringToInt(size) - } - - index := c.Request.FormValue("pageIndex") - if index != "" { - pageIndex, err = tools.StringToInt(index) - } - - data.OperName = c.Request.FormValue("operName") - data.Status = c.Request.FormValue("status") - data.OperIp = c.Request.FormValue("operIp") - result, count, err := data.GetPage(pageSize, pageIndex) - tools.HasError(err, "", -1) - - var mp = make(map[string]interface{}, 3) - mp["list"] = result - mp["count"] = count - mp["pageIndex"] = pageIndex - mp["pageSize"] = pageSize - - var res app.Response - res.Data = mp - - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 通过编码获取登录日志 -// @Description 获取JSON -// @Tags 登录日志 -// @Param infoId path int true "infoId" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/operlog/{infoId} [get] -// @Security Bearer -func GetOperLog(c *gin.Context) { - var OperLog models.SysOperLog - OperLog.OperId, _ = tools.StringToInt(c.Param("operId")) - result, err := OperLog.Get() - tools.HasError(err, "抱歉未找到相关信息", -1) - var res app.Response - res.Data = result - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 添加操作日志 -// @Description 获取JSON -// @Tags 操作日志 -// @Accept application/json -// @Product application/json -// @Param data body models.SysOperLog true "data" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/operlog [post] -// @Security Bearer -func InsertOperLog(c *gin.Context) { - var data models.SysOperLog - err := c.BindWith(&data, binding.JSON) - tools.HasError(err, "", 500) - result, err := data.Create() - tools.HasError(err, "", -1) - var res app.Response - res.Data = result - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 批量删除操作日志 -// @Description 删除数据 -// @Tags 操作日志 -// @Param operId path string true "以逗号(,)分割的operId" -// @Success 200 {string} string "{"code": 200, "message": "删除成功"}" -// @Success 200 {string} string "{"code": -1, "message": "删除失败"}" -// @Router /api/v1/operlog/{operId} [delete] -func DeleteOperLog(c *gin.Context) { - var data models.SysOperLog - data.UpdateBy = tools.GetUserIdStr(c) - IDS := tools.IdsStrToIdsIntGroup("operId", c) - _, err := data.BatchDelete(IDS) - tools.HasError(err, "删除失败", 500) - var res app.Response - res.Msg = "删除成功" - c.JSON(http.StatusOK, res.ReturnOK()) -} diff --git a/app/admin/apis/monitor/server.go b/app/admin/apis/monitor/server.go index 48928fe2..9e5b2329 100644 --- a/app/admin/apis/monitor/server.go +++ b/app/admin/apis/monitor/server.go @@ -4,12 +4,13 @@ import ( "runtime" "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + _ "github.com/go-admin-team/go-admin-core/sdk/pkg/response" "github.com/shirou/gopsutil/cpu" "github.com/shirou/gopsutil/disk" "github.com/shirou/gopsutil/mem" - "go-admin/tools" - "go-admin/tools/app" + "go-admin/common/apis" ) const ( @@ -19,12 +20,17 @@ const ( GB = 1024 * MB ) +type Monitor struct { + apis.Api +} + // @Summary 系统信息 // @Description 获取JSON // @Tags 系统信息 -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" +// @Success 200 {object} response.Response "{"code": 200, "data": [...]}" // @Router /api/v1/settings/serverInfo [get] -func ServerInfo(c *gin.Context) { +func (e Monitor) ServerInfo(c *gin.Context) { + e.Context = c osDic := make(map[string]interface{}, 0) osDic["goOs"] = runtime.GOOS @@ -33,8 +39,8 @@ func ServerInfo(c *gin.Context) { osDic["compiler"] = runtime.Compiler osDic["version"] = runtime.Version() osDic["numGoroutine"] = runtime.NumGoroutine() - osDic["ip"] = tools.GetLocaHonst() - osDic["projectDir"] = tools.GetCurrentPath() + osDic["ip"] = pkg.GetLocaHonst() + osDic["projectDir"] = pkg.GetCurrentPath() dis, _ := disk.Usage("/") diskTotalGB := int(dis.Total) / GB @@ -57,10 +63,10 @@ func ServerInfo(c *gin.Context) { cpuDic := make(map[string]interface{}, 0) cpuDic["cpuInfo"], _ = cpu.Info() percent, _ := cpu.Percent(0, false) - cpuDic["Percent"] = tools.Round(percent[0], 2) + cpuDic["Percent"] = pkg.Round(percent[0], 2) cpuDic["cpuNum"], _ = cpu.Counts(false) - app.Custum(c, gin.H{ + e.Custom(gin.H{ "code": 200, "os": osDic, "mem": memDic, diff --git a/app/admin/apis/public/file.go b/app/admin/apis/public/file.go index 0068a50e..42a4aca7 100644 --- a/app/admin/apis/public/file.go +++ b/app/admin/apis/public/file.go @@ -8,12 +8,12 @@ import ( "strings" "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + "github.com/go-admin-team/go-admin-core/sdk/pkg/utils" "github.com/google/uuid" - imgType "github.com/shamsher31/goimgtype" - "go-admin/pkg/utils" - "go-admin/tools" - "go-admin/tools/app" + "go-admin/common/apis" + "go-admin/common/file_store" ) type FileResponse struct { @@ -24,6 +24,12 @@ type FileResponse struct { Type string `json:"type"` } +const path = "static/uploadfile/" + +type File struct { + apis.Api +} + // @Summary 上传图片 // @Description 获取JSON // @Tags 公共接口 @@ -33,72 +39,161 @@ type FileResponse struct { // @Success 200 {string} string "{"code": 200, "message": "添加成功"}" // @Success 200 {string} string "{"code": -1, "message": "添加失败"}" // @Router /api/v1/public/uploadFile [post] -func UploadFile(c *gin.Context) { +func (e File) UploadFile(c *gin.Context) { + e.Context = c + tag, _ := c.GetPostForm("type") urlPerfix := fmt.Sprintf("http://%s/", c.Request.Host) var fileResponse FileResponse if tag == "" { - app.Error(c, 200, errors.New(""), "缺少标识") + e.Error(500, nil, "缺少标识") + //app.Error(c, 200, errors.New(""), "缺少标识") return } else { switch tag { case "1": // 单图 - files, err := c.FormFile("file") - if err != nil { - app.Error(c, 200, errors.New(""), "图片不能为空") + var done bool + fileResponse, done = e.singleFile(c, fileResponse, urlPerfix) + if done { return } - // 上传文件至指定目录 - guid := uuid.New().String() - - singleFile := "static/uploadfile/" + guid + utils.GetExt(files.Filename) - _ = c.SaveUploadedFile(files, singleFile) - fileType, _ := imgType.Get(singleFile) - fileResponse = FileResponse{ - Size: tools.GetFileSize(singleFile), - Path: singleFile, - FullPath: urlPerfix + singleFile, - Name: files.Filename, - Type: fileType, - } - app.OK(c, fileResponse, "上传成功") + e.OK(fileResponse, "上传成功") return case "2": // 多图 - files := c.Request.MultipartForm.File["file"] - var multipartFile []FileResponse - for _, f := range files { - guid := uuid.New().String() - multipartFileName := "static/uploadfile/" + guid + utils.GetExt(f.Filename) - e := c.SaveUploadedFile(f, multipartFileName) - fileType, _ := imgType.Get(multipartFileName) - if e == nil { - multipartFile = append(multipartFile, FileResponse{ - Size: tools.GetFileSize(multipartFileName), - Path: multipartFileName, - FullPath: urlPerfix + multipartFileName, - Name: f.Filename, - Type: fileType, - }) - } - } - app.OK(c, multipartFile, "上传成功") + multipartFile := e.multipleFile(c, urlPerfix) + e.OK(multipartFile, "上传成功") return case "3": // base64 - files, _ := c.GetPostForm("file") - file2list := strings.Split(files, ",") - ddd, _ := base64.StdEncoding.DecodeString(file2list[1]) - guid := uuid.New().String() - base64File := "static/uploadfile/" + guid + ".jpg" - _ = ioutil.WriteFile(base64File, ddd, 0666) - typeStr := strings.Replace(strings.Replace(file2list[0], "data:", "", -1), ";base64", "", -1) - fileResponse = FileResponse{ - Size: tools.GetFileSize(base64File), - Path: base64File, - FullPath: urlPerfix + base64File, - Name: "", - Type: typeStr, - } - app.OK(c, fileResponse, "上传成功") + fileResponse = e.baseImg(c, fileResponse, urlPerfix) + e.OK(fileResponse, "上传成功") } } } + +func (e File) baseImg(c *gin.Context, fileResponse FileResponse, urlPerfix string) FileResponse { + files, _ := c.GetPostForm("file") + file2list := strings.Split(files, ",") + ddd, _ := base64.StdEncoding.DecodeString(file2list[1]) + guid := uuid.New().String() + fileName := guid + ".jpg" + err := utils.IsNotExistMkDir(path) + if err != nil { + e.Error(500, errors.New(""), "初始化文件路径失败") + } + base64File := path + fileName + _ = ioutil.WriteFile(base64File, ddd, 0666) + typeStr := strings.Replace(strings.Replace(file2list[0], "data:", "", -1), ";base64", "", -1) + fileResponse = FileResponse{ + Size: pkg.GetFileSize(base64File), + Path: base64File, + FullPath: urlPerfix + base64File, + Name: "", + Type: typeStr, + } + source, _ := c.GetPostForm("source") + err = thirdUpload(source, fileName, base64File) + if err != nil { + e.Error(200, errors.New(""), "上传第三方失败") + return fileResponse + } + if source != "1" { + fileResponse.Path = "https://youshikeji.oss-cn-shanghai.aliyuncs.com/img/" + fileName + fileResponse.FullPath = "https://youshikeji.oss-cn-shanghai.aliyuncs.com/img/" + fileName + } + return fileResponse +} + +func (e File) multipleFile(c *gin.Context, urlPerfix string) []FileResponse { + files := c.Request.MultipartForm.File["file"] + source, _ := c.GetPostForm("source") + var multipartFile []FileResponse + for _, f := range files { + guid := uuid.New().String() + fileName := guid + utils.GetExt(f.Filename) + + err := utils.IsNotExistMkDir(path) + if err != nil { + e.Error(500, errors.New(""), "初始化文件路径失败") + } + multipartFileName := path + fileName + err1 := c.SaveUploadedFile(f, multipartFileName) + fileType, _ := utils.GetType(multipartFileName) + if err1 == nil { + err := thirdUpload(source, fileName, multipartFileName) + if err != nil { + e.Error(500, errors.New(""), "上传第三方失败") + } else { + fileResponse := FileResponse{ + Size: pkg.GetFileSize(multipartFileName), + Path: multipartFileName, + FullPath: urlPerfix + multipartFileName, + Name: f.Filename, + Type: fileType, + } + if source != "1" { + fileResponse.Path = "https://youshikeji.oss-cn-shanghai.aliyuncs.com/img/" + fileName + fileResponse.FullPath = "https://youshikeji.oss-cn-shanghai.aliyuncs.com/img/" + fileName + } + multipartFile = append(multipartFile, fileResponse) + } + } + } + return multipartFile +} + +func (e File) singleFile(c *gin.Context, fileResponse FileResponse, urlPerfix string) (FileResponse, bool) { + files, err := c.FormFile("file") + + if err != nil { + e.Error(200, errors.New(""), "图片不能为空") + return FileResponse{}, true + } + // 上传文件至指定目录 + guid := uuid.New().String() + + fileName := guid + utils.GetExt(files.Filename) + + err = utils.IsNotExistMkDir(path) + if err != nil { + e.Error(500, errors.New(""), "初始化文件路径失败") + } + singleFile := path + fileName + _ = c.SaveUploadedFile(files, singleFile) + fileType, _ := utils.GetType(singleFile) + fileResponse = FileResponse{ + Size: pkg.GetFileSize(singleFile), + Path: singleFile, + FullPath: urlPerfix + singleFile, + Name: files.Filename, + Type: fileType, + } + source, _ := c.GetPostForm("source") + err = thirdUpload(source, fileName, singleFile) + if err != nil { + e.Error(200, errors.New(""), "上传第三方失败") + return FileResponse{}, true + } + fileResponse.Path = "https://youshikeji.oss-cn-shanghai.aliyuncs.com/img/" + fileName + fileResponse.FullPath = "https://youshikeji.oss-cn-shanghai.aliyuncs.com/img/" + fileName + return fileResponse, false +} + +func thirdUpload(source string, name string, path string) error { + switch source { + case "2": + return ossUpload("img/"+name, path) + case "3": + return qiniuUpload("img/"+name, path) + } + return nil +} + +func ossUpload(name string, path string) error { + oss := file_store.ALiYunOSS{} + return oss.UpLoad(name, path) +} + +func qiniuUpload(name string, path string) error { + oss := file_store.ALiYunOSS{} + return oss.UpLoad(name, path) +} diff --git a/app/admin/apis/sys_china_area_data/sys_china_area_data.go b/app/admin/apis/sys_china_area_data/sys_china_area_data.go new file mode 100644 index 00000000..bdf82982 --- /dev/null +++ b/app/admin/apis/sys_china_area_data/sys_china_area_data.go @@ -0,0 +1,195 @@ +package sys_china_area_data + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" + + "go-admin/app/admin/models" + "go-admin/app/admin/service" + "go-admin/app/admin/service/dto" + "go-admin/common/actions" + "go-admin/common/apis" +) + +type SysChinaAreaData struct { + apis.Api +} + +func (e SysChinaAreaData) GetSysChinaAreaDataList(c *gin.Context) { + e.SetContext(c) + log := e.GetLogger() + d := new(dto.SysChinaAreaDataSearch) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //查询列表 + err = d.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + //数据权限检查 + p := actions.GetPermissionFromContext(c) + + list := make([]models.SysChinaAreaData, 0) + var count int64 + serviceStudent := service.SysChinaAreaData{} + serviceStudent.Log = log + serviceStudent.Orm = db + err = serviceStudent.GetSysChinaAreaDataPage(d, p, &list, &count) + if err != nil { + e.Error(http.StatusInternalServerError, err, "查询失败") + return + } + + e.PageOK(list, int(count), d.GetPageIndex(), d.GetPageSize(), "查询成功") +} + +func (e SysChinaAreaData) GetSysChinaAreaData(c *gin.Context) { + e.SetContext(c) + log := e.GetLogger() + control := new(dto.SysChinaAreaDataById) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //查看详情 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object models.SysChinaAreaData + + //数据权限检查 + p := actions.GetPermissionFromContext(c) + + serviceSysChinaAreaData := service.SysChinaAreaData{} + serviceSysChinaAreaData.Log = log + serviceSysChinaAreaData.Orm = db + err = serviceSysChinaAreaData.GetSysChinaAreaData(control, p, &object) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "查询失败") + return + } + + e.OK(object, "查看成功") +} + +func (e SysChinaAreaData) InsertSysChinaAreaData(c *gin.Context) { + e.SetContext(c) + log := e.GetLogger() + control := new(dto.SysChinaAreaDataControl) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //新增操作 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + object, err := control.Generate() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") + return + } + // 设置创建人 + object.SetCreateBy(user.GetUserId(c)) + + serviceSysChinaAreaData := service.SysChinaAreaData{} + serviceSysChinaAreaData.Orm = db + serviceSysChinaAreaData.Log = log + err = serviceSysChinaAreaData.InsertSysChinaAreaData(object) + if err != nil { + log.Error(err) + e.Error(http.StatusInternalServerError, err, "创建失败") + return + } + + e.OK(object.GetId(), "创建成功") +} + +func (e SysChinaAreaData) UpdateSysChinaAreaData(c *gin.Context) { + e.SetContext(c) + log := e.GetLogger() + control := new(dto.SysChinaAreaDataControl) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //更新操作 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + object, err := control.Generate() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") + return + } + object.SetUpdateBy(user.GetUserId(c)) + + //数据权限检查 + p := actions.GetPermissionFromContext(c) + + serviceSysChinaAreaData := service.SysChinaAreaData{} + serviceSysChinaAreaData.Orm = db + serviceSysChinaAreaData.Log = log + err = serviceSysChinaAreaData.UpdateSysChinaAreaData(object, p) + if err != nil { + log.Error(err) + return + } + e.OK(object.GetId(), "更新成功") +} + +func (e SysChinaAreaData) DeleteSysChinaAreaData(c *gin.Context) { + e.SetContext(c) + log := e.GetLogger() + control := new(dto.SysChinaAreaDataById) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //删除操作 + err = control.Bind(c) + if err != nil { + log.Errorf("Bind error: %s", err) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + // 设置编辑人 + control.SetUpdateBy(user.GetUserId(c)) + + // 数据权限检查 + p := actions.GetPermissionFromContext(c) + + serviceSysChinaAreaData := service.SysChinaAreaData{} + serviceSysChinaAreaData.Orm = db + serviceSysChinaAreaData.Log = log + err = serviceSysChinaAreaData.RemoveSysChinaAreaData(control, p) + if err != nil { + log.Errorf("RemoveSysChinaAreaData error, %s", err) + e.Error(http.StatusInternalServerError, err, "删除失败") + return + } + e.OK(control.GetId(), "删除成功") +} \ No newline at end of file diff --git a/app/admin/apis/sys_file/sys_file_dir.go b/app/admin/apis/sys_file/sys_file_dir.go new file mode 100644 index 00000000..d275638c --- /dev/null +++ b/app/admin/apis/sys_file/sys_file_dir.go @@ -0,0 +1,198 @@ +package sys_file + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" + + "go-admin/app/admin/models" + "go-admin/app/admin/service" + "go-admin/app/admin/service/dto" + "go-admin/common/actions" + "go-admin/common/apis" +) + +type SysFileDir struct { + apis.Api +} + +func (e SysFileDir) GetSysFileDirList(c *gin.Context) { + e.Context = c + log := e.GetLogger() + search := new(dto.SysFileDirSearch) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + err = c.ShouldBind(search) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + + var list *[]models.SysFileDirL + serviceStudent := service.SysFileDir{} + serviceStudent.Log = log + serviceStudent.Orm = db + list, err = serviceStudent.SetSysFileDir(search) + if err != nil { + log.Errorf("SetSysFileDir error, %s", err) + e.Error(http.StatusUnprocessableEntity, err, "查询失败") + return + } + + e.OK(list, "查询成功") +} + +func (e SysFileDir) GetSysFileDir(c *gin.Context) { + control := new(dto.SysFileDirById) + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //查看详情 + err = c.ShouldBindUri(control) + if err != nil { + log.Warnf("ShouldBindUri error: %s", err.Error()) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + } + + var object models.SysFileDir + + serviceSysFileDir := service.SysFileDir{} + serviceSysFileDir.Log = log + serviceSysFileDir.Orm = db + err = serviceSysFileDir.GetSysFileDir(control, &object) + if err != nil { + log.Errorf("GetSysFileDir error, %s", err) + e.Error(http.StatusInternalServerError, err, "查询失败") + return + } + + e.OK(object, "查看成功") +} + +func (e SysFileDir) InsertSysFileDir(c *gin.Context) { + control := new(dto.SysFileDirControl) + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //新增操作 + err = c.ShouldBindUri(control) + if err != nil { + log.Warnf("ShouldBindUri error: %s", err.Error()) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + err = c.ShouldBind(control) + if err != nil { + log.Warnf("ShouldBind error: %s", err.Error()) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + // 设置创建人 + control.CreateBy = user.GetUserId(c) + + serviceSysFileDir := service.SysFileDir{} + serviceSysFileDir.Orm = db + serviceSysFileDir.Log = log + err = serviceSysFileDir.InsertSysFileDir(control) + if err != nil { + log.Errorf("InsertSysFileDir error, %s", err) + e.Error(http.StatusInternalServerError, err, "创建失败") + return + } + + e.OK(control.ID, "创建成功") +} + +func (e SysFileDir) UpdateSysFileDir(c *gin.Context) { + control := new(dto.SysFileDirControl) + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + err = c.ShouldBindUri(control) + if err != nil { + log.Warnf("ShouldBindUri error: %s", err.Error()) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + } + err = c.ShouldBind(control) + if err != nil { + log.Warnf("ShouldBind error: %#v", err.Error()) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + } + // 设置创建人 + control.UpdateBy = user.GetUserId(c) + + //数据权限检查 + p := actions.GetPermissionFromContext(c) + + serviceSysFileDir := service.SysFileDir{} + serviceSysFileDir.Orm = db + serviceSysFileDir.Log = log + err = serviceSysFileDir.UpdateSysFileDir(control, p) + if err != nil { + log.Errorf("UpdateSysFileDir error, %s", err) + e.Error(http.StatusInternalServerError, err, "更新失败") + return + } + e.OK(control.ID, "更新成功") +} + +func (e SysFileDir) DeleteSysFileDir(c *gin.Context) { + control := new(dto.SysFileDirById) + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + msgID := pkg.GenerateMsgIDFromContext(c) + //删除操作 + err = c.ShouldBindUri(control) + if err != nil { + log.Warnf("MsgID[%s] ShouldBindUri error: %s", msgID, err.Error()) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + } + err = c.ShouldBind(control) + if err != nil { + log.Warnf("MsgID[%s] ShouldBind error: %#v", msgID, err.Error()) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + } + + // 设置编辑人 + control.UpdateBy = user.GetUserId(c) + + // 数据权限检查 + p := actions.GetPermissionFromContext(c) + + serviceSysFileDir := service.SysFileDir{} + serviceSysFileDir.Orm = db + serviceSysFileDir.MsgID = msgID + err = serviceSysFileDir.RemoveSysFileDir(control, p) + if err != nil { + log.Errorf("RemoveSysFileDir error, %s", err) + e.Error(http.StatusInternalServerError, err, "删除失败") + return + } + e.OK(control.Id, "删除成功") +} diff --git a/app/admin/apis/sys_file/sys_file_info.go b/app/admin/apis/sys_file/sys_file_info.go new file mode 100644 index 00000000..637743bf --- /dev/null +++ b/app/admin/apis/sys_file/sys_file_info.go @@ -0,0 +1,209 @@ +package sys_file + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" + + "go-admin/app/admin/models" + "go-admin/app/admin/service" + "go-admin/app/admin/service/dto" + "go-admin/common/actions" + "go-admin/common/apis" +) + +type SysFileInfo struct { + apis.Api +} + +func (e SysFileInfo) GetSysFileInfoList(c *gin.Context) { + e.Context = c + log := e.GetLogger() + search := new(dto.SysFileInfoSearch) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + err = c.ShouldBind(search) + if err != nil { + log.Warnf("参数验证错误, error: %s", err) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + //数据权限检查 + p := actions.GetPermissionFromContext(c) + + list := make([]models.SysFileInfo, 0) + var count int64 + serviceStudent := service.SysFileInfo{} + serviceStudent.Log = log + serviceStudent.Orm = db + err = serviceStudent.GetSysFileInfoPage(search, p, &list, &count) + if err != nil { + log.Errorf("GetSysFileInfoPage error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "查询失败") + return + } + + e.PageOK(list, int(count), search.PageIndex, search.PageSize, "查询成功") +} + +func (e SysFileInfo) GetSysFileInfo(c *gin.Context) { + control := new(dto.SysFileInfoById) + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //查看详情 + err = c.ShouldBindUri(control) + if err != nil { + log.Warnf("参数验证错误, error:%s", err) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + var object models.SysFileInfo + + //数据权限检查 + p := actions.GetPermissionFromContext(c) + + serviceSysFileInfo := service.SysFileInfo{} + serviceSysFileInfo.Log = log + serviceSysFileInfo.Orm = db + err = serviceSysFileInfo.GetSysFileInfo(control, p, &object) + if err != nil { + log.Errorf("GetSysFileInfo error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "查询失败") + return + } + + e.OK(object, "查看成功") +} + +func (e SysFileInfo) InsertSysFileInfo(c *gin.Context) { + control := new(dto.SysFileInfoControl) + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //新增操作 + err = c.ShouldBindUri(control) + if err != nil { + log.Warnf("参数验证错误, error: %s", err) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + err = c.ShouldBind(control) + if err != nil { + log.Warnf("参数验证错误, error: %s", err) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + // 设置创建人 + control.CreateBy = user.GetUserId(c) + + serviceSysFileInfo := service.SysFileInfo{} + serviceSysFileInfo.Orm = db + serviceSysFileInfo.Log = log + err = serviceSysFileInfo.InsertSysFileInfo(control) + if err != nil { + log.Errorf("InsertSysFileInfo error: %s", err) + e.Error(http.StatusInternalServerError, err, "创建失败") + return + } + + e.OK(control.ID, "创建成功") +} + +func (e SysFileInfo) UpdateSysFileInfo(c *gin.Context) { + control := new(dto.SysFileInfoControl) + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + err = c.ShouldBindUri(control) + if err != nil { + log.Warnf("参数验证错误, error: %s", err) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + err = c.ShouldBind(control) + if err != nil { + log.Warnf("参数验证错误, error:%s", err) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + // 设置创建人 + control.UpdateBy = user.GetUserId(c) + + //数据权限检查 + p := actions.GetPermissionFromContext(c) + + serviceSysFileInfo := service.SysFileInfo{} + serviceSysFileInfo.Orm = db + serviceSysFileInfo.Log = log + err = serviceSysFileInfo.UpdateSysFileInfo(control, p) + if err != nil { + log.Errorf("UpdateSysFileInfo error: %s", err) + e.Error(http.StatusInternalServerError, err, "创建失败") + return + } + e.OK(control.ID, "更新成功") +} + +func (e SysFileInfo) DeleteSysFileInfo(c *gin.Context) { + control := new(dto.SysFileInfoById) + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //删除操作 + err = c.ShouldBindUri(control) + if err != nil { + log.Warnf("参数验证错误, error: %s", err) + e.Error(422, err, "参数验证失败") + return + } + err = c.ShouldBind(control) + if err != nil { + log.Warnf("参数验证错误, error: %s", err) + e.Error(422, err, "参数验证失败") + return + } + + // 设置编辑人 + control.UpdateBy = user.GetUserId(c) + + // 数据权限检查 + p := actions.GetPermissionFromContext(c) + + serviceSysFileInfo := service.SysFileInfo{} + serviceSysFileInfo.Orm = db + serviceSysFileInfo.Log = log + err = serviceSysFileInfo.RemoveSysFileInfo(control, p) + if err != nil { + log.Errorf("RemoveSysFileInfo error: %s", err) + e.Error(http.StatusInternalServerError, err, "创建失败") + return + } + e.OK(control.Id, "删除成功") +} diff --git a/app/admin/apis/sys_job/sys_job.go b/app/admin/apis/sys_job/sys_job.go new file mode 100644 index 00000000..c0667ddd --- /dev/null +++ b/app/admin/apis/sys_job/sys_job.go @@ -0,0 +1,73 @@ +package sys_job + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk" + "go-admin/app/admin/service" + "go-admin/common/apis" + "go-admin/common/dto" +) + +type SysJob struct { + apis.Api +} + +// RemoveJobForService 调用service实现 +func (e SysJob) RemoveJobForService(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + var v dto.GeneralDelDto + err = c.Bind(&v) + if err != nil { + log.Warnf("参数验证错误, error: %s", err) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + s := service.SysJob{} + s.Log = log + s.Orm = db + s.Cron = sdk.Runtime.GetCrontabKey(c.Request.Host) + err = s.RemoveJob(&v) + if err != nil { + log.Errorf("RemoveJob error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "") + return + } + e.OK(nil, s.Msg) +} + +// StartJobForService 启动job service实现 +func (e SysJob) StartJobForService(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + var v dto.GeneralGetDto + err = c.BindUri(&v) + if err != nil { + log.Warnf("参数验证错误, error: %s", err) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + s := service.SysJob{} + s.Orm = db + s.Log = log + s.Cron = sdk.Runtime.GetCrontabKey(c.Request.Host) + err = s.StartJob(&v) + if err != nil { + log.Errorf("GetCrontabKey error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "") + return + } + e.OK(nil, s.Msg) +} diff --git a/app/admin/apis/sys_user/sys_user.go b/app/admin/apis/sys_user/sys_user.go new file mode 100644 index 00000000..3a04a1a7 --- /dev/null +++ b/app/admin/apis/sys_user/sys_user.go @@ -0,0 +1,472 @@ +package sys_user + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" + _ "github.com/go-admin-team/go-admin-core/sdk/pkg/response" + "github.com/google/uuid" + + "go-admin/app/admin/models/system" + "go-admin/app/admin/service" + "go-admin/app/admin/service/dto" + "go-admin/common/actions" + "go-admin/common/apis" + common "go-admin/common/models" +) + +type SysUser struct { + apis.Api +} + +// @Summary 列表用户信息数据 +// @Description 获取JSON +// @Tags 用户 +// @Param username query string false "username" +// @Success 200 {string} string "{"code": 200, "data": [...]}" +// @Success 200 {string} string "{"code": -1, "message": "抱歉未找到相关信息"}" +// @Router /api/v1/sysUser [get] +// @Security Bearer +func (e SysUser) GetSysUserList(c *gin.Context) { + e.Context = c + log := e.GetLogger() + d := new(dto.SysUserSearch) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + req := d.Generate() + + //查询列表 + err = req.Bind(c) + if err != nil { + log.Warnf("Bind error: %s", err.Error()) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + //数据权限检查 + p := actions.GetPermissionFromContext(c) + + list := make([]system.SysUser, 0) + var count int64 + serviceStudent := service.SysUser{} + serviceStudent.Log = log + serviceStudent.Orm = db + err = serviceStudent.GetSysUserPage(req, p, &list, &count) + if err != nil { + e.Error(http.StatusInternalServerError, err, "查询失败") + return + } + + e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") +} + +// @Summary 获取用户 +// @Description 获取JSON +// @Tags 用户 +// @Param userId path int true "用户编码" +// @Success 200 {object} response.Response "{"code": 200, "data": [...]}" +// @Router /api/v1/sysUser/{userId} [get] +// @Security Bearer +func (e SysUser) GetSysUser(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysUserById) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //查看详情 + req := control.Generate() + err = req.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object system.SysUser + + //数据权限检查 + p := actions.GetPermissionFromContext(c) + + serviceSysUser := service.SysUser{} + serviceSysUser.Log = log + serviceSysUser.Orm = db + err = serviceSysUser.GetSysUser(req, p, &object) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "查询失败") + return + } + + e.OK(object, "查看成功") +} + +// @Summary 创建用户 +// @Description 获取JSON +// @Tags 用户 +// @Accept application/json +// @Product application/json +// @Param data body dto.SysUserControl true "用户数据" +// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" +// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" +// @Router /api/v1/sysUser [post] +func (e SysUser) InsertSysUser(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysUserControl) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //新增操作 + req := control.Generate() + err = req.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object common.ActiveRecord + object, err = req.GenerateM() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") + return + } + // 设置创建人 + object.SetCreateBy(user.GetUserId(c)) + + serviceSysUser := service.SysUser{} + serviceSysUser.Orm = db + serviceSysUser.Log = log + err = serviceSysUser.InsertSysUser(object) + if err != nil { + log.Error(err) + e.Error(http.StatusInternalServerError, err, "创建失败") + return + } + + e.OK(object.GetId(), "创建成功") +} + +// @Summary 修改用户数据 +// @Description 获取JSON +// @Tags 用户 +// @Accept application/json +// @Product application/json +// @Param data body dto.SysUserControl true "body" +// @Success 200 {string} string "{"code": 200, "message": "修改成功"}" +// @Success 200 {string} string "{"code": -1, "message": "修改失败"}" +// @Router /api/v1/sysuser/{userId} [put] +func (e SysUser) UpdateSysUser(c *gin.Context) { + control := new(dto.SysUserControl) + + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + req := control.Generate() + //更新操作 + err = req.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object common.ActiveRecord + object, err = req.GenerateM() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") + return + } + object.SetUpdateBy(user.GetUserId(c)) + + //数据权限检查 + p := actions.GetPermissionFromContext(c) + + serviceSysUser := service.SysUser{} + serviceSysUser.Orm = db + serviceSysUser.Log = log + err = serviceSysUser.UpdateSysUser(object, p) + if err != nil { + log.Error(err) + return + } + e.OK(object.GetId(), "更新成功") +} + +// @Summary 删除用户数据 +// @Description 删除数据 +// @Tags 用户 +// @Param userId path int true "userId" +// @Success 200 {string} string "{"code": 200, "message": "删除成功"}" +// @Success 200 {string} string "{"code": -1, "message": "删除失败"}" +// @Router /api/v1/sysuser/{userId} [delete] +func (e SysUser) DeleteSysUser(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysUserById) + + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //删除操作 + req := control.Generate() + err = req.Bind(c) + if err != nil { + log.Errorf("Bind error: %s", err) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object common.ActiveRecord + object, err = req.GenerateM() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") + return + } + + // 设置编辑人 + object.SetUpdateBy(user.GetUserId(c)) + + // 数据权限检查 + p := actions.GetPermissionFromContext(c) + + serviceSysUser := service.SysUser{} + serviceSysUser.Orm = db + serviceSysUser.Log = log + err = serviceSysUser.RemoveSysUser(req, object, p) + if err != nil { + log.Error(err) + return + } + e.OK(object.GetId(), "删除成功") +} + +// @Summary 修改头像 +// @Description 获取JSON +// @Tags 用户 +// @Accept multipart/form-data +// @Param file formData file true "file" +// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" +// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" +// @Router /api/v1/user/avatar [post] +func (e SysUser) InsetSysUserAvatar(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + // 数据权限检查 + p := actions.GetPermissionFromContext(c) + + form, _ := c.MultipartForm() + files := form.File["upload[]"] + guid := uuid.New().String() + filPath := "static/uploadfile/" + guid + ".jpg" + for _, file := range files { + log.Debugf("upload avatar file: %s", file.Filename) + // 上传文件至指定目录 + err = c.SaveUploadedFile(file, filPath) + if err != nil { + log.Errorf("save file error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "") + return + } + } + + object := &system.SysUser{ + UserId: p.UserId, + Avatar: "/" + filPath, + } + serviceSysUser := service.SysUser{} + serviceSysUser.Orm = db + serviceSysUser.Log = log + err = serviceSysUser.UpdateSysUser(object, p) + if err != nil { + log.Error(err) + return + } + e.OK(filPath, "修改成功") +} + +// @Summary 重置密码 +// @Description 获取JSON +// @Tags 用户 +// @Accept application/json +// @Product application/json +// @Param data body dto.PassWord true "body" +// @Success 200 {object} response.Response "{"code": 200, "data": [...]}" +// @Router /api/v1/user/pwd [post] +// @Security Bearer +func (e SysUser) SysUserUpdatePwd(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + var pwd dto.PassWord + err = c.Bind(&pwd) + if err != nil { + log.Errorf("Bind error: %s", err) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + // 数据权限检查 + p := actions.GetPermissionFromContext(c) + + serviceSysUser := service.SysUser{} + serviceSysUser.Orm = db + serviceSysUser.Log = log + err = serviceSysUser.UpdateSysUserPwd(user.GetUserId(c), pwd.OldPassword, pwd.NewPassword, p) + if err != nil { + log.Error(err) + e.Error(http.StatusForbidden, err, "密码修改失败") + return + } + e.OK(nil, "密码修改成功") +} + +// @Summary 获取个人中心用户 +// @Description 获取JSON +// @Tags 个人中心 +// @Success 200 {object} response.Response "{"code": 200, "data": [...]}" +// @Router /api/v1/user/profile [get] +// @Security Bearer +func (e SysUser) GetSysUserProfile(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + id := user.GetUserId(c) + serviceSysUser := service.SysUser{} + serviceSysUser.Log = log + serviceSysUser.Orm = db + user := new(system.SysUser) + roles := make([]system.SysRole, 0) + posts := make([]system.SysPost, 0) + err = serviceSysUser.GetSysUserProfile(id, user, &roles, &posts) + if err != nil { + log.Errorf("get user profile error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "获取用户信息失败") + return + } + e.OK(gin.H{ + "user": user, + "roles": roles, + "posts": posts, + }, "查询成功") + //var SysUser models.SysUser + //userId := tools.GetUserIdStr(c) + //SysUser.UserId, _ = tools.StringToInt(userId) + //result, err := SysUser.Get() + //tools.HasError(err, "抱歉未找到相关信息", -1) + //var SysRole models.SysRole + //var Post models.Post + //var Dept models.SysDepts + ////获取角色列表 + //roles, err := SysRole.GetList() + ////获取职位列表 + //posts, err := Post.GetList() + ////获取部门列表 + //Dept.DeptId = result.DeptId + //dept, err := Dept.Get() + // + //postIds := make([]int, 0) + //postIds = append(postIds, result.PostId) + // + //roleIds := make([]int, 0) + //roleIds = append(roleIds, result.RoleId) + // + //app.Custum(c, gin.H{ + // "code": 200, + // "data": result, + // "postIds": postIds, + // "roleIds": roleIds, + // "roles": roles, + // "posts": posts, + // "dept": dept, + //}) +} + +func (e SysUser) GetInfo(c *gin.Context) { + e.Context = c + log := e.GetLogger() + + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //数据权限检查 + p := actions.GetPermissionFromContext(c) + + var roles = make([]string, 1) + roles[0] = user.GetRoleName(c) + + var permissions = make([]string, 1) + permissions[0] = "*:*:*" + + var buttons = make([]string, 1) + buttons[0] = "*:*:*" + + RoleMenu := system.RoleMenu{} + RoleMenu.RoleId = user.GetRoleId(c) + + var mp = make(map[string]interface{}) + mp["roles"] = roles + if user.GetRoleName(c) == "admin" || user.GetRoleName(c) == "系统管理员" { + mp["permissions"] = permissions + mp["buttons"] = buttons + } else { + list, _ := RoleMenu.GetPermis(db) + mp["permissions"] = list + mp["buttons"] = list + } + + var sysUser system.SysUser + req := new(dto.SysUserById) + req.Id = user.GetUserId(c) + serviceSysUser := service.SysUser{} + serviceSysUser.Log = log + serviceSysUser.Orm = db + err = serviceSysUser.GetSysUser(req, p, &sysUser) + if err != nil { + e.Error(http.StatusUnauthorized, err, "登录失败") + return + } + + mp["introduction"] = " am a super administrator" + + mp["avatar"] = "https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif" + if sysUser.Avatar != "" { + mp["avatar"] = sysUser.Avatar + } + mp["userName"] = sysUser.NickName + mp["userId"] = sysUser.UserId + mp["deptId"] = sysUser.DeptId + mp["name"] = sysUser.NickName + e.OK(mp, "") +} diff --git a/app/admin/apis/syscategory/syscategory.go b/app/admin/apis/syscategory/syscategory.go deleted file mode 100644 index 03181dea..00000000 --- a/app/admin/apis/syscategory/syscategory.go +++ /dev/null @@ -1,83 +0,0 @@ -package syscategory - -import ( - "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" - - "go-admin/app/admin/models" - "go-admin/tools" - "go-admin/tools/app" - "go-admin/tools/app/msg" -) - -func GetSysCategoryList(c *gin.Context) { - var data models.SysCategory - var err error - var pageSize = 10 - var pageIndex = 1 - - if size := c.Request.FormValue("pageSize"); size != "" { - pageSize, err = tools.StringToInt(size) - } - if index := c.Request.FormValue("pageIndex"); index != "" { - pageIndex, err = tools.StringToInt(index) - } - - data.Name = c.Request.FormValue("name") - data.Status = c.Request.FormValue("status") - - data.DataScope = tools.GetUserIdStr(c) - result, count, err := data.GetPage(pageSize, pageIndex) - tools.HasError(err, "", -1) - - app.PageOK(c, result, count, pageIndex, pageSize, "") -} - -func GetSysCategory(c *gin.Context) { - var data models.SysCategory - data.Id, _ = tools.StringToInt(c.Param("id")) - result, err := data.Get() - tools.HasError(err, "抱歉未找到相关信息", -1) - - app.OK(c, result, "") -} - -// @Summary 添加分类 -// @Description 获取JSON -// @Tags 分类 -// @Accept application/json -// @Product application/json -// @Param data body models.SysCategory true "data" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/syscategory [post] -func InsertSysCategory(c *gin.Context) { - var data models.SysCategory - err := c.ShouldBindJSON(&data) - data.CreateBy = tools.GetUserIdStr(c) - tools.HasError(err, "", 500) - result, err := data.Create() - tools.HasError(err, "", -1) - app.OK(c, result, "") -} - -func UpdateSysCategory(c *gin.Context) { - var data models.SysCategory - err := c.BindWith(&data, binding.JSON) - tools.HasError(err, "数据解析失败", -1) - data.UpdateBy = tools.GetUserIdStr(c) - result, err := data.Update(data.Id) - tools.HasError(err, "", -1) - - app.OK(c, result, "") -} - -func DeleteSysCategory(c *gin.Context) { - var data models.SysCategory - data.UpdateBy = tools.GetUserIdStr(c) - - IDS := tools.IdsStrToIdsIntGroup("id", c) - _, err := data.BatchDelete(IDS) - tools.HasError(err, msg.DeletedFail, 500) - app.OK(c, nil, msg.DeletedSuccess) -} diff --git a/app/admin/apis/syscontent/syscontent.go b/app/admin/apis/syscontent/syscontent.go deleted file mode 100644 index ceb851c3..00000000 --- a/app/admin/apis/syscontent/syscontent.go +++ /dev/null @@ -1,84 +0,0 @@ -package syscontent - -import ( - "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" - - "go-admin/app/admin/models" - "go-admin/tools" - "go-admin/tools/app" - "go-admin/tools/app/msg" -) - -func GetSysContentList(c *gin.Context) { - var data models.SysContent - var err error - var pageSize = 10 - var pageIndex = 1 - - if size := c.Request.FormValue("pageSize"); size != "" { - pageSize, err = tools.StringToInt(size) - } - if index := c.Request.FormValue("pageIndex"); index != "" { - pageIndex, err = tools.StringToInt(index) - } - - data.CateId = c.Request.FormValue("cateId") - data.Name = c.Request.FormValue("name") - data.Status = c.Request.FormValue("status") - - data.DataScope = tools.GetUserIdStr(c) - result, count, err := data.GetPage(pageSize, pageIndex) - tools.HasError(err, "", -1) - - app.PageOK(c, result, count, pageIndex, pageSize, "") -} - -func GetSysContent(c *gin.Context) { - var data models.SysContent - data.Id, _ = tools.StringToInt(c.Param("id")) - result, err := data.Get() - tools.HasError(err, "抱歉未找到相关信息", -1) - - app.OK(c, result, "") -} - -// @Summary 添加内容管理 -// @Description 获取JSON -// @Tags 内容管理 -// @Accept application/json -// @Product application/json -// @Param data body models.SysContent true "data" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/syscontent [post] -func InsertSysContent(c *gin.Context) { - var data models.SysContent - err := c.ShouldBindJSON(&data) - data.CreateBy = tools.GetUserIdStr(c) - tools.HasError(err, "", 500) - result, err := data.Create() - tools.HasError(err, "", -1) - app.OK(c, result, "") -} - -func UpdateSysContent(c *gin.Context) { - var data models.SysContent - err := c.BindWith(&data, binding.JSON) - tools.HasError(err, "数据解析失败", -1) - data.UpdateBy = tools.GetUserIdStr(c) - result, err := data.Update(data.Id) - tools.HasError(err, "", -1) - - app.OK(c, result, "") -} - -func DeleteSysContent(c *gin.Context) { - var data models.SysContent - data.UpdateBy = tools.GetUserIdStr(c) - - IDS := tools.IdsStrToIdsIntGroup("id", c) - _, err := data.BatchDelete(IDS) - tools.HasError(err, msg.DeletedFail, 500) - app.OK(c, nil, msg.DeletedSuccess) -} diff --git a/app/admin/apis/sysfiledir/dir.go b/app/admin/apis/sysfiledir/dir.go deleted file mode 100644 index fbf142be..00000000 --- a/app/admin/apis/sysfiledir/dir.go +++ /dev/null @@ -1,71 +0,0 @@ -package sysfiledir - -import ( - "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" - - "go-admin/app/admin/models" - "go-admin/tools" - "go-admin/tools/app" - "go-admin/tools/app/msg" -) - -func GetSysFileDirList(c *gin.Context) { - var SysFileDir models.SysFileDir - SysFileDir.Label = c.Request.FormValue("label") - SysFileDir.PId, _ = tools.StringToInt(c.Request.FormValue("pid")) - SysFileDir.Id, _ = tools.StringToInt(c.Request.FormValue("id")) - SysFileDir.DataScope = tools.GetUserIdStr(c) - result, err := SysFileDir.SetSysFileDir() - tools.HasError(err, "抱歉未找到相关信息", -1) - app.OK(c, result, "") -} - -func GetSysFileDir(c *gin.Context) { - var data models.SysFileDir - data.Id, _ = tools.StringToInt(c.Param("id")) - result, err := data.Get() - tools.HasError(err, "抱歉未找到相关信息", -1) - - app.OK(c, result, "") -} - -// @Summary 添加SysFileDir -// @Description 获取JSON -// @Tags SysFileDir -// @Accept application/json -// @Product application/json -// @Param data body models.SysFileDir true "data" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/sysfiledir [post] -func InsertSysFileDir(c *gin.Context) { - var data models.SysFileDir - err := c.ShouldBindJSON(&data) - data.CreateBy = tools.GetUserIdStr(c) - tools.HasError(err, "", 500) - result, err := data.Create() - tools.HasError(err, "", -1) - app.OK(c, result, "") -} - -func UpdateSysFileDir(c *gin.Context) { - var data models.SysFileDir - err := c.BindWith(&data, binding.JSON) - tools.HasError(err, "数据解析失败", -1) - data.UpdateBy = tools.GetUserIdStr(c) - result, err := data.Update(data.Id) - tools.HasError(err, "", -1) - - app.OK(c, result, "") -} - -func DeleteSysFileDir(c *gin.Context) { - var data models.SysFileDir - data.UpdateBy = tools.GetUserIdStr(c) - - IDS := tools.IdsStrToIdsIntGroup("id", c) - _, err := data.BatchDelete(IDS) - tools.HasError(err, msg.DeletedFail, 500) - app.OK(c, nil, msg.DeletedSuccess) -} diff --git a/app/admin/apis/sysfileinfo/sysfileinfo.go b/app/admin/apis/sysfileinfo/sysfileinfo.go deleted file mode 100644 index 509c74a9..00000000 --- a/app/admin/apis/sysfileinfo/sysfileinfo.go +++ /dev/null @@ -1,77 +0,0 @@ -package sysfileinfo - -import ( - "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" - - "go-admin/app/admin/models" - "go-admin/tools" - "go-admin/tools/app" - "go-admin/tools/app/msg" -) - -func GetSysFileInfoList(c *gin.Context) { - var data models.SysFileInfo - var err error - var pageSize = 10 - var pageIndex = 1 - - if size := c.Request.FormValue("pageSize"); size != "" { - pageSize, err = tools.StringToInt(size) - } - tools.HasError(err, "", -1) - if index := c.Request.FormValue("pageIndex"); index != "" { - pageIndex, err = tools.StringToInt(index) - } - tools.HasError(err, "", -1) - if pid := c.Request.FormValue("pId"); pid != "" { - data.PId, err = tools.StringToInt(pid) - } - tools.HasError(err, "", -1) - - data.DataScope = tools.GetUserIdStr(c) - result, count, err := data.GetPage(pageSize, pageIndex) - tools.HasError(err, "", -1) - - app.PageOK(c, result, count, pageIndex, pageSize, "") -} - -func GetSysFileInfo(c *gin.Context) { - var data models.SysFileInfo - data.Id, _ = tools.StringToInt(c.Param("id")) - result, err := data.Get() - tools.HasError(err, "抱歉未找到相关信息", -1) - - app.OK(c, result, "") -} - -func InsertSysFileInfo(c *gin.Context) { - var data models.SysFileInfo - err := c.ShouldBindJSON(&data) - data.CreateBy = tools.GetUserIdStr(c) - tools.HasError(err, "", 500) - result, err := data.Create() - tools.HasError(err, "", -1) - app.OK(c, result, "") -} - -func UpdateSysFileInfo(c *gin.Context) { - var data models.SysFileInfo - err := c.BindWith(&data, binding.JSON) - tools.HasError(err, "数据解析失败", -1) - data.UpdateBy = tools.GetUserIdStr(c) - result, err := data.Update(data.Id) - tools.HasError(err, "", -1) - - app.OK(c, result, "") -} - -func DeleteSysFileInfo(c *gin.Context) { - var data models.SysFileInfo - data.UpdateBy = tools.GetUserIdStr(c) - - IDS := tools.IdsStrToIdsIntGroup("id", c) - _, err := data.BatchDelete(IDS) - tools.HasError(err, msg.DeletedFail, 500) - app.OK(c, nil, msg.DeletedSuccess) -} diff --git a/app/admin/apis/sysjob/sysjob.go b/app/admin/apis/sysjob/sysjob.go deleted file mode 100644 index c0067b49..00000000 --- a/app/admin/apis/sysjob/sysjob.go +++ /dev/null @@ -1,70 +0,0 @@ -package sysjob - -import ( - "github.com/gin-gonic/gin" - - "go-admin/app/admin/service" - "go-admin/common/apis" - "go-admin/common/dto" - "go-admin/common/log" - "go-admin/tools" - "go-admin/tools/app" -) - -type SysJob struct { - apis.Api -} - -// RemoveJobForService 调用service实现 -func (e *SysJob) RemoveJobForService(c *gin.Context) { - msgID := tools.GenerateMsgIDFromContext(c) - db, err := e.GetOrm(c) - if err != nil { - log.Errorf("msgID[%s] error:%s", msgID, err) - app.Error(c, 500, err, "") - return - } - var v dto.GeneralDelDto - err = c.BindUri(&v) - if err != nil { - log.Errorf("msgID[%s] 参数验证错误, error:%s", msgID, err) - app.Error(c, 422, err, "参数验证失败") - return - } - s := service.SysJob{} - s.MsgID = msgID - s.Orm = db - err = s.RemoveJob(&v) - if err != nil { - app.Error(c, 500, err, "") - return - } - app.OK(c, nil, s.Msg) -} - -// StartJobForService 启动job service实现 -func (e *SysJob) StartJobForService(c *gin.Context) { - msgID := tools.GenerateMsgIDFromContext(c) - db, err := e.GetOrm(c) - if err != nil { - log.Errorf("msgID[%s] error:%s", msgID, err) - app.Error(c, 500, err, "") - return - } - var v dto.GeneralGetDto - err = c.BindUri(&v) - if err != nil { - log.Errorf("msgID[%s] 参数验证错误, error:%s", msgID, err) - app.Error(c, 422, err, "参数验证失败") - return - } - s := service.SysJob{} - s.Orm = db - s.MsgID = msgID - err = s.StartJob(&v) - if err != nil { - app.Error(c, 500, err, "") - return - } - app.OK(c, nil, s.Msg) -} diff --git a/app/admin/apis/system/captcha.go b/app/admin/apis/system/captcha.go index 26439a18..511fb784 100644 --- a/app/admin/apis/system/captcha.go +++ b/app/admin/apis/system/captcha.go @@ -2,16 +2,24 @@ package system import ( "github.com/gin-gonic/gin" - - "go-admin/tools" - "go-admin/tools/app" - "go-admin/tools/captcha" + "github.com/go-admin-team/go-admin-core/sdk/pkg/captcha" + "go-admin/common/apis" ) -func GenerateCaptchaHandler(c *gin.Context) { +type System struct { + apis.Api +} + +func (e System) GenerateCaptchaHandler(c *gin.Context) { + e.Context = c + log := e.GetLogger() id, b64s, err := captcha.DriverDigitFunc() - tools.HasError(err, "验证码获取失败", 500) - app.Custum(c, gin.H{ + if err != nil { + log.Errorf("DriverDigitFunc error, %s", err.Error()) + e.Error(500, err, "验证码获取失败") + return + } + e.Custom(gin.H{ "code": 200, "data": b64s, "id": id, diff --git a/app/admin/apis/system/config.go b/app/admin/apis/system/config.go deleted file mode 100644 index 9a07a63b..00000000 --- a/app/admin/apis/system/config.go +++ /dev/null @@ -1,149 +0,0 @@ -package system - -import ( - "net/http" - - "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" - - "go-admin/app/admin/models" - "go-admin/tools" - "go-admin/tools/app" - "go-admin/tools/app/msg" -) - -// @Summary 配置列表数据 -// @Description 获取JSON -// @Tags 配置 -// @Param configKey query string false "configKey" -// @Param configName query string false "configName" -// @Param configType query string false "configType" -// @Param pageSize query int false "页条数" -// @Param pageIndex query int false "页码" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/configList [get] -// @Security Bearer -func GetConfigList(c *gin.Context) { - var data models.SysConfig - var err error - var pageSize = 10 - var pageIndex = 1 - - if size := c.Request.FormValue("pageSize"); size != "" { - pageSize, err = tools.StringToInt(size) - } - - if index := c.Request.FormValue("pageIndex"); index != "" { - pageIndex, err = tools.StringToInt(index) - } - - data.ConfigKey = c.Request.FormValue("configKey") - data.ConfigName = c.Request.FormValue("configName") - data.ConfigType = c.Request.FormValue("configType") - data.DataScope = tools.GetUserIdStr(c) - result, count, err := data.GetPage(pageSize, pageIndex) - tools.HasError(err, "", -1) - - var mp = make(map[string]interface{}, 3) - mp["list"] = result - mp["count"] = count - mp["pageIndex"] = pageIndex - mp["pageSize"] = pageSize - - var res app.Response - res.Data = mp - - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 获取配置 -// @Description 获取JSON -// @Tags 配置 -// @Param configId path int true "配置编码" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/config/{configId} [get] -// @Security Bearer -func GetConfig(c *gin.Context) { - var Config models.SysConfig - Config.ConfigId, _ = tools.StringToInt(c.Param("configId")) - result, err := Config.Get() - tools.HasError(err, "抱歉未找到相关信息", -1) - - var res app.Response - res.Data = result - - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 获取配置 -// @Description 获取JSON -// @Tags 配置 -// @Param configKey path int true "configKey" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/configKey/{configKey} [get] -// @Security Bearer -func GetConfigByConfigKey(c *gin.Context) { - var Config models.SysConfig - Config.ConfigKey = c.Param("configKey") - result, err := Config.Get() - tools.HasError(err, "抱歉未找到相关信息", -1) - - app.OK(c, result, result.ConfigValue) -} - -// @Summary 添加配置 -// @Description 获取JSON -// @Tags 配置 -// @Accept application/json -// @Product application/json -// @Param data body models.SysConfig true "data" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/dict/data [post] -// @Security Bearer -func InsertConfig(c *gin.Context) { - var data models.SysConfig - err := c.BindWith(&data, binding.JSON) - data.CreateBy = tools.GetUserIdStr(c) - tools.HasError(err, "", 500) - result, err := data.Create() - tools.HasError(err, "", -1) - - app.OK(c, result, "") -} - -// @Summary 修改配置 -// @Description 获取JSON -// @Tags 配置 -// @Accept application/json -// @Product application/json -// @Param data body models.SysConfig true "body" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/config [put] -// @Security Bearer -func UpdateConfig(c *gin.Context) { - var data models.SysConfig - err := c.BindWith(&data, binding.JSON) - tools.HasError(err, "数据解析失败", -1) - data.UpdateBy = tools.GetUserIdStr(c) - result, err := data.Update(data.ConfigId) - tools.HasError(err, "", -1) - app.OK(c, result, "") -} - -// @Summary 删除配置 -// @Description 删除数据 -// @Tags 配置 -// @Param configId path int true "configId" -// @Success 200 {string} string "{"code": 200, "message": "删除成功"}" -// @Success 200 {string} string "{"code": -1, "message": "删除失败"}" -// @Router /api/v1/config/{configId} [delete] -func DeleteConfig(c *gin.Context) { - var data models.SysConfig - data.UpdateBy = tools.GetUserIdStr(c) - IDS := tools.IdsStrToIdsIntGroup("configId", c) - result, err := data.BatchDelete(IDS) - tools.HasError(err, "修改失败", 500) - app.OK(c, result, msg.DeletedSuccess) -} diff --git a/app/admin/apis/system/dept.go b/app/admin/apis/system/dept.go deleted file mode 100644 index fb33bfae..00000000 --- a/app/admin/apis/system/dept.go +++ /dev/null @@ -1,133 +0,0 @@ -package system - -import ( - "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" - - "go-admin/app/admin/models" - "go-admin/tools" - "go-admin/tools/app" - "go-admin/tools/app/msg" -) - -// @Summary 分页部门列表数据 -// @Description 分页列表 -// @Tags 部门 -// @Param name query string false "name" -// @Param id query string false "id" -// @Param position query string false "position" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/deptList [get] -// @Security Bearer -func GetDeptList(c *gin.Context) { - var Dept models.SysDept - Dept.DeptName = c.Request.FormValue("deptName") - Dept.Status = c.Request.FormValue("status") - Dept.DeptId, _ = tools.StringToInt(c.Request.FormValue("deptId")) - Dept.DataScope = tools.GetUserIdStr(c) - result, err := Dept.SetDept(true) - tools.HasError(err, "抱歉未找到相关信息", -1) - app.OK(c, result, "") -} - -func GetDeptTree(c *gin.Context) { - var Dept models.SysDept - Dept.DeptName = c.Request.FormValue("deptName") - Dept.Status = c.Request.FormValue("status") - Dept.DeptId, _ = tools.StringToInt(c.Request.FormValue("deptId")) - result, err := Dept.SetDept(false) - tools.HasError(err, "抱歉未找到相关信息", -1) - app.OK(c, result, "") -} - -// @Summary 部门列表数据 -// @Description 获取JSON -// @Tags 部门 -// @Param deptId path string false "deptId" -// @Param position query string false "position" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/dept/{deptId} [get] -// @Security Bearer -func GetDept(c *gin.Context) { - var Dept models.SysDept - Dept.DeptId, _ = tools.StringToInt(c.Param("deptId")) - Dept.DataScope = tools.GetUserIdStr(c) - result, err := Dept.Get() - tools.HasError(err, msg.NotFound, 404) - app.OK(c, result, msg.GetSuccess) -} - -// @Summary 添加部门 -// @Description 获取JSON -// @Tags 部门 -// @Accept application/json -// @Product application/json -// @Param data body models.SysDept true "data" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/dept [post] -// @Security Bearer -func InsertDept(c *gin.Context) { - var data models.SysDept - err := c.BindWith(&data, binding.JSON) - tools.HasError(err, "", 500) - data.CreateBy = tools.GetUserIdStr(c) - result, err := data.Create() - tools.HasError(err, "", -1) - app.OK(c, result, msg.CreatedSuccess) -} - -// @Summary 修改部门 -// @Description 获取JSON -// @Tags 部门 -// @Accept application/json -// @Product application/json -// @Param id path int true "id" -// @Param data body models.SysDept true "body" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/dept [put] -// @Security Bearer -func UpdateDept(c *gin.Context) { - var data models.SysDept - err := c.BindJSON(&data) - tools.HasError(err, "", -1) - data.UpdateBy = tools.GetUserIdStr(c) - result, err := data.Update(data.DeptId) - tools.HasError(err, "", -1) - app.OK(c, result, msg.UpdatedSuccess) -} - -// @Summary 删除部门 -// @Description 删除数据 -// @Tags 部门 -// @Param id path int true "id" -// @Success 200 {string} string "{"code": 200, "message": "删除成功"}" -// @Success 200 {string} string "{"code": -1, "message": "删除失败"}" -// @Router /api/v1/dept/{id} [delete] -func DeleteDept(c *gin.Context) { - var data models.SysDept - id, err := tools.StringToInt(c.Param("id")) - _, err = data.Delete(id) - tools.HasError(err, "删除失败", 500) - app.OK(c, "", msg.DeletedSuccess) -} - -func GetDeptTreeRoleselect(c *gin.Context) { - var Dept models.SysDept - var SysRole models.SysRole - id, err := tools.StringToInt(c.Param("roleId")) - SysRole.RoleId = id - result, err := Dept.SetDeptLable() - tools.HasError(err, msg.NotFound, -1) - menuIds := make([]int, 0) - if id != 0 { - menuIds, err = SysRole.GetRoleDeptId() - tools.HasError(err, "抱歉未找到相关信息", -1) - } - app.Custum(c, gin.H{ - "code": 200, - "depts": result, - "checkedKeys": menuIds, - }) -} diff --git a/app/admin/apis/system/dict/dictdata.go b/app/admin/apis/system/dict/dictdata.go deleted file mode 100644 index bd58b907..00000000 --- a/app/admin/apis/system/dict/dictdata.go +++ /dev/null @@ -1,154 +0,0 @@ -package dict - -import ( - "net/http" - - "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" - - "go-admin/app/admin/models" - "go-admin/tools" - "go-admin/tools/app" -) - -// @Summary 字典数据列表 -// @Description 获取JSON -// @Tags 字典数据 -// @Param status query string false "status" -// @Param dictCode query string false "dictCode" -// @Param dictType query string false "dictType" -// @Param pageSize query int false "页条数" -// @Param pageIndex query int false "页码" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/dict/data/list [get] -// @Security Bearer -func GetDictDataList(c *gin.Context) { - var data models.DictData - var err error - var pageSize = 10 - var pageIndex = 1 - - if size := c.Request.FormValue("pageSize"); size != "" { - pageSize, err = tools.StringToInt(size) - } - - if index := c.Request.FormValue("pageIndex"); index != "" { - pageIndex, err = tools.StringToInt(index) - } - - data.DictLabel = c.Request.FormValue("dictLabel") - data.Status = c.Request.FormValue("status") - data.DictType = c.Request.FormValue("dictType") - id := c.Request.FormValue("dictCode") - data.DictCode, _ = tools.StringToInt(id) - data.DataScope = tools.GetUserIdStr(c) - result, count, err := data.GetPage(pageSize, pageIndex) - tools.HasError(err, "", -1) - - var mp = make(map[string]interface{}, 3) - mp["list"] = result - mp["count"] = count - mp["pageIndex"] = pageIndex - mp["pageSize"] = pageSize - - var res app.Response - res.Data = mp - - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 通过编码获取字典数据 -// @Description 获取JSON -// @Tags 字典数据 -// @Param dictCode path int true "字典编码" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/dict/data/{dictCode} [get] -// @Security Bearer -func GetDictData(c *gin.Context) { - var DictData models.DictData - DictData.DictLabel = c.Request.FormValue("dictLabel") - DictData.DictCode, _ = tools.StringToInt(c.Param("dictCode")) - result, err := DictData.GetByCode() - tools.HasError(err, "抱歉未找到相关信息", -1) - var res app.Response - res.Data = result - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 通过字典类型获取字典数据 -// @Description 获取JSON -// @Tags 字典数据 -// @Param dictType path int true "dictType" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/dict/databyType/{dictType} [get] -// @Security Bearer -func GetDictDataByDictType(c *gin.Context) { - var DictData models.DictData - DictData.DictType = c.Param("dictType") - result, err := DictData.Get() - tools.HasError(err, "抱歉未找到相关信息", -1) - - var res app.Response - res.Data = result - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 添加字典数据 -// @Description 获取JSON -// @Tags 字典数据 -// @Accept application/json -// @Product application/json -// @Param data body models.DictType true "data" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/dict/data [post] -// @Security Bearer -func InsertDictData(c *gin.Context) { - var data models.DictData - err := c.ShouldBindJSON(&data) - data.CreateBy = tools.GetUserIdStr(c) - tools.HasError(err, "", 500) - result, err := data.Create() - tools.HasError(err, "", -1) - var res app.Response - res.Data = result - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 修改字典数据 -// @Description 获取JSON -// @Tags 字典数据 -// @Accept application/json -// @Product application/json -// @Param data body models.DictType true "body" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/dict/data [put] -// @Security Bearer -func UpdateDictData(c *gin.Context) { - var data models.DictData - err := c.BindWith(&data, binding.JSON) - data.UpdateBy = tools.GetUserIdStr(c) - tools.HasError(err, "", -1) - result, err := data.Update(data.DictCode) - tools.HasError(err, "", -1) - var res app.Response - res.Data = result - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 删除字典数据 -// @Description 删除数据 -// @Tags 字典数据 -// @Param dictCode path int true "dictCode" -// @Success 200 {string} string "{"code": 200, "message": "删除成功"}" -// @Success 200 {string} string "{"code": -1, "message": "删除失败"}" -// @Router /api/v1/dict/data/{dictCode} [delete] -func DeleteDictData(c *gin.Context) { - var data models.DictData - data.UpdateBy = tools.GetUserIdStr(c) - IDS := tools.IdsStrToIdsIntGroup("dictCode", c) - result, err := data.BatchDelete(IDS) - tools.HasError(err, "修改失败", 500) - app.OK(c, result, "删除成功") -} diff --git a/app/admin/apis/system/dict/dicttype.go b/app/admin/apis/system/dict/dicttype.go deleted file mode 100644 index bf9fe500..00000000 --- a/app/admin/apis/system/dict/dicttype.go +++ /dev/null @@ -1,137 +0,0 @@ -package dict - -import ( - "net/http" - - "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" - - "go-admin/app/admin/models" - "go-admin/tools" - "go-admin/tools/app" -) - -// @Summary 字典类型列表数据 -// @Description 获取JSON -// @Tags 字典类型 -// @Param dictName query string false "dictName" -// @Param dictId query string false "dictId" -// @Param dictType query string false "dictType" -// @Param pageSize query int false "页条数" -// @Param pageIndex query int false "页码" -// @Success 200 {object} app.PageResponse "{"code": 200, "data": [...]}" -// @Router /api/v1/dict/type/list [get] -// @Security Bearer -func GetDictTypeList(c *gin.Context) { - var data models.DictType - var err error - var pageSize = 10 - var pageIndex = 1 - - if size := c.Request.FormValue("pageSize"); size != "" { - pageSize, err = tools.StringToInt(size) - } - - if index := c.Request.FormValue("pageIndex"); index != "" { - pageIndex, err = tools.StringToInt(index) - } - - data.DictName = c.Request.FormValue("dictName") - id := c.Request.FormValue("dictId") - data.DictId, _ = tools.StringToInt(id) - data.DictType = c.Request.FormValue("dictType") - data.DataScope = tools.GetUserIdStr(c) - result, count, err := data.GetPage(pageSize, pageIndex) - tools.HasError(err, "", -1) - - app.PageOK(c, result, count, pageIndex, pageSize, "") -} - -// @Summary 通过字典id获取字典类型 -// @Description 获取JSON -// @Tags 字典类型 -// @Param dictId path int true "字典类型编码" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/dict/type/{dictId} [get] -// @Security Bearer -func GetDictType(c *gin.Context) { - var DictType models.DictType - DictType.DictName = c.Request.FormValue("dictName") - DictType.DictId, _ = tools.StringToInt(c.Param("dictId")) - result, err := DictType.Get() - tools.HasError(err, "抱歉未找到相关信息", -1) - var res app.Response - res.Data = result - c.JSON(http.StatusOK, res.ReturnOK()) -} - -func GetDictTypeOptionSelect(c *gin.Context) { - var DictType models.DictType - DictType.DictName = c.Request.FormValue("dictName") - DictType.DictId, _ = tools.StringToInt(c.Param("dictId")) - result, err := DictType.GetList() - tools.HasError(err, "抱歉未找到相关信息", -1) - var res app.Response - res.Data = result - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 添加字典类型 -// @Description 获取JSON -// @Tags 字典类型 -// @Accept application/json -// @Product application/json -// @Param data body models.DictType true "data" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/dict/type [post] -// @Security Bearer -func InsertDictType(c *gin.Context) { - var data models.DictType - err := c.BindWith(&data, binding.JSON) - data.CreateBy = tools.GetUserIdStr(c) - tools.HasError(err, "", 500) - result, err := data.Create() - tools.HasError(err, "", -1) - var res app.Response - res.Data = result - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 修改字典类型 -// @Description 获取JSON -// @Tags 字典类型 -// @Accept application/json -// @Product application/json -// @Param data body models.DictType true "body" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/dict/type [put] -// @Security Bearer -func UpdateDictType(c *gin.Context) { - var data models.DictType - err := c.BindWith(&data, binding.JSON) - data.UpdateBy = tools.GetUserIdStr(c) - tools.HasError(err, "", -1) - result, err := data.Update(data.DictId) - tools.HasError(err, "", -1) - var res app.Response - res.Data = result - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 删除字典类型 -// @Description 删除数据 -// @Tags 字典类型 -// @Param dictId path int true "dictId" -// @Success 200 {string} string "{"code": 200, "message": "删除成功"}" -// @Success 200 {string} string "{"code": -1, "message": "删除失败"}" -// @Router /api/v1/dict/type/{dictId} [delete] -func DeleteDictType(c *gin.Context) { - var data models.DictType - data.UpdateBy = tools.GetUserIdStr(c) - IDS := tools.IdsStrToIdsIntGroup("dictId", c) - result, err := data.BatchDelete(IDS) - tools.HasError(err, "修改失败", 500) - app.OK(c, result, "删除成功") -} diff --git a/app/admin/apis/system/dict/sys_dict_data.go b/app/admin/apis/system/dict/sys_dict_data.go new file mode 100644 index 00000000..94d16df7 --- /dev/null +++ b/app/admin/apis/system/dict/sys_dict_data.go @@ -0,0 +1,269 @@ +package dict + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" + _ "github.com/go-admin-team/go-admin-core/sdk/pkg/response" + + "go-admin/app/admin/models/system" + "go-admin/app/admin/service" + "go-admin/app/admin/service/dto" + "go-admin/common/apis" + common "go-admin/common/models" +) + +type SysDictData struct { + apis.Api +} + +// @Summary 字典数据列表 +// @Description 获取JSON +// @Tags 字典数据 +// @Param status query string false "status" +// @Param dictCode query string false "dictCode" +// @Param dictType query string false "dictType" +// @Param pageSize query int false "页条数" +// @Param pageIndex query int false "页码" +// @Success 200 {object} response.Response "{"code": 200, "data": [...]}" +// @Router /api/v1/dict/data [get] +// @Security Bearer +func (e SysDictData) GetSysDictDataList(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + req := &dto.SysDictDataSearch{} + + //查询列表 + err = req.Bind(c) + if err != nil { + log.Warnf("Bind error: %s", err.Error()) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + list := make([]system.SysDictData, 0) + var count int64 + s := service.SysDictData{} + s.Log = log + s.Orm = db.Debug() + err = s.GetPage(req, &list, &count) + if err != nil { + log.Errorf("GetPage error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "查询失败") + return + } + + e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") +} + +// @Summary 通过编码获取字典数据 +// @Description 获取JSON +// @Tags 字典数据 +// @Param dictCode path int true "字典编码" +// @Success 200 {object} response.Response "{"code": 200, "data": [...]}" +// @Router /api/v1/dict/data/{dictCode} [get] +// @Security Bearer +func (e SysDictData) GetSysDictData(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //查看详情 + req := &dto.SysDictDataById{} + err = req.Bind(c) + if err != nil { + log.Warnf("Bind error: %s", err.Error()) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object system.SysDictData + + s := service.SysDictData{} + s.Log = log + s.Orm = db + err = s.Get(req, &object) + if err != nil { + log.Warnf("Get error: %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "查询失败") + return + } + + e.OK(object, "查看成功") +} + +// @Summary 添加字典数据 +// @Description 获取JSON +// @Tags 字典数据 +// @Accept application/json +// @Product application/json +// @Param data body dto.SysDictDataControl true "data" +// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" +// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" +// @Router /api/v1/dict/data [post] +// @Security Bearer +func (e SysDictData) InsertSysDictData(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //新增操作 + req := &dto.SysDictDataControl{} + err = req.Bind(c) + if err != nil { + log.Warnf("Bind error: %s", err.Error()) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + object, _ := req.GenerateM() + // 设置创建人 + object.SetCreateBy(user.GetUserId(c)) + + s := service.SysDictData{} + s.Orm = db + s.Log = log + err = s.Insert(object.(*system.SysDictData)) + if err != nil { + log.Errorf("Insert error, %s", err) + e.Error(http.StatusInternalServerError, err, "创建失败") + return + } + + e.OK(object.GetId(), "创建成功") +} + +// @Summary 修改字典数据 +// @Description 获取JSON +// @Tags 字典数据 +// @Accept application/json +// @Product application/json +// @Param data body dto.SysDictDataControl true "body" +// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" +// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" +// @Router /api/v1/dict/data/{dictCode} [put] +// @Security Bearer +func (e SysDictData) UpdateSysDictData(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + req := &dto.SysDictDataControl{} + //更新操作 + err = req.Bind(c) + if err != nil { + log.Warnf("request validate error, %s", err.Error()) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + object, _ := req.GenerateM() + object.SetUpdateBy(user.GetUserId(c)) + + s := service.SysDictData{} + s.Orm = db + s.Log = log + err = s.Update(object.(*system.SysDictData)) + if err != nil { + log.Errorf("Update error, %s", err) + e.Error(http.StatusInternalServerError, err, "更新失败") + return + } + e.OK(object.GetId(), "更新成功") +} + +// @Summary 删除字典数据 +// @Description 删除数据 +// @Tags 字典数据 +// @Param dictCode path int true "dictCode" +// @Success 200 {string} string "{"code": 200, "message": "删除成功"}" +// @Success 200 {string} string "{"code": -1, "message": "删除失败"}" +// @Router /api/v1/dict/data/{dictCode} [delete] +func (e SysDictData) DeleteSysDictData(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //删除操作 + req := new(dto.SysDictDataById) + err = req.Bind(c) + if err != nil { + log.Warnf("Bind error: %s", err) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object common.ActiveRecord + object, err = req.GenerateM() + if err != nil { + log.Errorf("GenerateM error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "模型生成失败") + return + } + + // 设置编辑人 + object.SetUpdateBy(user.GetUserId(c)) + + s := service.SysDictData{} + s.Orm = db + s.Log = log + err = s.Remove(req, object.(*system.SysDictData)) + if err != nil { + log.Errorf("Remove error, %s", err) + e.Error(http.StatusInternalServerError, err, "删除失败") + return + } + e.OK(object.GetId(), "删除成功") +} + +func (e SysDictData) GetSysDictDataAll(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + req := &dto.SysDictDataSearch{} + + //查询列表 + err = req.Bind(c) + if err != nil { + log.Warnf("Bind error: %s", err) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + list := make([]system.SysDictData, 0) + s := service.SysDictData{} + s.Log = log + s.Orm = db + err = s.GetAll(req, &list) + if err != nil { + log.Errorf("GetAll error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "查询失败") + return + } + + e.OK(list, "查询成功") +} diff --git a/app/admin/apis/system/dict/sys_dict_type.go b/app/admin/apis/system/dict/sys_dict_type.go new file mode 100644 index 00000000..c2a05296 --- /dev/null +++ b/app/admin/apis/system/dict/sys_dict_type.go @@ -0,0 +1,267 @@ +package dict + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" + _ "github.com/go-admin-team/go-admin-core/sdk/pkg/response" + + "go-admin/app/admin/models/system" + "go-admin/app/admin/service" + "go-admin/app/admin/service/dto" + "go-admin/common/apis" + common "go-admin/common/models" +) + +type SysDictType struct { + apis.Api +} + +// @Summary 字典类型列表数据 +// @Description 获取JSON +// @Tags 字典类型 +// @Param dictName query string false "dictName" +// @Param dictId query string false "dictId" +// @Param dictType query string false "dictType" +// @Param pageSize query int false "页条数" +// @Param pageIndex query int false "页码" +// @Success 200 {object} response.Response "{"code": 200, "data": [...]}" +// @Router /api/v1/dict/type [get] +// @Security Bearer +func (e SysDictType) GetSysDictTypeList(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + req := &dto.SysDictTypeSearch{} + + //查询列表 + err = req.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + list := make([]system.SysDictType, 0) + var count int64 + s := service.SysDictType{} + s.Log = log + s.Orm = db.Debug() + err = s.GetPage(req, &list, &count) + if err != nil { + e.Error(http.StatusInternalServerError, err, "查询失败") + return + } + + e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") +} + +// @Summary 通过字典id获取字典类型 +// @Description 获取JSON +// @Tags 字典类型 +// @Param dictId path int true "字典类型编码" +// @Success 200 {object} response.Response "{"code": 200, "data": [...]}" +// @Router /api/v1/dict/type/{dictId} [get] +// @Security Bearer +func (e SysDictType) GetSysDictType(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //查看详情 + req := &dto.SysDictTypeById{} + err = req.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object system.SysDictType + + s := service.SysDictType{} + s.Log = log + s.Orm = db + err = s.Get(req, &object) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "查询失败") + return + } + + e.OK(object, "查看成功") +} + +// @Summary 添加字典类型 +// @Description 获取JSON +// @Tags 字典类型 +// @Accept application/json +// @Product application/json +// @Param data body dto.SysDictTypeControl true "data" +// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" +// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" +// @Router /api/v1/dict/type [post] +// @Security Bearer +func (e SysDictType) InsertSysDictType(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //新增操作 + req := &dto.SysDictTypeControl{} + err = req.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + object, _ := req.GenerateM() + // 设置创建人 + object.SetCreateBy(user.GetUserId(c)) + + s := service.SysDictType{} + s.Orm = db + s.Log = log + err = s.Insert(object.(*system.SysDictType)) + if err != nil { + log.Error(err) + e.Error(http.StatusInternalServerError, err, "创建失败") + return + } + + e.OK(object.GetId(), "创建成功") +} + +// @Summary 修改字典类型 +// @Description 获取JSON +// @Tags 字典类型 +// @Accept application/json +// @Product application/json +// @Param data body dto.SysDictTypeControl true "body" +// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" +// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" +// @Router /api/v1/dict/type/{dictId} [put] +// @Security Bearer +func (e SysDictType) UpdateSysDictType(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + req := &dto.SysDictTypeControl{} + //更新操作 + err = req.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + object, _ := req.GenerateM() + object.SetUpdateBy(user.GetUserId(c)) + + s := service.SysDictType{} + s.Orm = db + s.Log = log + err = s.Update(object.(*system.SysDictType)) + if err != nil { + log.Error(err) + return + } + e.OK(object.GetId(), "更新成功") +} + +// @Summary 删除字典类型 +// @Description 删除数据 +// @Tags 字典类型 +// @Param dictId path int true "dictId" +// @Success 200 {string} string "{"code": 200, "message": "删除成功"}" +// @Success 200 {string} string "{"code": -1, "message": "删除失败"}" +// @Router /api/v1/dict/type/{dictId} [delete] +func (e SysDictType) DeleteSysDictType(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //删除操作 + req := new(dto.SysDictTypeById) + err = req.Bind(c) + if err != nil { + log.Errorf("Bind error: %s", err) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object common.ActiveRecord + object, err = req.GenerateM() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") + return + } + + // 设置编辑人 + object.SetUpdateBy(user.GetUserId(c)) + + s := service.SysDictType{} + s.Orm = db + s.Log = log + err = s.Remove(req, object.(*system.SysDictType)) + if err != nil { + log.Error(err) + return + } + e.OK(object.GetId(), "删除成功") +} + +// @Summary 字典类型全部数据 +// @Description 获取JSON +// @Tags 字典类型 +// @Param dictName query string false "dictName" +// @Param dictId query string false "dictId" +// @Param dictType query string false "dictType" +// @Success 200 {object} response.Response "{"code": 200, "data": [...]}" +// @Router /api/v1/dict/type-option-select [get] +// @Security Bearer +func (e SysDictType) GetSysDictTypeAll(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + req := &dto.SysDictTypeSearch{} + + //查询列表 + err = req.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + list := make([]system.SysDictType, 0) + s := service.SysDictType{} + s.Log = log + s.Orm = db + err = s.GetAll(req, &list) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "查询失败") + return + } + + e.OK(list, "查询成功") +} diff --git a/app/admin/apis/system/index.go b/app/admin/apis/system/index.go index 53327064..59997496 100644 --- a/app/admin/apis/system/index.go +++ b/app/admin/apis/system/index.go @@ -28,7 +28,7 @@ $(function(){ - + ` diff --git a/app/admin/apis/system/info.go b/app/admin/apis/system/info.go deleted file mode 100644 index 694abcd6..00000000 --- a/app/admin/apis/system/info.go +++ /dev/null @@ -1,53 +0,0 @@ -package system - -import ( - "github.com/gin-gonic/gin" - - "go-admin/app/admin/models" - "go-admin/tools" - "go-admin/tools/app" -) - -func GetInfo(c *gin.Context) { - - var roles = make([]string, 1) - roles[0] = tools.GetRoleName(c) - - var permissions = make([]string, 1) - permissions[0] = "*:*:*" - - var buttons = make([]string, 1) - buttons[0] = "*:*:*" - - RoleMenu := models.RoleMenu{} - RoleMenu.RoleId = tools.GetRoleId(c) - - var mp = make(map[string]interface{}) - mp["roles"] = roles - if tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员" { - mp["permissions"] = permissions - mp["buttons"] = buttons - } else { - list, _ := RoleMenu.GetPermis() - mp["permissions"] = list - mp["buttons"] = list - } - - sysuser := models.SysUser{} - sysuser.UserId = tools.GetUserId(c) - user, err := sysuser.Get() - tools.HasError(err, "", 500) - - mp["introduction"] = " am a super administrator" - - mp["avatar"] = "https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif" - if user.Avatar != "" { - mp["avatar"] = user.Avatar - } - mp["userName"] = user.NickName - mp["userId"] = user.UserId - mp["deptId"] = user.DeptId - mp["name"] = user.NickName - - app.OK(c, mp, "") -} diff --git a/app/admin/apis/system/menu.go b/app/admin/apis/system/menu.go deleted file mode 100644 index dd01d624..00000000 --- a/app/admin/apis/system/menu.go +++ /dev/null @@ -1,177 +0,0 @@ -package system - -import ( - "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" - - "go-admin/app/admin/models" - "go-admin/tools" - "go-admin/tools/app" -) - -// @Summary Menu列表数据 -// @Description 获取JSON -// @Tags 菜单 -// @Param menuName query string false "menuName" -// @Success 200 {string} string "{"code": 200, "data": [...]}" -// @Success 200 {string} string "{"code": -1, "message": "抱歉未找到相关信息"}" -// @Router /api/v1/menulist [get] -// @Security Bearer -func GetMenuList(c *gin.Context) { - var Menu models.Menu - Menu.MenuName = c.Request.FormValue("menuName") - Menu.Visible = c.Request.FormValue("visible") - Menu.Title = c.Request.FormValue("title") - Menu.DataScope = tools.GetUserIdStr(c) - result, err := Menu.SetMenu() - tools.HasError(err, "抱歉未找到相关信息", -1) - - app.OK(c, result, "") -} - -// @Summary Menu列表数据 -// @Description 获取JSON -// @Tags 菜单 -// @Param menuName query string false "menuName" -// @Success 200 {string} string "{"code": 200, "data": [...]}" -// @Success 200 {string} string "{"code": -1, "message": "抱歉未找到相关信息"}" -// @Router /api/v1/menu [get] -// @Security Bearer -func GetMenu(c *gin.Context) { - var data models.Menu - id, err := tools.StringToInt(c.Param("id")) - data.MenuId = id - result, err := data.GetByMenuId() - tools.HasError(err, "抱歉未找到相关信息", -1) - app.OK(c, result, "") -} - -func GetMenuTreeRoleselect(c *gin.Context) { - var Menu models.Menu - var SysRole models.SysRole - id, err := tools.StringToInt(c.Param("roleId")) - SysRole.RoleId = id - result, err := Menu.SetMenuLable() - tools.HasError(err, "抱歉未找到相关信息", -1) - menuIds := make([]int, 0) - if id != 0 { - menuIds, err = SysRole.GetRoleMeunId() - tools.HasError(err, "抱歉未找到相关信息", -1) - } - app.Custum(c, gin.H{ - "code": 200, - "menus": result, - "checkedKeys": menuIds, - }) -} - -// @Summary 获取菜单树 -// @Description 获取JSON -// @Tags 菜单 -// @Accept application/x-www-form-urlencoded -// @Product application/x-www-form-urlencoded -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/menuTreeselect [get] -// @Security Bearer -func GetMenuTreeelect(c *gin.Context) { - var data models.Menu - result, err := data.SetMenuLable() - tools.HasError(err, "抱歉未找到相关信息", -1) - app.OK(c, result, "") -} - -// @Summary 创建菜单 -// @Description 获取JSON -// @Tags 菜单 -// @Accept application/x-www-form-urlencoded -// @Product application/x-www-form-urlencoded -// @Param menuName formData string true "menuName" -// @Param Path formData string false "Path" -// @Param Action formData string true "Action" -// @Param Permission formData string true "Permission" -// @Param ParentId formData string true "ParentId" -// @Param IsDel formData string true "IsDel" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/menu [post] -// @Security Bearer -func InsertMenu(c *gin.Context) { - var data models.Menu - err := c.BindWith(&data, binding.JSON) - tools.HasError(err, "抱歉未找到相关信息", -1) - data.CreateBy = tools.GetUserIdStr(c) - result, err := data.Create() - tools.HasError(err, "抱歉未找到相关信息", -1) - app.OK(c, result, "") -} - -// @Summary 修改菜单 -// @Description 获取JSON -// @Tags 菜单 -// @Accept application/x-www-form-urlencoded -// @Product application/x-www-form-urlencoded -// @Param id path int true "id" -// @Param data body models.Menu true "body" -// @Success 200 {string} string "{"code": 200, "message": "修改成功"}" -// @Success 200 {string} string "{"code": -1, "message": "修改失败"}" -// @Router /api/v1/menu/{id} [put] -// @Security Bearer -func UpdateMenu(c *gin.Context) { - var data models.Menu - err2 := c.BindWith(&data, binding.JSON) - data.UpdateBy = tools.GetUserIdStr(c) - tools.HasError(err2, "修改失败", -1) - _, err := data.Update(data.MenuId) - tools.HasError(err, "", 501) - app.OK(c, "", "修改成功") - -} - -// @Summary 删除菜单 -// @Description 删除数据 -// @Tags 菜单 -// @Param id path int true "id" -// @Success 200 {string} string "{"code": 200, "message": "删除成功"}" -// @Success 200 {string} string "{"code": -1, "message": "删除失败"}" -// @Router /api/v1/menu/{id} [delete] -func DeleteMenu(c *gin.Context) { - var data models.Menu - id, err := tools.StringToInt(c.Param("id")) - data.UpdateBy = tools.GetUserIdStr(c) - _, err = data.Delete(id) - tools.HasError(err, "删除失败", 500) - app.OK(c, "", "删除成功") -} - -// @Summary 根据角色名称获取菜单列表数据(左菜单使用) -// @Description 获取JSON -// @Tags 菜单 -// @Param id path int true "id" -// @Success 200 {string} string "{"code": 200, "data": [...]}" -// @Success 200 {string} string "{"code": -1, "message": "抱歉未找到相关信息"}" -// @Router /api/v1/menurole [get] -// @Security Bearer -func GetMenuRole(c *gin.Context) { - var Menu models.Menu - result, err := Menu.SetMenuRole(tools.GetRoleName(c)) - tools.HasError(err, "获取失败", 500) - app.OK(c, result, "") -} - -// @Summary 获取角色对应的菜单id数组 -// @Description 获取JSON -// @Tags 菜单 -// @Param id path int true "id" -// @Success 200 {string} string "{"code": 200, "data": [...]}" -// @Success 200 {string} string "{"code": -1, "message": "抱歉未找到相关信息"}" -// @Router /api/v1/menuids/{id} [get] -// @Security Bearer -func GetMenuIDS(c *gin.Context) { - var data models.RoleMenu - data.RoleName = c.GetString("role") - data.UpdateBy = tools.GetUserIdStr(c) - result, err := data.GetIDS() - tools.HasError(err, "获取失败", 500) - app.OK(c, result, "") -} diff --git a/app/admin/apis/system/post.go b/app/admin/apis/system/post.go deleted file mode 100644 index 9569ed1a..00000000 --- a/app/admin/apis/system/post.go +++ /dev/null @@ -1,118 +0,0 @@ -package system - -import ( - "github.com/gin-gonic/gin" - - "go-admin/app/admin/models" - "go-admin/tools" - "go-admin/tools/app" -) - -// @Summary 岗位列表数据 -// @Description 获取JSON -// @Tags 岗位 -// @Param postName query string false "postName" -// @Param postCode query string false "postCode" -// @Param postId query string false "postId" -// @Param status query string false "status" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/post [get] -// @Security Bearer -func GetPostList(c *gin.Context) { - var data models.Post - var err error - var pageSize = 10 - var pageIndex = 1 - - if size := c.Request.FormValue("pageSize"); size != "" { - pageSize, err = tools.StringToInt(size) - } - - if index := c.Request.FormValue("pageIndex"); index != "" { - pageIndex, err = tools.StringToInt(index) - } - - id := c.Request.FormValue("postId") - data.PostId, _ = tools.StringToInt(id) - - data.PostCode = c.Request.FormValue("postCode") - data.PostName = c.Request.FormValue("postName") - data.Status = c.Request.FormValue("status") - - data.DataScope = tools.GetUserIdStr(c) - result, count, err := data.GetPage(pageSize, pageIndex) - tools.HasError(err, "", -1) - app.PageOK(c, result, count, pageIndex, pageSize, "") -} - -// @Summary 获取岗位信息 -// @Description 获取JSON -// @Tags 岗位 -// @Param postId path int true "postId" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/post/{postId} [get] -// @Security Bearer -func GetPost(c *gin.Context) { - var Post models.Post - Post.PostId, _ = tools.StringToInt(c.Param("postId")) - result, err := Post.Get() - tools.HasError(err, "抱歉未找到相关信息", -1) - app.OK(c, result, "") -} - -// @Summary 添加岗位 -// @Description 获取JSON -// @Tags 岗位 -// @Accept application/json -// @Product application/json -// @Param data body models.Post true "data" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/post [post] -// @Security Bearer -func InsertPost(c *gin.Context) { - var data models.Post - err := c.Bind(&data) - data.CreateBy = tools.GetUserIdStr(c) - tools.HasError(err, "", 500) - result, err := data.Create() - tools.HasError(err, "", -1) - app.OK(c, result, "") -} - -// @Summary 修改岗位 -// @Description 获取JSON -// @Tags 岗位 -// @Accept application/json -// @Product application/json -// @Param data body models.Post true "body" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/post/ [put] -// @Security Bearer -func UpdatePost(c *gin.Context) { - var data models.Post - - err := c.Bind(&data) - data.UpdateBy = tools.GetUserIdStr(c) - tools.HasError(err, "", -1) - result, err := data.Update(data.PostId) - tools.HasError(err, "", -1) - app.OK(c, result, "修改成功") -} - -// @Summary 删除岗位 -// @Description 删除数据 -// @Tags 岗位 -// @Param id path int true "id" -// @Success 200 {string} string "{"code": 200, "message": "删除成功"}" -// @Success 500 {string} string "{"code": 500, "message": "删除失败"}" -// @Router /api/v1/post/{postId} [delete] -func DeletePost(c *gin.Context) { - var data models.Post - data.UpdateBy = tools.GetUserIdStr(c) - IDS := tools.IdsStrToIdsIntGroup("postId", c) - result, err := data.BatchDelete(IDS) - tools.HasError(err, "删除失败", 500) - app.OK(c, result, "删除成功") -} diff --git a/app/admin/apis/system/role.go b/app/admin/apis/system/role.go deleted file mode 100644 index 8b42af29..00000000 --- a/app/admin/apis/system/role.go +++ /dev/null @@ -1,163 +0,0 @@ -package system - -import ( - "github.com/gin-gonic/gin" - mycasbin "go-admin/pkg/casbin" - - "go-admin/app/admin/models" - "go-admin/tools" - "go-admin/tools/app" -) - -// @Summary 角色列表数据 -// @Description Get JSON -// @Tags 角色/Role -// @Param roleName query string false "roleName" -// @Param status query string false "status" -// @Param roleKey query string false "roleKey" -// @Param pageSize query int false "页条数" -// @Param pageIndex query int false "页码" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/rolelist [get] -// @Security Bearer -func GetRoleList(c *gin.Context) { - var data models.SysRole - var err error - var pageSize = 10 - var pageIndex = 1 - - if size := c.Request.FormValue("pageSize"); size != "" { - pageSize, err = tools.StringToInt(size) - } - - if index := c.Request.FormValue("pageIndex"); index != "" { - pageIndex, err = tools.StringToInt(index) - } - - data.RoleKey = c.Request.FormValue("roleKey") - data.RoleName = c.Request.FormValue("roleName") - data.Status = c.Request.FormValue("status") - data.DataScope = tools.GetUserIdStr(c) - result, count, err := data.GetPage(pageSize, pageIndex) - tools.HasError(err, "", -1) - - app.PageOK(c, result, count, pageIndex, pageSize, "") -} - -// @Summary 获取Role数据 -// @Description 获取JSON -// @Tags 角色/Role -// @Param roleId path string false "roleId" -// @Success 200 {string} string "{"code": 200, "data": [...]}" -// @Success 200 {string} string "{"code": -1, "message": "抱歉未找到相关信息"}" -// @Router /api/v1/role [get] -// @Security Bearer -func GetRole(c *gin.Context) { - var Role models.SysRole - Role.RoleId, _ = tools.StringToInt(c.Param("roleId")) - result, err := Role.Get() - menuIds := make([]int, 0) - menuIds, err = Role.GetRoleMeunId() - tools.HasError(err, "抱歉未找到相关信息", -1) - result.MenuIds = menuIds - app.OK(c, result, "") - -} - -// @Summary 创建角色 -// @Description 获取JSON -// @Tags 角色/Role -// @Accept application/json -// @Product application/json -// @Param data body models.SysRole true "data" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/role [post] -func InsertRole(c *gin.Context) { - var data models.SysRole - data.CreateBy = tools.GetUserIdStr(c) - err := c.Bind(&data) - tools.HasError(err, "数据解析失败", 500) - id, err := data.Insert() - tools.HasError(err, "", -1) - data.RoleId = id - - var t models.RoleMenu - if len(data.MenuIds) > 0 { - _, err = t.Insert(id, data.MenuIds) - tools.HasError(err, "", -1) - } - - _, err = mycasbin.LoadPolicy() - tools.HasError(err, "", -1) - - app.OK(c, data, "添加成功") -} - -// @Summary 修改用户角色 -// @Description 获取JSON -// @Tags 角色/Role -// @Accept application/json -// @Product application/json -// @Param data body models.SysRole true "body" -// @Success 200 {string} string "{"code": 200, "message": "修改成功"}" -// @Success 200 {string} string "{"code": -1, "message": "修改失败"}" -// @Router /api/v1/role [put] -func UpdateRole(c *gin.Context) { - var data models.SysRole - data.UpdateBy = tools.GetUserIdStr(c) - err := c.Bind(&data) - tools.HasError(err, "数据解析失败", -1) - result, err := data.Update(data.RoleId) - tools.HasError(err, "", -1) - var t models.RoleMenu - _, err = t.DeleteRoleMenu(data.RoleId) - tools.HasError(err, "修改失败(delete rm)", -1) - if len(data.MenuIds) > 0 { - _, err2 := t.Insert(data.RoleId, data.MenuIds) - tools.HasError(err2, "修改失败(insert)", -1) - } - - _, err = mycasbin.LoadPolicy() - tools.HasError(err, "", -1) - - app.OK(c, result, "修改成功") -} - -func UpdateRoleDataScope(c *gin.Context) { - var data models.SysRole - data.UpdateBy = tools.GetUserIdStr(c) - err := c.Bind(&data) - tools.HasError(err, "数据解析失败", -1) - result, err := data.Update(data.RoleId) - - var t models.SysRoleDept - _, err = t.DeleteRoleDept(data.RoleId) - tools.HasError(err, "添加失败1", -1) - if data.DataScope == "2" { - _, err2 := t.Insert(data.RoleId, data.DeptIds) - tools.HasError(err2, "添加失败2", -1) - } - app.OK(c, result, "修改成功") -} - -// @Summary 删除用户角色 -// @Description 删除数据 -// @Tags 角色/Role -// @Param roleId path int true "roleId" -// @Success 200 {string} string "{"code": 200, "message": "删除成功"}" -// @Success 200 {string} string "{"code": -1, "message": "删除失败"}" -// @Router /api/v1/role/{roleId} [delete] -func DeleteRole(c *gin.Context) { - var Role models.SysRole - Role.UpdateBy = tools.GetUserIdStr(c) - - IDS := tools.IdsStrToIdsIntGroup("roleId", c) - _, err := Role.BatchDelete(IDS) - tools.HasError(err, "删除失败", -1) - - _, err = mycasbin.LoadPolicy() - tools.HasError(err, "", -1) - - app.OK(c, "", "删除成功") -} diff --git a/app/admin/apis/system/rolemenu.go b/app/admin/apis/system/rolemenu.go deleted file mode 100644 index 1844599d..00000000 --- a/app/admin/apis/system/rolemenu.go +++ /dev/null @@ -1,73 +0,0 @@ -package system - -import ( - "fmt" - "net/http" - - "github.com/gin-gonic/gin" - - "go-admin/app/admin/models" - "go-admin/tools/app" -) - -// @Summary RoleMenu列表数据 -// @Description 获取JSON -// @Tags 角色菜单 -// @Param RoleId query string false "RoleId" -// @Success 200 {string} string "{"code": 200, "data": [...]}" -// @Success 200 {string} string "{"code": -1, "message": "抱歉未找到相关信息"}" -// @Router /api/v1/rolemenu [get] -// @Security Bearer -func GetRoleMenu(c *gin.Context) { - var Rm models.RoleMenu - err := c.ShouldBind(&Rm) - result, err := Rm.Get() - var res app.Response - if err != nil { - res.Msg = "抱歉未找到相关信息" - c.JSON(http.StatusOK, res.ReturnError(200)) - return - } - res.Data = result - c.JSON(http.StatusOK, res.ReturnOK()) -} - -type RoleMenuPost struct { - RoleId string - RoleMenu []models.RoleMenu -} - -func InsertRoleMenu(c *gin.Context) { - - var res app.Response - res.Msg = "添加成功" - c.JSON(http.StatusOK, res.ReturnOK()) - return - -} - -// @Summary 删除用户菜单数据 -// @Description 删除数据 -// @Tags 角色菜单 -// @Param id path string true "id" -// @Param menu_id query string false "menu_id" -// @Success 200 {string} string "{"code": 200, "message": "删除成功"}" -// @Success 200 {string} string "{"code": -1, "message": "删除失败"}" -// @Router /api/v1/rolemenu/{id} [delete] -func DeleteRoleMenu(c *gin.Context) { - var t models.RoleMenu - id := c.Param("id") - menuId := c.Request.FormValue("menu_id") - fmt.Println(menuId) - _, err := t.Delete(id, menuId) - if err != nil { - var res app.Response - res.Msg = "删除失败" - c.JSON(http.StatusOK, res.ReturnError(200)) - return - } - var res app.Response - res.Msg = "删除成功" - c.JSON(http.StatusOK, res.ReturnOK()) - return -} diff --git a/app/admin/apis/system/settings.go b/app/admin/apis/system/settings.go index 12335f55..af53e0eb 100644 --- a/app/admin/apis/system/settings.go +++ b/app/admin/apis/system/settings.go @@ -1,67 +1,98 @@ package system import ( - "errors" "fmt" + "net/http" "strings" "github.com/gin-gonic/gin" "go-admin/app/admin/models" - "go-admin/tools" - "go-admin/tools/app" + "go-admin/app/admin/service" + "go-admin/app/admin/service/dto" + "go-admin/common/apis" ) +type SysSetting struct { + apis.Api +} + // @Summary 查询系统信息 // @Description 获取JSON // @Tags 系统信息 // @Success 200 {string} string "{"code": 200, "message": "添加成功"}" // @Success 200 {string} string "{"code": -1, "message": "添加失败"}" // @Router /api/v1/setting [get] -func GetSetting(c *gin.Context) { - var s models.SysSetting - r, e := s.Get() +func (e SysSetting) GetSetting(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } - if r.Logo != "" { - if !strings.HasPrefix(r.Logo, "http") { - r.Logo = fmt.Sprintf("http://%s/%s", c.Request.Host, r.Logo) + sysSettingService := service.SysSetting{} + sysSettingService.Log = log + sysSettingService.Orm = db + var model = models.SysSetting{} + err = sysSettingService.GetSysSetting(&model) + if err != nil { + e.Error(http.StatusInternalServerError, err, "查询失败") + return + } + + if model.Logo != "" { + if !strings.HasPrefix(model.Logo, "http") { + model.Logo = fmt.Sprintf("http://%s/%s", c.Request.Host, model.Logo) } } - tools.HasError(e, "查询失败", 500) - app.OK(c, r, "查询成功") + e.OK(model, "查询成功") } // @Summary 更新或提交系统信息 // @Description 获取JSON // @Tags 系统信息 -// @Param data body models.SysUser true "body" +// @Param data body dto.SysSettingControl true "body" // @Success 200 {string} string "{"code": 200, "message": "添加成功"}" // @Success 200 {string} string "{"code": -1, "message": "添加失败"}" // @Router /api/v1/system/setting [post] -func CreateSetting(c *gin.Context) { - var s models.ResponseSystemConfig - if err := c.ShouldBind(&s); err != nil { - app.Error(c, 200, errors.New("缺少必要参数"), "") +func (e SysSetting) CreateOrUpdateSetting(c *gin.Context) { + control := new(dto.SysSettingControl) + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) return } - var sModel models.SysSetting - sModel.Logo = s.Logo - sModel.Name = s.Name - - a, e := sModel.Update() - if e != nil { - app.Error(c, 200, e, "") + //更新操作 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + object, err := control.Generate() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") return } - if a.Logo != "" { - if !strings.HasPrefix(a.Logo, "http") { - a.Logo = fmt.Sprintf("http://%s/%s", c.Request.Host, a.Logo) + sysSettingService := service.SysSetting{} + sysSettingService.Log = log + sysSettingService.Orm = db + err = sysSettingService.UpdateSysSetting(object) + if err != nil { + e.Error(http.StatusInternalServerError, err, "更新失败") + return + } + + if object.Logo != "" { + if !strings.HasPrefix(object.Logo, "http") { + object.Logo = fmt.Sprintf("http://%s/%s", c.Request.Host, object.Logo) } } - - app.OK(c, a, "提交成功") - + e.OK(object, "提交成功") } diff --git a/app/admin/apis/system/sys_config/sys_config.go b/app/admin/apis/system/sys_config/sys_config.go new file mode 100644 index 00000000..977de4f8 --- /dev/null +++ b/app/admin/apis/system/sys_config/sys_config.go @@ -0,0 +1,277 @@ +package sys_config + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" + + "go-admin/app/admin/models/system" + "go-admin/app/admin/service" + "go-admin/app/admin/service/dto" + "go-admin/common/apis" +) + +type SysConfig struct { + apis.Api +} + +func (e SysConfig) GetSysConfigList(c *gin.Context) { + e.Context = c + log := e.GetLogger() + d := new(dto.SysConfigSearch) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //查询列表 + err = d.Bind(c) + if err != nil { + log.Errorf("参数验证失败, error:%s", err) + e.Error(500, err, "参数验证失败") + return + } + + list := make([]system.SysConfig, 0) + var count int64 + s := service.SysConfig{} + s.Log = log + s.Orm = db + err = s.GetSysConfigPage(d, &list, &count) + if err != nil { + log.Errorf("GetSysConfigPage 查询失败, error:%s", err) + e.Error(500, err, "查询失败") + return + } + e.PageOK(list, int(count), d.GetPageIndex(), d.GetPageSize(), "查询成功") +} + +// GetSysConfigBySysApp 获取系统配置信息,主要注意这里不在验证数据权限 +func (e SysConfig) GetSysConfigBySysApp(c *gin.Context) { + e.Context = c + log := e.GetLogger() + d := new(dto.SysConfigSearch) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + err = d.Bind(c) + if err != nil { + log.Errorf("参数验证失败, error:%s", err) + e.Error(500, err, "参数验证失败") + return + } + + // 控制只读前台的数据 + d.IsFrontend = 1 + + list := make([]system.SysConfig, 0) + s := service.SysConfig{} + s.Log = log + s.Orm = db + err = s.GetSysConfigByKey(d, &list) + if err != nil { + log.Errorf("GetSysConfigPage 查询失败, error:%s", err) + e.Error(500, err, "查询失败") + return + } + mp := make(map[string]string) + for i := 0; i < len(list); i++ { + key := list[i].ConfigKey + if key != "" { + mp[key] = list[i].ConfigValue + } + } + e.OK(mp, "查询成功") +} + +func (e SysConfig) GetSysConfig(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysConfigById) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + //查看详情 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + log.Errorf("Orm获取失败, error:%s", err) + e.Error(500, err, "Orm获取失败") + return + } + var object system.SysConfig + + serviceSysLoginLog := service.SysConfig{} + serviceSysLoginLog.Log = log + serviceSysLoginLog.Orm = db + err = serviceSysLoginLog.GetSysConfig(control, &object) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "查询失败") + log.Errorf("Orm获取失败, error:%s", err) + e.Error(500, err, "Orm获取失败") + return + } + + e.OK(object, "查看成功") +} + +func (e SysConfig) InsertSysConfig(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysConfigControl) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //新增操作 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + log.Errorf("Orm获取失败, error:%s", err) + e.Error(500, err, "Orm获取失败") + return + } + object, err := control.Generate() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") + log.Errorf("Orm获取失败, error:%s", err) + e.Error(500, err, "Orm获取失败") + return + } + // 设置创建人 + object.SetCreateBy(user.GetUserId(c)) + + serviceSysLoginLog := service.SysConfig{} + serviceSysLoginLog.Orm = db + serviceSysLoginLog.Log = log + err = serviceSysLoginLog.InsertSysConfig(object) + if err != nil { + log.Error(err) + e.Error(http.StatusInternalServerError, err, "创建失败") + log.Errorf("Orm获取失败, error:%s", err) + e.Error(500, err, "Orm获取失败") + return + } + + e.OK(object.GetId(), "创建成功") +} + +func (e SysConfig) UpdateSysConfig(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysConfigControl) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //更新操作 + err = control.Bind(c) + + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + log.Errorf("Orm获取失败, error:%s", err) + e.Error(500, err, "Orm获取失败") + return + } + object, err := control.Generate() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") + log.Errorf("Orm获取失败, error:%s", err) + e.Error(500, err, "Orm获取失败") + return + } + object.SetUpdateBy(user.GetUserId(c)) + + serviceSysLoginLog := service.SysConfig{} + serviceSysLoginLog.Orm = db + serviceSysLoginLog.Log = log + err = serviceSysLoginLog.UpdateSysConfig(object) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "更新失败") + log.Errorf("Orm获取失败, error:%s", err) + e.Error(500, err, "Orm获取失败") + return + } + e.OK(object.GetId(), "更新成功") +} + +func (e SysConfig) DeleteSysConfig(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysConfigById) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //删除操作 + err = control.Bind(c) + if err != nil { + log.Errorf("Bind error: %s", err) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + log.Errorf("Orm获取失败, error:%s", err) + e.Error(500, err, "Orm获取失败") + return + } + object, err := control.GenerateM() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") + log.Errorf("Orm获取失败, error:%s", err) + e.Error(500, err, "Orm获取失败") + return + } + + // 设置编辑人 + object.SetUpdateBy(user.GetUserId(c)) + + serviceSysLoginLog := service.SysConfig{} + serviceSysLoginLog.Orm = db + serviceSysLoginLog.Log = log + err = serviceSysLoginLog.RemoveSysConfig(control, object) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "删除失败") + log.Errorf("Orm获取失败, error:%s", err) + e.Error(500, err, "Orm获取失败") + return + } + e.OK(object.GetId(), "删除成功") +} + +// GetSysConfigByKEYForService 根据Key获取SysConfig的Service +func (e SysConfig) GetSysConfigByKEYForService(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + var v dto.SysConfigControl + err = v.Bind(c) + if err != nil { + log.Errorf("参数验证错误, error:%s", err) + e.Error(422, err, "参数验证失败") + return + } + s := service.SysConfig{} + s.Log = log + s.Orm = db + err = s.GetSysConfigByKEY(&v) + if err != nil { + log.Errorf("通过Key获取配置失败, error:%s", err) + e.Error(500, err, "") + return + } + e.OK(v, s.Msg) +} diff --git a/app/admin/apis/system/sys_dept/sys_dept.go b/app/admin/apis/system/sys_dept/sys_dept.go new file mode 100644 index 00000000..71cfa021 --- /dev/null +++ b/app/admin/apis/system/sys_dept/sys_dept.go @@ -0,0 +1,294 @@ +package sys_dept + +import ( + "github.com/go-admin-team/go-admin-core/sdk/pkg" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" + _ "github.com/go-admin-team/go-admin-core/sdk/pkg/response" + + "go-admin/app/admin/models/system" + "go-admin/app/admin/service" + "go-admin/app/admin/service/dto" + "go-admin/common/apis" +) + +type SysDept struct { + apis.Api +} + +// @Summary 分页部门列表数据 +// @Description 分页列表 +// @Tags 部门 +// @Param name query string false "name" +// @Param id query string false "id" +// @Param position query string false "position" +// @Success 200 {object} response.Response "{"code": 200, "data": [...]}" +// @Router /api/v1/dept [get] +// @Security Bearer +func (e SysDept) GetSysDeptList(c *gin.Context) { + e.Context = c + log := e.GetLogger() + d := new(dto.SysDeptSearch) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //查询列表 + err = d.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + list := make([]system.SysDept, 0) + serviceStudent := service.SysDept{} + serviceStudent.Log = log + serviceStudent.Orm = db + list, err = serviceStudent.SetDeptPage(d) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "查询失败") + return + } + + e.OK(list, "查询成功") +} + +// @Summary 部门列表数据 +// @Description 获取JSON +// @Tags 部门 +// @Param deptId path string false "deptId" +// @Param position query string false "position" +// @Success 200 {object} response.Response "{"code": 200, "data": [...]}" +// @Router /api/v1/dept/{deptId} [get] +// @Security Bearer +func (e SysDept) GetSysDept(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysDeptById) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //查看详情 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object system.SysDept + + serviceSysOperlog := service.SysDept{} + serviceSysOperlog.Log = log + serviceSysOperlog.Orm = db + err = serviceSysOperlog.GetSysDept(control, &object) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "查询失败") + return + } + + e.OK(object, "查看成功") +} + +// @Summary 添加部门 +// @Description 获取JSON +// @Tags 部门 +// @Accept application/json +// @Product application/json +// @Param data body dto.SysDeptControl true "data" +// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" +// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" +// @Router /api/v1/dept [post] +// @Security Bearer +func (e SysDept) InsertSysDept(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysDeptControl) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //新增操作 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + object, err := control.Generate() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") + return + } + // 设置创建人 + object.SetCreateBy(user.GetUserId(c)) + + serviceSysDept := service.SysDept{} + serviceSysDept.Orm = db + serviceSysDept.Log = log + err = serviceSysDept.InsertSysDept(object) + if err != nil { + log.Error(err) + e.Error(http.StatusInternalServerError, err, "创建失败") + return + } + + e.OK(object.GetId(), "创建成功") +} + +// @Summary 修改部门 +// @Description 获取JSON +// @Tags 部门 +// @Accept application/json +// @Product application/json +// @Param id path int true "id" +// @Param data body dto.SysDeptControl true "body" +// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" +// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" +// @Router /api/v1/dept/{deptId} [put] +// @Security Bearer +func (e SysDept) UpdateSysDept(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysDeptControl) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //更新操作 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + object, err := control.Generate() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") + return + } + object.SetUpdateBy(user.GetUserId(c)) + + serviceSysDept := service.SysDept{} + serviceSysDept.Orm = db + serviceSysDept.Log = log + err = serviceSysDept.UpdateSysDept(object) + if err != nil { + log.Error(err) + return + } + e.OK(object.GetId(), "更新成功") +} + +// @Summary 删除部门 +// @Description 删除数据 +// @Tags 部门 +// @Param data body dto.SysDeptById true "body" +// @Success 200 {string} string "{"code": 200, "message": "删除成功"}" +// @Success 200 {string} string "{"code": -1, "message": "删除失败"}" +// @Router /api/v1/dept [delete] +func (e SysDept) DeleteSysDept(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysDeptById) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //删除操作 + err = control.Bind(c) + if err != nil { + log.Errorf("Bind error: %s", err) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + serviceSysDept := service.SysDept{} + serviceSysDept.Orm = db + serviceSysDept.Log = log + err = serviceSysDept.RemoveSysDept(control) + if err != nil { + log.Errorf("RemoveSysDept error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "删除失败") + return + } + e.OK(control.GetId(), "删除成功") +} + +// GetDeptTree 用户管理 左侧部门树 +func (e SysDept) GetDeptTree(c *gin.Context) { + e.Context = c + log := e.GetLogger() + d := new(dto.SysDeptSearch) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //查询列表 + err = d.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + list := make([]dto.DeptLabel, 0) + serviceStudent := service.SysDept{} + serviceStudent.Log = log + serviceStudent.Orm = db + list, err = serviceStudent.SetDeptTree(d) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "查询失败") + return + } + + //var Dept models.SysDepts + //Dept.DeptName = c.Request.FormValue("deptName") + //Dept.Status = c.Request.FormValue("status") + //Dept.DeptId, _ = tools.StringToInt(c.Request.FormValue("deptId")) + //result, err := Dept.SetDept(false) + //tools.HasError(err, "抱歉未找到相关信息", -1) + e.OK(list, "") +} + +func (e SysDept) GetDeptTreeRoleSelect(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + s := service.SysDept{} + s.Orm = db + s.Log = log + id, err := pkg.StringToInt(c.Param("roleId")) + result, err := s.SetDeptLabel() + if err != nil { + log.Errorf("SetDeptLabel error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "") + } + menuIds := make([]int, 0) + if id != 0 { + menuIds, err = s.GetRoleDeptId(id) + if err != nil { + log.Errorf("抱歉未找到相关信息, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "") + } + } + e.OK(gin.H{ + "depts": result, + "checkedKeys": menuIds, + }, "") +} diff --git a/app/admin/apis/system/sys_login_log/sys_login_log.go b/app/admin/apis/system/sys_login_log/sys_login_log.go new file mode 100644 index 00000000..2c3cbe3c --- /dev/null +++ b/app/admin/apis/system/sys_login_log/sys_login_log.go @@ -0,0 +1,188 @@ +package sys_login_log + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" + + "go-admin/app/admin/models/system" + "go-admin/app/admin/service" + "go-admin/app/admin/service/dto" + "go-admin/common/apis" +) + +type SysLoginLog struct { + apis.Api +} + +func (e SysLoginLog) GetSysLoginLogList(c *gin.Context) { + e.Context = c + log := e.GetLogger() + d := new(dto.SysLoginLogSearch) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //查询列表 + err = d.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + list := make([]system.SysLoginLog, 0) + var count int64 + serviceStudent := service.SysLoginLog{} + serviceStudent.Log = log + serviceStudent.Orm = db + err = serviceStudent.GetSysLoginLogPage(d, &list, &count) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "查询失败") + return + } + + e.PageOK(list, int(count), d.GetPageIndex(), d.GetPageSize(), "查询成功") +} + +func (e SysLoginLog) GetSysLoginLog(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysLoginLogById) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //查看详情 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object system.SysLoginLog + + serviceSysLoginLog := service.SysLoginLog{} + serviceSysLoginLog.Log = log + serviceSysLoginLog.Orm = db + err = serviceSysLoginLog.GetSysLoginLog(control, &object) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "查询失败") + return + } + + e.OK(object, "查看成功") +} + +func (e SysLoginLog) InsertSysLoginLog(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysLoginLogControl) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //新增操作 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + object, err := control.Generate() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") + return + } + // 设置创建人 + object.SetCreateBy(user.GetUserId(c)) + + serviceSysLoginLog := service.SysLoginLog{} + serviceSysLoginLog.Orm = db + serviceSysLoginLog.Log = log + err = serviceSysLoginLog.InsertSysLoginLog(object) + if err != nil { + log.Errorf("InsertSysLoginLog error, %s", err) + e.Error(http.StatusInternalServerError, err, "创建失败") + return + } + + e.OK(object.GetId(), "创建成功") +} + +func (e SysLoginLog) UpdateSysLoginLog(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysLoginLogControl) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //更新操作 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + object, err := control.Generate() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") + return + } + object.SetUpdateBy(user.GetUserId(c)) + + serviceSysLoginLog := service.SysLoginLog{} + serviceSysLoginLog.Orm = db + serviceSysLoginLog.Log = log + err = serviceSysLoginLog.UpdateSysLoginLog(object) + if err != nil { + log.Errorf("UpdateSysLoginLog error, %s", err) + e.Error(http.StatusInternalServerError, err, "更新失败") + return + } + e.OK(object.GetId(), "更新成功") +} + +func (e SysLoginLog) DeleteSysLoginLog(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysLoginLogById) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //删除操作 + err = control.Bind(c) + if err != nil { + log.Errorf("Bind error: %s", err) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + object, err := control.GenerateM() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") + return + } + + // 设置编辑人 + object.SetUpdateBy(user.GetUserId(c)) + + serviceSysLoginLog := service.SysLoginLog{} + serviceSysLoginLog.Orm = db + serviceSysLoginLog.Log = log + err = serviceSysLoginLog.RemoveSysLoginLog(control, object) + if err != nil { + log.Errorf("RemoveSysLoginLog error, %s", err) + e.Error(http.StatusInternalServerError, err, "删除失败") + return + } + e.OK(object.GetId(), "删除成功") +} diff --git a/app/admin/apis/system/sys_menu/sys_menu.go b/app/admin/apis/system/sys_menu/sys_menu.go new file mode 100644 index 00000000..7654b786 --- /dev/null +++ b/app/admin/apis/system/sys_menu/sys_menu.go @@ -0,0 +1,369 @@ +package sys_menu + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" + + "go-admin/app/admin/models/system" + "go-admin/app/admin/service" + "go-admin/app/admin/service/dto" + "go-admin/common/apis" +) + +type SysMenu struct { + apis.Api +} + +// @Summary Menu列表数据 +// @Description 获取JSON +// @Tags 菜单 +// @Param menuName query string false "menuName" +// @Success 200 {string} string "{"code": 200, "data": [...]}" +// @Success 200 {string} string "{"code": -1, "message": "抱歉未找到相关信息"}" +// @Router /api/v1/menulist [get] +// @Security Bearer +func (e SysMenu) GetSysMenuList(c *gin.Context) { + e.Context = c + log := e.GetLogger() + d := new(dto.SysMenuSearch) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //查询列表 + err = d.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + var list *[]system.SysMenu + serviceSysMenu := service.SysMenu{} + serviceSysMenu.Log = log + serviceSysMenu.Orm = db + list, err = serviceSysMenu.GetSysMenuPage(d) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "查询失败") + return + } + + e.OK(list, "查询成功") +} + +// @Summary Menu详情数据 +// @Description 获取JSON +// @Tags 菜单 +// @Param menuName query string false "menuName" +// @Success 200 {string} string "{"code": 200, "data": [...]}" +// @Success 200 {string} string "{"code": -1, "message": "抱歉未找到相关信息"}" +// @Router /api/v1/menu/{id} [get] +// @Security Bearer +func (e SysMenu) GetSysMenu(c *gin.Context) { + control := new(dto.SysMenuById) + + e.Context = c + log := e.GetLogger() + + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //查看详情 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object system.SysMenu + + serviceSysMenu := service.SysMenu{} + serviceSysMenu.Log = log + serviceSysMenu.Orm = db + err = serviceSysMenu.GetSysMenu(control, &object) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "查询失败") + return + } + + e.OK(object, "查看成功") +} + +// @Summary 创建菜单 +// @Description 获取JSON +// @Tags 菜单 +// @Accept application/x-www-form-urlencoded +// @Product application/x-www-form-urlencoded +// @Param menuName formData string true "menuName" +// @Param Path formData string false "Path" +// @Param Action formData string true "Action" +// @Param Permission formData string true "Permission" +// @Param ParentId formData string true "ParentId" +// @Param IsDel formData string true "IsDel" +// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" +// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" +// @Router /api/v1/menu [post] +// @Security Bearer +func (e SysMenu) InsertSysMenu(c *gin.Context) { + control := new(dto.SysMenuControl) + + e.Context = c + log := e.GetLogger() + + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //新增操作 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + object, err := control.Generate() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") + return + } + // 设置创建人 + object.SetCreateBy(user.GetUserId(c)) + + serviceSysMenu := service.SysMenu{} + serviceSysMenu.Orm = db + serviceSysMenu.Log = log + err = serviceSysMenu.InsertSysMenu(object) + if err != nil { + log.Error(err) + e.Error(http.StatusInternalServerError, err, "创建失败") + return + } + + e.OK(object.GetId(), "创建成功") +} + +// @Summary 修改菜单 +// @Description 获取JSON +// @Tags 菜单 +// @Accept application/x-www-form-urlencoded +// @Product application/x-www-form-urlencoded +// @Param id path int true "id" +// @Param data body dto.SysMenuControl true "body" +// @Success 200 {string} string "{"code": 200, "message": "修改成功"}" +// @Success 200 {string} string "{"code": -1, "message": "修改失败"}" +// @Router /api/v1/menu/{id} [put] +// @Security Bearer +func (e SysMenu) UpdateSysMenu(c *gin.Context) { + control := new(dto.SysMenuControl) + + e.Context = c + log := e.GetLogger() + + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //更新操作 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + object, err := control.Generate() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") + return + } + object.SetUpdateBy(user.GetUserId(c)) + + serviceSysMenu := service.SysMenu{} + serviceSysMenu.Orm = db + serviceSysMenu.Log = log + err = serviceSysMenu.UpdateSysMenu(object) + if err != nil { + log.Error(err) + return + } + e.OK(object.GetId(), "更新成功") +} + +// @Summary 删除菜单 +// @Description 删除数据 +// @Tags 菜单 +// @Param data body dto.SysMenuById true "body" +// @Success 200 {string} string "{"code": 200, "message": "删除成功"}" +// @Success 200 {string} string "{"code": -1, "message": "删除失败"}" +// @Router /api/v1/menu/ [delete] +func (e SysMenu) DeleteSysMenu(c *gin.Context) { + control := new(dto.SysMenuById) + + e.Context = c + log := e.GetLogger() + + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //删除操作 + err = control.Bind(c) + if err != nil { + log.Errorf("Bind error: %s", err) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + serviceSysMenu := service.SysMenu{} + serviceSysMenu.Orm = db + serviceSysMenu.Log = log + err = serviceSysMenu.RemoveSysMenu(control) + if err != nil { + log.Errorf("RemoveSysMenu error, %s", err) + e.Error(http.StatusInternalServerError, err, "删除失败") + return + } + e.OK(control.GetId(), "删除成功") +} + +// @Summary 根据角色名称获取菜单列表数据(左菜单使用) +// @Description 获取JSON +// @Tags 菜单 +// @Param id path int true "id" +// @Success 200 {string} string "{"code": 200, "data": [...]}" +// @Success 200 {string} string "{"code": -1, "message": "抱歉未找到相关信息"}" +// @Router /api/v1/menurole [get] +// @Security Bearer +func (e SysMenu) GetMenuRole(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + serviceSysMenu := service.SysMenu{} + serviceSysMenu.Log = log + serviceSysMenu.Orm = db + result, err := serviceSysMenu.SetMenuRole(user.GetRoleName(c)) + + if err != nil { + e.Error(http.StatusInternalServerError, err, "查询失败") + return + } + + e.OK(result, "") +} + +// @Summary 获取角色对应的菜单id数组 +// @Description 获取JSON +// @Tags 菜单 +// @Param id path int true "id" +// @Success 200 {string} string "{"code": 200, "data": [...]}" +// @Success 200 {string} string "{"code": -1, "message": "抱歉未找到相关信息"}" +// @Router /api/v1/menuids/{id} [get] +// @Security Bearer +func (e SysMenu) GetMenuIDS(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + var data system.RoleMenu + data.RoleName = c.GetString("role") + data.UpdateBy = user.GetUserId(c) + result, err := data.GetIDS(db) + if err != nil { + log.Errorf("GetIDS error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "获取失败") + return + } + e.OK(result, "") +} + +//// GetMenuTreeRoleselect 角色修改中的菜单列表 +//func (e SysMenu) GetMenuTreeRoleselect(c *gin.Context) { +// var Menu models.Menu +// var SysRole models.SysRole +// +// id, err := tools.StringToInt(c.Param("roleId")) +// SysRole.RoleId = id +// //var r *models.SysRole +// r, err := SysRole.Get() +// +// var result *[]models.MenuLable +// menuIds := make([]int, 0) +// if r.RoleKey != "admin" { +// result, err = Menu.SetMenuLabel() +// tools.HasError(err, "抱歉未找到相关信息", -1) +// if id != 0 { +// menuIds, err = SysRole.GetRoleMeunId() +// tools.HasError(err, "抱歉未找到相关信息", -1) +// } +// } +// app.Custum(c, gin.H{ +// "code": 200, +// "menus": result, +// "checkedKeys": menuIds, +// }) +//} + +// @Summary 获取菜单树 +// @Description 获取JSON +// @Tags 菜单 +// @Accept application/x-www-form-urlencoded +// @Product application/x-www-form-urlencoded +// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" +// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" +// @Router /api/v1/menuTreeselect [get] +// @Security Bearer +func (e SysMenu) GetMenuTreeSelect(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + d := new(dto.SelectRole) + + err = c.BindUri(d) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + serviceSysMenu := service.SysMenu{} + serviceSysMenu.Log = log + serviceSysMenu.Orm = db + result, err := serviceSysMenu.SetSysMenuLabel() + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "查询失败") + return + } + s := service.SysRole{} + s.Log = log + s.Orm = db + menuIds, err := s.GetRoleMenuId(db, d.RoleId) + if err != nil { + log.Errorf("GetIDS error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "") + return + } + e.OK(gin.H{ + "menus": result, + "checkedKeys": menuIds, + }, "获取成功") +} diff --git a/app/admin/apis/system/sys_opera_log/sys_opera_log.go b/app/admin/apis/system/sys_opera_log/sys_opera_log.go new file mode 100644 index 00000000..8a150276 --- /dev/null +++ b/app/admin/apis/system/sys_opera_log/sys_opera_log.go @@ -0,0 +1,178 @@ +package sys_opera_log + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" + + "go-admin/app/admin/models/system" + "go-admin/app/admin/service" + "go-admin/app/admin/service/dto" + "go-admin/common/apis" +) + +type SysOperaLog struct { + apis.Api +} + +func (e SysOperaLog) GetSysOperaLogList(c *gin.Context) { + e.Context = c + log := e.GetLogger() + d := new(dto.SysOperaLogSearch) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //查询列表 + err = d.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + list := make([]system.SysOperaLog, 0) + var count int64 + serviceStudent := service.SysOperaLog{} + serviceStudent.Log = log + serviceStudent.Orm = db + err = serviceStudent.GetSysOperaLogPage(d, &list, &count) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "查询失败") + return + } + + e.PageOK(list, int(count), d.GetPageIndex(), d.GetPageSize(), "查询成功") +} + +func (e SysOperaLog) GetSysOperaLog(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysOperaLogById) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //查看详情 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object system.SysOperaLog + + serviceSysOperlog := service.SysOperaLog{} + serviceSysOperlog.Log = log + serviceSysOperlog.Orm = db + err = serviceSysOperlog.GetSysOperaLog(control, &object) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "查询失败") + return + } + + e.OK(object, "查看成功") +} + +func (e SysOperaLog) InsertSysOperaLog(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysOperaLogControl) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //新增操作 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + object, err := control.Generate() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") + return + } + // 设置创建人 + object.SetCreateBy(user.GetUserId(c)) + + serviceSysOperaLog := service.SysOperaLog{} + serviceSysOperaLog.Orm = db + serviceSysOperaLog.Log = log + err = serviceSysOperaLog.InsertSysOperaLog(object) + if err != nil { + log.Error(err) + e.Error(http.StatusInternalServerError, err, "创建失败") + return + } + + e.OK(object.GetId(), "创建成功") +} + +func (e SysOperaLog) UpdateSysOperaLog(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysOperaLogControl) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //更新操作 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + object, err := control.Generate() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") + return + } + object.SetUpdateBy(user.GetUserId(c)) + + serviceSysOperaLog := service.SysOperaLog{} + serviceSysOperaLog.Orm = db + serviceSysOperaLog.Log = log + err = serviceSysOperaLog.UpdateSysOperaLog(object) + if err != nil { + log.Error(err) + return + } + e.OK(object.GetId(), "更新成功") +} + +func (e SysOperaLog) DeleteSysOperaLog(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysOperaLogById) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //删除操作 + err = control.Bind(c) + if err != nil { + log.Errorf("Bind error: %s", err) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + serviceSysOperaLog := service.SysOperaLog{} + serviceSysOperaLog.Orm = db + serviceSysOperaLog.Log = log + err = serviceSysOperaLog.RemoveSysOperaLog(control) + if err != nil { + log.Error(err) + return + } + e.OK(control.GetId(), "删除成功") +} diff --git a/app/admin/apis/system/sys_post/sys_post.go b/app/admin/apis/system/sys_post/sys_post.go new file mode 100644 index 00000000..a4789bb4 --- /dev/null +++ b/app/admin/apis/system/sys_post/sys_post.go @@ -0,0 +1,223 @@ +package sys_post + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" + _ "github.com/go-admin-team/go-admin-core/sdk/pkg/response" + + "go-admin/app/admin/models/system" + "go-admin/app/admin/service" + "go-admin/app/admin/service/dto" + "go-admin/common/apis" +) + +type SysPost struct { + apis.Api +} + +// @Summary 岗位列表数据 +// @Description 获取JSON +// @Tags 岗位 +// @Param postName query string false "postName" +// @Param postCode query string false "postCode" +// @Param postId query string false "postId" +// @Param status query string false "status" +// @Success 200 {object} response.Response "{"code": 200, "data": [...]}" +// @Router /api/v1/post [get] +// @Security Bearer +func (e SysPost) GetSysPostList(c *gin.Context) { + e.Context = c + log := e.GetLogger() + d := new(dto.SysPostSearch) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //查询列表 + err = d.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + list := make([]system.SysPost, 0) + var count int64 + serviceStudent := service.SysPost{} + serviceStudent.Log = log + serviceStudent.Orm = db + err = serviceStudent.GetSysPostPage(d, &list, &count) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "查询失败") + return + } + + e.PageOK(list, int(count), d.GetPageIndex(), d.GetPageSize(), "查询成功") +} + +// @Summary 获取岗位信息 +// @Description 获取JSON +// @Tags 岗位 +// @Param postId path int true "postId" +// @Success 200 {object} response.Response "{"code": 200, "data": [...]}" +// @Router /api/v1/post/{postId} [get] +// @Security Bearer +func (e SysPost) GetSysPost(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysPostById) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //查看详情 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object system.SysPost + + serviceSysOperlog := service.SysPost{} + serviceSysOperlog.Log = log + serviceSysOperlog.Orm = db + err = serviceSysOperlog.GetSysPost(control, &object) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "查询失败") + return + } + + e.OK(object, "查看成功") +} + +// @Summary 添加岗位 +// @Description 获取JSON +// @Tags 岗位 +// @Accept application/json +// @Product application/json +// @Param data body dto.SysPostControl true "data" +// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" +// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" +// @Router /api/v1/post [post] +// @Security Bearer +func (e SysPost) InsertSysPost(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysPostControl) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //新增操作 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + object, err := control.Generate() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") + return + } + // 设置创建人 + object.SetCreateBy(user.GetUserId(c)) + + serviceSysPost := service.SysPost{} + serviceSysPost.Orm = db + serviceSysPost.Log = log + err = serviceSysPost.InsertSysPost(object) + if err != nil { + log.Error(err) + e.Error(http.StatusInternalServerError, err, "创建失败") + return + } + + e.OK(object.GetId(), "创建成功") +} + +// @Summary 修改岗位 +// @Description 获取JSON +// @Tags 岗位 +// @Accept application/json +// @Product application/json +// @Param data body dto.SysPostControl true "body" +// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" +// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" +// @Router /api/v1/post/ [put] +// @Security Bearer +func (e SysPost) UpdateSysPost(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysPostControl) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //更新操作 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + object, err := control.Generate() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") + return + } + object.SetUpdateBy(user.GetUserId(c)) + + serviceSysPost := service.SysPost{} + serviceSysPost.Orm = db + serviceSysPost.Log = log + err = serviceSysPost.UpdateSysPost(object) + if err != nil { + log.Error(err) + return + } + e.OK(object.GetId(), "更新成功") +} + +// @Summary 删除岗位 +// @Description 删除数据 +// @Tags 岗位 +// @Param id path int true "id" +// @Success 200 {string} string "{"code": 200, "message": "删除成功"}" +// @Success 500 {string} string "{"code": 500, "message": "删除失败"}" +// @Router /api/v1/post/{postId} [delete] +func (e SysPost) DeleteSysPost(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysPostById) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //删除操作 + err = control.Bind(c) + if err != nil { + log.Errorf("Bind error: %s", err) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + serviceSysPost := service.SysPost{} + serviceSysPost.Orm = db + serviceSysPost.Log = log + err = serviceSysPost.RemoveSysPost(control) + if err != nil { + log.Error(err) + return + } + e.OK(control.GetId(), "删除成功") +} diff --git a/app/admin/apis/system/sys_role/sys_role.go b/app/admin/apis/system/sys_role/sys_role.go new file mode 100644 index 00000000..20544c10 --- /dev/null +++ b/app/admin/apis/system/sys_role/sys_role.go @@ -0,0 +1,279 @@ +package sys_role + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" + _ "github.com/go-admin-team/go-admin-core/sdk/pkg/response" + + "go-admin/app/admin/models/system" + "go-admin/app/admin/service" + "go-admin/app/admin/service/dto" + "go-admin/common/apis" + "go-admin/common/global" +) + +type SysRole struct { + apis.Api +} + +// @Summary 角色列表数据 +// @Description Get JSON +// @Tags 角色/Role +// @Param roleName query string false "roleName" +// @Param status query string false "status" +// @Param roleKey query string false "roleKey" +// @Param pageSize query int false "页条数" +// @Param pageIndex query int false "页码" +// @Success 200 {object} response.Response "{"code": 200, "data": [...]}" +// @Router /api/v1/role [get] +// @Security Bearer +func (e SysRole) GetSysRoleList(c *gin.Context) { + e.Context = c + log := e.GetLogger() + d := new(dto.SysRoleSearch) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //查询列表 + err = d.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + list := make([]system.SysRole, 0) + var count int64 + s := service.SysRole{} + s.Log = log + s.Orm = db + err = s.GetSysRolePage(d, &list, &count) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "查询失败") + return + } + + e.PageOK(list, int(count), d.GetPageIndex(), d.GetPageSize(), "查询成功") +} + +// @Summary 获取Role数据 +// @Description 获取JSON +// @Tags 角色/Role +// @Param roleId path string false "roleId" +// @Success 200 {string} string "{"code": 200, "data": [...]}" +// @Success 200 {string} string "{"code": -1, "message": "抱歉未找到相关信息"}" +// @Router /api/v1/role/{id} [get] +// @Security Bearer +func (e SysRole) GetSysRole(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysRoleById) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //查看详情 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object system.SysRole + + s := service.SysRole{} + s.Log = log + s.Orm = db + err = s.GetSysRole(control, &object) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "查询失败") + return + } + + e.OK(object, "查看成功") +} + +// @Summary 创建角色 +// @Description 获取JSON +// @Tags 角色/Role +// @Accept application/json +// @Product application/json +// @Param data body dto.SysRoleControl true "data" +// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" +// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" +// @Router /api/v1/role [post] +// @Security Bearer +func (e SysRole) InsertSysRole(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysRoleControl) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //新增操作 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + object, err := control.Generate() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") + return + } + // 设置创建人 + object.CreateBy = user.GetUserId(c) + if object.Status == "" { + object.Status = "2" + } + + s := service.SysRole{} + s.Orm = db + s.Log = log + err = s.InsertSysRole(object) + if err != nil { + log.Error(err) + e.Error(http.StatusInternalServerError, err, "创建失败") + return + } + _, err = global.LoadPolicy(c) + if err != nil { + e.Error(http.StatusInternalServerError, err, "") + return + } + e.OK(object.GetId(), "创建成功") +} + +// @Summary 修改用户角色 +// @Description 获取JSON +// @Tags 角色/Role +// @Accept application/json +// @Product application/json +// @Param data body dto.SysRoleControl true "body" +// @Success 200 {string} string "{"code": 200, "message": "修改成功"}" +// @Success 200 {string} string "{"code": -1, "message": "修改失败"}" +// @Router /api/v1/role/{id} [put] +// @Security Bearer +func (e SysRole) UpdateSysRole(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysRoleControl) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //更新操作 + err = control.Bind(c) + if err != nil { + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + object, err := control.Generate() + if err != nil { + e.Error(http.StatusInternalServerError, err, "模型生成失败") + return + } + object.UpdateBy = user.GetUserId(c) + + s := service.SysRole{} + s.Orm = db + s.Log = log + err = s.UpdateSysRole(object) + if err != nil { + log.Error(err) + return + } + _, err = global.LoadPolicy(c) + if err != nil { + e.Error(http.StatusInternalServerError, err, "") + return + } + e.OK(object.GetId(), "更新成功") +} + +// @Summary 删除用户角色 +// @Description 删除数据 +// @Tags 角色/Role +// @Param data body dto.SysRoleById true "body" +// @Success 200 {string} string "{"code": 200, "message": "删除成功"}" +// @Success 200 {string} string "{"code": -1, "message": "删除失败"}" +// @Router /api/v1/role [delete] +// @Security Bearer +func (e SysRole) DeleteSysRole(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.SysRoleById) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //删除操作 + err = control.Bind(c) + if err != nil { + log.Errorf("Bind error: %s", err) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + s := service.SysRole{} + s.Orm = db + s.Log = log + err = s.RemoveSysRole(control) + if err != nil { + log.Error(err) + e.Error(http.StatusInternalServerError, err, "") + return + } + _, err = global.LoadPolicy(c) + if err != nil { + e.Error(http.StatusInternalServerError, err, "") + return + } + e.OK(control.GetId(), "删除成功") +} + +func (e SysRole) UpdateRoleDataScope(c *gin.Context) { + e.Context = c + log := e.GetLogger() + control := new(dto.RoleDataScopeReq) + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + //更新操作 + err = c.Bind(control) + if err != nil { + log.Errorf("request bind error, %s", err.Error()) + e.Error(http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + data := &system.SysRole{ + RoleId: control.RoleId, + DataScope: control.DataScope, + DeptIds: control.DeptIds, + } + data.UpdateBy = user.GetUserId(c) + s := &service.SysRole{} + s.Orm = db + s.Log = log + err = s.UpdateDataScope(data) + if err != nil { + e.Error(http.StatusInternalServerError, err, "") + return + } + e.OK(nil, "操作成功") +} diff --git a/app/admin/apis/system/sysuser.go b/app/admin/apis/system/sysuser.go deleted file mode 100644 index 9748ef5b..00000000 --- a/app/admin/apis/system/sysuser.go +++ /dev/null @@ -1,234 +0,0 @@ -package system - -import ( - "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" - "github.com/google/uuid" - - "go-admin/app/admin/models" - "go-admin/common/global" - "go-admin/tools" - "go-admin/tools/app" -) - -// @Summary 列表用户信息数据 -// @Description 获取JSON -// @Tags 用户 -// @Param username query string false "username" -// @Success 200 {string} string "{"code": 200, "data": [...]}" -// @Success 200 {string} string "{"code": -1, "message": "抱歉未找到相关信息"}" -// @Router /api/v1/sysUserList [get] -// @Security Bearer -func GetSysUserList(c *gin.Context) { - var data models.SysUser - var err error - var pageSize = 10 - var pageIndex = 1 - - size := c.Request.FormValue("pageSize") - if size != "" { - pageSize, err = tools.StringToInt(size) - } - - index := c.Request.FormValue("pageIndex") - if index != "" { - pageIndex, err = tools.StringToInt(index) - } - - data.Username = c.Request.FormValue("username") - data.Status = c.Request.FormValue("status") - data.Phone = c.Request.FormValue("phone") - - postId := c.Request.FormValue("postId") - data.PostId, _ = tools.StringToInt(postId) - - deptId := c.Request.FormValue("deptId") - data.DeptId, _ = tools.StringToInt(deptId) - - data.DataScope = tools.GetUserIdStr(c) - result, count, err := data.GetPage(pageSize, pageIndex) - tools.HasError(err, "", -1) - - app.PageOK(c, result, count, pageIndex, pageSize, "") -} - -// @Summary 获取用户 -// @Description 获取JSON -// @Tags 用户 -// @Param userId path int true "用户编码" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/sysUser/{userId} [get] -// @Security Bearer -func GetSysUser(c *gin.Context) { - var SysUser models.SysUser - SysUser.UserId, _ = tools.StringToInt(c.Param("userId")) - result, err := SysUser.Get() - tools.HasError(err, "抱歉未找到相关信息", -1) - var SysRole models.SysRole - var Post models.Post - roles, err := SysRole.GetList() - posts, err := Post.GetList() - - postIds := make([]int, 0) - postIds = append(postIds, result.PostId) - - roleIds := make([]int, 0) - roleIds = append(roleIds, result.RoleId) - app.Custum(c, gin.H{ - "code": 200, - "data": result, - "postIds": postIds, - "roleIds": roleIds, - "roles": roles, - "posts": posts, - }) -} - -// @Summary 获取个人中心用户 -// @Description 获取JSON -// @Tags 个人中心 -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/user/profile [get] -// @Security Bearer -func GetSysUserProfile(c *gin.Context) { - var SysUser models.SysUser - userId := tools.GetUserIdStr(c) - SysUser.UserId, _ = tools.StringToInt(userId) - result, err := SysUser.Get() - tools.HasError(err, "抱歉未找到相关信息", -1) - var SysRole models.SysRole - var Post models.Post - var Dept models.SysDept - //获取角色列表 - roles, err := SysRole.GetList() - //获取职位列表 - posts, err := Post.GetList() - //获取部门列表 - Dept.DeptId = result.DeptId - dept, err := Dept.Get() - - postIds := make([]int, 0) - postIds = append(postIds, result.PostId) - - roleIds := make([]int, 0) - roleIds = append(roleIds, result.RoleId) - - app.Custum(c, gin.H{ - "code": 200, - "data": result, - "postIds": postIds, - "roleIds": roleIds, - "roles": roles, - "posts": posts, - "dept": dept, - }) -} - -// @Summary 获取用户角色和职位 -// @Description 获取JSON -// @Tags 用户 -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/sysUser [get] -// @Security Bearer -func GetSysUserInit(c *gin.Context) { - var SysRole models.SysRole - var Post models.Post - roles, err := SysRole.GetList() - posts, err := Post.GetList() - tools.HasError(err, "抱歉未找到相关信息", -1) - mp := make(map[string]interface{}, 2) - mp["roles"] = roles - mp["posts"] = posts - app.OK(c, mp, "") -} - -// @Summary 创建用户 -// @Description 获取JSON -// @Tags 用户 -// @Accept application/json -// @Product application/json -// @Param data body models.SysUser true "用户数据" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/sysUser [post] -func InsertSysUser(c *gin.Context) { - var sysuser models.SysUser - err := c.BindWith(&sysuser, binding.JSON) - tools.HasError(err, "非法数据格式", 500) - - sysuser.CreateBy = tools.GetUserIdStr(c) - id, err := sysuser.Insert() - tools.HasError(err, "添加失败", 500) - app.OK(c, id, "添加成功") -} - -// @Summary 修改用户数据 -// @Description 获取JSON -// @Tags 用户 -// @Accept application/json -// @Product application/json -// @Param data body models.SysUser true "body" -// @Success 200 {string} string "{"code": 200, "message": "修改成功"}" -// @Success 200 {string} string "{"code": -1, "message": "修改失败"}" -// @Router /api/v1/sysuser/{userId} [put] -func UpdateSysUser(c *gin.Context) { - var data models.SysUser - err := c.Bind(&data) - tools.HasError(err, "数据解析失败", -1) - data.UpdateBy = tools.GetUserIdStr(c) - result, err := data.Update(data.UserId) - tools.HasError(err, "修改失败", 500) - app.OK(c, result, "修改成功") -} - -// @Summary 删除用户数据 -// @Description 删除数据 -// @Tags 用户 -// @Param userId path int true "userId" -// @Success 200 {string} string "{"code": 200, "message": "删除成功"}" -// @Success 200 {string} string "{"code": -1, "message": "删除失败"}" -// @Router /api/v1/sysuser/{userId} [delete] -func DeleteSysUser(c *gin.Context) { - var data models.SysUser - data.UpdateBy = tools.GetUserIdStr(c) - IDS := tools.IdsStrToIdsIntGroup("userId", c) - result, err := data.BatchDelete(IDS) - tools.HasError(err, "删除失败", 500) - app.OK(c, result, "删除成功") -} - -// @Summary 修改头像 -// @Description 获取JSON -// @Tags 用户 -// @Accept multipart/form-data -// @Param file formData file true "file" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/user/profileAvatar [post] -func InsetSysUserAvatar(c *gin.Context) { - form, _ := c.MultipartForm() - files := form.File["upload[]"] - guid := uuid.New().String() - filPath := "static/uploadfile/" + guid + ".jpg" - for _, file := range files { - global.Logger.Debug(file.Filename) - // 上传文件至指定目录 - _ = c.SaveUploadedFile(file, filPath) - } - sysuser := models.SysUser{} - sysuser.UserId = tools.GetUserId(c) - sysuser.Avatar = "/" + filPath - sysuser.UpdateBy = tools.GetUserIdStr(c) - sysuser.Update(sysuser.UserId) - app.OK(c, filPath, "修改成功") -} - -func SysUserUpdatePwd(c *gin.Context) { - var pwd models.SysUserPwd - err := c.Bind(&pwd) - tools.HasError(err, "数据解析失败", 500) - sysuser := models.SysUser{} - sysuser.UserId = tools.GetUserId(c) - sysuser.SetPwd(pwd) - app.OK(c, "", "密码修改成功") -} diff --git a/app/admin/apis/tools/dbcolumns.go b/app/admin/apis/tools/dbcolumns.go index c2d19665..aa4ca76e 100644 --- a/app/admin/apis/tools/dbcolumns.go +++ b/app/admin/apis/tools/dbcolumns.go @@ -4,10 +4,10 @@ import ( "net/http" "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + _ "github.com/go-admin-team/go-admin-core/sdk/pkg/response" "go-admin/app/admin/models/tools" - tools2 "go-admin/tools" - "go-admin/tools/app" ) // @Summary 分页列表数据 / page list data @@ -16,35 +16,38 @@ import ( // @Param tableName query string false "tableName / 数据表名称" // @Param pageSize query int false "pageSize / 页条数" // @Param pageIndex query int false "pageIndex / 页码" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" +// @Success 200 {object} response.Response "{"code": 200, "data": [...]}" // @Router /api/v1/db/columns/page [get] -func GetDBColumnList(c *gin.Context) { +func (e *Gen) GetDBColumnList(c *gin.Context) { + e.Context = c + log := e.GetLogger() var data tools.DBColumns var err error var pageSize = 10 var pageIndex = 1 if size := c.Request.FormValue("pageSize"); size != "" { - pageSize, err = tools2.StringToInt(size) + pageSize, err = pkg.StringToInt(size) } if index := c.Request.FormValue("pageIndex"); index != "" { - pageIndex, err = tools2.StringToInt(index) + pageIndex, err = pkg.StringToInt(index) + } + + db, err := pkg.GetOrm(c) + if err != nil { + log.Errorf("get db connection error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "数据库连接获取失败") + return } data.TableName = c.Request.FormValue("tableName") - tools2.Assert(data.TableName == "", "table name cannot be empty!", 500) - result, count, err := data.GetPage(pageSize, pageIndex) - tools2.HasError(err, "", -1) - - var mp = make(map[string]interface{}, 3) - mp["list"] = result - mp["count"] = count - mp["pageIndex"] = pageIndex - mp["pageSize"] = pageSize - - var res app.Response - res.Data = mp - - c.JSON(http.StatusOK, res.ReturnOK()) + pkg.Assert(data.TableName == "", "table name cannot be empty!", 500) + result, count, err := data.GetPage(db, pageSize, pageIndex) + if err != nil { + log.Errorf("GetPage error, %s", err.Error()) + e.Error(500, err, "") + return + } + e.PageOK(result, count, pageIndex, pageSize, "查询成功") } diff --git a/app/admin/apis/tools/dbtables.go b/app/admin/apis/tools/dbtables.go index dbe62a94..12f6ae46 100644 --- a/app/admin/apis/tools/dbtables.go +++ b/app/admin/apis/tools/dbtables.go @@ -1,14 +1,15 @@ package tools import ( + "errors" "net/http" "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/config" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + _ "github.com/go-admin-team/go-admin-core/sdk/pkg/response" "go-admin/app/admin/models/tools" - tools2 "go-admin/tools" - "go-admin/tools/app" - "go-admin/tools/config" ) // @Summary 分页列表数据 / page list data @@ -17,39 +18,45 @@ import ( // @Param tableName query string false "tableName / 数据表名称" // @Param pageSize query int false "pageSize / 页条数" // @Param pageIndex query int false "pageIndex / 页码" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" +// @Success 200 {object} response.Response "{"code": 200, "data": [...]}" // @Router /api/v1/db/tables/page [get] -func GetDBTableList(c *gin.Context) { - var res app.Response +func (e *Gen) GetDBTableList(c *gin.Context) { + //var res response.Response var data tools.DBTables var err error var pageSize = 10 var pageIndex = 1 + e.Context = c + log := e.GetLogger() if config.DatabaseConfig.Driver == "sqlite3" || config.DatabaseConfig.Driver == "postgres" { - res.Msg = "对不起,sqlite3 或 postgres 不支持代码生成!" - c.JSON(http.StatusOK, res.ReturnError(500)) + err = errors.New("对不起,sqlite3 或 postgres 不支持代码生成!") + log.Warn(err) + e.Error(403, err, "") + //c.JSON(http.StatusOK, res.ReturnError(500)) return } if size := c.Request.FormValue("pageSize"); size != "" { - pageSize, err = tools2.StringToInt(size) + pageSize, err = pkg.StringToInt(size) } if index := c.Request.FormValue("pageIndex"); index != "" { - pageIndex, err = tools2.StringToInt(index) + pageIndex, err = pkg.StringToInt(index) + } + + db, err := pkg.GetOrm(c) + if err != nil { + log.Errorf("get db connection error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "数据库连接获取失败") + return } data.TableName = c.Request.FormValue("tableName") - result, count, err := data.GetPage(pageSize, pageIndex) - tools2.HasError(err, "", -1) - - var mp = make(map[string]interface{}, 3) - mp["list"] = result - mp["count"] = count - mp["pageIndex"] = pageIndex - mp["pageSize"] = pageSize - - res.Data = mp - - c.JSON(http.StatusOK, res.ReturnOK()) + result, count, err := data.GetPage(db, pageSize, pageIndex) + if err != nil { + log.Errorf("GetPage error, %s", err.Error()) + e.Error(500, err, "") + return + } + e.PageOK(result, count, pageIndex, pageSize, "查询成功") } diff --git a/app/admin/apis/tools/gen.go b/app/admin/apis/tools/gen.go index 50a4576d..b96c1a36 100644 --- a/app/admin/apis/tools/gen.go +++ b/app/admin/apis/tools/gen.go @@ -3,35 +3,86 @@ package tools import ( "bytes" "net/http" + "strconv" "text/template" + "time" "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/api" + "github.com/go-admin-team/go-admin-core/sdk/config" + "github.com/go-admin-team/go-admin-core/sdk/pkg" "go-admin/app/admin/models" "go-admin/app/admin/models/tools" - tools2 "go-admin/tools" - "go-admin/tools/app" - "go-admin/tools/config" + "go-admin/common/apis" ) -func Preview(c *gin.Context) { +type Gen struct { + apis.Api +} + +func (e Gen) Preview(c *gin.Context) { + e.Context = c + log := e.GetLogger() table := tools.SysTables{} - id, err := tools2.StringToInt(c.Param("tableId")) - tools2.HasError(err, "", -1) + id, err := pkg.StringToInt(c.Param("tableId")) + if err != nil { + log.Error(err) + e.Error(500, err, "") + return + } table.TableId = id - t1, err := template.ParseFiles("template/v3/model.go.template") - tools2.HasError(err, "", -1) - t2, err := template.ParseFiles("template/v3/no_actions/api.go.template") - tools2.HasError(err, "", -1) - t3, err := template.ParseFiles("template/v3/js.go.template") - tools2.HasError(err, "", -1) - t4, err := template.ParseFiles("template/v3/vue.go.template") - tools2.HasError(err, "", -1) - t5, err := template.ParseFiles("template/v3/no_actions/router_check_role.go.template") - tools2.HasError(err, "", -1) - t6, err := template.ParseFiles("template/v3/no_actions/dto.go.template") - tools2.HasError(err, "", -1) - tab, _ := table.Get() + t1, err := template.ParseFiles("template/v4/model.go.template") + if err != nil { + log.Error(err) + e.Error(500, err, "") + return + } + t2, err := template.ParseFiles("template/v4/no_actions/apis.go.template") + if err != nil { + log.Error(err) + e.Error(500, err, "") + return + } + t3, err := template.ParseFiles("template/v4/js.go.template") + if err != nil { + log.Error(err) + e.Error(500, err, "") + return + } + t4, err := template.ParseFiles("template/v4/vue.go.template") + if err != nil { + log.Error(err) + e.Error(500, err, "") + return + } + t5, err := template.ParseFiles("template/v4/no_actions/router_check_role.go.template") + if err != nil { + log.Error(err) + e.Error(500, err, "") + return + } + t6, err := template.ParseFiles("template/v4/dto.go.template") + if err != nil { + log.Error(err) + e.Error(500, err, "") + return + } + t7, err := template.ParseFiles("template/v4/no_actions/service.go.template") + if err != nil { + log.Error(err) + e.Error(500, err, "") + return + } + + db, err := pkg.GetOrm(c) + if err != nil { + log.Errorf("get db connection error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "数据库连接获取失败") + return + } + + tab, _ := table.Get(db) var b1 bytes.Buffer err = t1.Execute(&b1, tab) var b2 bytes.Buffer @@ -44,6 +95,8 @@ func Preview(c *gin.Context) { err = t5.Execute(&b5, tab) var b6 bytes.Buffer err = t6.Execute(&b6, tab) + var b7 bytes.Buffer + err = t7.Execute(&b7, tab) mp := make(map[string]interface{}) mp["template/model.go.template"] = b1.String() @@ -52,31 +105,70 @@ func Preview(c *gin.Context) { mp["template/vue.go.template"] = b4.String() mp["template/router.go.template"] = b5.String() mp["template/dto.go.template"] = b6.String() - var res app.Response - res.Data = mp - - c.JSON(http.StatusOK, res.ReturnOK()) + mp["template/service.go.template"] = b7.String() + e.OK(mp, "") } -func GenCodeV3(c *gin.Context) { +func (e Gen) GenCode(c *gin.Context) { + e.Context = c + log := e.GetLogger() table := tools.SysTables{} - id, err := tools2.StringToInt(c.Param("tableId")) - tools2.HasError(err, "", -1) - table.TableId = id - tab, _ := table.Get() - - if tab.IsActions == 1 { - ActionsGenV3(tab) - } else { - NOActionsGenV3(tab) + id, err := pkg.StringToInt(c.Param("tableId")) + if err != nil { + log.Error(err) + e.Error(500, err, "") + return } - app.OK(c, "", "Code generated successfully!") + db, err := pkg.GetOrm(c) + if err != nil { + log.Errorf("get db connection error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "数据库连接获取失败") + return + } + + table.TableId = id + tab, _ := table.Get(db) + + if tab.IsActions == 1 { + e.ActionsGen(c, tab) + } else { + e.NOActionsGen(c, tab) + } + + e.OK("", "Code generated successfully!") } -func NOActionsGenV3(tab tools.SysTables) { +func (e Gen) GenApiToFile(c *gin.Context) { + e.Context = c + log := e.GetLogger() + table := tools.SysTables{} + id, err := pkg.StringToInt(c.Param("tableId")) + if err != nil { + log.Error(err) + e.Error(500, err, "") + return + } - basePath := "template/v3/" + db, err := pkg.GetOrm(c) + if err != nil { + log.Errorf("get db connection error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "数据库连接获取失败") + return + } + + table.TableId = id + tab, _ := table.Get(db) + e.genApiToFile(c, tab) + + e.OK("", "Code generated successfully!") +} + +func (e Gen) NOActionsGen(c *gin.Context, tab tools.SysTables) { + e.Context = c + log := e.GetLogger() + + basePath := "template/v4/" routerFile := basePath + "no_actions/router_check_role.go.template" if tab.IsAuth == 2 { @@ -84,26 +176,54 @@ func NOActionsGenV3(tab tools.SysTables) { } t1, err := template.ParseFiles(basePath + "model.go.template") - tools2.HasError(err, "", -1) + if err != nil { + log.Error(err) + e.Error(500, err, "") + return + } t2, err := template.ParseFiles(basePath + "no_actions/apis.go.template") - tools2.HasError(err, "", -1) + if err != nil { + log.Error(err) + e.Error(500, err, "") + return + } t3, err := template.ParseFiles(routerFile) - tools2.HasError(err, "", -1) + if err != nil { + log.Error(err) + e.Error(500, err, "") + return + } t4, err := template.ParseFiles(basePath + "js.go.template") - tools2.HasError(err, "", -1) + if err != nil { + log.Error(err) + e.Error(500, err, "") + return + } t5, err := template.ParseFiles(basePath + "vue.go.template") - tools2.HasError(err, "", -1) + if err != nil { + log.Error(err) + e.Error(500, err, "") + return + } t6, err := template.ParseFiles(basePath + "dto.go.template") - tools2.HasError(err, "", -1) + if err != nil { + log.Error(err) + e.Error(500, err, "") + return + } t7, err := template.ParseFiles(basePath + "no_actions/service.go.template") - tools2.HasError(err, "", -1) + if err != nil { + log.Error(err) + e.Error(500, err, "") + return + } - _ = tools2.PathCreate("./app/" + tab.PackageName + "/apis/" + tab.ModuleName) - _ = tools2.PathCreate("./app/" + tab.PackageName + "/models/") - _ = tools2.PathCreate("./app/" + tab.PackageName + "/router/") - _ = tools2.PathCreate("./app/" + tab.PackageName + "/service/dto/") - _ = tools2.PathCreate(config.GenConfig.FrontPath + "/api/") - _ = tools2.PathCreate(config.GenConfig.FrontPath + "/views/" + tab.BusinessName) + _ = pkg.PathCreate("./app/" + tab.PackageName + "/apis/" + tab.ModuleName) + _ = pkg.PathCreate("./app/" + tab.PackageName + "/models/") + _ = pkg.PathCreate("./app/" + tab.PackageName + "/router/") + _ = pkg.PathCreate("./app/" + tab.PackageName + "/service/dto/") + _ = pkg.PathCreate(config.GenConfig.FrontPath + "/api/") + _ = pkg.PathCreate(config.GenConfig.FrontPath + "/views/" + tab.BusinessName) var b1 bytes.Buffer err = t1.Execute(&b1, tab) @@ -119,18 +239,43 @@ func NOActionsGenV3(tab tools.SysTables) { err = t6.Execute(&b6, tab) var b7 bytes.Buffer err = t7.Execute(&b7, tab) - tools2.FileCreate(b1, "./app/"+tab.PackageName+"/models/"+tab.BusinessName+".go") - tools2.FileCreate(b2, "./app/"+tab.PackageName+"/apis/"+tab.ModuleName+"/"+tab.BusinessName+".go") - tools2.FileCreate(b3, "./app/"+tab.PackageName+"/router/"+tab.BusinessName+".go") - tools2.FileCreate(b4, config.GenConfig.FrontPath+"/api/"+tab.BusinessName+".js") - tools2.FileCreate(b5, config.GenConfig.FrontPath+"/views/"+tab.BusinessName+"/index.vue") - tools2.FileCreate(b6, "./app/"+tab.PackageName+"/service/dto/"+tab.BusinessName+".go") - tools2.FileCreate(b7, "./app/"+tab.PackageName+"/service/"+tab.BusinessName+".go") + pkg.FileCreate(b1, "./app/"+tab.PackageName+"/models/"+tab.BusinessName+".go") + pkg.FileCreate(b2, "./app/"+tab.PackageName+"/apis/"+tab.ModuleName+"/"+tab.BusinessName+".go") + pkg.FileCreate(b3, "./app/"+tab.PackageName+"/router/"+tab.BusinessName+".go") + pkg.FileCreate(b4, config.GenConfig.FrontPath+"/api/"+tab.BusinessName+".js") + pkg.FileCreate(b5, config.GenConfig.FrontPath+"/views/"+tab.BusinessName+"/index.vue") + pkg.FileCreate(b6, "./app/"+tab.PackageName+"/service/dto/"+tab.BusinessName+".go") + pkg.FileCreate(b7, "./app/"+tab.PackageName+"/service/"+tab.BusinessName+".go") } -func ActionsGenV3(tab tools.SysTables) { - basePath := "template/v3/" +func (e Gen) genApiToFile(c *gin.Context, tab tools.SysTables) { + e.Context = c + log := e.GetLogger() + + basePath := "template/" + + t1, err := template.ParseFiles(basePath + "api_migrate.template") + if err != nil { + log.Error(err) + e.Error(500, err, "") + return + } + i := strconv.FormatInt(time.Now().UnixNano()/1e6, 10) + var b1 bytes.Buffer + err = t1.Execute(&b1, struct { + tools.SysTables + GenerateTime string + }{tab, i}) + + pkg.FileCreate(b1, "./cmd/migrate/migration/version-local/"+i+"_migrate.go") + +} + +func (e Gen) ActionsGen(c *gin.Context, tab tools.SysTables) { + e.Context = c + log := api.GetRequestLogger(c) + basePath := "template/v4/" routerFile := basePath + "actions/router_check_role.go.template" if tab.IsAuth == 2 { @@ -138,21 +283,41 @@ func ActionsGenV3(tab tools.SysTables) { } t1, err := template.ParseFiles(basePath + "model.go.template") - tools2.HasError(err, "", -1) + if err != nil { + log.Error(err) + e.Error(500, err, "") + return + } t3, err := template.ParseFiles(routerFile) - tools2.HasError(err, "", -1) + if err != nil { + log.Error(err) + e.Error(500, err, "") + return + } t4, err := template.ParseFiles(basePath + "js.go.template") - tools2.HasError(err, "", -1) + if err != nil { + log.Error(err) + e.Error(500, err, "") + return + } t5, err := template.ParseFiles(basePath + "vue.go.template") - tools2.HasError(err, "", -1) + if err != nil { + log.Error(err) + e.Error(500, err, "") + return + } t6, err := template.ParseFiles(basePath + "dto.go.template") - tools2.HasError(err, "", -1) + if err != nil { + log.Error(err) + e.Error(500, err, "") + return + } - _ = tools2.PathCreate("./app/" + tab.PackageName + "/models/") - _ = tools2.PathCreate("./app/" + tab.PackageName + "/router/") - _ = tools2.PathCreate("./app/" + tab.PackageName + "/service/dto/") - _ = tools2.PathCreate(config.GenConfig.FrontPath + "/api/") - _ = tools2.PathCreate(config.GenConfig.FrontPath + "/views/" + tab.BusinessName) + _ = pkg.PathCreate("./app/" + tab.PackageName + "/models/") + _ = pkg.PathCreate("./app/" + tab.PackageName + "/router/") + _ = pkg.PathCreate("./app/" + tab.PackageName + "/service/dto/") + _ = pkg.PathCreate(config.GenConfig.FrontPath + "/api/") + _ = pkg.PathCreate(config.GenConfig.FrontPath + "/views/" + tab.BusinessName) var b1 bytes.Buffer err = t1.Execute(&b1, tab) @@ -165,21 +330,30 @@ func ActionsGenV3(tab tools.SysTables) { var b6 bytes.Buffer err = t6.Execute(&b6, tab) - tools2.FileCreate(b1, "./app/"+tab.PackageName+"/models/"+tab.BusinessName+".go") - tools2.FileCreate(b3, "./app/"+tab.PackageName+"/router/"+tab.BusinessName+".go") - tools2.FileCreate(b4, config.GenConfig.FrontPath+"/api/"+tab.BusinessName+".js") - tools2.FileCreate(b5, config.GenConfig.FrontPath+"/views/"+tab.BusinessName+"/index.vue") - tools2.FileCreate(b6, "./app/"+tab.PackageName+"/service/dto/"+tab.BusinessName+".go") + pkg.FileCreate(b1, "./app/"+tab.PackageName+"/models/"+tab.BusinessName+".go") + pkg.FileCreate(b3, "./app/"+tab.PackageName+"/router/"+tab.BusinessName+".go") + pkg.FileCreate(b4, config.GenConfig.FrontPath+"/api/"+tab.BusinessName+".js") + pkg.FileCreate(b5, config.GenConfig.FrontPath+"/views/"+tab.BusinessName+"/index.vue") + pkg.FileCreate(b6, "./app/"+tab.PackageName+"/service/dto/"+tab.BusinessName+".go") } -func GenMenuAndApi(c *gin.Context) { - +func (e Gen) GenMenuAndApi(c *gin.Context) { + log := api.GetRequestLogger(c) + e.Context = c table := tools.SysTables{} - timeNow := tools2.GetCurrentTime() - id, err := tools2.StringToInt(c.Param("tableId")) - tools2.HasError(err, "", -1) + timeNow := pkg.GetCurrentTime() + id, err := pkg.StringToInt(c.Param("tableId")) + pkg.HasError(err, "", -1) + + db, err := pkg.GetOrm(c) + if err != nil { + log.Errorf("get db connection error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "数据库连接获取失败") + return + } + table.TableId = id - tab, _ := table.Get() + tab, _ := table.Get(db) Mmenu := models.Menu{} Mmenu.MenuName = tab.TBName + "Manage" Mmenu.Title = tab.TableComment @@ -197,7 +371,7 @@ func GenMenuAndApi(c *gin.Context) { Mmenu.UpdateBy = "1" Mmenu.CreatedAt = timeNow Mmenu.UpdatedAt = timeNow - Mmenu.MenuId, err = Mmenu.Create() + Mmenu.MenuId, err = Mmenu.Create(db) Cmenu := models.Menu{} Cmenu.MenuName = tab.TBName @@ -206,7 +380,7 @@ func GenMenuAndApi(c *gin.Context) { Cmenu.Path = tab.TBName Cmenu.MenuType = "C" Cmenu.Action = "无" - Cmenu.Permission = tab.ModuleName + ":" + tab.BusinessName + ":list" + Cmenu.Permission = tab.PackageName + ":" + tab.BusinessName + ":list" Cmenu.ParentId = Mmenu.MenuId Cmenu.NoCache = false Cmenu.Component = "/" + tab.BusinessName + "/index" @@ -217,7 +391,7 @@ func GenMenuAndApi(c *gin.Context) { Cmenu.UpdateBy = "1" Cmenu.CreatedAt = timeNow Cmenu.UpdatedAt = timeNow - Cmenu.MenuId, err = Cmenu.Create() + Cmenu.MenuId, err = Cmenu.Create(db) MList := models.Menu{} MList.MenuName = "" @@ -226,7 +400,7 @@ func GenMenuAndApi(c *gin.Context) { MList.Path = tab.TBName MList.MenuType = "F" MList.Action = "无" - MList.Permission = tab.ModuleName + ":" + tab.BusinessName + ":query" + MList.Permission = tab.PackageName + ":" + tab.BusinessName + ":query" MList.ParentId = Cmenu.MenuId MList.NoCache = false MList.Sort = 0 @@ -236,7 +410,7 @@ func GenMenuAndApi(c *gin.Context) { MList.UpdateBy = "1" MList.CreatedAt = timeNow MList.UpdatedAt = timeNow - MList.MenuId, err = MList.Create() + MList.MenuId, err = MList.Create(db) MCreate := models.Menu{} MCreate.MenuName = "" @@ -245,7 +419,7 @@ func GenMenuAndApi(c *gin.Context) { MCreate.Path = tab.TBName MCreate.MenuType = "F" MCreate.Action = "无" - MCreate.Permission = tab.ModuleName + ":" + tab.BusinessName + ":add" + MCreate.Permission = tab.PackageName + ":" + tab.BusinessName + ":add" MCreate.ParentId = Cmenu.MenuId MCreate.NoCache = false MCreate.Sort = 0 @@ -255,7 +429,7 @@ func GenMenuAndApi(c *gin.Context) { MCreate.UpdateBy = "1" MCreate.CreatedAt = timeNow MCreate.UpdatedAt = timeNow - MCreate.MenuId, err = MCreate.Create() + MCreate.MenuId, err = MCreate.Create(db) MUpdate := models.Menu{} MUpdate.MenuName = "" @@ -264,7 +438,7 @@ func GenMenuAndApi(c *gin.Context) { MUpdate.Path = tab.TBName MUpdate.MenuType = "F" MUpdate.Action = "无" - MUpdate.Permission = tab.ModuleName + ":" + tab.BusinessName + ":edit" + MUpdate.Permission = tab.PackageName + ":" + tab.BusinessName + ":edit" MUpdate.ParentId = Cmenu.MenuId MUpdate.NoCache = false MUpdate.Sort = 0 @@ -274,7 +448,7 @@ func GenMenuAndApi(c *gin.Context) { MUpdate.UpdateBy = "1" MUpdate.CreatedAt = timeNow MUpdate.UpdatedAt = timeNow - MUpdate.MenuId, err = MUpdate.Create() + MUpdate.MenuId, err = MUpdate.Create(db) MDelete := models.Menu{} MDelete.MenuName = "" @@ -283,7 +457,7 @@ func GenMenuAndApi(c *gin.Context) { MDelete.Path = tab.TBName MDelete.MenuType = "F" MDelete.Action = "无" - MDelete.Permission = tab.ModuleName + ":" + tab.BusinessName + ":remove" + MDelete.Permission = tab.PackageName + ":" + tab.BusinessName + ":remove" MDelete.ParentId = Cmenu.MenuId MDelete.NoCache = false MDelete.Sort = 0 @@ -293,7 +467,7 @@ func GenMenuAndApi(c *gin.Context) { MDelete.UpdateBy = "1" MDelete.CreatedAt = timeNow MDelete.UpdatedAt = timeNow - MDelete.MenuId, err = MDelete.Create() + MDelete.MenuId, err = MDelete.Create(db) var InterfaceId = 63 Amenu := models.Menu{} @@ -312,7 +486,7 @@ func GenMenuAndApi(c *gin.Context) { Amenu.UpdateBy = "1" Amenu.CreatedAt = timeNow Amenu.UpdatedAt = timeNow - Amenu.MenuId, err = Amenu.Create() + Amenu.MenuId, err = Amenu.Create(db) AList := models.Menu{} AList.MenuName = "" @@ -330,7 +504,7 @@ func GenMenuAndApi(c *gin.Context) { AList.UpdateBy = "1" AList.CreatedAt = timeNow AList.UpdatedAt = timeNow - AList.MenuId, err = AList.Create() + AList.MenuId, err = AList.Create(db) AGet := models.Menu{} AGet.MenuName = "" @@ -348,7 +522,7 @@ func GenMenuAndApi(c *gin.Context) { AGet.UpdateBy = "1" AGet.CreatedAt = timeNow AGet.UpdatedAt = timeNow - AGet.MenuId, err = AGet.Create() + AGet.MenuId, err = AGet.Create(db) ACreate := models.Menu{} ACreate.MenuName = "" @@ -366,7 +540,7 @@ func GenMenuAndApi(c *gin.Context) { ACreate.UpdateBy = "1" ACreate.CreatedAt = timeNow ACreate.UpdatedAt = timeNow - ACreate.MenuId, err = ACreate.Create() + ACreate.MenuId, err = ACreate.Create(db) AUpdate := models.Menu{} AUpdate.MenuName = "" @@ -384,7 +558,7 @@ func GenMenuAndApi(c *gin.Context) { AUpdate.UpdateBy = "1" AUpdate.CreatedAt = timeNow AUpdate.UpdatedAt = timeNow - AUpdate.MenuId, err = AUpdate.Create() + AUpdate.MenuId, err = AUpdate.Create(db) ADelete := models.Menu{} ADelete.MenuName = "" @@ -402,7 +576,7 @@ func GenMenuAndApi(c *gin.Context) { ADelete.UpdateBy = "1" ADelete.CreatedAt = timeNow ADelete.UpdatedAt = timeNow - ADelete.MenuId, err = ADelete.Create() + ADelete.MenuId, err = ADelete.Create(db) - app.OK(c, "", "数据生成成功!") + e.OK("", "数据生成成功!") } diff --git a/app/admin/apis/tools/systables.go b/app/admin/apis/tools/systables.go index f4c9dc82..9a1ad610 100644 --- a/app/admin/apis/tools/systables.go +++ b/app/admin/apis/tools/systables.go @@ -5,98 +5,140 @@ import ( "strings" "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + _ "github.com/go-admin-team/go-admin-core/sdk/pkg/response" + "gorm.io/gorm" "go-admin/app/admin/models/tools" - tools2 "go-admin/tools" - "go-admin/tools/app" + "go-admin/common/apis" ) +type SysTable struct { + apis.Api +} + // @Summary 分页列表数据 // @Description 生成表分页列表 // @Tags 工具 - 生成表 // @Param tableName query string false "tableName / 数据表名称" // @Param pageSize query int false "pageSize / 页条数" // @Param pageIndex query int false "pageIndex / 页码" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" +// @Success 200 {object} response.Response "{"code": 200, "data": [...]}" // @Router /api/v1/sys/tables/page [get] -func GetSysTableList(c *gin.Context) { +func (e *SysTable) GetSysTableList(c *gin.Context) { + e.Context = c + log := e.GetLogger() var data tools.SysTables var err error var pageSize = 10 var pageIndex = 1 if size := c.Request.FormValue("pageSize"); size != "" { - pageSize, err = tools2.StringToInt(size) + pageSize, err = pkg.StringToInt(size) } if index := c.Request.FormValue("pageIndex"); index != "" { - pageIndex, err = tools2.StringToInt(index) + pageIndex, err = pkg.StringToInt(index) + } + + db, err := e.GetOrm() + if err != nil { + log.Errorf("get db connection error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "数据库连接获取失败") + return } data.TBName = c.Request.FormValue("tableName") data.TableComment = c.Request.FormValue("tableComment") - result, count, err := data.GetPage(pageSize, pageIndex) - tools2.HasError(err, "", -1) - - var mp = make(map[string]interface{}, 3) - mp["list"] = result - mp["count"] = count - mp["pageIndex"] = pageIndex - mp["pageSize"] = pageSize - - var res app.Response - res.Data = mp - - c.JSON(http.StatusOK, res.ReturnOK()) + result, count, err := data.GetPage(db, pageSize, pageIndex) + if err != nil { + log.Errorf("GetPage error, %s", err.Error()) + e.Error(500, err, "") + return + } + e.PageOK(result, count, pageIndex, pageSize, "查询成功") } // @Summary 获取配置 // @Description 获取JSON // @Tags 工具 - 生成表 // @Param configKey path int true "configKey" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" +// @Success 200 {object} response.Response "{"code": 200, "data": [...]}" // @Router /api/v1/sys/tables/info/{tableId} [get] // @Security Bearer -func GetSysTables(c *gin.Context) { +func (e *SysTable) GetSysTables(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Errorf("get db connection error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "数据库连接获取失败") + return + } + var data tools.SysTables - data.TableId, _ = tools2.StringToInt(c.Param("tableId")) - result, err := data.Get() - tools2.HasError(err, "抱歉未找到相关信息", -1) + data.TableId, _ = pkg.StringToInt(c.Param("tableId")) + result, err := data.Get(db) + if err != nil { + log.Errorf("Get error, %s", err.Error()) + e.Error(500, err, "") + return + } - var res app.Response - res.Data = result mp := make(map[string]interface{}) mp["list"] = result.Columns mp["info"] = result - res.Data = mp - c.JSON(http.StatusOK, res.ReturnOK()) + e.OK(mp, "") } -func GetSysTablesInfo(c *gin.Context) { +func (e *SysTable) GetSysTablesInfo(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Errorf("get db connection error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "数据库连接获取失败") + return + } + var data tools.SysTables if c.Request.FormValue("tableName") != "" { data.TBName = c.Request.FormValue("tableName") } - result, err := data.Get() - tools2.HasError(err, "抱歉未找到相关信息", -1) + result, err := data.Get(db) + if err != nil { + log.Errorf("Get error, %s", err.Error()) + e.Error(500, err, "抱歉未找到相关信息") + return + } - var res app.Response - res.Data = result mp := make(map[string]interface{}) mp["list"] = result.Columns mp["info"] = result - res.Data = mp - c.JSON(http.StatusOK, res.ReturnOK()) + e.OK(mp, "") + //res.Data = mp + //c.JSON(http.StatusOK, res.ReturnOK()) } -func GetSysTablesTree(c *gin.Context) { - var data tools.SysTables - result, err := data.GetTree() - tools2.HasError(err, "抱歉未找到相关信息", -1) +func (e *SysTable) GetSysTablesTree(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Errorf("get db connection error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "数据库连接获取失败") + return + } - var res app.Response - res.Data = result - c.JSON(http.StatusOK, res.ReturnOK()) + var data tools.SysTables + result, err := data.GetTree(db) + if err != nil { + log.Errorf("GetTree error, %s", err.Error()) + e.Error(500, err, "抱歉未找到相关信息") + return + } + + e.OK(result, "") } // @Summary 添加表结构 @@ -109,31 +151,49 @@ func GetSysTablesTree(c *gin.Context) { // @Success 200 {string} string "{"code": -1, "message": "添加失败"}" // @Router /api/v1/sys/tables/info [post] // @Security Bearer -func InsertSysTable(c *gin.Context) { +func (e *SysTable) InsertSysTable(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Errorf("get db connection error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "数据库连接获取失败") + return + } tablesList := strings.Split(c.Request.FormValue("tables"), ",") for i := 0; i < len(tablesList); i++ { - data, err := genTableInit(tablesList, i, c) + data, err := genTableInit(db, tablesList, i, c) + if err != nil { + log.Errorf("genTableInit error, %s", err.Error()) + e.Error(500, err, "") + return + } - _, err = data.Create() - tools2.HasError(err, "", -1) + _, err = data.Create(db) + if err != nil { + log.Errorf("Create error, %s", err.Error()) + e.Error(500, err, "") + return + } } - var res app.Response - res.Msg = "添加成功!" - c.JSON(http.StatusOK, res.ReturnOK()) + e.OK(nil, "添加成功") } -func genTableInit(tablesList []string, i int, c *gin.Context) (tools.SysTables, error) { +func genTableInit(tx *gorm.DB, tablesList []string, i int, c *gin.Context) (tools.SysTables, error) { var data tools.SysTables var dbTable tools.DBTables var dbColumn tools.DBColumns data.TBName = tablesList[i] - data.CreateBy = tools2.GetUserIdStr(c) + data.CreateBy = 0 dbTable.TableName = data.TBName - dbtable, err := dbTable.Get() + dbtable, err := dbTable.Get(tx) + if err != nil { + return data, err + } dbColumn.TableName = data.TBName tablenamelist := strings.Split(dbColumn.TableName, "_") @@ -148,8 +208,8 @@ func genTableInit(tablesList []string, i int, c *gin.Context) (tools.SysTables, data.TplCategory = "crud" data.Crud = true - dbcolumn, err := dbColumn.GetList() - data.CreateBy = tools2.GetUserIdStr(c) + dbcolumn, err := dbColumn.GetList(tx) + data.CreateBy = 0 data.TableComment = dbtable.TableComment if dbtable.TableComment == "" { data.TableComment = data.ClassName @@ -191,8 +251,8 @@ func genTableInit(tablesList []string, i int, c *gin.Context) (tools.SysTables, column.IsPk = "1" column.Pk = true data.PkColumn = dbcolumn[i].ColumnName - column.GoField = strings.ToUpper(column.GoField) - column.JsonField = strings.ToUpper(column.JsonField) + //column.GoField = strings.ToUpper(column.GoField) + //column.JsonField = strings.ToUpper(column.JsonField) data.PkGoField = column.GoField data.PkJsonField = column.JsonField } @@ -204,9 +264,7 @@ func genTableInit(tablesList []string, i int, c *gin.Context) (tools.SysTables, if strings.Contains(dbcolumn[i].ColumnType, "int") { if strings.Contains(dbcolumn[i].ColumnKey, "PR") { - column.GoType = "uint" - } else if strings.Contains(dbcolumn[i].ColumnType, "unsigned") { - column.GoType = "uint" + column.GoType = "int" } else { column.GoType = "string" } @@ -237,18 +295,28 @@ func genTableInit(tablesList []string, i int, c *gin.Context) (tools.SysTables, // @Success 200 {string} string "{"code": -1, "message": "添加失败"}" // @Router /api/v1/sys/tables/info [put] // @Security Bearer -func UpdateSysTable(c *gin.Context) { +func (e *SysTable) UpdateSysTable(c *gin.Context) { var data tools.SysTables err := c.Bind(&data) - tools2.HasError(err, "数据解析失败", 500) - data.UpdateBy = tools2.GetUserIdStr(c) - result, err := data.Update() - tools2.HasError(err, "", -1) + pkg.HasError(err, "数据解析失败", 500) - var res app.Response - res.Data = result - res.Msg = "修改成功" - c.JSON(http.StatusOK, res.ReturnOK()) + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Errorf("get db connection error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "数据库连接获取失败") + return + } + + data.UpdateBy = 0 + result, err := data.Update(db) + if err != nil { + log.Errorf("Update error, %s", err.Error()) + e.Error(500, err, "") + return + } + e.OK(result, "修改成功") } // @Summary 删除表结构 @@ -258,12 +326,23 @@ func UpdateSysTable(c *gin.Context) { // @Success 200 {string} string "{"code": 200, "message": "删除成功"}" // @Success 200 {string} string "{"code": -1, "message": "删除失败"}" // @Router /api/v1/sys/tables/info/{tableId} [delete] -func DeleteSysTables(c *gin.Context) { +func (e *SysTable) DeleteSysTables(c *gin.Context) { + e.Context = c + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Errorf("get db connection error, %s", err.Error()) + e.Error(http.StatusInternalServerError, err, "数据库连接获取失败") + return + } + var data tools.SysTables - IDS := tools2.IdsStrToIdsIntGroup("tableId", c) - _, err := data.BatchDelete(IDS) - tools2.HasError(err, "删除失败", 500) - var res app.Response - res.Msg = "删除成功" - c.JSON(http.StatusOK, res.ReturnOK()) + IDS := pkg.IdsStrToIdsIntGroup("tableId", c) + _, err = data.BatchDelete(db, IDS) + if err != nil { + log.Errorf("BatchDelete error, %s", err.Error()) + e.Error(500, err, "删除失败") + return + } + e.OK(nil, "删除成功") } diff --git a/app/admin/middleware/db.go b/app/admin/middleware/db.go deleted file mode 100644 index 80da3b40..00000000 --- a/app/admin/middleware/db.go +++ /dev/null @@ -1,58 +0,0 @@ -package middleware - -import ( - "database/sql" - "errors" - - "gorm.io/driver/mysql" - "gorm.io/driver/postgres" - "gorm.io/gorm" - "gorm.io/gorm/schema" - - "go-admin/common/config" - "go-admin/common/global" - "go-admin/common/middleware" - "go-admin/tools" -) - -var WithContextDb = middleware.WithContextDb - -func getGormFromDb(driver string, db *sql.DB, config *gorm.Config) (*gorm.DB, error) { - switch driver { - case "mysql": - return gorm.Open(mysql.New(mysql.Config{Conn: db}), config) - case "postgres": - return gorm.Open(postgres.New(postgres.Config{Conn: db}), config) - default: - return nil, errors.New("not support this db driver") - } -} - -func GetGormFromConfig(cfg config.Conf) map[string]*gorm.DB { - gormDB := make(map[string]*gorm.DB) - if cfg.GetSaas() { - var err error - for k, v := range cfg.GetDbs() { - gormDB[k], err = getGormFromDb(v.Driver, v.DB, &gorm.Config{ - NamingStrategy: schema.NamingStrategy{ - SingularTable: true, - }, - }) - if err != nil { - global.Logger.Fatal(tools.Red(k+" connect error :"), err) - } - } - return gormDB - } - c := cfg.GetDb() - db, err := getGormFromDb(c.Driver, c.DB, &gorm.Config{ - NamingStrategy: schema.NamingStrategy{ - SingularTable: true, - }, - }) - if err != nil { - global.Logger.Fatal(tools.Red(c.Driver+" connect error :"), err) - } - gormDB["*"] = db - return gormDB -} diff --git a/app/admin/middleware/logger.go b/app/admin/middleware/logger.go deleted file mode 100644 index f3a621d8..00000000 --- a/app/admin/middleware/logger.go +++ /dev/null @@ -1,110 +0,0 @@ -package middleware - -import ( - "fmt" - "strings" - "time" - - "github.com/gin-gonic/gin" - - "go-admin/app/admin/models" - "go-admin/common/global" - "go-admin/tools" - config2 "go-admin/tools/config" -) - -// 日志记录到文件 -func LoggerToFile() gin.HandlerFunc { - - return func(c *gin.Context) { - // 开始时间 - startTime := time.Now() - - // 处理请求 - c.Next() - - // 结束时间 - endTime := time.Now() - - // 执行时间 - latencyTime := endTime.Sub(startTime) - - // 请求方式 - reqMethod := c.Request.Method - - // 请求路由 - reqUri := c.Request.RequestURI - - // 状态码 - statusCode := c.Writer.Status() - - // 请求IP - clientIP := c.ClientIP() - - // 日志格式 - fmt.Printf("%s [INFO] %s %s %3d %13v %15s \r\n", - startTime.Format("2006-01-02 15:04:05"), - reqMethod, - reqUri, - statusCode, - latencyTime, - clientIP, - ) - - global.RequestLogger.Info(statusCode, latencyTime, clientIP, reqMethod, reqUri) - - if c.Request.Method != "GET" && c.Request.Method != "OPTIONS" && config2.LoggerConfig.EnabledDB { - SetDBOperLog(c, clientIP, statusCode, reqUri, reqMethod, latencyTime) - } - } -} - -// 写入操作日志表 -// 该方法后续即将弃用 -func SetDBOperLog(c *gin.Context, clientIP string, statusCode int, reqUri string, reqMethod string, latencyTime time.Duration) { - menu := models.Menu{} - menu.Path = reqUri - menu.Action = reqMethod - menuList, _ := menu.Get() - sysOperLog := models.SysOperLog{} - sysOperLog.OperIp = clientIP - sysOperLog.OperLocation = tools.GetLocation(clientIP) - sysOperLog.Status = tools.IntToString(statusCode) - sysOperLog.OperName = tools.GetUserName(c) - sysOperLog.RequestMethod = c.Request.Method - sysOperLog.OperUrl = reqUri - if reqUri == "/login" { - sysOperLog.BusinessType = "10" - sysOperLog.Title = "用户登录" - sysOperLog.OperName = "-" - } else if strings.Contains(reqUri, "/api/v1/logout") { - sysOperLog.BusinessType = "11" - } else if strings.Contains(reqUri, "/api/v1/getCaptcha") { - sysOperLog.BusinessType = "12" - sysOperLog.Title = "验证码" - } else { - if reqMethod == "POST" { - sysOperLog.BusinessType = "1" - } else if reqMethod == "PUT" { - sysOperLog.BusinessType = "2" - } else if reqMethod == "DELETE" { - sysOperLog.BusinessType = "3" - } - } - sysOperLog.Method = reqMethod - if len(menuList) > 0 { - sysOperLog.Title = menuList[0].Title - } - b, _ := c.Get("body") - sysOperLog.OperParam, _ = tools.StructToJsonStr(b) - sysOperLog.CreateBy = tools.GetUserName(c) - sysOperLog.OperTime = tools.GetCurrentTime() - sysOperLog.LatencyTime = (latencyTime).String() - sysOperLog.UserAgent = c.Request.UserAgent() - if c.Err() == nil { - sysOperLog.Status = "0" - } else { - sysOperLog.Status = "1" - } - _, _ = sysOperLog.Create() -} diff --git a/app/admin/middleware/permission.go b/app/admin/middleware/permission.go deleted file mode 100644 index a0566310..00000000 --- a/app/admin/middleware/permission.go +++ /dev/null @@ -1,42 +0,0 @@ -package middleware - -import ( - "fmt" - "net/http" - - "github.com/gin-gonic/gin" - - mycasbin "go-admin/pkg/casbin" - "go-admin/pkg/jwtauth" - "go-admin/tools" -) - -//权限检查中间件 -func AuthCheckRole() gin.HandlerFunc { - return func(c *gin.Context) { - data, _ := c.Get(jwtauth.JwtPayloadKey) - v := data.(jwtauth.MapClaims) - e := mycasbin.Casbin() - //检查权限 - res, err := e.Enforce(v["rolekey"], c.Request.URL.Path, c.Request.Method) - tools.HasError(err, "", 500) - - fmt.Printf("%s [INFO] %s %s %s \r\n", - tools.GetCurrentTimeStr(), - c.Request.Method, - c.Request.URL.Path, - v["rolekey"], - ) - - if res { - c.Next() - } else { - c.JSON(http.StatusOK, gin.H{ - "code": 403, - "msg": "对不起,您没有该接口访问权限,请联系管理员", - }) - c.Abort() - return - } - } -} diff --git a/app/admin/models/config.go b/app/admin/models/config.go deleted file mode 100644 index d41cd6c3..00000000 --- a/app/admin/models/config.go +++ /dev/null @@ -1,134 +0,0 @@ -package models - -import ( - "errors" - _ "time" - - orm "go-admin/common/global" - "go-admin/tools" -) - -type SysConfig struct { - ConfigId int `json:"configId" gorm:"primary_key;auto_increment;"` //编码 - ConfigName string `json:"configName" gorm:"size:128;"` //参数名称 - ConfigKey string `json:"configKey" gorm:"size:128;"` //参数键名 - ConfigValue string `json:"configValue" gorm:"size:255;"` //参数键值 - ConfigType string `json:"configType" gorm:"size:64;"` //是否系统内置 - Remark string `json:"remark" gorm:"size:128;"` //备注 - CreateBy string `json:"createBy" gorm:"size:128;"` - UpdateBy string `json:"updateBy" gorm:"size:128;"` - BaseModel - - DataScope string `json:"dataScope" gorm:"-"` - Params string `json:"params" gorm:"-"` -} - -func (SysConfig) TableName() string { - return "sys_config" -} - -// Config 创建 -func (e *SysConfig) Create() (SysConfig, error) { - var doc SysConfig - var i int64 - orm.Eloquent.Table(e.TableName()).Where("config_name=? or config_key = ?", e.ConfigName, e.ConfigKey).Count(&i) - if i > 0 { - return doc, errors.New("参数名称或者参数键名已经存在!") - } - - result := orm.Eloquent.Table(e.TableName()).Create(&e) - if result.Error != nil { - err := result.Error - return doc, err - } - doc = *e - return doc, nil -} - -// 获取 Config -func (e *SysConfig) Get() (SysConfig, error) { - var doc SysConfig - - table := orm.Eloquent.Table(e.TableName()) - if e.ConfigId != 0 { - table = table.Where("config_id = ?", e.ConfigId) - } - - if e.ConfigKey != "" { - table = table.Where("config_key = ?", e.ConfigKey) - } - - if err := table.First(&doc).Error; err != nil { - return doc, err - } - return doc, nil -} - -func (e *SysConfig) GetPage(pageSize int, pageIndex int) ([]SysConfig, int, error) { - var doc []SysConfig - - table := orm.Eloquent.Table(e.TableName()) - - if e.ConfigName != "" { - table = table.Where("config_name = ?", e.ConfigName) - } - if e.ConfigKey != "" { - table = table.Where("config_key = ?", e.ConfigKey) - } - if e.ConfigType != "" { - table = table.Where("config_type = ?", e.ConfigType) - } - - // 数据权限控制 - dataPermission := new(DataPermission) - dataPermission.UserId, _ = tools.StringToInt(e.DataScope) - table, err := dataPermission.GetDataScope("sys_config", table) - if err != nil { - return nil, 0, err - } - var count int64 - - if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil { - return nil, 0, err - } - //table.Where("`deleted_at` IS NULL").Count(&count) - return doc, int(count), nil -} - -func (e *SysConfig) Update(id int) (update SysConfig, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("config_id = ?", id).First(&update).Error; err != nil { - return - } - - if e.ConfigName != "" && e.ConfigName != update.ConfigName { - return update, errors.New("参数名称不允许修改!") - } - - if e.ConfigKey != "" && e.ConfigKey != update.ConfigKey { - return update, errors.New("参数键名不允许修改!") - } - - //参数1:是要修改的数据 - //参数2:是修改的数据 - if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil { - return - } - return -} - -func (e *SysConfig) Delete() (success bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("config_id = ?", e.ConfigId).Delete(&SysConfig{}).Error; err != nil { - success = false - return - } - success = true - return -} - -func (e *SysConfig) BatchDelete(id []int) (Result bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("config_id in (?)", id).Delete(&SysConfig{}).Error; err != nil { - return - } - Result = true - return -} diff --git a/app/admin/models/datascope.go b/app/admin/models/datascope.go deleted file mode 100644 index 83702fb8..00000000 --- a/app/admin/models/datascope.go +++ /dev/null @@ -1,85 +0,0 @@ -package models - -import ( - "errors" - "fmt" - - "gorm.io/gorm" - - "go-admin/tools" - "go-admin/tools/config" -) - -type DataPermission struct { - DataScope string - UserId int - DeptId int - RoleId int -} - -func (e *DataPermission) GetDataScope(tbname string, table *gorm.DB) (*gorm.DB, error) { - - if !config.ApplicationConfig.EnableDP { - usageStr := `数据权限已经为您` + tools.Green(`关闭`) + `,如需开启请参考配置文件字段说明` - fmt.Printf("%s\n", usageStr) - return table, nil - } - SysUser := new(SysUser) - SysRole := new(SysRole) - SysUser.UserId = e.UserId - user, err := SysUser.Get() - if err != nil { - return nil, errors.New("获取用户数据出错 msg:" + err.Error()) - } - SysRole.RoleId = user.RoleId - role, err := SysRole.Get() - if err != nil { - return nil, errors.New("获取用户数据出错 msg:" + err.Error()) - } - if role.DataScope == "2" { - table = table.Where(tbname+".create_by in (select sys_user.user_id from sys_role_dept left join sys_user on sys_user.dept_id=sys_role_dept.dept_id where sys_role_dept.role_id = ?)", user.RoleId) - } - if role.DataScope == "3" { - table = table.Where(tbname+".create_by in (SELECT user_id from sys_user where dept_id = ? )", user.DeptId) - } - if role.DataScope == "4" { - table = table.Where(tbname+".create_by in (SELECT user_id from sys_user where sys_user.dept_id in(select dept_id from sys_dept where dept_path like ? ))", "%"+tools.IntToString(user.DeptId)+"%") - } - if role.DataScope == "5" || role.DataScope == "" { - table = table.Where(tbname+".create_by = ?", e.UserId) - } - - return table, nil -} - -func DataScopes(tableName string, userid int) func(db *gorm.DB) *gorm.DB { - return func(db *gorm.DB) *gorm.DB { - SysUser := new(SysUser) - SysRole := new(SysRole) - SysUser.UserId = userid - user, err := SysUser.Get() - if err != nil { - db.Error = errors.New("获取用户数据出错 msg:" + err.Error()) - return db - } - SysRole.RoleId = user.RoleId - role, err := SysRole.Get() - if err != nil { - db.Error = errors.New("获取用户数据出错 msg:" + err.Error()) - return db - } - if role.DataScope == "2" { - return db.Where(tableName+".create_by in (select sys_user.user_id from sys_role_dept left join sys_user on sys_user.dept_id=sys_role_dept.dept_id where sys_role_dept.role_id = ?)", user.RoleId) - } - if role.DataScope == "3" { - return db.Where(tableName+".create_by in (SELECT user_id from sys_user where dept_id = ? )", user.DeptId) - } - if role.DataScope == "4" { - return db.Where(tableName+".create_by in (SELECT user_id from sys_user where sys_user.dept_id in(select dept_id from sys_dept where dept_path like ? ))", "%"+tools.IntToString(user.DeptId)+"%") - } - if role.DataScope == "5" || role.DataScope == "" { - return db.Where(tableName+".create_by = ?", userid) - } - return db - } -} diff --git a/app/admin/models/dept.go b/app/admin/models/dept.go deleted file mode 100644 index 7820ed5c..00000000 --- a/app/admin/models/dept.go +++ /dev/null @@ -1,276 +0,0 @@ -package models - -import ( - "errors" - _ "time" - - orm "go-admin/common/global" - "go-admin/tools" -) - -type SysDept struct { - DeptId int `json:"deptId" gorm:"primary_key;auto_increment;"` //部门编码 - ParentId int `json:"parentId" gorm:""` //上级部门 - DeptPath string `json:"deptPath" gorm:"size:255;"` // - DeptName string `json:"deptName" gorm:"size:128;"` //部门名称 - Sort int `json:"sort" gorm:""` //排序 - Leader string `json:"leader" gorm:"size:128;"` //负责人 - Phone string `json:"phone" gorm:"size:11;"` //手机 - Email string `json:"email" gorm:"size:64;"` //邮箱 - Status string `json:"status" gorm:"size:4;"` //状态 - CreateBy string `json:"createBy" gorm:"size:64;"` - UpdateBy string `json:"updateBy" gorm:"size:64;"` - BaseModel - - DataScope string `json:"dataScope" gorm:"-"` - Params string `json:"params" gorm:"-"` - Children []SysDept `json:"children" gorm:"-"` -} - -func (SysDept) TableName() string { - return "sys_dept" -} - -type DeptLable struct { - Id int `gorm:"-" json:"id"` - Label string `gorm:"-" json:"label"` - Children []DeptLable `gorm:"-" json:"children"` -} - -func (e *SysDept) Create() (SysDept, error) { - var doc SysDept - result := orm.Eloquent.Table(e.TableName()).Create(&e) - if result.Error != nil { - err := result.Error - return doc, err - } - deptPath := "/" + tools.IntToString(e.DeptId) - if int(e.ParentId) != 0 { - var deptP SysDept - orm.Eloquent.Table(e.TableName()).Where("dept_id = ?", e.ParentId).First(&deptP) - deptPath = deptP.DeptPath + deptPath - } else { - deptPath = "/0" + deptPath - } - var mp = map[string]string{} - mp["deptPath"] = deptPath - if err := orm.Eloquent.Table(e.TableName()).Where("dept_id = ?", e.DeptId).Updates(mp).Error; err != nil { - err := result.Error - return doc, err - } - doc = *e - doc.DeptPath = deptPath - return doc, nil -} - -func (e *SysDept) Get() (SysDept, error) { - var doc SysDept - - table := orm.Eloquent.Table(e.TableName()) - if e.DeptId != 0 { - table = table.Where("dept_id = ?", e.DeptId) - } - if e.DeptName != "" { - table = table.Where("dept_name = ?", e.DeptName) - } - - if err := table.First(&doc).Error; err != nil { - return doc, err - } - return doc, nil -} - -func (e *SysDept) GetList() ([]SysDept, error) { - var doc []SysDept - - table := orm.Eloquent.Table(e.TableName()) - if e.DeptId != 0 { - table = table.Where("dept_id = ?", e.DeptId) - } - if e.DeptName != "" { - table = table.Where("dept_name = ?", e.DeptName) - } - if e.Status != "" { - table = table.Where("status = ?", e.Status) - } - - if err := table.Order("sort").Find(&doc).Error; err != nil { - return doc, err - } - return doc, nil -} - -func (e *SysDept) GetPage(bl bool) ([]SysDept, error) { - var doc []SysDept - - table := orm.Eloquent.Table(e.TableName()) - if e.DeptId != 0 { - table = table.Where("dept_id = ?", e.DeptId) - } - if e.DeptName != "" { - table = table.Where("dept_name = ?", e.DeptName) - } - if e.Status != "" { - table = table.Where("status = ?", e.Status) - } - if e.DeptPath != "" { - table = table.Where("deptPath like %?%", e.DeptPath) - } - if bl { - // 数据权限控制 - dataPermission := new(DataPermission) - dataPermission.UserId, _ = tools.StringToInt(e.DataScope) - tableper, err := dataPermission.GetDataScope("sys_dept", table) - if err != nil { - return nil, err - } - table = tableper - } - - if err := table.Order("sort").Find(&doc).Error; err != nil { - return nil, err - } - return doc, nil -} - -func (e *SysDept) SetDept(bl bool) ([]SysDept, error) { - list, err := e.GetPage(bl) - - m := make([]SysDept, 0) - for i := 0; i < len(list); i++ { - if list[i].ParentId != 0 { - continue - } - info := Digui(&list, list[i]) - - m = append(m, info) - } - return m, err -} - -func Digui(deptlist *[]SysDept, menu SysDept) SysDept { - list := *deptlist - - min := make([]SysDept, 0) - for j := 0; j < len(list); j++ { - - if menu.DeptId != list[j].ParentId { - continue - } - mi := SysDept{} - mi.DeptId = list[j].DeptId - mi.ParentId = list[j].ParentId - mi.DeptPath = list[j].DeptPath - mi.DeptName = list[j].DeptName - mi.Sort = list[j].Sort - mi.Leader = list[j].Leader - mi.Phone = list[j].Phone - mi.Email = list[j].Email - mi.Status = list[j].Status - mi.Children = []SysDept{} - ms := Digui(deptlist, mi) - min = append(min, ms) - - } - menu.Children = min - return menu -} - -func (e *SysDept) Update(id int) (update SysDept, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("dept_id = ?", id).First(&update).Error; err != nil { - return - } - - deptPath := "/" + tools.IntToString(e.DeptId) - if int(e.ParentId) != 0 { - var deptP SysDept - orm.Eloquent.Table(e.TableName()).Where("dept_id = ?", e.ParentId).First(&deptP) - deptPath = deptP.DeptPath + deptPath - } else { - deptPath = "/0" + deptPath - } - e.DeptPath = deptPath - - if e.DeptPath != "" && e.DeptPath != update.DeptPath { - return update, errors.New("上级部门不允许修改!") - } - - //参数1:是要修改的数据 - //参数2:是修改的数据 - - if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil { - return - } - - return -} - -func (e *SysDept) Delete(id int) (success bool, err error) { - - user := SysUser{} - user.DeptId = id - userlist, err := user.GetList() - tools.HasError(err, "", 500) - tools.Assert(len(userlist) <= 0, "当前部门存在用户,不能删除!", 500) - - tx := orm.Eloquent.Begin() - defer func() { - if r := recover(); r != nil { - tx.Rollback() - } - }() - - if err = tx.Error; err != nil { - success = false - return - } - - if err = tx.Table(e.TableName()).Where("dept_id = ?", id).Delete(&SysDept{}).Error; err != nil { - success = false - tx.Rollback() - return - } - if err = tx.Commit().Error; err != nil { - success = false - return - } - success = true - - return -} - -func (dept *SysDept) SetDeptLable() (m []DeptLable, err error) { - deptlist, err := dept.GetList() - - m = make([]DeptLable, 0) - for i := 0; i < len(deptlist); i++ { - if deptlist[i].ParentId != 0 { - continue - } - e := DeptLable{} - e.Id = deptlist[i].DeptId - e.Label = deptlist[i].DeptName - deptsInfo := DiguiDeptLable(&deptlist, e) - - m = append(m, deptsInfo) - } - return -} - -func DiguiDeptLable(deptlist *[]SysDept, dept DeptLable) DeptLable { - list := *deptlist - - min := make([]DeptLable, 0) - for j := 0; j < len(list); j++ { - - if dept.Id != list[j].ParentId { - continue - } - mi := DeptLable{list[j].DeptId, list[j].DeptName, []DeptLable{}} - ms := DiguiDeptLable(deptlist, mi) - min = append(min, ms) - - } - dept.Children = min - return dept -} diff --git a/app/admin/models/dictdata.go b/app/admin/models/dictdata.go deleted file mode 100644 index 29a0f034..00000000 --- a/app/admin/models/dictdata.go +++ /dev/null @@ -1,166 +0,0 @@ -package models - -import ( - "errors" - - orm "go-admin/common/global" - "go-admin/tools" -) - -type DictData struct { - DictCode int `gorm:"primary_key;auto_increment;" json:"dictCode" example:"1"` //字典编码 - DictSort int `gorm:"" json:"dictSort"` //显示顺序 - DictLabel string `gorm:"size:128;" json:"dictLabel"` //数据标签 - DictValue string `gorm:"size:255;" json:"dictValue"` //数据键值 - DictType string `gorm:"size:64;" json:"dictType"` //字典类型 - CssClass string `gorm:"size:128;" json:"cssClass"` // - ListClass string `gorm:"size:128;" json:"listClass"` // - IsDefault string `gorm:"size:8;" json:"isDefault"` // - Status string `gorm:"size:4;" json:"status"` //状态 - Default string `gorm:"size:8;" json:"default"` // - CreateBy string `gorm:"size:64;" json:"createBy"` // - UpdateBy string `gorm:"size:64;" json:"updateBy"` // - Remark string `gorm:"size:255;" json:"remark"` //备注 - BaseModel - - Params string `gorm:"-" json:"params"` - DataScope string `gorm:"-" json:"dataScope"` -} - -func (DictData) TableName() string { - return "sys_dict_data" -} - -func (e *DictData) Create() (DictData, error) { - var doc DictData - - var i int64 - if err := orm.Eloquent.Table(e.TableName()). - Where("dict_type = ?", e.DictType). - Where("dict_label=? or (dict_label=? and dict_value = ?)", e.DictLabel, e.DictLabel, e.DictValue). - Count(&i).Error; err != nil { - return doc, err - } - if i > 0 { - return doc, errors.New("字典标签或者字典键值已经存在!") - } - - result := orm.Eloquent.Table(e.TableName()).Create(&e) - if result.Error != nil { - err := result.Error - return doc, err - } - doc = *e - return doc, nil -} - -func (e *DictData) GetByCode() (DictData, error) { - var doc DictData - - table := orm.Eloquent.Table(e.TableName()) - if e.DictCode != 0 { - table = table.Where("dict_code = ?", e.DictCode) - } - if e.DictLabel != "" { - table = table.Where("dict_label = ?", e.DictLabel) - } - if e.DictType != "" { - table = table.Where("dict_type = ?", e.DictType) - } - - if err := table.First(&doc).Error; err != nil { - return doc, err - } - return doc, nil -} - -func (e *DictData) Get() ([]DictData, error) { - var doc []DictData - - table := orm.Eloquent.Table(e.TableName()) - if e.DictCode != 0 { - table = table.Where("dict_code = ?", e.DictCode) - } - if e.DictLabel != "" { - table = table.Where("dict_label = ?", e.DictLabel) - } - if e.DictType != "" { - table = table.Where("dict_type = ?", e.DictType) - } - - if err := table.Order("dict_sort").Find(&doc).Error; err != nil { - return doc, err - } - return doc, nil -} - -func (e *DictData) GetPage(pageSize int, pageIndex int) ([]DictData, int, error) { - var doc []DictData - - table := orm.Eloquent.Table(e.TableName()) - if e.DictCode != 0 { - table = table.Where("dict_code = ?", e.DictCode) - } - if e.DictType != "" { - table = table.Where("dict_type = ?", e.DictType) - } - if e.DictLabel != "" { - table = table.Where("dict_label = ?", e.DictLabel) - } - if e.Status != "" { - table = table.Where("status = ?", e.Status) - } - - // 数据权限控制 - dataPermission := new(DataPermission) - dataPermission.UserId, _ = tools.StringToInt(e.DataScope) - table, err := dataPermission.GetDataScope("sys_dict_data", table) - if err != nil { - return nil, 0, err - } - var count int64 - - if err := table.Order("dict_sort").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil { - return nil, 0, err - } - //table.Where("`deleted_at` IS NULL").Count(&count) - return doc, int(count), nil -} - -func (e *DictData) Update(id int) (update DictData, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("dict_code = ?", id).First(&update).Error; err != nil { - return - } - - if e.DictLabel != "" && e.DictLabel != update.DictLabel { - return update, errors.New("标签不允许修改!") - } - - if e.DictValue != "" && e.DictValue != update.DictValue { - return update, errors.New("键值不允许修改!") - } - - //参数1:是要修改的数据 - //参数2:是修改的数据 - if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil { - return - } - return -} - -func (e *DictData) Delete(id int) (success bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("dict_code = ?", id).Delete(&DictData{}).Error; err != nil { - success = false - return - } - success = true - return -} - -func (e *DictData) BatchDelete(id []int) (Result bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("dict_code in (?)", id).Delete(&DictData{}).Error; err != nil { - return - } - Result = true - return -} diff --git a/app/admin/models/dicttype.go b/app/admin/models/dicttype.go deleted file mode 100644 index 3b77fd0b..00000000 --- a/app/admin/models/dicttype.go +++ /dev/null @@ -1,152 +0,0 @@ -package models - -import ( - "errors" - - "gorm.io/gorm" - - orm "go-admin/common/global" - "go-admin/tools" -) - -type DictType struct { - DictId int `gorm:"primary_key;auto_increment;" json:"dictId"` - DictName string `gorm:"size:128;" json:"dictName"` //字典名称 - DictType string `gorm:"size:128;" json:"dictType"` //字典类型 - Status string `gorm:"size:4;" json:"status"` //状态 - CreateBy string `gorm:"size:11;" json:"createBy"` //创建者 - UpdateBy string `gorm:"size:11;" json:"updateBy"` //更新者 - Remark string `gorm:"size:255;" json:"remark"` //备注 - BaseModel - - DataScope string `gorm:"-" json:"dataScope"` // - Params string `gorm:"-" json:"params"` // -} - -func (DictType) TableName() string { - return "sys_dict_type" -} - -func (e *DictType) Create() (DictType, error) { - var doc DictType - - var i int64 - orm.Eloquent.Table(e.TableName()).Where("dict_name=? or dict_type = ?", e.DictName, e.DictType).Count(&i) - if i > 0 { - return doc, errors.New("字典名称或者字典类型已经存在!") - } - - result := orm.Eloquent.Table(e.TableName()).Create(&e) - if result.Error != nil { - err := result.Error - return doc, err - } - doc = *e - return doc, nil -} - -func (e *DictType) Get() (DictType, error) { - var doc DictType - - table := orm.Eloquent.Table(e.TableName()) - if e.DictId != 0 { - table = table.Where("dict_id = ?", e.DictId) - } - if e.DictName != "" { - table = table.Where("dict_name = ?", e.DictName) - } - if e.DictType != "" { - table = table.Where("dict_type = ?", e.DictType) - } - - if err := table.First(&doc).Error; err != nil { - return doc, err - } - return doc, nil -} - -func (e *DictType) GetList() ([]DictType, error) { - var doc []DictType - - table := orm.Eloquent.Table(e.TableName()) - if e.DictId != 0 { - table = table.Where("dict_id = ?", e.DictId) - } - if e.DictName != "" { - table = table.Where("dict_name = ?", e.DictName) - } - if e.DictType != "" { - table = table.Where("dict_type = ?", e.DictType) - } - - if err := table.Find(&doc).Error; err != nil { - return doc, err - } - return doc, nil -} - -func (e *DictType) GetPage(pageSize int, pageIndex int) ([]DictType, int, error) { - var doc []DictType - var db *gorm.DB - - table := orm.Eloquent.Table(e.TableName()) - if e.DictId != 0 { - db = db.Where("dict_id = ?", e.DictId) - } - if e.DictName != "" { - db = db.Where("dict_name = ?", e.DictName) - } - - // 数据权限控制 - dataPermission := new(DataPermission) - dataPermission.UserId, _ = tools.StringToInt(e.DataScope) - table, err := dataPermission.GetDataScope("sys_dict_type", table) - if err != nil { - return nil, 0, err - } - var count int64 - - if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil { - return nil, 0, err - } - //table.Count(&count) - return doc, int(count), nil -} - -func (e *DictType) Update(id int) (update DictType, err error) { - if err = orm.Eloquent.Table(e.TableName()).First(&update, id).Error; err != nil { - return - } - - if e.DictName != "" && e.DictName != update.DictName { - return update, errors.New("名称不允许修改!") - } - - if e.DictType != "" && e.DictType != update.DictType { - return update, errors.New("类型不允许修改!") - } - - //参数1:是要修改的数据 - //参数2:是修改的数据 - if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil { - return - } - return -} - -func (e *DictType) Delete(id int) (success bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("dict_id = ?", id).Delete(&DictData{}).Error; err != nil { - success = false - return - } - success = true - return -} - -func (e *DictType) BatchDelete(id []int) (Result bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("dict_id in (?)", id).Delete(&DictType{}).Error; err != nil { - return - } - Result = true - return -} diff --git a/app/admin/models/filedir.go b/app/admin/models/filedir.go deleted file mode 100644 index 2d1e243e..00000000 --- a/app/admin/models/filedir.go +++ /dev/null @@ -1,177 +0,0 @@ -package models - -import ( - orm "go-admin/common/global" - "go-admin/tools" -) - -type SysFileDir struct { - Id int `json:"id"` - Label string `json:"label" gorm:"type:varchar(255);"` // 名称 - PId int `json:"pId" gorm:"type:int(11);"` // 父id - Sort int `json:"sort" gorm:""` //排序 - Path string `json:"path" gorm:"size:255;"` // - CreateBy string `json:"createBy" gorm:"type:varchar(128);"` // 创建人 - UpdateBy string `json:"updateBy" gorm:"type:varchar(128);"` // 编辑人 - Children []SysFileDir `json:"children" gorm:"-"` - DataScope string `json:"dataScope" gorm:"-"` - Params string `json:"params" gorm:"-"` - BaseModel -} - -func (SysFileDir) TableName() string { - return "sys_file_dir" -} - -// 创建SysFileDir -func (e *SysFileDir) Create() (SysFileDir, error) { - var doc SysFileDir - result := orm.Eloquent.Table(e.TableName()).Create(&e) - if result.Error != nil { - err := result.Error - return doc, err - } - - path := "/" + tools.IntToString(e.Id) - if int(e.PId) != 0 { - var deptP SysFileDir - orm.Eloquent.Table(e.TableName()).Where("id = ?", e.PId).First(&deptP) - path = deptP.Path + path - } else { - path = "/0" + path - } - var mp = map[string]string{} - mp["path"] = path - if err := orm.Eloquent.Table(e.TableName()).Where("id = ?", e.Id).Updates(mp).Error; err != nil { - err := result.Error - return doc, err - } - doc = *e - doc.Path = path - - return doc, nil -} - -// 获取SysFileDir -func (e *SysFileDir) Get() (SysFileDir, error) { - var doc SysFileDir - table := orm.Eloquent.Table(e.TableName()) - - if e.Id != 0 { - table = table.Where("id = ?", e.Id) - } - - if err := table.First(&doc).Error; err != nil { - return doc, err - } - return doc, nil -} - -// 获取SysFileDir带分页 -func (e *SysFileDir) GetPage() ([]SysFileDir, int, error) { - var doc []SysFileDir - - table := orm.Eloquent.Table(e.TableName()) - - // 数据权限控制(如果不需要数据权限请将此处去掉) - //dataPermission := new(DataPermission) - //dataPermission.UserId, _ = tools.StringToInt(e.DataScope) - //table, err := dataPermission.GetDataScope(e.TableName(), table) - //if err != nil { - // return nil, 0, err - //} - var count int64 - - if err := table.Find(&doc).Error; err != nil { - return nil, 0, err - } - table.Where("`deleted_at` IS NULL").Count(&count) - return doc, int(count), nil -} - -// 更新SysFileDir -func (e *SysFileDir) Update(id int) (update SysFileDir, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("id = ?", id).First(&update).Error; err != nil { - return - } - - path := "/" + tools.IntToString(e.Id) - if int(e.Id) != 0 { - var deptP SysFileDir - orm.Eloquent.Table(e.TableName()).Where("id = ?", e.Id).First(&deptP) - path = deptP.Path + path - } else { - path = "/0" + path - } - e.Path = path - - //if e.Path != "" && e.Path != update.Path { - // return update, errors.New("上级不允许修改!") - //} - - //参数1:是要修改的数据 - //参数2:是修改的数据 - if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil { - return - } - return -} - -// 删除SysFileDir -func (e *SysFileDir) Delete(id int) (success bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("id = ?", id).Delete(&SysFileDir{}).Error; err != nil { - success = false - return - } - success = true - return -} - -//批量删除 -func (e *SysFileDir) BatchDelete(id []int) (Result bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("id in (?)", id).Delete(&SysFileDir{}).Error; err != nil { - return - } - Result = true - return -} - -func (e *SysFileDir) SetSysFileDir() ([]SysFileDir, error) { - list, _, err := e.GetPage() - - m := make([]SysFileDir, 0) - for i := 0; i < len(list); i++ { - if list[i].PId != 0 { - continue - } - info := SysFileDirDigui(&list, list[i]) - - m = append(m, info) - } - return m, err -} - -func SysFileDirDigui(deptlist *[]SysFileDir, menu SysFileDir) SysFileDir { - list := *deptlist - - min := make([]SysFileDir, 0) - for j := 0; j < len(list); j++ { - - if menu.Id != list[j].PId { - continue - } - mi := SysFileDir{} - mi.Id = list[j].Id - mi.PId = list[j].PId - mi.Label = list[j].Label - mi.Sort = list[j].Sort - mi.CreatedAt = list[j].CreatedAt - mi.UpdatedAt = list[j].UpdatedAt - mi.Children = []SysFileDir{} - ms := SysFileDirDigui(deptlist, mi) - min = append(min, ms) - - } - menu.Children = min - return menu -} diff --git a/app/admin/models/gorm/data.go b/app/admin/models/gorm/data.go deleted file mode 100644 index 3b7a5897..00000000 --- a/app/admin/models/gorm/data.go +++ /dev/null @@ -1,88 +0,0 @@ -package gorm - -import ( - "gorm.io/gorm" - - "go-admin/app/admin/models" -) - -func InitData(db *gorm.DB) { - - list := []models.CasbinRule{ - {"p", "admin", "/api/v1/menulist", "GET", "", "", ""}, - {"p", "admin", "/api/v1/menu", "POST", "", "", ""}, - {"p", "admin", "/api/v1/dict/databytype/", "GET", "", "", ""}, - {"p", "admin", "/api/v1/menu", "PUT", "", "", ""}, - {"p", "admin", "/api/v1/menu/:id", "DELETE", "", "", ""}, - {"p", "admin", "/api/v1/sysUserList", "GET", "", "", ""}, - {"p", "admin", "/api/v1/sysUser/:id", "GET", "", "", ""}, - {"p", "admin", "/api/v1/sysUser/", "GET", "", "", ""}, - {"p", "admin", "/api/v1/sysUser", "POST", "", "", ""}, - {"p", "admin", "/api/v1/sysUser", "PUT", "", "", ""}, - {"p", "admin", "/api/v1/sysUser/:id", "DELETE", "", "", ""}, - {"p", "admin", "/api/v1/user/profile", "GET", "", "", ""}, - {"p", "admin", "/api/v1/rolelist", "GET", "", "", ""}, - {"p", "admin", "/api/v1/role/:id", "GET", "", "", ""}, - {"p", "admin", "/api/v1/role", "POST", "", "", ""}, - {"p", "admin", "/api/v1/role", "PUT", "", "", ""}, - {"p", "admin", "/api/v1/role/:id", "DELETE", "", "", ""}, - {"p", "admin", "/api/v1/configList", "GET", "", "", ""}, - {"p", "admin", "/api/v1/config/:id", "GET", "", "", ""}, - {"p", "admin", "/api/v1/config", "POST", "", "", ""}, - {"p", "admin", "/api/v1/config", "PUT", "", "", ""}, - {"p", "admin", "/api/v1/config/:id", "DELETE", "", "", ""}, - {"p", "admin", "/api/v1/menurole", "GET", "", "", ""}, - {"p", "admin", "/api/v1/roleMenuTreeselect/:id", "GET", "", "", ""}, - {"p", "admin", "/api/v1/menuTreeselect", "GET", "", "", ""}, - {"p", "admin", "/api/v1/rolemenu", "GET", "", "", ""}, - {"p", "admin", "/api/v1/rolemenu", "POST", "", "", ""}, - {"p", "admin", "/api/v1/rolemenu/:id", "DELETE", "", "", ""}, - {"p", "admin", "/api/v1/deptList", "GET", "", "", ""}, - {"p", "admin", "/api/v1/dept/:id", "GET", "", "", ""}, - {"p", "admin", "/api/v1/dept", "POST", "", "", ""}, - {"p", "admin", "/api/v1/dept", "PUT", "", "", ""}, - {"p", "admin", "/api/v1/dept/:id", "DELETE", "", "", ""}, - {"p", "admin", "/api/v1/dict/datalist", "GET", "", "", ""}, - {"p", "admin", "/api/v1/dict/data/:id", "GET", "", "", ""}, - {"p", "admin", "/api/v1/dict/databytype/:id", "GET", "", "", ""}, - {"p", "admin", "/api/v1/dict/data", "POST", "", "", ""}, - {"p", "admin", "/api/v1/dict/data/", "PUT", "", "", ""}, - {"p", "admin", "/api/v1/dict/data/:id", "DELETE", "", "", ""}, - {"p", "admin", "/api/v1/dict/typelist", "GET", "", "", ""}, - {"p", "admin", "/api/v1/dict/type/:id", "GET", "", "", ""}, - {"p", "admin", "/api/v1/dict/type", "POST", "", "", ""}, - {"p", "admin", "/api/v1/dict/type", "PUT", "", "", ""}, - {"p", "admin", "/api/v1/dict/type/:id", "DELETE", "", "", ""}, - {"p", "admin", "/api/v1/postlist", "GET", "", "", ""}, - {"p", "admin", "/api/v1/post/:id", "GET", "", "", ""}, - {"p", "admin", "/api/v1/post", "POST", "", "", ""}, - {"p", "admin", "/api/v1/post", "PUT", "", "", ""}, - {"p", "admin", "/api/v1/post/:id", "DELETE", "", "", ""}, - {"p", "admin", "/api/v1/menu/:id", "GET", "", "", ""}, - {"p", "admin", "/api/v1/menuids", "GET", "", "", ""}, - {"p", "admin", "/api/v1/loginloglist", "GET", "", "", ""}, - {"p", "admin", "/api/v1/loginlog/:id", "DELETE", "", "", ""}, - {"p", "admin", "/api/v1/operloglist", "GET", "", "", ""}, - {"p", "admin", "/api/v1/getinfo", "GET", "", "", ""}, - {"p", "admin", "/api/v1/roledatascope", "PUT", "", "", ""}, - {"p", "admin", "/api/v1/roleDeptTreeselect/:id", "GET", "", "", ""}, - {"p", "admin", "/api/v1/deptTree", "GET", "", "", ""}, - {"p", "admin", "/api/v1/configKey/:id", "GET", "", "", ""}, - {"p", "admin", "/api/v1/logout", "POST", "", "", ""}, - {"p", "admin", "/api/v1/user/avatar", "POST", "", "", ""}, - {"p", "admin", "/api/v1/user/pwd", "PUT", "", "", ""}, - {"p", "admin", "/api/v1/dict/typeoptionselect", "GET", "", "", ""}, - {"p", "admin", "/api/v1/sysjobList", "GET", "", "", ""}, - {"p", "admin", "/api/v1/sysjob/:id", "GET", "", "", ""}, - {"p", "admin", "/api/v1/sysjob", "POST", "", "", ""}, - {"p", "admin", "/api/v1/sysjob", "PUT", "", "", ""}, - {"p", "admin", "/api/v1/sysjob/:id", "DELETE", "", "", ""}, - {"p", "admin", "/api/v1/syssettingList", "GET", "", "", ""}, - {"p", "admin", "/api/v1/syssetting/:id", "GET", "", "", ""}, - {"p", "admin", "/api/v1/syssetting", "POST", "", "", ""}, - {"p", "admin", "/api/v1/syssetting", "PUT", "", "", ""}, - {"p", "admin", "/api/v1/syssetting/:id", "DELETE", "", "", ""}, - } - - db.Table("sys_casbin_rule").Create(list) -} diff --git a/app/admin/models/initdb.go b/app/admin/models/initdb.go index d1e49e5b..9bb37a2a 100644 --- a/app/admin/models/initdb.go +++ b/app/admin/models/initdb.go @@ -2,12 +2,11 @@ package models import ( "fmt" + "go-admin/common/global" "gorm.io/gorm" "io/ioutil" "log" "strings" - - "go-admin/common/global" ) func InitDb(db *gorm.DB) (err error) { diff --git a/app/admin/models/login.go b/app/admin/models/login.go deleted file mode 100644 index 26a4c4b8..00000000 --- a/app/admin/models/login.go +++ /dev/null @@ -1,30 +0,0 @@ -package models - -import ( - orm "go-admin/common/global" - "go-admin/tools" -) - -type Login struct { - Username string `form:"UserName" json:"username" binding:"required"` - Password string `form:"Password" json:"password" binding:"required"` - Code string `form:"Code" json:"code" binding:"required"` - UUID string `form:"UUID" json:"uuid" binding:"required"` -} - -func (u *Login) GetUser() (user SysUser, role SysRole, e error) { - - e = orm.Eloquent.Table("sys_user").Where("username = ? ", u.Username).Find(&user).Error - if e != nil { - return - } - _, e = tools.CompareHashAndPassword(user.Password, u.Password) - if e != nil { - return - } - e = orm.Eloquent.Table("sys_role").Where("role_id = ? ", user.RoleId).First(&role).Error - if e != nil { - return - } - return -} diff --git a/app/admin/models/loginlog.go b/app/admin/models/loginlog.go deleted file mode 100644 index af445a8a..00000000 --- a/app/admin/models/loginlog.go +++ /dev/null @@ -1,105 +0,0 @@ -package models - -import ( - "time" - - orm "go-admin/common/global" -) - -type LoginLog struct { - InfoId int `json:"infoId" gorm:"primary_key;auto_increment;"` //主键 - Username string `json:"username" gorm:"size:128;"` //用户名 - Status string `json:"status" gorm:"size:4;"` //状态 - Ipaddr string `json:"ipaddr" gorm:"size:255;"` //ip地址 - LoginLocation string `json:"loginLocation" gorm:"size:255;"` //归属地 - Browser string `json:"browser" gorm:"size:255;"` //浏览器 - Os string `json:"os" gorm:"size:255;"` //系统 - Platform string `json:"platform" gorm:"size:255;"` // 固件 - LoginTime time.Time `json:"loginTime" gorm:"type:timestamp;"` //登录时间 - CreateBy string `json:"createBy" gorm:"size:128;"` //创建人 - UpdateBy string `json:"updateBy" gorm:"size:128;"` //更新者 - DataScope string `json:"dataScope" gorm:"-"` //数据 - Params string `json:"params" gorm:"-"` // - Remark string `json:"remark" gorm:"size:255;"` //备注 - Msg string `json:"msg" gorm:"size:255;"` - BaseModel -} - -func (LoginLog) TableName() string { - return "sys_loginlog" -} - -func (e *LoginLog) Get() (LoginLog, error) { - var doc LoginLog - - table := orm.Eloquent.Table(e.TableName()) - if e.Ipaddr != "" { - table = table.Where("ipaddr = ?", e.Ipaddr) - } - if e.InfoId != 0 { - table = table.Where("info_id = ?", e.InfoId) - } - - if err := table.First(&doc).Error; err != nil { - return doc, err - } - return doc, nil -} - -func (e *LoginLog) GetPage(pageSize int, pageIndex int) ([]LoginLog, int, error) { - var doc []LoginLog - - table := orm.Eloquent.Table(e.TableName()) - if e.Ipaddr != "" { - table = table.Where("ipaddr = ?", e.Ipaddr) - } - if e.Status != "" { - table = table.Where("status = ?", e.Status) - } - if e.Username != "" { - table = table.Where("userName = ?", e.Username) - } - - var count int64 - - if err := table.Order("info_id desc").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil { - return nil, 0, err - } - //table.Where("`deleted_at` IS NULL").Count(&count) - return doc, int(count), nil -} - -func (e *LoginLog) Create() (LoginLog, error) { - var doc LoginLog - e.CreateBy = "0" - e.UpdateBy = "0" - result := orm.Eloquent.Table(e.TableName()).Create(&e) - if result.Error != nil { - err := result.Error - return doc, err - } - doc = *e - return doc, nil -} - -func (e *LoginLog) Update(id int) (update LoginLog, err error) { - - if err = orm.Eloquent.Table(e.TableName()).First(&update, id).Error; err != nil { - return - } - - //参数1:是要修改的数据 - //参数2:是修改的数据 - if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil { - return - } - return -} - -func (e *LoginLog) BatchDelete(id []int) (Result bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("info_id in (?)", id).Delete(&LoginLog{}).Error; err != nil { - return - } - Result = true - return -} diff --git a/app/admin/models/menu.go b/app/admin/models/menu.go index 64e0919e..0e1d5f0b 100644 --- a/app/admin/models/menu.go +++ b/app/admin/models/menu.go @@ -2,13 +2,16 @@ package models import ( "errors" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + "go-admin/common/models" - orm "go-admin/common/global" - "go-admin/tools" + "gorm.io/gorm" + + "go-admin/app/admin/models/system" ) type Menu struct { - MenuId int `json:"menuId" gorm:"primary_key;AUTO_INCREMENT"` + MenuId int `json:"menuId" gorm:"primaryKey;autoIncrement"` MenuName string `json:"menuName" gorm:"size:128;"` Title string `json:"title" gorm:"size:128;"` Icon string `json:"icon" gorm:"size:128;"` @@ -31,7 +34,7 @@ type Menu struct { RoleId int `gorm:"-"` Children []Menu `json:"children" gorm:"-"` IsSelect bool `json:"is_select" gorm:"-"` - BaseModel + models.ModelTime } func (Menu) TableName() string { @@ -45,7 +48,7 @@ type MenuLable struct { } type Menus struct { - MenuId int `json:"menuId" gorm:"column:menu_id;primary_key;"` + MenuId int `json:"menuId" gorm:"column:menu_id;primaryKey;autoIncrement;"` MenuName string `json:"menuName" gorm:"column:menu_name"` Title string `json:"title" gorm:"column:title"` Icon string `json:"icon" gorm:"column:icon"` @@ -80,152 +83,162 @@ type MenuRole struct { type MS []Menu -func (e *Menu) GetByMenuId() (Menu Menu, err error) { +//func (e *Menu) GetByMenuId() (Menu Menu, err error) { +// +// table := orm.Eloquent.Table(e.TableName()) +// table = table.Where("menu_id = ?", e.MenuId) +// if err = table.Find(&Menu).Error; err != nil { +// return +// } +// return +//} - table := orm.Eloquent.Table(e.TableName()) - table = table.Where("menu_id = ?", e.MenuId) - if err = table.Find(&Menu).Error; err != nil { - return - } - return -} +//func (e *Menu) SetMenu() (m []Menu, err error) { +// menulist, err := e.GetPage() +// +// m = make([]Menu, 0) +// for i := 0; i < len(menulist); i++ { +// if menulist[i].ParentId != 0 { +// continue +// } +// menusInfo := DiguiMenu(&menulist, menulist[i]) +// +// m = append(m, menusInfo) +// } +// return +//} -func (e *Menu) SetMenu() (m []Menu, err error) { - menulist, err := e.GetPage() +//func DiguiMenu(menulist *[]Menu, menu Menu) Menu { +// list := *menulist +// +// min := make([]Menu, 0) +// for j := 0; j < len(list); j++ { +// +// if menu.MenuId != list[j].ParentId { +// continue +// } +// mi := Menu{} +// mi.MenuId = list[j].MenuId +// mi.MenuName = list[j].MenuName +// mi.Title = list[j].Title +// mi.Icon = list[j].Icon +// mi.Path = list[j].Path +// mi.MenuType = list[j].MenuType +// mi.Action = list[j].Action +// mi.Permission = list[j].Permission +// mi.ParentId = list[j].ParentId +// mi.NoCache = list[j].NoCache +// mi.Breadcrumb = list[j].Breadcrumb +// mi.Component = list[j].Component +// mi.Sort = list[j].Sort +// mi.Visible = list[j].Visible +// mi.CreatedAt = list[j].CreatedAt +// mi.Children = []Menu{} +// +// if mi.MenuType != "F" { +// ms := DiguiMenu(menulist, mi) +// min = append(min, ms) +// +// } else { +// min = append(min, mi) +// } +// +// } +// menu.Children = min +// return menu +//} - m = make([]Menu, 0) - for i := 0; i < len(menulist); i++ { - if menulist[i].ParentId != 0 { - continue - } - menusInfo := DiguiMenu(&menulist, menulist[i]) +//func (e *Menu) SetMenuLabel() (m *[]MenuLable, err error) { +// menulist, err := e.Get() +// +// ml := make([]MenuLable, 0) +// for i := 0; i < len(menulist); i++ { +// if menulist[i].ParentId != 0 { +// continue +// } +// e := MenuLable{} +// e.Id = menulist[i].MenuId +// e.Label = menulist[i].Title +// menusInfo := MenuLabelCall(&menulist, e) +// +// ml = append(ml, menusInfo) +// } +// return &ml, err +//} - m = append(m, menusInfo) - } - return -} +//func MenuLabelCall(menulist *[]Menu, menu MenuLable) MenuLable { +// list := *menulist +// +// min := make([]MenuLable, 0) +// for j := 0; j < len(list); j++ { +// +// if menu.Id != list[j].ParentId { +// continue +// } +// mi := MenuLable{} +// mi.Id = list[j].MenuId +// mi.Label = list[j].Title +// mi.Children = []MenuLable{} +// if list[j].MenuType != "F" { +// ms := MenuLabelCall(menulist, mi) +// min = append(min, ms) +// } else { +// min = append(min, mi) +// } +// +// } +// if len(min) > 0 { +// menu.Children = min +// } else { +// menu.Children = nil +// } +// return menu +//} -func DiguiMenu(menulist *[]Menu, menu Menu) Menu { - list := *menulist +//func (e *Menu) SetMenuRole(roleName string) (m []Menu, err error) { +// +// menus, err := e.GetByRoleName(roleName) +// +// m = make([]Menu, 0) +// for i := 0; i < len(menus); i++ { +// if menus[i].ParentId != 0 { +// continue +// } +// menusInfo := DiguiMenu(&menus, menus[i]) +// +// m = append(m, menusInfo) +// } +// return +//} - min := make([]Menu, 0) - for j := 0; j < len(list); j++ { +//func (e *MenuRole) Get(tx *gorm.DB) (Menus []MenuRole, err error) { +// table := tx.Table(e.TableName()) +// if e.MenuName != "" { +// table = table.Where("menu_name = ?", e.MenuName) +// } +// if err = table.Order("sort").Find(&Menus).Error; err != nil { +// return +// } +// return +//} - if menu.MenuId != list[j].ParentId { - continue - } - mi := Menu{} - mi.MenuId = list[j].MenuId - mi.MenuName = list[j].MenuName - mi.Title = list[j].Title - mi.Icon = list[j].Icon - mi.Path = list[j].Path - mi.MenuType = list[j].MenuType - mi.Action = list[j].Action - mi.Permission = list[j].Permission - mi.ParentId = list[j].ParentId - mi.NoCache = list[j].NoCache - mi.Breadcrumb = list[j].Breadcrumb - mi.Component = list[j].Component - mi.Sort = list[j].Sort - mi.Visible = list[j].Visible - mi.CreatedAt = list[j].CreatedAt - mi.Children = []Menu{} +//func (e *Menu) GetByRoleName(roleName string) (Menus []Menu, err error) { +// var table *gorm.DB +// if roleName == "admin" { +// table = orm.Eloquent.Table(e.TableName()).Select("sys_menu.*") +// table = table.Where(" menu_type in ('M','C')") +// } else { +// table = orm.Eloquent.Table(e.TableName()).Select("sys_menu.*").Joins("left join sys_role_menu on sys_role_menu.menu_id=sys_menu.menu_id") +// table = table.Where("sys_role_menu.role_name=? and menu_type in ('M','C')", roleName) +// } +// if err = table.Order("sort").Find(&Menus).Error; err != nil { +// return +// } +// return +//} - if mi.MenuType != "F" { - ms := DiguiMenu(menulist, mi) - min = append(min, ms) - - } else { - min = append(min, mi) - } - - } - menu.Children = min - return menu -} - -func (e *Menu) SetMenuLable() (m []MenuLable, err error) { - menulist, err := e.Get() - - m = make([]MenuLable, 0) - for i := 0; i < len(menulist); i++ { - if menulist[i].ParentId != 0 { - continue - } - e := MenuLable{} - e.Id = menulist[i].MenuId - e.Label = menulist[i].Title - menusInfo := DiguiMenuLable(&menulist, e) - - m = append(m, menusInfo) - } - return -} - -func DiguiMenuLable(menulist *[]Menu, menu MenuLable) MenuLable { - list := *menulist - - min := make([]MenuLable, 0) - for j := 0; j < len(list); j++ { - - if menu.Id != list[j].ParentId { - continue - } - mi := MenuLable{} - mi.Id = list[j].MenuId - mi.Label = list[j].Title - mi.Children = []MenuLable{} - if list[j].MenuType != "F" { - ms := DiguiMenuLable(menulist, mi) - min = append(min, ms) - } else { - min = append(min, mi) - } - - } - menu.Children = min - return menu -} - -func (e *Menu) SetMenuRole(rolename string) (m []Menu, err error) { - - menulist, err := e.GetByRoleName(rolename) - - m = make([]Menu, 0) - for i := 0; i < len(menulist); i++ { - if menulist[i].ParentId != 0 { - continue - } - menusInfo := DiguiMenu(&menulist, menulist[i]) - - m = append(m, menusInfo) - } - return -} - -func (e *MenuRole) Get() (Menus []MenuRole, err error) { - table := orm.Eloquent.Table(e.TableName()) - if e.MenuName != "" { - table = table.Where("menu_name = ?", e.MenuName) - } - if err = table.Order("sort").Find(&Menus).Error; err != nil { - return - } - return -} - -func (e *Menu) GetByRoleName(rolename string) (Menus []Menu, err error) { - table := orm.Eloquent.Table(e.TableName()).Select("sys_menu.*").Joins("left join sys_role_menu on sys_role_menu.menu_id=sys_menu.menu_id") - table = table.Where("sys_role_menu.role_name=? and menu_type in ('M','C')", rolename) - if err = table.Order("sort").Find(&Menus).Error; err != nil { - return - } - return -} - -func (e *Menu) Get() (Menus []Menu, err error) { - table := orm.Eloquent.Table(e.TableName()) +func (e *Menu) Get(tx *gorm.DB) (Menus []Menu, err error) { + table := tx.Table(e.TableName()) if e.MenuName != "" { table = table.Where("menu_name = ?", e.MenuName) } @@ -245,8 +258,8 @@ func (e *Menu) Get() (Menus []Menu, err error) { return } -func (e *Menu) GetPage() (Menus []Menu, err error) { - table := orm.Eloquent.Table(e.TableName()) +func (e *Menu) GetPage(tx *gorm.DB) (Menus []Menu, err error) { + table := tx.Table(e.TableName()) if e.MenuName != "" { table = table.Where("menu_name = ?", e.MenuName) } @@ -261,8 +274,8 @@ func (e *Menu) GetPage() (Menus []Menu, err error) { } // 数据权限控制 - dataPermission := new(DataPermission) - dataPermission.UserId, _ = tools.StringToInt(e.DataScope) + dataPermission := new(system.DataPermission) + dataPermission.UserId, _ = pkg.StringToInt(e.DataScope) table, err = dataPermission.GetDataScope("sys_menu", table) if err != nil { return nil, err @@ -273,13 +286,13 @@ func (e *Menu) GetPage() (Menus []Menu, err error) { return } -func (e *Menu) Create() (id int, err error) { - result := orm.Eloquent.Table(e.TableName()).Create(&e) +func (e *Menu) Create(tx *gorm.DB) (id int, err error) { + result := tx.Table(e.TableName()).Create(&e) if result.Error != nil { err = result.Error return } - err = InitPaths(e) + err = InitPaths(tx, e) if err != nil { return } @@ -287,44 +300,44 @@ func (e *Menu) Create() (id int, err error) { return } -func InitPaths(menu *Menu) (err error) { +func InitPaths(tx *gorm.DB, menu *Menu) (err error) { parentMenu := new(Menu) - if int(menu.ParentId) != 0 { - orm.Eloquent.Table("sys_menu").Where("menu_id = ?", menu.ParentId).First(parentMenu) + if menu.ParentId != 0 { + tx.Table("sys_menu").Where("menu_id = ?", menu.ParentId).First(parentMenu) if parentMenu.Paths == "" { err = errors.New("父级paths异常,请尝试对当前节点父级菜单进行更新操作!") return } - menu.Paths = parentMenu.Paths + "/" + tools.IntToString(menu.MenuId) + menu.Paths = parentMenu.Paths + "/" + pkg.IntToString(menu.MenuId) } else { - menu.Paths = "/0/" + tools.IntToString(menu.MenuId) + menu.Paths = "/0/" + pkg.IntToString(menu.MenuId) } - orm.Eloquent.Table("sys_menu").Where("menu_id = ?", menu.MenuId).Update("paths", menu.Paths) + tx.Table("sys_menu").Where("menu_id = ?", menu.MenuId).Update("paths", menu.Paths) return } -func (e *Menu) Update(id int) (update Menu, err error) { - if err = orm.Eloquent.Table(e.TableName()).First(&update, id).Error; err != nil { - return - } +//func (e *Menu) Update(tx *gorm.DB, id int) (update Menu, err error) { +// if err = tx.Table(e.TableName()).First(&update, id).Error; err != nil { +// return +// } +// +// //参数1:是要修改的数据 +// //参数2:是修改的数据 +// if err = tx.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil { +// return +// } +// err = InitPaths(tx, e) +// if err != nil { +// return +// } +// return +//} - //参数1:是要修改的数据 - //参数2:是修改的数据 - if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil { - return - } - err = InitPaths(e) - if err != nil { - return - } - return -} - -func (e *Menu) Delete(id int) (success bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("menu_id = ?", id).Delete(&Menu{}).Error; err != nil { - success = false - return - } - success = true - return -} +//func (e *Menu) Delete(tx *gorm.DB, id int) (success bool, err error) { +// if err = tx.Table(e.TableName()).Where("menu_id = ?", id).Delete(&Menu{}).Error; err != nil { +// success = false +// return +// } +// success = true +// return +//} diff --git a/app/admin/models/operlog.go b/app/admin/models/operlog.go deleted file mode 100644 index cde719af..00000000 --- a/app/admin/models/operlog.go +++ /dev/null @@ -1,116 +0,0 @@ -package models - -import ( - "time" - - orm "go-admin/common/global" -) - -//sys_operlog -type SysOperLog struct { - OperId int `json:"operId" gorm:"primary_key;AUTO_INCREMENT"` //日志编码 - Title string `json:"title" gorm:"size:255;"` //操作模块 - BusinessType string `json:"businessType" gorm:"size:128;"` //操作类型 - BusinessTypes string `json:"businessTypes" gorm:"size:128;"` - Method string `json:"method" gorm:"size:128;"` //函数 - RequestMethod string `json:"requestMethod" gorm:"size:128;"` //请求方式 - OperatorType string `json:"operatorType" gorm:"size:128;"` //操作类型 - OperName string `json:"operName" gorm:"size:128;"` //操作者 - DeptName string `json:"deptName" gorm:"size:128;"` //部门名称 - OperUrl string `json:"operUrl" gorm:"size:255;"` //访问地址 - OperIp string `json:"operIp" gorm:"size:128;"` //客户端ip - OperLocation string `json:"operLocation" gorm:"size:128;"` //访问位置 - OperParam string `json:"operParam" gorm:"size:255;"` //请求参数 - Status string `json:"status" gorm:"size:4;"` //操作状态 - OperTime time.Time `json:"operTime" gorm:"type:timestamp;"` //操作时间 - JsonResult string `json:"jsonResult" gorm:"size:255;"` //返回数据 - CreateBy string `json:"createBy" gorm:"size:128;"` //创建人 - UpdateBy string `json:"updateBy" gorm:"size:128;"` //更新者 - DataScope string `json:"dataScope" gorm:"-"` //数据 - Params string `json:"params" gorm:"-"` //参数 - Remark string `json:"remark" gorm:"size:255;"` //备注 - LatencyTime string `json:"latencyime" gorm:"size:128;"` //耗时 - UserAgent string `json:"userAgent" gorm:"size:255;"` //ua - BaseModel -} - -func (SysOperLog) TableName() string { - return "sys_operlog" -} - -func (e *SysOperLog) Get() (SysOperLog, error) { - var doc SysOperLog - - table := orm.Eloquent.Table(e.TableName()) - if e.OperIp != "" { - table = table.Where("oper_ip = ?", e.OperIp) - } - if e.OperId != 0 { - table = table.Where("oper_id = ?", e.OperId) - } - - if err := table.First(&doc).Error; err != nil { - return doc, err - } - return doc, nil -} - -func (e *SysOperLog) GetPage(pageSize int, pageIndex int) ([]SysOperLog, int, error) { - var doc []SysOperLog - - table := orm.Eloquent.Table(e.TableName()) - if e.OperIp != "" { - table = table.Where("oper_ip = ?", e.OperIp) - } - if e.Status != "" { - table = table.Where("status = ?", e.Status) - } - if e.OperName != "" { - table = table.Where("oper_name = ?", e.OperName) - } - if e.BusinessType != "" { - table = table.Where("business_type = ?", e.BusinessType) - } - - var count int64 - - if err := table.Order("oper_id desc").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil { - return nil, 0, err - } - //table.Where("`deleted_at` IS NULL").Count(&count) - return doc, int(count), nil -} - -func (e *SysOperLog) Create() (SysOperLog, error) { - var doc SysOperLog - e.CreateBy = "0" - e.UpdateBy = "0" - result := orm.Eloquent.Table(e.TableName()).Create(&e) - if result.Error != nil { - err := result.Error - return doc, err - } - doc = *e - return doc, nil -} - -func (e *SysOperLog) Update(id int) (update SysOperLog, err error) { - if err = orm.Eloquent.Table(e.TableName()).First(&update, id).Error; err != nil { - return - } - - //参数1:是要修改的数据 - //参数2:是修改的数据 - if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil { - return - } - return -} - -func (e *SysOperLog) BatchDelete(id []int) (Result bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where(" oper_id in (?)", id).Delete(&SysOperLog{}).Error; err != nil { - return - } - Result = true - return -} diff --git a/app/admin/models/post.go b/app/admin/models/post.go deleted file mode 100644 index bbfcf1c5..00000000 --- a/app/admin/models/post.go +++ /dev/null @@ -1,145 +0,0 @@ -package models - -import ( - orm "go-admin/common/global" - "go-admin/tools" -) - -type Post struct { - PostId int `gorm:"primary_key;AUTO_INCREMENT" json:"postId"` //岗位编号 - PostName string `gorm:"size:128;" json:"postName"` //岗位名称 - PostCode string `gorm:"size:128;" json:"postCode"` //岗位代码 - Sort int `gorm:"" json:"sort"` //岗位排序 - Status string `gorm:"size:4;" json:"status"` //状态 - Remark string `gorm:"size:255;" json:"remark"` //描述 - CreateBy string `gorm:"size:128;" json:"createBy"` - UpdateBy string `gorm:"size:128;" json:"updateBy"` - BaseModel - - DataScope string `gorm:"-" json:"dataScope"` - Params string `gorm:"-" json:"params"` -} - -func (Post) TableName() string { - return "sys_post" -} - -func (e *Post) Create() (Post, error) { - var doc Post - result := orm.Eloquent.Table(e.TableName()).Create(&e) - if result.Error != nil { - err := result.Error - return doc, err - } - doc = *e - return doc, nil -} - -func (e *Post) Get() (Post, error) { - var doc Post - - table := orm.Eloquent.Table(e.TableName()) - if e.PostId != 0 { - table = table.Where("post_id = ?", e.PostId) - } - if e.PostName != "" { - table = table.Where("post_name = ?", e.PostName) - } - if e.PostCode != "" { - table = table.Where("post_code = ?", e.PostCode) - } - if e.Status != "" { - table = table.Where("status = ?", e.Status) - } - - if err := table.First(&doc).Error; err != nil { - return doc, err - } - return doc, nil -} - -func (e *Post) GetList() ([]Post, error) { - var doc []Post - - table := orm.Eloquent.Table(e.TableName()) - if e.PostId != 0 { - table = table.Where("post_id = ?", e.PostId) - } - if e.PostName != "" { - table = table.Where("post_name = ?", e.PostName) - } - if e.PostCode != "" { - table = table.Where("post_code = ?", e.PostCode) - } - if e.Status != "" { - table = table.Where("status = ?", e.Status) - } - - if err := table.Find(&doc).Error; err != nil { - return doc, err - } - return doc, nil -} - -func (e *Post) GetPage(pageSize int, pageIndex int) ([]Post, int, error) { - var doc []Post - - table := orm.Eloquent.Table(e.TableName()) - if e.PostId != 0 { - table = table.Where("post_id = ?", e.PostId) - } - if e.PostName != "" { - table = table.Where("post_name = ?", e.PostName) - } - if e.PostCode != "" { - table = table.Where("post_code = ?", e.PostCode) - } - if e.Status != "" { - table = table.Where("status = ?", e.Status) - } - - // 数据权限控制 - dataPermission := new(DataPermission) - dataPermission.UserId, _ = tools.StringToInt(e.DataScope) - table, err := dataPermission.GetDataScope("sys_post", table) - if err != nil { - return nil, 0, err - } - var count int64 - - if err := table.Order("sort").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil { - return nil, 0, err - } - //table.Where("`deleted_at` IS NULL").Count(&count) - return doc, int(count), nil -} - -func (e *Post) Update(id int) (update Post, err error) { - if err = orm.Eloquent.Table(e.TableName()).First(&update, id).Error; err != nil { - return - } - - //参数1:是要修改的数据 - //参数2:是修改的数据 - if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil { - return - } - return -} - -func (e *Post) Delete(id int) (success bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("post_id = ?", id).Delete(&Post{}).Error; err != nil { - success = false - return - } - success = true - return -} - -func (e *Post) BatchDelete(id []int) (Result bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("post_id in (?)", id).Delete(&Post{}).Error; err != nil { - return - } - Result = true - return -} diff --git a/app/admin/models/role.go b/app/admin/models/role.go index 1088c31c..ef2086d3 100644 --- a/app/admin/models/role.go +++ b/app/admin/models/role.go @@ -1,30 +1,23 @@ package models -import ( - "github.com/pkg/errors" - "gorm.io/gorm" - - orm "go-admin/common/global" - "go-admin/tools" -) +import "go-admin/common/models" type SysRole struct { - RoleId int `json:"roleId" gorm:"primary_key;AUTO_INCREMENT"` // 角色编码 - RoleName string `json:"roleName" gorm:"size:128;"` // 角色名称 - Status string `json:"status" gorm:"size:4;"` // - RoleKey string `json:"roleKey" gorm:"size:128;"` //角色代码 - RoleSort int `json:"roleSort" gorm:""` //角色排序 - Flag string `json:"flag" gorm:"size:128;"` // - CreateBy string `json:"createBy" gorm:"size:128;"` // - UpdateBy string `json:"updateBy" gorm:"size:128;"` // - Remark string `json:"remark" gorm:"size:255;"` //备注 + RoleId int `json:"roleId" gorm:"primaryKey;autoIncrement"` // 角色编码 + RoleName string `json:"roleName" gorm:"size:128;"` // 角色名称 + Status string `json:"status" gorm:"size:4;"` // + RoleKey string `json:"roleKey" gorm:"size:128;"` //角色代码 + RoleSort int `json:"roleSort" gorm:""` //角色排序 + Flag string `json:"flag" gorm:"size:128;"` // + Remark string `json:"remark" gorm:"size:255;"` //备注 Admin bool `json:"admin" gorm:"size:4;"` DataScope string `json:"dataScope" gorm:"size:128;"` - BaseModel + models.ModelTime + models.ControlBy - Params string `json:"params" gorm:"-"` - MenuIds []int `json:"menuIds" gorm:"-"` - DeptIds []int `json:"deptIds" gorm:"-"` + Params string `json:"params" gorm:"-"` + MenuIds []int `json:"menuIds" gorm:"-"` + DeptIds []int `json:"deptIds" gorm:"-"` } func (SysRole) TableName() string { @@ -35,196 +28,216 @@ type MenuIdList struct { MenuId int `json:"menuId"` } -func (role *SysRole) GetById(tx *gorm.DB, id interface{}) error { - return tx.First(role, id).Error -} - -func (role *SysRole) GetPage(pageSize int, pageIndex int) ([]SysRole, int, error) { - var doc []SysRole - - table := orm.Eloquent.Table("sys_role") - if role.RoleId != 0 { - table = table.Where("role_id = ?", role.RoleId) - } - if role.RoleName != "" { - table = table.Where("role_name = ?", role.RoleName) - } - if role.Status != "" { - table = table.Where("status = ?", role.Status) - } - if role.RoleKey != "" { - table = table.Where("role_key = ?", role.RoleKey) - } - - // 数据权限控制 - dataPermission := new(DataPermission) - dataPermission.UserId, _ = tools.StringToInt(role.DataScope) - table, err := dataPermission.GetDataScope("sys_role", table) - if err != nil { - return nil, 0, err - } - var count int64 - - if err := table.Order("role_sort").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil { - return nil, 0, err - } - //table.Where("`deleted_at` IS NULL").Count(&count) - return doc, int(count), nil -} - -func (role *SysRole) Get() (SysRole SysRole, err error) { - table := orm.Eloquent.Table("sys_role") - if role.RoleId != 0 { - table = table.Where("role_id = ?", role.RoleId) - } - if role.RoleName != "" { - table = table.Where("role_name = ?", role.RoleName) - } - if err = table.First(&SysRole).Error; err != nil { - return - } - - return -} - -func (role *SysRole) GetList() (SysRole []SysRole, err error) { - table := orm.Eloquent.Table("sys_role") - if role.RoleId != 0 { - table = table.Where("role_id = ?", role.RoleId) - } - if role.RoleName != "" { - table = table.Where("role_name = ?", role.RoleName) - } - if err = table.Order("role_sort").Find(&SysRole).Error; err != nil { - return - } - - return -} - -// 获取角色对应的菜单ids -func (role *SysRole) GetRoleMeunId() ([]int, error) { - menuIds := make([]int, 0) - menuList := make([]MenuIdList, 0) - if err := orm.Eloquent.Table("sys_role_menu").Select("sys_role_menu.menu_id").Where("role_id = ? ", role.RoleId).Where(" sys_role_menu.menu_id not in(select sys_menu.parent_id from sys_role_menu LEFT JOIN sys_menu on sys_menu.menu_id=sys_role_menu.menu_id where role_id =? and parent_id is not null)", role.RoleId).Find(&menuList).Error; err != nil { - return nil, err - } - - for i := 0; i < len(menuList); i++ { - menuIds = append(menuIds, menuList[i].MenuId) - } - return menuIds, nil -} - -func (role *SysRole) Insert() (id int, err error) { - var i int64 - orm.Eloquent.Table(role.TableName()).Where("role_name=? or role_key = ?", role.RoleName, role.RoleKey).Count(&i) - if i > 0 { - return 0, errors.New("角色名称或者角色标识已经存在!") - } - role.UpdateBy = "" - result := orm.Eloquent.Table(role.TableName()).Create(&role) - if result.Error != nil { - err = result.Error - return - } - id = role.RoleId - return -} - -type DeptIdList struct { - DeptId int `json:"DeptId"` -} - -func (role *SysRole) GetRoleDeptId() ([]int, error) { - deptIds := make([]int, 0) - deptList := make([]DeptIdList, 0) - if err := orm.Eloquent.Table("sys_role_dept").Select("sys_role_dept.dept_id").Joins("LEFT JOIN sys_dept on sys_dept.dept_id=sys_role_dept.dept_id").Where("role_id = ? ", role.RoleId).Where(" sys_role_dept.dept_id not in(select sys_dept.parent_id from sys_role_dept LEFT JOIN sys_dept on sys_dept.dept_id=sys_role_dept.dept_id where role_id =? )", role.RoleId).Find(&deptList).Error; err != nil { - return nil, err - } - - for i := 0; i < len(deptList); i++ { - deptIds = append(deptIds, deptList[i].DeptId) - } - - return deptIds, nil -} - -//修改 -func (role *SysRole) Update(id int) (update SysRole, err error) { - if err = orm.Eloquent.Table(role.TableName()).First(&update, id).Error; err != nil { - return - } - - if role.RoleName != "" && role.RoleName != update.RoleName { - return update, errors.New("角色名称不允许修改!") - } - - if role.RoleKey != "" && role.RoleKey != update.RoleKey { - return update, errors.New("角色标识不允许修改!") - } - - //参数1:是要修改的数据 - //参数2:是修改的数据 - if err = orm.Eloquent.Table(role.TableName()).Model(&update).Updates(&role).Error; err != nil { - return - } - return -} - -//批量删除 -func (role *SysRole) BatchDelete(id []int) (Result bool, err error) { - tx := orm.Eloquent.Begin() - - defer func() { - if r := recover(); r != nil { - tx.Rollback() - } - }() - - if err := tx.Error; err != nil { - return false, err - } - // 查询角色 - var roles []SysRole - if err := tx.Table("sys_role").Where("role_id in (?)", id).Find(&roles).Error; err != nil { - tx.Rollback() - return false, err - } - - var count int64 - if err := tx.Table("sys_user").Where("role_id in (?)", id).Count(&count).Error; err != nil { - tx.Rollback() - return false, err - } - if count > 0 { - tx.Rollback() - return false, errors.New("存在绑定用户,请解绑后重试") - } - - // 删除角色 - if err = tx.Table(role.TableName()).Where("role_id in (?)", id).Unscoped().Delete(&SysRole{}).Error; err != nil { - tx.Rollback() - return false, err - } - - // 删除角色菜单 - if err := tx.Table("sys_role_menu").Where("role_id in (?)", id).Delete(&RoleMenu{}).Error; err != nil { - tx.Rollback() - return false, err - } - - // 删除casbin配置 - for i := 0; i < len(roles); i++ { - if err := tx.Table("sys_casbin_rule").Where("v0 in (?)", roles[0].RoleKey).Delete(&CasbinRule{}).Error; err != nil { - tx.Rollback() - return false, err - } - } - - if err := tx.Commit().Error; err != nil { - return false, err - } - - return true, nil -} +//func (role *SysRole) GetById(tx *gorm.DB, id interface{}) error { +// return tx.First(role, id).Error +//} +// +//func (role *SysRole) GetPage(pageSize int, pageIndex int) ([]SysRole, int, error) { +// var doc []SysRole +// +// table := orm.Eloquent.Table("sys_role") +// if role.RoleId != 0 { +// table = table.Where("role_id = ?", role.RoleId) +// } +// if role.RoleName != "" { +// table = table.Where("role_name = ?", role.RoleName) +// } +// if role.Status != "" { +// table = table.Where("status = ?", role.Status) +// } +// if role.RoleKey != "" { +// table = table.Where("role_key = ?", role.RoleKey) +// } +// +// // 数据权限控制 +// dataPermission := new(DataPermission) +// dataPermission.UserId, _ = tools.StringToInt(role.DataScope) +// table, err := dataPermission.GetDataScope("sys_role", table) +// if err != nil { +// return nil, 0, err +// } +// var count int64 +// +// if err := table.Order("role_sort").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil { +// return nil, 0, err +// } +// //table.Where("`deleted_at` IS NULL").Count(&count) +// return doc, int(count), nil +//} +// +//func (role *SysRole) Get() (SysRole SysRole, err error) { +// table := orm.Eloquent.Table("sys_role") +// if role.RoleId != 0 { +// table = table.Where("role_id = ?", role.RoleId) +// } +// if role.RoleName != "" { +// table = table.Where("role_name = ?", role.RoleName) +// } +// if err = table.First(&SysRole).Error; err != nil { +// return +// } +// +// return +//} +// +//func (role *SysRole) GetOne(sysRole *SysRole) (err error) { +// table := orm.Eloquent.Table("sys_role") +// if role.RoleId != 0 { +// table = table.Where("role_id = ?", role.RoleId) +// } +// if role.RoleName != "" { +// table = table.Where("role_name = ?", role.RoleName) +// } +// if err = table.First(sysRole).Error; err != nil { +// return +// } +// +// return +//} +// +//func (role *SysRole) GetList() (SysRole []SysRole, err error) { +// table := orm.Eloquent.Table("sys_role") +// if role.RoleId != 0 { +// table = table.Where("role_id = ?", role.RoleId) +// } +// if role.RoleName != "" { +// table = table.Where("role_name = ?", role.RoleName) +// } +// if err = table.Order("role_sort").Find(&SysRole).Error; err != nil { +// return +// } +// +// return +//} +// +//// 获取角色对应的菜单ids +//func (role *SysRole) GetRoleMeunId() ([]int, error) { +// menuIds := make([]int, 0) +// menuList := make([]MenuIdList, 0) +// if err := orm.Eloquent.Table("sys_role_menu"). +// Select("sys_role_menu.menu_id"). +// Where("role_id = ? ", role.RoleId). +// Where(" sys_role_menu.menu_id not in(select sys_menu.parent_id from sys_role_menu " + +// "LEFT JOIN sys_menu on sys_menu.menu_id=sys_role_menu.menu_id where role_id =? and parent_id is not null)", role.RoleId). +// Find(&menuList).Error; err != nil { +// return nil, err +// } +// +// for i := 0; i < len(menuList); i++ { +// menuIds = append(menuIds, menuList[i].MenuId) +// } +// return menuIds, nil +//} +// +//func (role *SysRole) Insert() (id int, err error) { +// var i int64 +// orm.Eloquent.Table(role.TableName()).Where("role_name=? or role_key = ?", role.RoleName, role.RoleKey).Count(&i) +// if i > 0 { +// return 0, errors.New("角色名称或者角色标识已经存在!") +// } +// role.UpdateBy = "" +// result := orm.Eloquent.Table(role.TableName()).Create(&role) +// if result.Error != nil { +// err = result.Error +// return +// } +// id = role.RoleId +// return +//} +// +//type DeptIdList struct { +// DeptId int `json:"DeptId"` +//} +// +//func (role *SysRole) GetRoleDeptId() ([]int, error) { +// deptIds := make([]int, 0) +// deptList := make([]DeptIdList, 0) +// if err := orm.Eloquent.Table("sys_role_dept").Select("sys_role_dept.dept_id").Joins("LEFT JOIN sys_dept on sys_dept.dept_id=sys_role_dept.dept_id").Where("role_id = ? ", role.RoleId).Where(" sys_role_dept.dept_id not in(select sys_dept.parent_id from sys_role_dept LEFT JOIN sys_dept on sys_dept.dept_id=sys_role_dept.dept_id where role_id =? )", role.RoleId).Find(&deptList).Error; err != nil { +// return nil, err +// } +// +// for i := 0; i < len(deptList); i++ { +// deptIds = append(deptIds, deptList[i].DeptId) +// } +// +// return deptIds, nil +//} +// +////修改 +//func (role *SysRole) Update(id int) (update SysRole, err error) { +// if err = orm.Eloquent.Table(role.TableName()).First(&update, id).Error; err != nil { +// return +// } +// +// if role.RoleName != "" && role.RoleName != update.RoleName { +// return update, errors.New("角色名称不允许修改!") +// } +// +// if role.RoleKey != "" && role.RoleKey != update.RoleKey { +// return update, errors.New("角色标识不允许修改!") +// } +// +// //参数1:是要修改的数据 +// //参数2:是修改的数据 +// if err = orm.Eloquent.Table(role.TableName()).Model(&update).Updates(&role).Error; err != nil { +// return +// } +// return +//} +// +////批量删除 +//func (role *SysRole) BatchDelete(id []int) (Result bool, err error) { +// tx := orm.Eloquent.Begin() +// +// defer func() { +// if r := recover(); r != nil { +// tx.Rollback() +// } +// }() +// +// if err := tx.Error; err != nil { +// return false, err +// } +// // 查询角色 +// var roles []SysRole +// if err := tx.Table("sys_role").Where("role_id in (?)", id).Find(&roles).Error; err != nil { +// tx.Rollback() +// return false, err +// } +// +// var count int64 +// if err := tx.Table("sys_user").Where("role_id in (?)", id).Count(&count).Error; err != nil { +// tx.Rollback() +// return false, err +// } +// if count > 0 { +// tx.Rollback() +// return false, errors.New("存在绑定用户,请解绑后重试") +// } +// +// // 删除角色 +// if err = tx.Table(role.TableName()).Where("role_id in (?)", id).Unscoped().Delete(&SysRole{}).Error; err != nil { +// tx.Rollback() +// return false, err +// } +// +// // 删除角色菜单 +// if err := tx.Table("sys_role_menu").Where("role_id in (?)", id).Delete(&RoleMenu{}).Error; err != nil { +// tx.Rollback() +// return false, err +// } +// +// // 删除casbin配置 +// for i := 0; i < len(roles); i++ { +// if err := tx.Table("sys_casbin_rule").Where("v0 in (?)", roles[0].RoleKey).Delete(&CasbinRule{}).Error; err != nil { +// tx.Rollback() +// return false, err +// } +// } +// +// if err := tx.Commit().Error; err != nil { +// return false, err +// } +// +// return true, nil +//} diff --git a/app/admin/models/roledept.go b/app/admin/models/roledept.go deleted file mode 100644 index dd094e1c..00000000 --- a/app/admin/models/roledept.go +++ /dev/null @@ -1,47 +0,0 @@ -package models - -import ( - "fmt" - - orm "go-admin/common/global" -) - -//sys_role_dept -type SysRoleDept struct { - RoleId int `gorm:""` - DeptId int `gorm:""` -} - -func (SysRoleDept) TableName() string { - return "sys_role_dept" -} - -func (rm *SysRoleDept) Insert(roleId int, deptIds []int) (bool, error) { - //ORM不支持批量插入所以需要拼接 sql 串 - sql := "INSERT INTO `sys_role_dept` (`role_id`,`dept_id`) VALUES " - - for i := 0; i < len(deptIds); i++ { - if len(deptIds)-1 == i { - //最后一条数据 以分号结尾 - sql += fmt.Sprintf("(%d,%d);", roleId, deptIds[i]) - } else { - sql += fmt.Sprintf("(%d,%d),", roleId, deptIds[i]) - } - } - orm.Eloquent.Exec(sql) - - return true, nil -} - -func (rm *SysRoleDept) DeleteRoleDept(roleId int) (bool, error) { - if err := orm.Eloquent.Table("sys_role_dept").Where("role_id = ?", roleId).Delete(&rm).Error; err != nil { - return false, err - } - var role SysRole - if err := orm.Eloquent.Table("sys_role").Where("role_id = ?", roleId).First(&role).Error; err != nil { - return false, err - } - - return true, nil - -} diff --git a/app/admin/models/rolemenu.go b/app/admin/models/rolemenu.go deleted file mode 100644 index ef7909e2..00000000 --- a/app/admin/models/rolemenu.go +++ /dev/null @@ -1,234 +0,0 @@ -package models - -import ( - "fmt" - - orm "go-admin/common/global" - "go-admin/tools" -) - -type RoleMenu struct { - RoleId int `gorm:""` - MenuId int `gorm:""` - RoleName string `gorm:"size:128)"` - CreateBy string `gorm:"size:128)"` - UpdateBy string `gorm:"size:128)"` -} - -func (RoleMenu) TableName() string { - return "sys_role_menu" -} - -type MenuPath struct { - Path string `json:"path"` -} - -func (rm *RoleMenu) Get() ([]RoleMenu, error) { - var r []RoleMenu - table := orm.Eloquent.Table("sys_role_menu") - if rm.RoleId != 0 { - table = table.Where("role_id = ?", rm.RoleId) - - } - if err := table.Find(&r).Error; err != nil { - return nil, err - } - return r, nil -} - -func (rm *RoleMenu) GetPermis() ([]string, error) { - var r []Menu - table := orm.Eloquent.Select("sys_menu.permission").Table("sys_menu").Joins("left join sys_role_menu on sys_menu.menu_id = sys_role_menu.menu_id") - - table = table.Where("role_id = ?", rm.RoleId) - - table = table.Where("sys_menu.menu_type in('F','C')") - if err := table.Find(&r).Error; err != nil { - return nil, err - } - var list []string - for i := 0; i < len(r); i++ { - list = append(list, r[i].Permission) - } - return list, nil -} - -func (rm *RoleMenu) GetIDS() ([]MenuPath, error) { - var r []MenuPath - table := orm.Eloquent.Select("sys_menu.path").Table("sys_role_menu") - table = table.Joins("left join sys_role on sys_role.role_id=sys_role_menu.role_id") - table = table.Joins("left join sys_menu on sys_menu.id=sys_role_menu.menu_id") - table = table.Where("sys_role.role_name = ? and sys_menu.type=1", rm.RoleName) - if err := table.Find(&r).Error; err != nil { - return nil, err - } - return r, nil -} - -func (rm *RoleMenu) DeleteRoleMenu(roleId int) (bool, error) { - tx := orm.Eloquent.Begin() - defer func() { - if r := recover(); r != nil { - tx.Rollback() - } - }() - - if err := tx.Error; err != nil { - return false, err - } - - if err := tx.Table("sys_role_dept").Where("role_id = ?", roleId).Delete(&rm).Error; err != nil { - tx.Rollback() - return false, err - } - if err := tx.Table("sys_role_menu").Where("role_id = ?", roleId).Delete(&rm).Error; err != nil { - tx.Rollback() - return false, err - } - var role SysRole - if err := tx.Table("sys_role").Where("role_id = ?", roleId).First(&role).Error; err != nil { - tx.Rollback() - return false, err - } - sql3 := "delete from sys_casbin_rule where v0= '" + role.RoleKey + "';" - if err := tx.Exec(sql3).Error; err != nil { - tx.Rollback() - return false, err - } - if err := tx.Commit().Error; err != nil { - return false, err - } - - return true, nil - -} - -// 该方法即将弃用 -func (rm *RoleMenu) BatchDeleteRoleMenu(roleIds []int) (bool, error) { - tx := orm.Eloquent.Begin() - defer func() { - if r := recover(); r != nil { - tx.Rollback() - } - }() - - if err := tx.Error; err != nil { - return false, err - } - - if err := tx.Table("sys_role_menu").Where("role_id in (?)", roleIds).Delete(&rm).Error; err != nil { - tx.Rollback() - return false, err - } - var role []SysRole - if err := tx.Table("sys_role").Where("role_id in (?)", roleIds).Find(&role).Error; err != nil { - tx.Rollback() - return false, err - } - sql := "" - for i := 0; i < len(role); i++ { - sql += "delete from sys_casbin_rule where v0= '" + role[i].RoleName + "';" - } - if err := tx.Exec(sql).Error; err != nil { - tx.Rollback() - return false, err - } - if err := tx.Commit().Error; err != nil { - return false, err - } - return true, nil - -} - -func (rm *RoleMenu) Insert(roleId int, menuId []int) (bool, error) { - var ( - role SysRole - menu []Menu - casbinRuleQueue []CasbinRule // casbinRule 待插入队列 - ) - - // 开始事务 - tx := orm.Eloquent.Begin() - defer func() { - if r := recover(); r != nil { - tx.Rollback() - } - }() - - if err := tx.Error; err != nil { - return false, err - } - - // 在事务中做一些数据库操作(从这一点使用'tx',而不是'db') - if err := tx.Table("sys_role").Where("role_id = ?", roleId).First(&role).Error; err != nil { - tx.Rollback() - return false, err - } - if err := tx.Table("sys_menu").Where("menu_id in (?)", menuId).Find(&menu).Error; err != nil { - tx.Rollback() - return false, err - } - //ORM不支持批量插入所以需要拼接 sql 串 - sysRoleMenuSql := "INSERT INTO `sys_role_menu` (`role_id`,`menu_id`,`role_name`) VALUES " - casbinRuleSql := "INSERT INTO `sys_casbin_rule` (`p_type`,`v0`,`v1`,`v2`) VALUES " - - for i, m := range menu { - // 拼装'role_menu'表批量插入SQL语句 - sysRoleMenuSql += fmt.Sprintf("(%d,%d,'%s')", role.RoleId, m.MenuId, role.RoleKey) - if i == len(menu)-1 { - sysRoleMenuSql += ";" //最后一条数据 以分号结尾 - } else { - sysRoleMenuSql += "," - } - if m.MenuType == "A" { - // 加入队列 - casbinRuleQueue = append(casbinRuleQueue, - CasbinRule{ - V0: role.RoleKey, - V1: m.Path, - V2: m.Action, - }) - } - } - // 执行批量插入sys_role_menu - if err := tx.Exec(sysRoleMenuSql).Error; err != nil { - tx.Rollback() - return false, err - } - - // 拼装'sys_casbin_rule'批量插入SQL语句 - // TODO: casbinRuleQueue队列不为空时才会拼装,否则直接忽略不执行'for'循环 - for i, v := range casbinRuleQueue { - casbinRuleSql += fmt.Sprintf("('p','%s','%s','%s')", v.V0, v.V1, v.V2) - if i == len(casbinRuleQueue)-1 { - casbinRuleSql += ";" - } else { - casbinRuleSql += "," - } - } - // 执行批量插入sys_casbin_rule - if len(casbinRuleQueue) > 0 { - if err := tx.Exec(casbinRuleSql).Error; err != nil { - tx.Rollback() - return false, err - } - } - - if err := tx.Commit().Error; err != nil { - return false, err - } - return true, nil -} - -func (rm *RoleMenu) Delete(RoleId string, MenuID string) (bool, error) { - rm.RoleId, _ = tools.StringToInt(RoleId) - table := orm.Eloquent.Table("sys_role_menu").Where("role_id = ?", RoleId) - if MenuID != "" { - table = table.Where("menu_id = ?", MenuID) - } - if err := table.Delete(&rm).Error; err != nil { - return false, err - } - return true, nil - -} diff --git a/app/admin/models/sys_category.go b/app/admin/models/sys_category.go new file mode 100644 index 00000000..219394ca --- /dev/null +++ b/app/admin/models/sys_category.go @@ -0,0 +1,29 @@ +package models + +import ( + "go-admin/common/models" +) + +type SysCategory struct { + models.Model + Name string `json:"name" gorm:"type:varchar(255);comment:名称"` // + Img string `json:"img" gorm:"type:varchar(255);comment:图标"` // + Sort int `json:"sort" gorm:"type:int(4);comment:排序"` // + Status int `json:"status" gorm:"type:int(1);comment:状态"` // + Remark string `json:"remark" gorm:"type:varchar(255);comment:备注"` // + models.ControlBy + models.ModelTime +} + +func (SysCategory) TableName() string { + return "sys_category" +} + +func (e *SysCategory) Generate() models.ActiveRecord { + o := *e + return &o +} + +func (e *SysCategory) GetId() interface{} { + return e.Id +} \ No newline at end of file diff --git a/app/admin/models/sys_china_area_data.go b/app/admin/models/sys_china_area_data.go new file mode 100644 index 00000000..019b041f --- /dev/null +++ b/app/admin/models/sys_china_area_data.go @@ -0,0 +1,27 @@ +package models + +import ( + "go-admin/common/models" +) + +type SysChinaAreaData struct { + models.Model + + PId string `json:"pId" gorm:"type:int(11);comment:上级编码"` + Name string `json:"name" gorm:"type:varchar(128);comment:名称"` + models.ControlBy + models.ModelTime +} + +func (SysChinaAreaData) TableName() string { + return "sys_china_area_data" +} + +func (e *SysChinaAreaData) Generate() models.ActiveRecord { + o := *e + return &o +} + +func (e *SysChinaAreaData) GetId() interface{} { + return e.Id +} \ No newline at end of file diff --git a/app/admin/models/sys_content.go b/app/admin/models/sys_content.go new file mode 100644 index 00000000..093d2ba1 --- /dev/null +++ b/app/admin/models/sys_content.go @@ -0,0 +1,33 @@ +package models + +import ( + "go-admin/common/models" +) + +type SysContent struct { + models.Model + CateId int `json:"cateId" gorm:"type:int(11);comment:分类id"` + Name string `json:"name" gorm:"type:varchar(255);comment:名称"` + Status int `json:"status" gorm:"type:int(1);comment:状态"` + Img string `json:"img" gorm:"type:varchar(255);comment:图片"` + Content string `json:"content" gorm:"type:text;comment:内容"` + Remark string `json:"remark" gorm:"type:varchar(255);comment:备注"` + Sort int `json:"sort" gorm:"type:int(4);comment:排序"` + models.ControlBy + models.ModelTime +} + +// TableName +func (SysContent) TableName() string { + return "sys_content" +} + +// Generate +func (e *SysContent) Generate() models.ActiveRecord { + o := *e + return &o +} + +func (e *SysContent) GetId() interface{} { + return e.Id +} \ No newline at end of file diff --git a/app/admin/models/sys_file_dir.go b/app/admin/models/sys_file_dir.go new file mode 100644 index 00000000..246b14c7 --- /dev/null +++ b/app/admin/models/sys_file_dir.go @@ -0,0 +1,40 @@ +package models + +import ( + "go-admin/common/models" +) + +type SysFileDir struct { + models.Model + Label string `json:"label" gorm:"type:varchar(255);comment:目录名称"` // 目录名称 + PId int `json:"pId" gorm:"type:int(11);comment:上级目录"` // 上级目录 + Sort string `json:"sort" gorm:"type:bigint(20);comment:排序"` // 排序 + Path string `json:"path" gorm:"type:varchar(255);comment:路径"` // 路径 + Children []SysFileDir `json:"children,omitempty" gorm:"-"` // 下级信息 + models.ControlBy + models.ModelTime +} + +type SysFileDirL struct { + models.Model + Label string `json:"label" gorm:"type:varchar(255);comment:目录名称"` // 目录名称 + PId int `json:"pId" gorm:"type:int(11);comment:上级目录"` // 上级目录 + Sort string `json:"sort" gorm:"type:bigint(20);comment:排序"` // 排序 + Path string `json:"path" gorm:"type:varchar(255);comment:路径"` // 路径 + models.ControlBy + models.ModelTime + Children []SysFileDirL `json:"children,omitempty" gorm:"-"` // 下级信息 +} + +func (SysFileDir) TableName() string { /**/ + return "sys_file_dir" +} + +func (e *SysFileDir) Generate() models.ActiveRecord { + o := *e + return &o +} + +func (e *SysFileDir) GetId() interface{} { + return e.Id +} diff --git a/app/admin/models/sys_file_info.go b/app/admin/models/sys_file_info.go new file mode 100644 index 00000000..598969e0 --- /dev/null +++ b/app/admin/models/sys_file_info.go @@ -0,0 +1,31 @@ +package models + +import ( + "go-admin/common/models" +) + +type SysFileInfo struct { + models.Model + Type string `json:"type" gorm:"type:varchar(255);comment:类型"` // + Name string `json:"name" gorm:"type:varchar(255);comment:名称"` // + Size string `json:"size" gorm:"type:int(11);comment:大小"` // + PId int `json:"pId" gorm:"type:int(11);comment:目录"` // + Source string `json:"source" gorm:"type:varchar(255);comment:来源"` // + Url string `json:"url" gorm:"type:varchar(255);comment:地址"` // + FullUrl string `json:"fullUrl" gorm:"type:varchar(255);comment:全地址"` // + models.ControlBy + models.ModelTime +} + +func (SysFileInfo) TableName() string { + return "sys_file_info" +} + +func (e *SysFileInfo) Generate() models.ActiveRecord { + o := *e + return &o +} + +func (e *SysFileInfo) GetId() interface{} { + return e.Id +} diff --git a/app/admin/models/sys_job.go b/app/admin/models/sys_job.go new file mode 100644 index 00000000..bc88025a --- /dev/null +++ b/app/admin/models/sys_job.go @@ -0,0 +1,109 @@ +package models + +import ( + "go-admin/common/models" + "gorm.io/gorm" +) + +type SysJob struct { + JobId int `json:"jobId" gorm:"primaryKey;autoIncrement"` // 编码 + JobName string `json:"jobName" gorm:"size:255;"` // 名称 + JobGroup string `json:"jobGroup" gorm:"size:255;"` // 任务分组 + JobType int `json:"jobType" gorm:"size:1;"` // 任务类型 + CronExpression string `json:"cronExpression" gorm:"size:255;"` // cron表达式 + InvokeTarget string `json:"invokeTarget" gorm:"size:255;"` // 调用目标 + Args string `json:"args" gorm:"size:255;"` // 目标参数 + MisfirePolicy int `json:"misfirePolicy" gorm:"size:255;"` // 执行策略 + Concurrent int `json:"concurrent" gorm:"size:1;"` // 是否并发 + Status int `json:"status" gorm:"size:1;"` // 状态 + EntryId int `json:"entry_id" gorm:"size:11;"` // job启动时返回的id + models.ControlBy + models.ModelTime + + DataScope string `json:"dataScope" gorm:"-"` +} + +func (SysJob) TableName() string { + return "sys_job" +} + +func (e *SysJob) Generate() models.ActiveRecord { + o := *e + return &o +} + +func (e *SysJob) GetId() interface{} { + return e.JobId +} + +func (e *SysJob) SetCreateBy(createBy int) { + e.CreateBy = createBy +} + +func (e *SysJob) SetUpdateBy(updateBy int) { + e.UpdateBy = updateBy +} + +// 创建SysJob +//func (e *SysJob) Create() (err error) { +// return orm.Eloquent.Table(e.TableName()).Create(e).Error +//} + +// 获取SysJob +//func (e *SysJob) Get(id interface{}) (err error) { +// return orm.Eloquent.Table(e.TableName()).First(e, id).Error +//} + +// 获取SysJob带分页 +//func (e *SysJob) GetPage(pageSize int, pageIndex int, v interface{}, list interface{}) (int, error) { +// table := orm.Eloquent.Table(e.TableName()).Scopes(dto.MakeCondition(v)) +// +// // 数据权限控制(如果不需要数据权限请将此处去掉) +// //dataPermission := new(DataPermission) +// userid, _ := tools.StringToInt(e.DataScope) +// +// var count int64 +// +// if err := table.Scopes(system.DataScopes(e.TableName(), userid), dto.Paginate(pageSize, pageIndex)).Find(list).Offset(-1).Limit(-1).Count(&count).Error; err != nil { +// return 0, err +// } +// return int(count), nil +//} + +func (e *SysJob) GetList(tx *gorm.DB, list interface{}) (err error) { + return tx.Table(e.TableName()).Where("status = ?", 2).Find(list).Error +} + +// 更新SysJob +func (e *SysJob) Update(tx *gorm.DB, id interface{}) (err error) { + return tx.Table(e.TableName()).Where(id).Updates(&e).Error +} + +func (e *SysJob) RemoveAllEntryID(tx *gorm.DB) (update SysJob, err error) { + if err = tx.Table(e.TableName()).Where("entry_id > ?", 0).Update("entry_id", 0).Error; err != nil { + return + } + return +} + +//func (e *SysJob) RemoveEntryID(entryID int) (update SysJob, err error) { +// if err = orm.Eloquent.Table(e.TableName()).Where("entry_id = ?", entryID).Updates(map[string]interface{}{"entry_id": 0}).Error; err != nil { +// return +// } +// return +//} + +// 删除SysJob +//func (e *SysJob) Delete(id int) (success bool, err error) { +// if err = orm.Eloquent.Table(e.TableName()).Where(id).Delete(&SysJob{}).Error; err != nil { +// success = false +// return +// } +// success = true +// return +//} + +//批量删除 +//func (e *SysJob) BatchDelete(id []int) error { +// return orm.Eloquent.Table(e.TableName()).Where(id).Delete(&SysJob{}).Error +//} diff --git a/app/admin/models/syscategory.go b/app/admin/models/syscategory.go deleted file mode 100644 index b277bd92..00000000 --- a/app/admin/models/syscategory.go +++ /dev/null @@ -1,122 +0,0 @@ -package models - -import ( - orm "go-admin/common/global" - "go-admin/tools" -) - -type SysCategory struct { - Id int `json:"id" gorm:"type:int(11);primary_key;AUTO_INCREMENT"` // 分类Id - Name string `json:"name" gorm:"type:varchar(255);"` // 名称 - Img string `json:"img" gorm:"type:varchar(255);"` // 图片 - Sort string `json:"sort" gorm:"type:int(4);"` // 排序 - Status string `json:"status" gorm:"type:int(1);"` // 状态 - Remark string `json:"remark" gorm:"type:varchar(255);"` // 备注 - CreateBy string `json:"createBy" gorm:"type:varchar(64);"` // 创建者 - UpdateBy string `json:"updateBy" gorm:"type:varchar(64);"` // 更新者 - DataScope string `json:"dataScope" gorm:"-"` - Params string `json:"params" gorm:"-"` - BaseModel -} - -func (SysCategory) TableName() string { - return "sys_category" -} - -// 创建SysCategory -func (e *SysCategory) Create() (SysCategory, error) { - var doc SysCategory - result := orm.Eloquent.Table(e.TableName()).Create(&e) - if result.Error != nil { - err := result.Error - return doc, err - } - doc = *e - return doc, nil -} - -// 获取SysCategory -func (e *SysCategory) Get() (SysCategory, error) { - var doc SysCategory - table := orm.Eloquent.Table(e.TableName()) - - if e.Id != 0 { - table = table.Where("id = ?", e.Id) - } - - if e.Name != "" { - table = table.Where("name = ?", e.Name) - } - - if e.Status != "" { - table = table.Where("status = ?", e.Status) - } - - if err := table.First(&doc).Error; err != nil { - return doc, err - } - return doc, nil -} - -// 获取SysCategory带分页 -func (e *SysCategory) GetPage(pageSize int, pageIndex int) ([]SysCategory, int, error) { - var doc []SysCategory - - table := orm.Eloquent.Table(e.TableName()) - - if e.Name != "" { - table = table.Where("name = ?", e.Name) - } - - if e.Status != "" { - table = table.Where("status = ?", e.Status) - } - - // 数据权限控制(如果不需要数据权限请将此处去掉) - dataPermission := new(DataPermission) - dataPermission.UserId, _ = tools.StringToInt(e.DataScope) - table, err := dataPermission.GetDataScope(e.TableName(), table) - if err != nil { - return nil, 0, err - } - var count int64 - - if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil { - return nil, 0, err - } - //table.Where("`deleted_at` IS NULL").Count(&count) - return doc, int(count), nil -} - -// 更新SysCategory -func (e *SysCategory) Update(id int) (update SysCategory, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("id = ?", id).First(&update).Error; err != nil { - return - } - - //参数1:是要修改的数据 - //参数2:是修改的数据 - if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil { - return - } - return -} - -// 删除SysCategory -func (e *SysCategory) Delete(id int) (success bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("id = ?", id).Delete(&SysCategory{}).Error; err != nil { - success = false - return - } - success = true - return -} - -//批量删除 -func (e *SysCategory) BatchDelete(id []int) (Result bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("id in (?)", id).Delete(&SysCategory{}).Error; err != nil { - return - } - Result = true - return -} diff --git a/app/admin/models/syscontent.go b/app/admin/models/syscontent.go deleted file mode 100644 index cfa93026..00000000 --- a/app/admin/models/syscontent.go +++ /dev/null @@ -1,132 +0,0 @@ -package models - -import ( - orm "go-admin/common/global" - "go-admin/tools" -) - -type SysContent struct { - Id int `json:"id" gorm:"type:int(11);primary_key;auto_increment"` // id - CateId string `json:"cateId" gorm:"type:int(11);"` // 分类id - Name string `json:"name" gorm:"type:varchar(255);"` // 名称 - Status string `json:"status" gorm:"type:int(1);"` // 状态 - Img string `json:"img" gorm:"type:varchar(255);"` // 图片 - Content string `json:"content" gorm:"type:text;"` // 内容 - Remark string `json:"remark" gorm:"type:varchar(255);"` // 备注 - Sort string `json:"sort" gorm:"type:int(4);"` // 排序 - CreateBy string `json:"createBy" gorm:"type:varchar(128);"` // 创建者 - UpdateBy string `json:"updateBy" gorm:"type:varchar(128);"` // 更新者 - DataScope string `json:"dataScope" gorm:"-"` - Params string `json:"params" gorm:"-"` - BaseModel -} - -func (SysContent) TableName() string { - return "sys_content" -} - -// 创建SysContent -func (e *SysContent) Create() (SysContent, error) { - var doc SysContent - result := orm.Eloquent.Table(e.TableName()).Create(&e) - if result.Error != nil { - err := result.Error - return doc, err - } - doc = *e - return doc, nil -} - -// 获取SysContent -func (e *SysContent) Get() (SysContent, error) { - var doc SysContent - table := orm.Eloquent.Table(e.TableName()) - - if e.Id != 0 { - table = table.Where("id = ?", e.Id) - } - - if e.CateId != "" { - table = table.Where("cate_id = ?", e.CateId) - } - - if e.Name != "" { - table = table.Where("name like ?", "%"+e.Name+"%") - } - - if e.Status != "" { - table = table.Where("status = ?", e.Status) - } - - if err := table.First(&doc).Error; err != nil { - return doc, err - } - return doc, nil -} - -// 获取SysContent带分页 -func (e *SysContent) GetPage(pageSize int, pageIndex int) ([]SysContent, int, error) { - var doc []SysContent - - table := orm.Eloquent.Table(e.TableName()) - - if e.CateId != "" { - table = table.Where("cate_id = ?", e.CateId) - } - - if e.Name != "" { - table = table.Where("name like ?", "%"+e.Name+"%") - } - - if e.Status != "" { - table = table.Where("status = ?", e.Status) - } - - // 数据权限控制(如果不需要数据权限请将此处去掉) - dataPermission := new(DataPermission) - dataPermission.UserId, _ = tools.StringToInt(e.DataScope) - table, err := dataPermission.GetDataScope(e.TableName(), table) - if err != nil { - return nil, 0, err - } - var count int64 - - if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil { - return nil, 0, err - } - //table.Where("`deleted_at` IS NULL").Count(&count) - return doc, int(count), nil -} - -// 更新SysContent -func (e *SysContent) Update(id int) (update SysContent, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("id = ?", id).First(&update).Error; err != nil { - return - } - - //参数1:是要修改的数据 - //参数2:是修改的数据 - if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil { - return - } - return -} - -// 删除SysContent -func (e *SysContent) Delete(id int) (success bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("id = ?", id).Delete(&SysContent{}).Error; err != nil { - success = false - return - } - success = true - return -} - -//批量删除 -func (e *SysContent) BatchDelete(id []int) (Result bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("id in (?)", id).Delete(&SysContent{}).Error; err != nil { - return - } - Result = true - return -} diff --git a/app/admin/models/sysfileinfo.go b/app/admin/models/sysfileinfo.go deleted file mode 100644 index e47e2573..00000000 --- a/app/admin/models/sysfileinfo.go +++ /dev/null @@ -1,111 +0,0 @@ -package models - -import ( - orm "go-admin/common/global" -) - -type SysFileInfo struct { - Id int `json:"id"` // id - Type string `json:"type" gorm:"type:varchar(255);"` // 文件类型 - Name string `json:"name" gorm:"type:varchar(255);"` // 文件名称 - Size string `json:"size" gorm:"type:int(11);"` // 文件大小 - PId int `json:"pId" gorm:"type:int(11);"` // 目录id - Source string `json:"source" gorm:"type:varchar(255);"` // 文件源 - Url string `json:"url" gorm:"type:varchar(255);"` // 文件路径 - FullUrl string `json:"fullUrl" gorm:"type:varchar(255);"` // 文件全路径 - CreateBy string `json:"createBy" gorm:"type:varchar(128);"` // 创建人 - UpdateBy string `json:"updateBy" gorm:"type:varchar(128);"` // 编辑人 - DataScope string `json:"dataScope" gorm:"-"` - Params string `json:"params" gorm:"-"` - BaseModel -} - -func (SysFileInfo) TableName() string { - return "sys_file_info" -} - -// 创建SysFileInfo -func (e *SysFileInfo) Create() (SysFileInfo, error) { - var doc SysFileInfo - result := orm.Eloquent.Table(e.TableName()).Create(&e) - if result.Error != nil { - err := result.Error - return doc, err - } - doc = *e - return doc, nil -} - -// 获取SysFileInfo -func (e *SysFileInfo) Get() (SysFileInfo, error) { - var doc SysFileInfo - table := orm.Eloquent.Table(e.TableName()) - - if e.Id != 0 { - table = table.Where("id = ?", e.Id) - } - - if err := table.First(&doc).Error; err != nil { - return doc, err - } - return doc, nil -} - -// 获取SysFileInfo带分页 -func (e *SysFileInfo) GetPage(pageSize int, pageIndex int) ([]SysFileInfo, int, error) { - var doc []SysFileInfo - - table := orm.Eloquent.Table(e.TableName()) - - if e.PId != 0 { - table = table.Where("p_id = ?", e.PId) - } - - // 数据权限控制(如果不需要数据权限请将此处去掉) - //dataPermission := new(DataPermission) - //dataPermission.UserId, _ = tools.StringToInt(e.DataScope) - //table, err := dataPermission.GetDataScope(e.TableName(), table) - //if err != nil { - // return nil, 0, err - //} - var count int64 - - if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil { - return nil, 0, err - } - //table.Where("`deleted_at` IS NULL").Count(&count) - return doc, int(count), nil -} - -// 更新SysFileInfo -func (e *SysFileInfo) Update(id int) (update SysFileInfo, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("id = ?", id).First(&update).Error; err != nil { - return - } - - //参数1:是要修改的数据 - //参数2:是修改的数据 - if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil { - return - } - return -} - -// 删除SysFileInfo -func (e *SysFileInfo) Delete(id int) (success bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("id = ?", id).Delete(&SysFileInfo{}).Error; err != nil { - success = false - return - } - success = true - return -} - -//批量删除 -func (e *SysFileInfo) BatchDelete(id []int) (Result bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("id in (?)", id).Delete(&SysFileInfo{}).Error; err != nil { - return - } - Result = true - return -} diff --git a/app/admin/models/sysjob.go b/app/admin/models/sysjob.go deleted file mode 100644 index 635d54b1..00000000 --- a/app/admin/models/sysjob.go +++ /dev/null @@ -1,113 +0,0 @@ -package models - -import ( - "go-admin/common/dto" - orm "go-admin/common/global" - "go-admin/common/models" - "go-admin/tools" - "strconv" -) - -type SysJob struct { - JobId uint `json:"jobId" gorm:"primary_key;AUTO_INCREMENT"` // 编码 - JobName string `json:"jobName" gorm:"size:255;"` // 名称 - JobGroup string `json:"jobGroup" gorm:"size:255;"` // 任务分组 - JobType int `json:"jobType" gorm:"size:1;"` // 任务类型 - CronExpression string `json:"cronExpression" gorm:"size:255;"` // cron表达式 - InvokeTarget string `json:"invokeTarget" gorm:"size:255;"` // 调用目标 - Args string `json:"args" gorm:"size:255;"` // 目标参数 - MisfirePolicy int `json:"misfirePolicy" gorm:"size:255;"` // 执行策略 - Concurrent int `json:"concurrent" gorm:"size:1;"` // 是否并发 - Status int `json:"status" gorm:"size:1;"` // 状态 - EntryId int `json:"entry_id" gorm:"size:11;"` // job启动时返回的id - CreateBy string `json:"createBy" gorm:"size:128;"` // - UpdateBy string `json:"updateBy" gorm:"size:128;"` // - BaseModel - - DataScope string `json:"dataScope" gorm:"-"` -} - -func (SysJob) TableName() string { - return "sys_job" -} - -func (e *SysJob) Generate() models.ActiveRecord { - o := *e - return &o -} - -func (e *SysJob) GetId() interface{} { - return e.JobId -} - -func (e *SysJob) SetCreateBy(createBy uint) { - e.CreateBy = strconv.Itoa(int(createBy)) -} - -func (e *SysJob) SetUpdateBy(updateBy uint) { - e.UpdateBy = strconv.Itoa(int(updateBy)) -} - -// 创建SysJob -func (e *SysJob) Create() (err error) { - return orm.Eloquent.Table(e.TableName()).Create(e).Error -} - -// 获取SysJob -func (e *SysJob) Get(id interface{}) (err error) { - return orm.Eloquent.Table(e.TableName()).First(e, id).Error -} - -// 获取SysJob带分页 -func (e *SysJob) GetPage(pageSize int, pageIndex int, v interface{}, list interface{}) (int, error) { - table := orm.Eloquent.Table(e.TableName()).Scopes(dto.MakeCondition(v)) - - // 数据权限控制(如果不需要数据权限请将此处去掉) - //dataPermission := new(DataPermission) - userid, _ := tools.StringToInt(e.DataScope) - - var count int64 - - if err := table.Scopes(DataScopes(e.TableName(), userid), dto.Paginate(pageSize, pageIndex)).Find(list).Offset(-1).Limit(-1).Count(&count).Error; err != nil { - return 0, err - } - return int(count), nil -} - -func (e *SysJob) GetList(list interface{}) (err error) { - return orm.Eloquent.Table(e.TableName()).Where("status = ?", 2).Find(list).Error -} - -// 更新SysJob -func (e *SysJob) Update(id interface{}) (err error) { - return orm.Eloquent.Table(e.TableName()).Where(id).Updates(&e).Error -} - -func (e *SysJob) RemoveAllEntryID() (update SysJob, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("entry_id > ?", 0).Update("entry_id", 0).Error; err != nil { - return - } - return -} - -func (e *SysJob) RemoveEntryID(entryID int) (update SysJob, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("entry_id = ?", entryID).Updates(map[string]interface{}{"entry_id": 0}).Error; err != nil { - return - } - return -} - -// 删除SysJob -func (e *SysJob) Delete(id int) (success bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where(id).Delete(&SysJob{}).Error; err != nil { - success = false - return - } - success = true - return -} - -//批量删除 -func (e *SysJob) BatchDelete(id []int) error { - return orm.Eloquent.Table(e.TableName()).Where(id).Delete(&SysJob{}).Error -} diff --git a/app/admin/models/system.go b/app/admin/models/system.go index ec94125f..05dd1e7a 100644 --- a/app/admin/models/system.go +++ b/app/admin/models/system.go @@ -1,39 +1,44 @@ package models import ( - orm "go-admin/common/global" + "go-admin/common/models" ) type SysSetting struct { SettingsId int `json:"settings_id" gorm:"primary_key;AUTO_INCREMENT"` Name string `json:"name" gorm:"type:varchar(256);"` Logo string `json:"logo" gorm:"type:varchar(256);"` - BaseModel + models.ModelTime } func (SysSetting) TableName() string { return "sys_setting" } -//查询 -func (s *SysSetting) Get() (create SysSetting, err error) { - result := orm.Eloquent.Table("sys_setting").First(&create) - if result.Error != nil { - err = result.Error - return - } - return create, nil +func (s *SysSetting) GetId() interface{} { + return s.SettingsId } +//查询 +//func (s *SysSetting) Get() (create SysSetting, err error) { +// result := orm.Eloquent.Table("sys_setting").First(&create) +// if result.Error != nil { +// err = result.Error +// return +// } +// return create, nil +//} + //修改 -func (s *SysSetting) Update() (update SysSetting, err error) { - if err = orm.Eloquent.Table("sys_setting").Model(&update).Updates(&s).Error; err != nil { - return - } - return -} +//func (s *SysSetting) Update() (update SysSetting, err error) { +// if err = orm.Eloquent.Table("sys_setting").Model(&update).Where("settings_id = ?", s.SettingsId).Updates(&s).Error; err != nil { +// return +// } +// return +//} type ResponseSystemConfig struct { - Name string `json:"name" binding:"required"` // 名称 - Logo string `json:"logo" binding:"required"` // 头像 + Name string `json:"name" binding:"required"` // 名称 + Logo string `json:"logo" binding:"required"` // 头像 + SettingsId int `json:"settings_id" binding:"required"` // 头像 } diff --git a/app/admin/models/system/casbin_rule.go b/app/admin/models/system/casbin_rule.go new file mode 100644 index 00000000..75634203 --- /dev/null +++ b/app/admin/models/system/casbin_rule.go @@ -0,0 +1,16 @@ +package system + +//sys_casbin_rule +type CasbinRule struct { + PType string `json:"p_type" gorm:"size:100;"` + V0 string `json:"v0" gorm:"size:100;"` + V1 string `json:"v1" gorm:"size:100;"` + V2 string `json:"v2" gorm:"size:100;"` + V3 string `json:"v3" gorm:"size:100;"` + V4 string `json:"v4" gorm:"size:100;"` + V5 string `json:"v5" gorm:"size:100;"` +} + +func (CasbinRule) TableName() string { + return "sys_casbin_rule" +} diff --git a/app/admin/models/system/datascope.go b/app/admin/models/system/datascope.go new file mode 100644 index 00000000..a95acfdb --- /dev/null +++ b/app/admin/models/system/datascope.go @@ -0,0 +1,81 @@ +package system + +import ( + "errors" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + "gorm.io/gorm" + + log "github.com/go-admin-team/go-admin-core/logger" + "github.com/go-admin-team/go-admin-core/sdk/config" +) + +type DataPermission struct { + DataScope string + UserId int + DeptId int + RoleId int +} + +func (e *DataPermission) GetDataScope(tableName string, db *gorm.DB) (*gorm.DB, error) { + + if !config.ApplicationConfig.EnableDP { + usageStr := `数据权限已经为您` + pkg.Green(`关闭`) + `,如需开启请参考配置文件字段说明` + log.Debug("%s\n", usageStr) + return db, nil + } + user := new(SysUser) + role := new(SysRole) + err := db.Find(user, e.UserId).Error + if err != nil { + return nil, errors.New("获取用户数据出错 msg:" + err.Error()) + } + err = db.Find(role, user.RoleId).Error + if err != nil { + return nil, errors.New("获取用户数据出错 msg:" + err.Error()) + } + if role.DataScope == "2" { + db = db.Where(tableName+".create_by in (select sys_user.user_id from sys_role_dept left join sys_user on sys_user.dept_id=sys_role_dept.dept_id where sys_role_dept.role_id = ?)", user.RoleId) + } + if role.DataScope == "3" { + db = db.Where(tableName+".create_by in (SELECT user_id from sys_user where dept_id = ? )", user.DeptId) + } + if role.DataScope == "4" { + db = db.Where(tableName+".create_by in (SELECT user_id from sys_user where sys_user.dept_id in(select dept_id from sys_dept where dept_path like ? ))", "%"+pkg.IntToString(user.DeptId)+"%") + } + if role.DataScope == "5" || role.DataScope == "" { + db = db.Where(tableName+".create_by = ?", e.UserId) + } + + return db, nil +} + +func DataScopes(tableName string, userId int) func(db *gorm.DB) *gorm.DB { + return func(db *gorm.DB) *gorm.DB { + user := new(SysUser) + role := new(SysRole) + user.UserId = userId + err := db.Find(user, userId).Error + if err != nil { + db.Error = errors.New("获取用户数据出错 msg:" + err.Error()) + return db + } + err = db.Find(role, user.RoleId).Error + if err != nil { + db.Error = errors.New("获取用户数据出错 msg:" + err.Error()) + return db + } + if role.DataScope == "2" { + return db.Where(tableName+".create_by in (select sys_user.user_id from sys_role_dept left join sys_user on sys_user.dept_id=sys_role_dept.dept_id where sys_role_dept.role_id = ?)", user.RoleId) + } + if role.DataScope == "3" { + return db.Where(tableName+".create_by in (SELECT user_id from sys_user where dept_id = ? )", user.DeptId) + } + if role.DataScope == "4" { + return db.Where(tableName+".create_by in (SELECT user_id from sys_user where sys_user.dept_id in(select dept_id from sys_dept where dept_path like ? ))", "%"+pkg.IntToString(user.DeptId)+"%") + } + if role.DataScope == "5" || role.DataScope == "" { + return db.Where(tableName+".create_by = ?", userId) + } + return db + } +} diff --git a/app/admin/models/system/role_dept.go b/app/admin/models/system/role_dept.go new file mode 100644 index 00000000..526f42e7 --- /dev/null +++ b/app/admin/models/system/role_dept.go @@ -0,0 +1,11 @@ +package system + +//sys_role_dept +type SysRoleDept struct { + RoleId int `gorm:"size:11;primaryKey"` + DeptId int `gorm:"size:11;primaryKey"` +} + +func (SysRoleDept) TableName() string { + return "sys_role_dept" +} diff --git a/app/admin/models/system/role_menu.go b/app/admin/models/system/role_menu.go new file mode 100644 index 00000000..ed0f0338 --- /dev/null +++ b/app/admin/models/system/role_menu.go @@ -0,0 +1,172 @@ +package system + +import ( + "fmt" + + "github.com/casbin/casbin/v2" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + "gorm.io/gorm" + + "go-admin/common/models" +) + +type RoleMenu struct { + RoleId int `gorm:""` + MenuId int `gorm:""` + RoleName string `gorm:"size:128"` + models.ControlBy +} + +func (RoleMenu) TableName() string { + return "sys_role_menu" +} + +type MenuPath struct { + Path string `json:"path"` +} + +func (rm *RoleMenu) Get(tx *gorm.DB) ([]RoleMenu, error) { + var r []RoleMenu + table := tx.Table("sys_role_menu") + if rm.RoleId != 0 { + table = table.Where("role_id = ?", rm.RoleId) + + } + if err := table.Find(&r).Error; err != nil { + return nil, err + } + return r, nil +} + +func (rm *RoleMenu) GetPermis(tx *gorm.DB) ([]string, error) { + var r []SysMenu + table := tx.Select("sys_menu.permission").Table("sys_menu").Joins("left join sys_role_menu on sys_menu.menu_id = sys_role_menu.menu_id") + + table = table.Where("role_id = ?", rm.RoleId) + + table = table.Where("sys_menu.menu_type in('F','C')") + if err := table.Find(&r).Error; err != nil { + return nil, err + } + var list []string + for i := 0; i < len(r); i++ { + list = append(list, r[i].Permission) + } + return list, nil +} + +func (rm *RoleMenu) GetIDS(tx *gorm.DB) ([]MenuPath, error) { + var r []MenuPath + table := tx.Select("sys_menu.path").Table("sys_role_menu") + table = table.Joins("left join sys_role on sys_role.role_id=sys_role_menu.role_id") + table = table.Joins("left join sys_menu on sys_menu.id=sys_role_menu.menu_id") + table = table.Where("sys_role.role_name = ? and sys_menu.type=1", rm.RoleName) + if err := table.Find(&r).Error; err != nil { + return nil, err + } + return r, nil +} + +func (rm *RoleMenu) DeleteRoleMenu(tx *gorm.DB, roleId int) error { + if err := tx.Table("sys_role_dept").Where("role_id = ?", roleId).Delete(&rm).Error; err != nil { + return err + } + if err := tx.Table("sys_role_menu").Where("role_id = ?", roleId).Delete(&rm).Error; err != nil { + return err + } + var role SysRole + if err := tx.Table("sys_role").Where("role_id = ?", roleId).First(&role).Error; err != nil { + return err + } + sql3 := "delete from sys_casbin_rule where v0= '" + role.RoleKey + "';" + if err := tx.Exec(sql3).Error; err != nil { + return err + } + return nil + +} + +// 该方法即将弃用 +func (rm *RoleMenu) BatchDeleteRoleMenu(tx *gorm.DB, roleIds []int) error { + if err := tx.Table("sys_role_menu").Where("role_id in (?)", roleIds).Delete(&rm).Error; err != nil { + return err + } + var role []SysRole + if err := tx.Table("sys_role").Where("role_id in (?)", roleIds).Find(&role).Error; err != nil { + return err + } + sql := "" + for i := 0; i < len(role); i++ { + sql += "delete from sys_casbin_rule where v0= '" + role[i].RoleName + "';" + } + if err := tx.Exec(sql).Error; err != nil { + return err + } + if err := tx.Commit().Error; err != nil { + return err + } + return nil + +} + +func (rm *RoleMenu) Insert(tx *gorm.DB, enforcer *casbin.SyncedEnforcer, roleId int, menuId []int) error { + var err error + var ( + role SysRole + menu []SysMenu + casbinRules []CasbinRule // casbinRule 待插入队列 + ) + // 在事务中做一些数据库操作(从这一点使用'tx',而不是'db') + if err = tx.Table("sys_role").Where("role_id = ?", roleId).First(&role).Error; err != nil { + return err + } + if err = tx.Table("sys_menu").Where("menu_id in (?)", menuId).Find(&menu).Error; err != nil { + return err + } + //ORM不支持批量插入所以需要拼接 sql 串 + sysRoleMenuSql := "INSERT INTO `sys_role_menu` (`role_id`,`menu_id`,`role_name`) VALUES " + + for i, m := range menu { + // 拼装'role_menu'表批量插入SQL语句 + sysRoleMenuSql += fmt.Sprintf("(%d,%d,'%s')", role.RoleId, m.MenuId, role.RoleKey) + if i == len(menu)-1 { + sysRoleMenuSql += ";" //最后一条数据 以分号结尾 + } else { + sysRoleMenuSql += "," + } + if m.MenuType == "A" { + // 加入队列 + casbinRules = append(casbinRules, + CasbinRule{ + V0: role.RoleKey, + V1: m.Path, + V2: m.Action, + }) + } + } + // 执行批量插入sys_role_menu + if err = tx.Exec(sysRoleMenuSql).Error; err != nil { + return err + } + + // 执行批量插入sys_casbin_rule + if len(casbinRules) > 0 { + if err = tx.Create(&casbinRules).Error; err != nil { + return err + } + } + return nil +} + +func (rm *RoleMenu) Delete(tx *gorm.DB, RoleId string, MenuID string) (bool, error) { + rm.RoleId, _ = pkg.StringToInt(RoleId) + table := tx.Table("sys_role_menu").Where("role_id = ?", RoleId) + if MenuID != "" { + table = table.Where("menu_id = ?", MenuID) + } + if err := table.Delete(&rm).Error; err != nil { + return false, err + } + return true, nil + +} diff --git a/app/admin/models/system/sys_config.go b/app/admin/models/system/sys_config.go new file mode 100644 index 00000000..0075b5e2 --- /dev/null +++ b/app/admin/models/system/sys_config.go @@ -0,0 +1,30 @@ +package system + +import ( + "go-admin/common/models" +) + +type SysConfig struct { + models.Model + ConfigName string `json:"configName" gorm:"type:varchar(128);comment:ConfigName"` // + ConfigKey string `json:"configKey" gorm:"type:varchar(128);comment:ConfigKey"` // + ConfigValue string `json:"configValue" gorm:"type:varchar(255);comment:ConfigValue"` // + ConfigType string `json:"configType" gorm:"type:varchar(64);comment:ConfigType"` + IsFrontend int `json:"isFrontend" gorm:"type:varchar(64);comment:是否前台"` // + Remark string `json:"remark" gorm:"type:varchar(128);comment:Remark"` // + models.ControlBy + models.ModelTime +} + +func (SysConfig) TableName() string { + return "sys_config" +} + +func (e *SysConfig) Generate() models.ActiveRecord { + o := *e + return &o +} + +func (e *SysConfig) GetId() interface{} { + return e.Id +} diff --git a/app/admin/models/system/sys_dept.go b/app/admin/models/system/sys_dept.go new file mode 100644 index 00000000..d076031a --- /dev/null +++ b/app/admin/models/system/sys_dept.go @@ -0,0 +1,33 @@ +package system + +import "go-admin/common/models" + +type SysDept struct { + DeptId int `json:"deptId" gorm:"primaryKey;autoIncrement;"` //部门编码 + ParentId int `json:"parentId" gorm:""` //上级部门 + DeptPath string `json:"deptPath" gorm:"size:255;"` // + DeptName string `json:"deptName" gorm:"size:128;"` //部门名称 + Sort int `json:"sort" gorm:""` //排序 + Leader string `json:"leader" gorm:"size:128;"` //负责人 + Phone string `json:"phone" gorm:"size:11;"` //手机 + Email string `json:"email" gorm:"size:64;"` //邮箱 + Status string `json:"status" gorm:"size:4;"` //状态 + models.ControlBy + models.ModelTime + DataScope string `json:"dataScope" gorm:"-"` + Params string `json:"params" gorm:"-"` + Children []SysDept `json:"children" gorm:"-"` +} + +func (SysDept) TableName() string { + return "sys_dept" +} + +func (e *SysDept) Generate() models.ActiveRecord { + o := *e + return &o +} + +func (e *SysDept) GetId() interface{} { + return e.DeptId +} diff --git a/app/admin/models/system/sys_dict_data.go b/app/admin/models/system/sys_dict_data.go new file mode 100644 index 00000000..f2f20e9b --- /dev/null +++ b/app/admin/models/system/sys_dict_data.go @@ -0,0 +1,35 @@ +package system + +import ( + "go-admin/common/models" +) + +type SysDictData struct { + models.ControlBy + models.ModelTime + + DictCode int `json:"dictCode" gorm:"primaryKey;column:dict_code;autoIncrement;comment:主键编码"` + DictSort int `json:"dictSort" gorm:"type:bigint(20);comment:DictSort"` + DictLabel string `json:"dictLabel" gorm:"type:varchar(128);comment:DictLabel"` + DictValue string `json:"dictValue" gorm:"type:varchar(255);comment:DictValue"` + DictType string `json:"dictType" gorm:"type:varchar(64);comment:DictType"` + CssClass string `json:"cssClass" gorm:"type:varchar(128);comment:CssClass"` + ListClass string `json:"listClass" gorm:"type:varchar(128);comment:ListClass"` + IsDefault string `json:"isDefault" gorm:"type:varchar(8);comment:IsDefault"` + Status string `json:"status" gorm:"type:varchar(4);comment:Status"` + Default string `json:"default" gorm:"type:varchar(8);comment:Default"` + Remark string `json:"remark" gorm:"type:varchar(255);comment:Remark"` +} + +func (SysDictData) TableName() string { + return "sys_dict_data" +} + +func (e *SysDictData) Generate() models.ActiveRecord { + o := *e + return &o +} + +func (e *SysDictData) GetId() interface{} { + return e.DictCode +} diff --git a/app/admin/models/system/sys_dict_type.go b/app/admin/models/system/sys_dict_type.go new file mode 100644 index 00000000..dfc053d6 --- /dev/null +++ b/app/admin/models/system/sys_dict_type.go @@ -0,0 +1,29 @@ +package system + +import ( + "go-admin/common/models" +) + +type SysDictType struct { + models.ControlBy + models.ModelTime + + ID int `json:"id" gorm:"primaryKey;column:dict_id;autoIncrement;comment:主键编码"` + DictName string `json:"dictName" gorm:"type:varchar(128);comment:DictName"` + DictType string `json:"dictType" gorm:"type:varchar(128);comment:DictType"` + Status string `json:"status" gorm:"type:varchar(4);comment:Status"` + Remark string `json:"remark" gorm:"type:varchar(255);comment:Remark"` +} + +func (SysDictType) TableName() string { + return "sys_dict_type" +} + +func (e *SysDictType) Generate() models.ActiveRecord { + o := *e + return &o +} + +func (e *SysDictType) GetId() interface{} { + return e.ID +} diff --git a/app/admin/models/system/sys_login_log.go b/app/admin/models/system/sys_login_log.go new file mode 100644 index 00000000..626428aa --- /dev/null +++ b/app/admin/models/system/sys_login_log.go @@ -0,0 +1,72 @@ +package system + +import ( + "encoding/json" + "errors" + "time" + + log "github.com/go-admin-team/go-admin-core/logger" + "github.com/go-admin-team/go-admin-core/sdk" + "github.com/go-admin-team/go-admin-core/storage" + + "go-admin/common/models" +) + +type SysLoginLog struct { + models.Model + Username string `json:"username" gorm:"type:varchar(128);comment:用户名"` + Status string `json:"status" gorm:"type:varchar(4);comment:状态"` + Ipaddr string `json:"ipaddr" gorm:"type:varchar(255);comment:ip地址"` + LoginLocation string `json:"loginLocation" gorm:"type:varchar(255);comment:归属地"` + Browser string `json:"browser" gorm:"type:varchar(255);comment:浏览器"` + Os string `json:"os" gorm:"type:varchar(255);comment:系统"` + Platform string `json:"platform" gorm:"type:varchar(255);comment:固件"` + LoginTime time.Time `json:"loginTime" gorm:"type:timestamp;comment:登录时间"` + Remark string `json:"remark" gorm:"type:varchar(255);comment:备注"` + Msg string `json:"msg" gorm:"type:varchar(255);comment:信息"` + CreatedAt time.Time `json:"createdAt" gorm:"comment:创建时间"` + UpdatedAt time.Time `json:"updatedAt" gorm:"comment:最后更新时间"` + models.ControlBy +} + +func (SysLoginLog) TableName() string { + return "sys_login_log" +} + +func (e *SysLoginLog) Generate() models.ActiveRecord { + o := *e + return &o +} + +func (e *SysLoginLog) GetId() interface{} { + return e.Id +} + +// SaveLoginLog 从队列中获取登录日志 +func SaveLoginLog(message storage.Messager) (err error) { + //准备db + db := sdk.Runtime.GetDbByKey(message.GetPrefix()) + if db == nil { + err = errors.New("db not exist") + log.Errorf("host[%s]'s %s", message.GetPrefix(), err.Error()) + return err + } + var rb []byte + rb, err = json.Marshal(message.GetValues()) + if err != nil { + log.Errorf("json Marshal error, %s", err.Error()) + return err + } + var l SysLoginLog + err = json.Unmarshal(rb, &l) + if err != nil { + log.Errorf("json Unmarshal error, %s", err.Error()) + return err + } + err = db.Create(&l).Error + if err != nil { + log.Errorf("db create error, %s", err.Error()) + return err + } + return nil +} diff --git a/app/admin/models/system/sys_menu.go b/app/admin/models/system/sys_menu.go new file mode 100644 index 00000000..dbcf8035 --- /dev/null +++ b/app/admin/models/system/sys_menu.go @@ -0,0 +1,64 @@ +package system + +import "go-admin/common/models" + +type SysMenu struct { + MenuId int `json:"menuId" gorm:"primaryKey;autoIncrement"` + MenuName string `json:"menuName" gorm:"size:128;"` + Title string `json:"title" gorm:"size:128;"` + Icon string `json:"icon" gorm:"size:128;"` + Path string `json:"path" gorm:"size:128;"` + Paths string `json:"paths" gorm:"size:128;"` + MenuType string `json:"menuType" gorm:"size:1;"` + Action string `json:"action" gorm:"size:16;"` + Permission string `json:"permission" gorm:"size:255;"` + ParentId int `json:"parentId" gorm:"size:11;"` + NoCache bool `json:"noCache" gorm:"size:8;"` + Breadcrumb string `json:"breadcrumb" gorm:"size:255;"` + Component string `json:"component" gorm:"size:255;"` + Sort int `json:"sort" gorm:"size:4;"` + Visible string `json:"visible" gorm:"size:1;"` + IsFrame string `json:"isFrame" gorm:"size:1;DEFAULT:0;"` + DataScope string `json:"dataScope" gorm:"-"` + Params string `json:"params" gorm:"-"` + RoleId int `gorm:"-"` + Children []SysMenu `json:"children" gorm:"-"` + IsSelect bool `json:"is_select" gorm:"-"` + models.ControlBy + models.ModelTime +} + +type SysMenus struct { + MenuId int `json:"menuId" gorm:"column:menu_id;primaryKey;autoIncrement;"` + MenuName string `json:"menuName" gorm:"column:menu_name"` + Title string `json:"title" gorm:"column:title"` + Icon string `json:"icon" gorm:"column:icon"` + Path string `json:"path" gorm:"column:path"` + MenuType string `json:"menuType" gorm:"column:menu_type"` + Action string `json:"action" gorm:"column:action"` + Permission string `json:"permission" gorm:"column:permission"` + ParentId int `json:"parentId" gorm:"column:parent_id"` + NoCache bool `json:"noCache" gorm:"column:no_cache"` + Breadcrumb string `json:"breadcrumb" gorm:"column:breadcrumb"` + Component string `json:"component" gorm:"column:component"` + Sort int `json:"sort" gorm:"column:sort"` + Visible string `json:"visible" gorm:"column:visible"` + Children []SysMenu `json:"children" gorm:"-"` + models.ControlBy + models.ModelTime + DataScope string `json:"dataScope" gorm:"-"` + Params string `json:"params" gorm:"-"` +} + +func (SysMenu) TableName() string { + return "sys_menu" +} + +func (e *SysMenu) Generate() models.ActiveRecord { + o := *e + return &o +} + +func (e *SysMenu) GetId() interface{} { + return e.MenuId +} diff --git a/app/admin/models/system/sys_opera_log.go b/app/admin/models/system/sys_opera_log.go new file mode 100644 index 00000000..b8a83ebe --- /dev/null +++ b/app/admin/models/system/sys_opera_log.go @@ -0,0 +1,85 @@ +package system + +import ( + "encoding/json" + "errors" + "time" + + log "github.com/go-admin-team/go-admin-core/logger" + "github.com/go-admin-team/go-admin-core/sdk" + "github.com/go-admin-team/go-admin-core/storage" + + "go-admin/common/models" +) + +type SysOperaLog struct { + models.Model + Title string `json:"title" gorm:"type:varchar(255);comment:操作模块"` + BusinessType string `json:"businessType" gorm:"type:varchar(128);comment:操作类型"` + BusinessTypes string `json:"businessTypes" gorm:"type:varchar(128);comment:BusinessTypes"` + Method string `json:"method" gorm:"type:varchar(128);comment:函数"` + RequestMethod string `json:"requestMethod" gorm:"type:varchar(128);comment:请求方式"` + OperatorType string `json:"operatorType" gorm:"type:varchar(128);comment:操作类型"` + OperName string `json:"operName" gorm:"type:varchar(128);comment:操作者"` + DeptName string `json:"deptName" gorm:"type:varchar(128);comment:部门名称"` + OperUrl string `json:"operUrl" gorm:"type:varchar(255);comment:访问地址"` + OperIp string `json:"operIp" gorm:"type:varchar(128);comment:客户端ip"` + OperLocation string `json:"operLocation" gorm:"type:varchar(128);comment:访问位置"` + OperParam string `json:"operParam" gorm:"type:varchar(255);comment:请求参数"` + Status string `json:"status" gorm:"type:varchar(4);comment:操作状态"` + OperTime time.Time `json:"operTime" gorm:"type:timestamp;comment:操作时间"` + JsonResult string `json:"jsonResult" gorm:"type:varchar(255);comment:返回数据"` + Remark string `json:"remark" gorm:"type:varchar(255);comment:备注"` + LatencyTime string `json:"latencyTime" gorm:"type:varchar(128);comment:耗时"` + UserAgent string `json:"userAgent" gorm:"type:varchar(255);comment:ua"` + CreatedAt time.Time `json:"createdAt" gorm:"comment:创建时间"` + UpdatedAt time.Time `json:"updatedAt" gorm:"comment:最后更新时间"` + models.ControlBy +} + +func (SysOperaLog) TableName() string { + return "sys_opera_log" +} + +func (e *SysOperaLog) Generate() models.ActiveRecord { + o := *e + return &o +} + +func (e *SysOperaLog) GetId() interface{} { + return e.Id +} + +// SaveOperaLog 从队列中获取操作日志 +func SaveOperaLog(message storage.Messager) (err error) { + //准备db + db := sdk.Runtime.GetDbByKey(message.GetPrefix()) + if db == nil { + err = errors.New("db not exist") + log.Errorf("host[%s]'s %s", message.GetPrefix(), err.Error()) + return err + } + var rb []byte + rb, err = json.Marshal(message.GetValues()) + if err != nil { + log.Errorf("json Marshal error, %s", err.Error()) + return err + } + var l SysOperaLog + err = json.Unmarshal(rb, &l) + if err != nil { + log.Errorf("json Unmarshal error, %s", err.Error()) + return err + } + if l.Title == "" { + m := &SysMenu{} + db.Model(m).Select("Title").Where("action = ?", l.Method).Where("path = ?", message.GetValues()["_fullPath"]).First(m) + l.Title = m.Title + } + err = db.Create(&l).Error + if err != nil { + log.Errorf("db create error, %s", err.Error()) + return err + } + return nil +} diff --git a/app/admin/models/system/sys_post.go b/app/admin/models/system/sys_post.go new file mode 100644 index 00000000..a2dc3cd9 --- /dev/null +++ b/app/admin/models/system/sys_post.go @@ -0,0 +1,30 @@ +package system + +import "go-admin/common/models" + +type SysPost struct { + PostId int `gorm:"primaryKey;autoIncrement" json:"postId"` //岗位编号 + PostName string `gorm:"size:128;" json:"postName"` //岗位名称 + PostCode string `gorm:"size:128;" json:"postCode"` //岗位代码 + Sort int `gorm:"" json:"sort"` //岗位排序 + Status int `gorm:"size:4;" json:"status"` //状态 + Remark string `gorm:"size:255;" json:"remark"` //描述 + models.ControlBy + models.ModelTime + + DataScope string `gorm:"-" json:"dataScope"` + Params string `gorm:"-" json:"params"` +} + +func (SysPost) TableName() string { + return "sys_post" +} + +func (e *SysPost) Generate() models.ActiveRecord { + o := *e + return &o +} + +func (e *SysPost) GetId() interface{} { + return e.PostId +} diff --git a/app/admin/models/system/sys_role.go b/app/admin/models/system/sys_role.go new file mode 100644 index 00000000..3def8e1c --- /dev/null +++ b/app/admin/models/system/sys_role.go @@ -0,0 +1,33 @@ +package system + +import "go-admin/common/models" + +type SysRole struct { + RoleId int `json:"roleId" gorm:"primaryKey;autoIncrement"` // 角色编码 + RoleName string `json:"roleName" gorm:"size:128;"` // 角色名称 + Status string `json:"status" gorm:"size:4;"` // + RoleKey string `json:"roleKey" gorm:"size:128;"` //角色代码 + RoleSort int `json:"roleSort" gorm:""` //角色排序 + Flag string `json:"flag" gorm:"size:128;"` // + Remark string `json:"remark" gorm:"size:255;"` //备注 + Admin bool `json:"admin" gorm:"size:4;"` + DataScope string `json:"dataScope" gorm:"size:128;"` + Params string `json:"params" gorm:"-"` + MenuIds []int `json:"menuIds" gorm:"-"` + DeptIds []int `json:"deptIds" gorm:"-"` + models.ControlBy + models.ModelTime +} + +func (SysRole) TableName() string { + return "sys_role" +} + +func (e *SysRole) Generate() models.ActiveRecord { + o := *e + return &o +} + +func (e *SysRole) GetId() interface{} { + return e.RoleId +} diff --git a/app/admin/models/system/sys_user.go b/app/admin/models/system/sys_user.go new file mode 100644 index 00000000..f866bdeb --- /dev/null +++ b/app/admin/models/system/sys_user.go @@ -0,0 +1,77 @@ +package system + +import ( + "go-admin/common/models" + "golang.org/x/crypto/bcrypt" + "gorm.io/gorm" +) + +type SysUser struct { + models.ControlBy + models.ModelTime + UserId int `gorm:"primaryKey;autoIncrement;comment:编码" json:"userId"` + Username string `json:"username" gorm:"type:varchar(64);comment:用户名"` + Password string `json:"-" gorm:"type:varchar(128);comment:密码"` + NickName string `json:"nickName" gorm:"type:varchar(128);comment:昵称"` + Phone string `json:"phone" gorm:"type:varchar(11);comment:手机号"` + RoleId int `json:"roleId" gorm:"type:bigint(20);comment:角色ID"` + Salt string `json:"-" gorm:"type:varchar(255);comment:加盐"` + Avatar string `json:"avatar" gorm:"type:varchar(255);comment:头像"` + Sex string `json:"sex" gorm:"type:varchar(255);comment:性别"` + Email string `json:"email" gorm:"type:varchar(128);comment:邮箱"` + DeptId int `json:"deptId" gorm:"type:bigint(20);comment:部门"` + PostId int `json:"postId" gorm:"type:bigint(20);comment:岗位"` + Remark string `json:"remark" gorm:"type:varchar(255);comment:备注"` + Status string `json:"status" gorm:"type:varchar(4);comment:状态"` + DeptIds []int `json:"deptIds" gorm:"-"` + PostIds []int `json:"postIds" gorm:"-"` + RoleIds []int `json:"roleIds" gorm:"-"` + Dept *SysDept `json:"dept"` +} + +func (SysUser) TableName() string { + return "sys_user" +} + +func (e *SysUser) Generate() models.ActiveRecord { + o := *e + return &o +} + +func (e *SysUser) GetId() interface{} { + return e.UserId +} + +//加密 +func (e *SysUser) Encrypt() (err error) { + if e.Password == "" { + return + } + + var hash []byte + if hash, err = bcrypt.GenerateFromPassword([]byte(e.Password), bcrypt.DefaultCost); err != nil { + return + } else { + e.Password = string(hash) + return + } +} + +func (e *SysUser) BeforeCreate(_ *gorm.DB) error { + return e.Encrypt() +} + +func (e *SysUser) BeforeUpdate(_ *gorm.DB) error { + var err error + if e.Password != "" { + err = e.Encrypt() + } + return err +} + +func (e *SysUser) AfterFind(_ *gorm.DB) error { + e.DeptIds = []int{e.DeptId} + e.PostIds = []int{e.PostId} + e.RoleIds = []int{e.RoleId} + return nil +} diff --git a/app/admin/models/sysuser.go b/app/admin/models/sysuser.go deleted file mode 100644 index fa5db4f7..00000000 --- a/app/admin/models/sysuser.go +++ /dev/null @@ -1,322 +0,0 @@ -package models - -import ( - "errors" - "gorm.io/gorm" - "log" - "strings" - - "golang.org/x/crypto/bcrypt" - - orm "go-admin/common/global" - "go-admin/tools" -) - -// User -type User struct { - // key - IdentityKey string - // 用户名 - UserName string - FirstName string - LastName string - // 角色 - Role string -} - -type UserName struct { - Username string `gorm:"size:64" json:"username"` -} - -type PassWord struct { - // 密码 - Password string `gorm:"size:128" json:"password"` -} - -type LoginM struct { - UserName - PassWord -} - -type SysUserId struct { - UserId int `gorm:"primary_key;AUTO_INCREMENT" json:"userId"` // 编码 -} - -type SysUserB struct { - NickName string `gorm:"size:128" json:"nickName"` // 昵称 - Phone string `gorm:"size:11" json:"phone"` // 手机号 - RoleId int `gorm:"" json:"roleId"` // 角色编码 - Salt string `gorm:"size:255" json:"salt"` //盐 - Avatar string `gorm:"size:255" json:"avatar"` //头像 - Sex string `gorm:"size:255" json:"sex"` //性别 - Email string `gorm:"size:128" json:"email"` //邮箱 - DeptId int `gorm:"" json:"deptId"` //部门编码 - PostId int `gorm:"" json:"postId"` //职位编码 - CreateBy string `gorm:"size:128" json:"createBy"` // - UpdateBy string `gorm:"size:128" json:"updateBy"` // - Remark string `gorm:"size:255" json:"remark"` //备注 - Status string `gorm:"size:4;" json:"status"` - BaseModel - - DataScope string `gorm:"-" json:"dataScope"` - Params string `gorm:"-" json:"params"` -} - -type SysUser struct { - SysUserId - LoginM - SysUserB -} - -func (SysUser) TableName() string { - return "sys_user" -} - -type SysUserPwd struct { - OldPassword string `json:"oldPassword"` - NewPassword string `json:"newPassword"` -} - -type SysUserPage struct { - SysUserId - SysUserB - LoginM - DeptName string `gorm:"-" json:"deptName"` -} - -type SysUserView struct { - SysUserId - SysUserB - LoginM - RoleName string `gorm:"column:role_name" json:"role_name"` -} - -// 获取用户数据 -func (e *SysUser) Get() (SysUserView SysUserView, err error) { - - table := orm.Eloquent.Table(e.TableName()).Select([]string{"sys_user.*", "sys_role.role_name"}) - table = table.Joins("left join sys_role on sys_user.role_id=sys_role.role_id") - if e.UserId != 0 { - table = table.Where("user_id = ?", e.UserId) - } - - if e.Username != "" { - table = table.Where("username = ?", e.Username) - } - - if e.Password != "" { - table = table.Where("password = ?", e.Password) - } - - if e.RoleId != 0 { - table = table.Where("role_id = ?", e.RoleId) - } - - if e.DeptId != 0 { - table = table.Where("dept_id = ?", e.DeptId) - } - - if e.PostId != 0 { - table = table.Where("post_id = ?", e.PostId) - } - - if err = table.First(&SysUserView).Error; err != nil { - return - } - - SysUserView.Password = "" - return -} - -func (e *SysUser) GetUserInfo() (SysUserView SysUserView, err error) { - - table := orm.Eloquent.Table(e.TableName()).Select([]string{"sys_user.*", "sys_role.role_name"}) - table = table.Joins("left join sys_role on sys_user.role_id=sys_role.role_id") - if e.UserId != 0 { - table = table.Where("user_id = ?", e.UserId) - } - - if e.Username != "" { - table = table.Where("username = ?", e.Username) - } - - if e.Password != "" { - table = table.Where("password = ?", e.Password) - } - - if e.RoleId != 0 { - table = table.Where("role_id = ?", e.RoleId) - } - - if e.DeptId != 0 { - table = table.Where("dept_id = ?", e.DeptId) - } - - if e.PostId != 0 { - table = table.Where("post_id = ?", e.PostId) - } - - if err = table.First(&SysUserView).Error; err != nil { - return - } - return -} - -func (e *SysUser) GetList() (SysUserView []SysUserView, err error) { - - table := orm.Eloquent.Table(e.TableName()).Select([]string{"sys_user.*", "sys_role.role_name"}) - table = table.Joins("left join sys_role on sys_user.role_id=sys_role.role_id") - if e.UserId != 0 { - table = table.Where("user_id = ?", e.UserId) - } - - if e.Username != "" { - table = table.Where("username = ?", e.Username) - } - - if e.Password != "" { - table = table.Where("password = ?", e.Password) - } - - if e.RoleId != 0 { - table = table.Where("role_id = ?", e.RoleId) - } - - if e.DeptId != 0 { - table = table.Where("dept_id = ?", e.DeptId) - } - - if e.PostId != 0 { - table = table.Where("post_id = ?", e.PostId) - } - - if err = table.Find(&SysUserView).Error; err != nil { - return - } - return -} - -func (e *SysUser) GetPage(pageSize int, pageIndex int) ([]SysUserPage, int, error) { - var doc []SysUserPage - table := orm.Eloquent.Select("sys_user.*,sys_dept.dept_name").Table(e.TableName()) - table = table.Joins("left join sys_dept on sys_dept.dept_id = sys_user.dept_id") - - if e.Username != "" { - table = table.Where("username = ?", e.Username) - } - if e.Status != "" { - table = table.Where("sys_user.status = ?", e.Status) - } - - if e.Phone != "" { - table = table.Where("sys_user.phone = ?", e.Phone) - } - - if e.DeptId != 0 { - table = table.Where("sys_user.dept_id in (select dept_id from sys_dept where dept_path like ? )", "%"+tools.IntToString(e.DeptId)+"%") - } - - // 数据权限控制(如果不需要数据权限请将此处去掉) - dataPermission := new(DataPermission) - dataPermission.UserId, _ = tools.StringToInt(e.DataScope) - table, err := dataPermission.GetDataScope(e.TableName(), table) - if err != nil { - return nil, 0, err - } - var count int64 - - if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil { - return nil, 0, err - } - return doc, int(count), nil -} - -//加密 -func (e *SysUser) Encrypt() (err error) { - if e.Password == "" { - return - } - - var hash []byte - if hash, err = bcrypt.GenerateFromPassword([]byte(e.Password), bcrypt.DefaultCost); err != nil { - return - } else { - e.Password = string(hash) - return - } -} - -//添加 -func (e SysUser) Insert() (id int, err error) { - if err = e.Encrypt(); err != nil { - return - } - - // check 用户名 - var count int64 - orm.Eloquent.Table(e.TableName()).Where("username = ?", e.Username).Count(&count) - if count > 0 { - err = errors.New("账户已存在!") - return - } - - //添加数据 - if err = orm.Eloquent.Table(e.TableName()).Create(&e).Error; err != nil { - return - } - id = e.UserId - return -} - -//修改 -func (e *SysUser) Update(id int) (update SysUser, err error) { - if e.Password != "" { - if err = e.Encrypt(); err != nil { - return - } - } - if err = orm.Eloquent.Table(e.TableName()).First(&update, id).Error; err != nil { - return - } - if e.RoleId == 0 { - e.RoleId = update.RoleId - } - - //参数1:是要修改的数据 - //参数2:是修改的数据 - if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil { - return - } - return -} - -func (e *SysUser) BatchDelete(id []int) (Result bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("user_id in (?)", id).Delete(&SysUser{}).Error; err != nil { - return - } - Result = true - return -} - -func (e *SysUser) SetPwd(pwd SysUserPwd) (Result bool, err error) { - user, err := e.GetUserInfo() - if err != nil { - tools.HasError(err, "获取用户数据失败(代码202)", 500) - } - _, err = tools.CompareHashAndPassword(user.Password, pwd.OldPassword) - if err != nil { - if strings.Contains(err.Error(), "hashedPassword is not the hash of the given password") { - tools.HasError(err, "密码错误(代码202)", 500) - } - log.Print(err) - return - } - e.Password = pwd.NewPassword - _, err = e.Update(e.UserId) - tools.HasError(err, "更新密码失败(代码202)", 500) - return -} - -func (e *SysUser) GetByUserId(tx *gorm.DB, id interface{}) error { - return tx.First(e, id).Error -} diff --git a/app/admin/models/tools/dbcolumns.go b/app/admin/models/tools/dbcolumns.go index 5a01d4b7..ef41f44a 100644 --- a/app/admin/models/tools/dbcolumns.go +++ b/app/admin/models/tools/dbcolumns.go @@ -2,12 +2,11 @@ package tools import ( "errors" + "github.com/go-admin-team/go-admin-core/sdk/pkg" "gorm.io/gorm" - orm "go-admin/common/global" - "go-admin/tools" - config2 "go-admin/tools/config" + "github.com/go-admin-team/go-admin-core/sdk/config" ) type DBColumns struct { @@ -25,14 +24,14 @@ type DBColumns struct { ColumnComment string `gorm:"column:COLUMN_COMMENT" json:"columnComment"` } -func (e *DBColumns) GetPage(pageSize int, pageIndex int) ([]DBColumns, int, error) { +func (e *DBColumns) GetPage(tx *gorm.DB, pageSize int, pageIndex int) ([]DBColumns, int, error) { var doc []DBColumns var count int64 table := new(gorm.DB) - if config2.DatabaseConfig.Driver == "mysql" { - table = orm.Eloquent.Table("information_schema.`COLUMNS`") - table = table.Where("table_schema= ? ", config2.GenConfig.DBName) + if config.DatabaseConfig.Driver == "mysql" { + table = tx.Table("information_schema.`COLUMNS`") + table = table.Where("table_schema= ? ", config.GenConfig.DBName) if e.TableName != "" { return nil, 0, errors.New("table name cannot be empty!") @@ -49,7 +48,7 @@ func (e *DBColumns) GetPage(pageSize int, pageIndex int) ([]DBColumns, int, erro } -func (e *DBColumns) GetList() ([]DBColumns, error) { +func (e *DBColumns) GetList(tx *gorm.DB) ([]DBColumns, error) { var doc []DBColumns table := new(gorm.DB) @@ -57,13 +56,13 @@ func (e *DBColumns) GetList() ([]DBColumns, error) { return nil, errors.New("table name cannot be empty!") } - if config2.DatabaseConfig.Driver == "mysql" { - table = orm.Eloquent.Table("information_schema.columns") - table = table.Where("table_schema= ? ", config2.GenConfig.DBName) + if config.DatabaseConfig.Driver == "mysql" { + table = tx.Table("information_schema.columns") + table = table.Where("table_schema= ? ", config.GenConfig.DBName) table = table.Where("TABLE_NAME = ?", e.TableName).Order("ORDINAL_POSITION asc") } else { - tools.Assert(true, "目前只支持mysql数据库", 500) + pkg.Assert(true, "目前只支持mysql数据库", 500) } if err := table.Find(&doc).Error; err != nil { return doc, err diff --git a/app/admin/models/tools/dbtables.go b/app/admin/models/tools/dbtables.go index 0ef2a8d7..77c4927f 100644 --- a/app/admin/models/tools/dbtables.go +++ b/app/admin/models/tools/dbtables.go @@ -2,12 +2,11 @@ package tools import ( "errors" + "github.com/go-admin-team/go-admin-core/sdk/pkg" "gorm.io/gorm" - orm "go-admin/common/global" - "go-admin/tools" - config2 "go-admin/tools/config" + config2 "github.com/go-admin-team/go-admin-core/sdk/config" ) type DBTables struct { @@ -20,14 +19,14 @@ type DBTables struct { TableComment string `gorm:"column:TABLE_COMMENT" json:"tableComment"` } -func (e *DBTables) GetPage(pageSize int, pageIndex int) ([]DBTables, int, error) { +func (e *DBTables) GetPage(tx *gorm.DB, pageSize int, pageIndex int) ([]DBTables, int, error) { var doc []DBTables table := new(gorm.DB) var count int64 if config2.DatabaseConfig.Driver == "mysql" { - table = orm.Eloquent.Table("information_schema.tables") - table = table.Where("TABLE_NAME not in (select table_name from " + config2.GenConfig.DBName + ".sys_tables) ") + table = tx.Table("information_schema.tables") + table = table.Where("TABLE_NAME not in (select table_name from `" + config2.GenConfig.DBName + "`.sys_tables) ") table = table.Where("table_schema= ? ", config2.GenConfig.DBName) if e.TableName != "" { @@ -37,28 +36,27 @@ func (e *DBTables) GetPage(pageSize int, pageIndex int) ([]DBTables, int, error) return nil, 0, err } } else { - tools.Assert(true, "目前只支持mysql数据库", 500) + pkg.Assert(true, "目前只支持mysql数据库", 500) } //table.Count(&count) return doc, int(count), nil } -func (e *DBTables) Get() (DBTables, error) { +func (e *DBTables) Get(tx *gorm.DB) (DBTables, error) { var doc DBTables - table := new(gorm.DB) if config2.DatabaseConfig.Driver == "mysql" { - table = orm.Eloquent.Table("information_schema.tables") + table := tx.Table("information_schema.tables") table = table.Where("table_schema= ? ", config2.GenConfig.DBName) if e.TableName == "" { return doc, errors.New("table name cannot be empty!") } table = table.Where("TABLE_NAME = ?", e.TableName) + if err := table.First(&doc).Error; err != nil { + return doc, err + } } else { - tools.Assert(true, "目前只支持mysql数据库", 500) - } - if err := table.First(&doc).Error; err != nil { - return doc, err + pkg.Assert(true, "目前只支持mysql数据库", 500) } return doc, nil } diff --git a/app/admin/models/tools/syscolumns.go b/app/admin/models/tools/syscolumns.go index 9bcbd83b..c7539e01 100644 --- a/app/admin/models/tools/syscolumns.go +++ b/app/admin/models/tools/syscolumns.go @@ -2,11 +2,11 @@ package tools import ( "go-admin/app/admin/models" - orm "go-admin/common/global" + "gorm.io/gorm" ) type SysColumns struct { - ColumnId int `gorm:"primary_key;auto_increment" json:"columnId"` + ColumnId int `gorm:"primaryKey;autoIncrement" json:"columnId"` TableId int `gorm:"" json:"tableId"` ColumnName string `gorm:"size:128;" json:"columnName"` ColumnComment string `gorm:"column:column_comment;size:128;" json:"columnComment"` @@ -41,8 +41,8 @@ type SysColumns struct { FkCol []SysColumns `gorm:"-" json:"fkCol"` FkLabelId string `gorm:"" json:"fkLabelId"` FkLabelName string `gorm:"size:255;" json:"fkLabelName"` - CreateBy string `gorm:"column:create_by;size:128;" json:"createBy"` - UpdateBy string `gorm:"column:update_By;size:128;" json:"updateBy"` + CreateBy int `gorm:"column:create_by;size:20;" json:"createBy"` + UpdateBy int `gorm:"column:update_By;size:20;" json:"updateBy"` models.BaseModel } @@ -51,10 +51,10 @@ func (SysColumns) TableName() string { return "sys_columns" } -func (e *SysColumns) GetList() ([]SysColumns, error) { +func (e *SysColumns) GetList(tx *gorm.DB) ([]SysColumns, error) { var doc []SysColumns - table := orm.Eloquent.Table("sys_columns") + table := tx.Table("sys_columns") table = table.Where("table_id = ?", e.TableId) @@ -64,9 +64,10 @@ func (e *SysColumns) GetList() ([]SysColumns, error) { return doc, nil } -func (e *SysColumns) Create() (SysColumns, error) { +func (e *SysColumns) Create(tx *gorm.DB) (SysColumns, error) { var doc SysColumns - result := orm.Eloquent.Table("sys_columns").Create(&e) + e.CreateBy = 0 + result := tx.Table("sys_columns").Create(&e) if result.Error != nil { err := result.Error return doc, err @@ -75,14 +76,15 @@ func (e *SysColumns) Create() (SysColumns, error) { return doc, nil } -func (e *SysColumns) Update() (update SysColumns, err error) { - if err = orm.Eloquent.Table("sys_columns").First(&update, e.ColumnId).Error; err != nil { +func (e *SysColumns) Update(tx *gorm.DB) (update SysColumns, err error) { + if err = tx.Table("sys_columns").First(&update, e.ColumnId).Error; err != nil { return } //参数1:是要修改的数据 //参数2:是修改的数据 - if err = orm.Eloquent.Table("sys_columns").Model(&update).Updates(&e).Error; err != nil { + e.UpdateBy = 0 + if err = tx.Table("sys_columns").Model(&update).Updates(&e).Error; err != nil { return } diff --git a/app/admin/models/tools/systables.go b/app/admin/models/tools/systables.go index 4275b8bd..39c9aa5e 100644 --- a/app/admin/models/tools/systables.go +++ b/app/admin/models/tools/systables.go @@ -1,14 +1,14 @@ package tools import ( + "gorm.io/gorm" "strings" "go-admin/app/admin/models" - orm "go-admin/common/global" ) type SysTables struct { - TableId int `gorm:"primary_key;auto_increment" json:"tableId"` //表编码 + TableId int `gorm:"primaryKey;autoIncrement" json:"tableId"` //表编码 TBName string `gorm:"column:table_name;size:255;" json:"tableName"` //表名称 TableComment string `gorm:"size:255;" json:"tableComment"` //表备注 ClassName string `gorm:"size:255;" json:"className"` //类名 @@ -34,8 +34,8 @@ type SysTables struct { IsLogicalDelete string `gorm:"size:1;" json:"isLogicalDelete"` LogicalDelete bool `gorm:"size:1;" json:"logicalDelete"` LogicalDeleteColumn string `gorm:"size:128;" json:"logicalDeleteColumn"` - CreateBy string `gorm:"size:128;" json:"createBy"` - UpdateBy string `gorm:"size:128;" json:"updateBy"` + CreateBy int `gorm:"size:128;" json:"createBy"` + UpdateBy int `gorm:"size:128;" json:"updateBy"` DataScope string `gorm:"-" json:"dataScope"` Params Params `gorm:"-" json:"params"` Columns []SysColumns `gorm:"-" json:"columns"` @@ -53,10 +53,10 @@ type Params struct { TreeName string `gorm:"-" json:"treeName"` } -func (e *SysTables) GetPage(pageSize int, pageIndex int) ([]SysTables, int, error) { +func (e *SysTables) GetPage(tx *gorm.DB, pageSize int, pageIndex int) ([]SysTables, int, error) { var doc []SysTables - table := orm.Eloquent.Table("sys_tables") + table := tx.Table("sys_tables") if e.TBName != "" { table = table.Where("table_name = ?", e.TBName) @@ -74,10 +74,10 @@ func (e *SysTables) GetPage(pageSize int, pageIndex int) ([]SysTables, int, erro return doc, int(count), nil } -func (e *SysTables) Get() (SysTables, error) { +func (e *SysTables) Get(tx *gorm.DB) (SysTables, error) { var doc SysTables var err error - table := orm.Eloquent.Table("sys_tables") + table := tx.Table("sys_tables") if e.TBName != "" { table = table.Where("table_name = ?", e.TBName) @@ -94,17 +94,17 @@ func (e *SysTables) Get() (SysTables, error) { } var col SysColumns col.TableId = doc.TableId - if doc.Columns, err = col.GetList(); err != nil { + if doc.Columns, err = col.GetList(tx); err != nil { return doc, err } return doc, nil } -func (e *SysTables) GetTree() ([]SysTables, error) { +func (e *SysTables) GetTree(tx *gorm.DB) ([]SysTables, error) { var doc []SysTables var err error - table := orm.Eloquent.Table("sys_tables") + table := tx.Table("sys_tables") if e.TBName != "" { table = table.Where("table_name = ?", e.TBName) @@ -123,7 +123,7 @@ func (e *SysTables) GetTree() ([]SysTables, error) { var col SysColumns //col.FkCol = append(col.FkCol, SysColumns{ColumnId: 0, ColumnName: "请选择"}) col.TableId = doc[i].TableId - if doc[i].Columns, err = col.GetList(); err != nil { + if doc[i].Columns, err = col.GetList(tx); err != nil { return doc, err } @@ -132,9 +132,10 @@ func (e *SysTables) GetTree() ([]SysTables, error) { return doc, nil } -func (e *SysTables) Create() (SysTables, error) { +func (e *SysTables) Create(tx *gorm.DB) (SysTables, error) { var doc SysTables - result := orm.Eloquent.Table("sys_tables").Create(&e) + e.CreateBy = 0 + result := tx.Table("sys_tables").Create(&e) if result.Error != nil { err := result.Error return doc, err @@ -143,20 +144,21 @@ func (e *SysTables) Create() (SysTables, error) { for i := 0; i < len(e.Columns); i++ { e.Columns[i].TableId = doc.TableId - e.Columns[i].Create() + _, _ = e.Columns[i].Create(tx) } return doc, nil } -func (e *SysTables) Update() (update SysTables, err error) { +func (e *SysTables) Update(tx *gorm.DB) (update SysTables, err error) { //if err = orm.Eloquent.Table("sys_tables").First(&update, e.TableId).Error; err != nil { // return //} //参数1:是要修改的数据 //参数2:是修改的数据 - if err = orm.Eloquent.Table("sys_tables").Where("table_id = ?", e.TableId).Updates(&e).Error; err != nil { + e.UpdateBy = 0 + if err = tx.Table("sys_tables").Where("table_id = ?", e.TableId).Updates(&e).Error; err != nil { return } @@ -170,7 +172,7 @@ func (e *SysTables) Update() (update SysTables, err error) { tables := make([]SysTables, 0) tableMap := make(map[string]*SysTables) if len(tableNames) > 0 { - if err = orm.Eloquent.Table("sys_tables").Where("table_name in (?)", tableNames).Find(&tables).Error; err != nil { + if err = tx.Table("sys_tables").Where("table_name in (?)", tableNames).Find(&tables).Error; err != nil { return } for i := range tables { @@ -196,13 +198,13 @@ func (e *SysTables) Update() (update SysTables, err error) { } } } - _, _ = e.Columns[i].Update() + _, _ = e.Columns[i].Update(tx) } return } -func (e *SysTables) Delete() (success bool, err error) { - tx := orm.Eloquent.Begin() +func (e *SysTables) Delete(db *gorm.DB) (success bool, err error) { + tx := db.Begin() defer func() { if err != nil { tx.Rollback() @@ -222,8 +224,8 @@ func (e *SysTables) Delete() (success bool, err error) { return } -func (e *SysTables) BatchDelete(id []int) (Result bool, err error) { - if err = orm.Eloquent.Unscoped().Table(e.TableName()).Where(" table_id in (?)", id).Delete(&SysColumns{}).Error; err != nil { +func (e *SysTables) BatchDelete(tx *gorm.DB, id []int) (Result bool, err error) { + if err = tx.Unscoped().Table(e.TableName()).Where(" table_id in (?)", id).Delete(&SysColumns{}).Error; err != nil { return } Result = true diff --git a/app/admin/router/init_router.go b/app/admin/router/init_router.go new file mode 100644 index 00000000..8fe9d823 --- /dev/null +++ b/app/admin/router/init_router.go @@ -0,0 +1,52 @@ +package router + +import ( + "os" + + "github.com/gin-gonic/gin" + log "github.com/go-admin-team/go-admin-core/logger" + "github.com/go-admin-team/go-admin-core/sdk" + "github.com/go-admin-team/go-admin-core/sdk/api" + "github.com/go-admin-team/go-admin-core/sdk/config" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + + common "go-admin/common/middleware" + "go-admin/common/middleware/handler" +) + +// InitRouter 路由初始化,不要怀疑,这里用到了 +func InitRouter() { + var r *gin.Engine + h := sdk.Runtime.GetEngine() + if h == nil { + h = gin.New() + sdk.Runtime.SetEngine(h) + } + switch h.(type) { + case *gin.Engine: + r = h.(*gin.Engine) + default: + log.Fatal("not support other engine") + os.Exit(-1) + } + if config.SslConfig.Enable { + r.Use(handler.TlsHandler()) + } + + r.Use(common.Sentinel()). + Use(common.RequestId(pkg.TrafficKey)). + Use(api.SetRequestLogger) + common.InitMiddleware(r) + // the jwt middleware + authMiddleware, err := common.AuthInit() + if err != nil { + log.Fatalf("JWT Init Error, %s", err.Error()) + } + + // 注册系统路由 + InitSysRouter(r, authMiddleware) + + // 注册业务路由 + // TODO: 这里可存放业务路由,里边并无实际路由只有演示代码 + InitExamplesRouter(r, authMiddleware) +} diff --git a/app/admin/router/initrouter.go b/app/admin/router/initrouter.go deleted file mode 100644 index 2ed811f4..00000000 --- a/app/admin/router/initrouter.go +++ /dev/null @@ -1,47 +0,0 @@ -package router - -import ( - "github.com/gin-gonic/gin" - "go-admin/app/admin/middleware" - "go-admin/app/admin/middleware/handler" - "go-admin/common/global" - "go-admin/common/log" - _ "go-admin/pkg/jwtauth" - "go-admin/tools" - "go-admin/tools/config" - "os" -) - -func InitRouter() { - var r *gin.Engine - h := global.Cfg.GetEngine() - if h == nil { - h = gin.New() - global.Cfg.SetEngine(h) - } - switch h.(type) { - case *gin.Engine: - r = h.(*gin.Engine) - default: - log.Fatal("not support other engine") - os.Exit(-1) - } - if config.SslConfig.Enable { - r.Use(handler.TlsHandler()) - } - r.Use(middleware.WithContextDb(middleware.GetGormFromConfig(global.Cfg))) - middleware.InitMiddleware(r) - // the jwt middleware - var err error - authMiddleware, err := middleware.AuthInit() - tools.HasError(err, "JWT Init Error", 500) - - // 注册系统路由 - InitSysRouter(r, authMiddleware) - - // 注册业务路由 - // TODO: 这里可存放业务路由,里边并无实际路由只有演示代码 - InitExamplesRouter(r, authMiddleware) - - //return r -} diff --git a/app/admin/router/monitor.go b/app/admin/router/monitor.go new file mode 100644 index 00000000..b6cf2fab --- /dev/null +++ b/app/admin/router/monitor.go @@ -0,0 +1,32 @@ +package router + +import ( + "github.com/go-admin-team/go-admin-core/sdk" + "net/http" + + "github.com/gin-gonic/gin" + log "github.com/go-admin-team/go-admin-core/logger" + "github.com/go-admin-team/go-admin-core/tools/transfer" + "github.com/prometheus/client_golang/prometheus/promhttp" +) + +func Monitor() { + var r *gin.Engine + h := sdk.Runtime.GetEngine() + if h == nil { + h = gin.New() + sdk.Runtime.SetEngine(h) + } + switch h.(type) { + case *gin.Engine: + r = h.(*gin.Engine) + default: + log.Fatal("not support other engine") + } + //开发环境启动监控指标 + r.GET("/metrics", transfer.Handler(promhttp.Handler())) + //健康检查 + r.GET("/health", func(c *gin.Context) { + c.Status(http.StatusOK) + }) +} diff --git a/app/admin/router/router.go b/app/admin/router/router.go index 925a86e6..ed283478 100644 --- a/app/admin/router/router.go +++ b/app/admin/router/router.go @@ -3,8 +3,8 @@ package router import ( "github.com/gin-gonic/gin" _ "github.com/gin-gonic/gin" - "go-admin/pkg/jwtauth" - jwt "go-admin/pkg/jwtauth" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" ) var ( @@ -35,8 +35,7 @@ func examplesNoCheckRoleRouter(r *gin.Engine) { } // {{无需认证路由自动补充在此处请勿删除}} - registerSysFileInfoRouter(v1) - registerSysFileDirRouter(v1) + //registerSysFileInfoRouter(v1) } // 需要认证的路由示例 @@ -49,9 +48,4 @@ func examplesCheckRoleRouter(r *gin.Engine, authMiddleware *jwtauth.GinJWTMiddle for _, f := range routerCheckRole { f(v1, authMiddleware) } - - // {{认证路由自动补充在此处请勿删除}} - registerSysContentRouter(v1, authMiddleware) - registerSysCategoryRouter(v1, authMiddleware) - } diff --git a/app/admin/router/sys_category.go b/app/admin/router/sys_category.go new file mode 100644 index 00000000..df8322a3 --- /dev/null +++ b/app/admin/router/sys_category.go @@ -0,0 +1,31 @@ +package router + +import ( + "github.com/gin-gonic/gin" + middleware2 "go-admin/common/middleware" + + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + "go-admin/app/admin/models" + "go-admin/app/admin/service/dto" + "go-admin/common/actions" +) + +func init() { + routerCheckRole = append(routerCheckRole, registerSysCategoryRouter) +} + +// 需认证的路由代码 +func registerSysCategoryRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + r := v1.Group("/syscategory").Use(authMiddleware.MiddlewareFunc()).Use(middleware2.AuthCheckRole()) + { + model := &models.SysCategory{} + r.GET("", actions.PermissionAction(), actions.IndexAction(model, new(dto.SysCategorySearch), func() interface{} { + list := make([]models.SysCategory, 0) + return &list + })) + r.GET("/:id", actions.PermissionAction(), actions.ViewAction(new(dto.SysCategoryById), nil)) + r.POST("", actions.CreateAction(new(dto.SysCategoryControl))) + r.PUT("/:id", actions.PermissionAction(), actions.UpdateAction(new(dto.SysCategoryControl))) + r.DELETE("", actions.PermissionAction(), actions.DeleteAction(new(dto.SysCategoryById))) + } +} diff --git a/app/admin/router/sys_china_area_data.go b/app/admin/router/sys_china_area_data.go new file mode 100644 index 00000000..0dca1098 --- /dev/null +++ b/app/admin/router/sys_china_area_data.go @@ -0,0 +1,25 @@ +package router + +import ( + "github.com/gin-gonic/gin" + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + "go-admin/app/admin/apis/sys_china_area_data" + middleware2 "go-admin/common/middleware" +) + +func init() { + routerCheckRole = append(routerCheckRole, registerSysChinaAreaDataRouter) +} + +// 需认证的路由代码 +func registerSysChinaAreaDataRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + api := sys_china_area_data.SysChinaAreaData{} + r := v1.Group("/sys_china_area_data").Use(authMiddleware.MiddlewareFunc()).Use(middleware2.AuthCheckRole()) + { + r.GET("", api.GetSysChinaAreaDataList) + r.GET("/:id", api.GetSysChinaAreaData) + r.POST("", api.InsertSysChinaAreaData) + r.PUT("/:id", api.UpdateSysChinaAreaData) + r.DELETE("", api.DeleteSysChinaAreaData) + } +} diff --git a/app/admin/router/sys_config.go b/app/admin/router/sys_config.go new file mode 100644 index 00000000..8b3541cd --- /dev/null +++ b/app/admin/router/sys_config.go @@ -0,0 +1,37 @@ +package router + +import ( + "github.com/gin-gonic/gin" + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + "go-admin/app/admin/apis/system/sys_config" + middleware2 "go-admin/common/middleware" +) + +func init() { + routerCheckRole = append(routerCheckRole, registerSysConfigRouter) +} + +// 需认证的路由代码 +func registerSysConfigRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + api := sys_config.SysConfig{} + r := v1.Group("/config").Use(authMiddleware.MiddlewareFunc()).Use(middleware2.AuthCheckRole()) + { + + r.GET("", api.GetSysConfigList) + r.GET("/:id", api.GetSysConfig) + r.POST("", api.InsertSysConfig) + r.PUT("/:id", api.UpdateSysConfig) + r.DELETE("", api.DeleteSysConfig) + } + + r1 := v1.Group("/configKey").Use(authMiddleware.MiddlewareFunc()) + { + r1.GET("/:configKey", api.GetSysConfigByKEYForService) + } + + r2 := v1.Group("/app-config") + { + r2.GET("", api.GetSysConfigBySysApp) + } + +} \ No newline at end of file diff --git a/app/admin/router/sys_content.go b/app/admin/router/sys_content.go new file mode 100644 index 00000000..133d7248 --- /dev/null +++ b/app/admin/router/sys_content.go @@ -0,0 +1,37 @@ +package router + +import ( + "github.com/gin-gonic/gin" + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + "go-admin/app/admin/models" + "go-admin/app/admin/service/dto" + "go-admin/common/actions" + middleware2 "go-admin/common/middleware" +) + +func init() { + routerCheckRole = append(routerCheckRole, registerSysContentRouter) +} + +// 需认证的路由代码 +func registerSysContentRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + + r := v1.Group("/syscontent").Use(authMiddleware.MiddlewareFunc()).Use(middleware2.AuthCheckRole()) + { + //r.GET("", sys_content.GetSysContentList) + //r.GET("/:id", sys_content.GetSysContent) + //r.POST("", sys_content.InsertSysContent) + //r.PUT("", sys_content.UpdateSysContent) + //r.DELETE("/:id", sys_content.DeleteSysContent) + + model := &models.SysContent{} + r.GET("", actions.PermissionAction(), actions.IndexAction(model, new(dto.SysContentSearch), func() interface{} { + list := make([]models.SysContent, 0) + return &list + })) + r.GET("/:id", actions.PermissionAction(), actions.ViewAction(new(dto.SysContentById), nil)) + r.POST("", actions.CreateAction(new(dto.SysContentControl))) + r.PUT("/:id", actions.PermissionAction(), actions.UpdateAction(new(dto.SysContentControl))) + r.DELETE("", actions.PermissionAction(), actions.DeleteAction(new(dto.SysContentById))) + } +} diff --git a/app/admin/router/sys_dept.go b/app/admin/router/sys_dept.go new file mode 100644 index 00000000..7ce7eddb --- /dev/null +++ b/app/admin/router/sys_dept.go @@ -0,0 +1,31 @@ +package router + +import ( + "github.com/gin-gonic/gin" + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + "go-admin/app/admin/apis/system/sys_dept" + middleware2 "go-admin/common/middleware" +) + +func init() { + routerCheckRole = append(routerCheckRole, registerSysDeptRouter) +} + +// 需认证的路由代码 +func registerSysDeptRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + api := sys_dept.SysDept{} + r := v1.Group("/dept").Use(authMiddleware.MiddlewareFunc()).Use(middleware2.AuthCheckRole()) + { + r.GET("", api.GetSysDeptList) + r.GET("/:id", api.GetSysDept) + r.POST("", api.InsertSysDept) + r.PUT("/:id", api.UpdateSysDept) + r.DELETE("/:id", api.DeleteSysDept) + } + + r1 := v1.Group("").Use(authMiddleware.MiddlewareFunc()) + { + r1.GET("/deptTree", api.GetDeptTree) + } + +} diff --git a/app/admin/router/sys_file_dir.go b/app/admin/router/sys_file_dir.go new file mode 100644 index 00000000..d2d47193 --- /dev/null +++ b/app/admin/router/sys_file_dir.go @@ -0,0 +1,25 @@ +package router + +import ( + "github.com/gin-gonic/gin" + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + "go-admin/app/admin/apis/sys_file" + middleware2 "go-admin/common/middleware" +) + +func init() { + routerCheckRole = append(routerCheckRole, registerSysFileDirRouter) +} + +// 需认证的路由代码 +func registerSysFileDirRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + api := sys_file.SysFileDir{} + r := v1.Group("/sysfiledir").Use(authMiddleware.MiddlewareFunc()).Use(middleware2.AuthCheckRole()) + { + r.GET("", api.GetSysFileDirList) + r.GET("/:id", api.GetSysFileDir) + r.POST("", api.InsertSysFileDir) + r.PUT("/:id", api.UpdateSysFileDir) + r.DELETE("/:id", api.DeleteSysFileDir) + } +} diff --git a/app/admin/router/sys_file_info.go b/app/admin/router/sys_file_info.go new file mode 100644 index 00000000..5cd1d458 --- /dev/null +++ b/app/admin/router/sys_file_info.go @@ -0,0 +1,25 @@ +package router + +import ( + "github.com/gin-gonic/gin" + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + "go-admin/app/admin/apis/sys_file" + middleware2 "go-admin/common/middleware" +) + +func init() { + routerCheckRole = append(routerCheckRole, registerSysFileInfoRouter) +} + +// 需认证的路由代码 +func registerSysFileInfoRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + api := sys_file.SysFileInfo{} + r := v1.Group("/sysfileinfo").Use(authMiddleware.MiddlewareFunc()).Use(middleware2.AuthCheckRole()) + { + r.GET("", api.GetSysFileInfoList) + r.GET("/:id", api.GetSysFileInfo) + r.POST("", api.InsertSysFileInfo) + r.PUT("/:id", api.UpdateSysFileInfo) + r.DELETE("/:id", api.DeleteSysFileInfo) + } +} diff --git a/app/admin/router/sysjob.go b/app/admin/router/sys_job.go similarity index 84% rename from app/admin/router/sysjob.go rename to app/admin/router/sys_job.go index 85270907..a6985b8c 100644 --- a/app/admin/router/sysjob.go +++ b/app/admin/router/sys_job.go @@ -2,12 +2,12 @@ package router import ( "github.com/gin-gonic/gin" - "go-admin/app/admin/apis/sysjob" - "go-admin/app/admin/middleware" + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + "go-admin/app/admin/apis/sys_job" "go-admin/app/admin/models" "go-admin/app/admin/service/dto" "go-admin/common/actions" - jwt "go-admin/pkg/jwtauth" + middleware2 "go-admin/common/middleware" ) func init() { @@ -17,7 +17,7 @@ func init() { // 需认证的路由代码 func registerSysJobRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { - r := v1.Group("/sysjob").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) + r := v1.Group("/sysjob").Use(authMiddleware.MiddlewareFunc()).Use(middleware2.AuthCheckRole()) { sysJob := &models.SysJob{} r.GET("", actions.PermissionAction(), actions.IndexAction(sysJob, new(dto.SysJobSearch), func() interface{} { @@ -31,7 +31,7 @@ func registerSysJobRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddlew r.PUT("", actions.PermissionAction(), actions.UpdateAction(new(dto.SysJobControl))) r.DELETE("", actions.PermissionAction(), actions.DeleteAction(new(dto.SysJobById))) } - sysJob := &sysjob.SysJob{} + sysJob := sys_job.SysJob{} v1.GET("/job/remove/:id", sysJob.RemoveJobForService) v1.GET("/job/start/:id", sysJob.StartJobForService) diff --git a/app/admin/router/sys_login_log.go b/app/admin/router/sys_login_log.go new file mode 100644 index 00000000..b813357a --- /dev/null +++ b/app/admin/router/sys_login_log.go @@ -0,0 +1,25 @@ +package router + +import ( + "github.com/gin-gonic/gin" + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + "go-admin/app/admin/apis/system/sys_login_log" + middleware2 "go-admin/common/middleware" +) + +func init() { + routerCheckRole = append(routerCheckRole, registerSysLoginLogRouter) +} + +// 需认证的路由代码 +func registerSysLoginLogRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + api := sys_login_log.SysLoginLog{} + r := v1.Group("/sys-login-log").Use(authMiddleware.MiddlewareFunc()).Use(middleware2.AuthCheckRole()) + { + r.GET("", api.GetSysLoginLogList) + r.GET("/:id", api.GetSysLoginLog) + r.POST("", api.InsertSysLoginLog) + r.PUT("/:id", api.UpdateSysLoginLog) + r.DELETE("", api.DeleteSysLoginLog) + } +} diff --git a/app/admin/router/sys_menu.go b/app/admin/router/sys_menu.go new file mode 100644 index 00000000..8d7b300a --- /dev/null +++ b/app/admin/router/sys_menu.go @@ -0,0 +1,39 @@ +package router + +import ( + "github.com/gin-gonic/gin" + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + "go-admin/app/admin/apis/system/sys_menu" + middleware2 "go-admin/common/middleware" +) + +func init() { + routerCheckRole = append(routerCheckRole, registerSysMenuRouter) +} + +// 需认证的路由代码 +func registerSysMenuRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + api := sys_menu.SysMenu{} + //menu := v1.Group("/menu").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) + //{ + // menu.GET("/:id", system.GetMenu) + // menu.POST("", system.InsertMenu) + // menu.PUT("", system.UpdateMenu) + // menu.DELETE("/:id", system.DeleteMenu) + //} + r := v1.Group("/menu").Use(authMiddleware.MiddlewareFunc()).Use(middleware2.AuthCheckRole()) + { + r.GET("", api.GetSysMenuList) + r.GET("/:id", api.GetSysMenu) + r.POST("", api.InsertSysMenu) + r.PUT("/:id", api.UpdateSysMenu) + r.DELETE("/:id", api.DeleteSysMenu) + } + + r1 := v1.Group("").Use(authMiddleware.MiddlewareFunc()) + { + r1.GET("/menurole", api.GetMenuRole) + r1.GET("/menuids", api.GetMenuIDS) + } + +} diff --git a/app/admin/router/sys_opera_log.go b/app/admin/router/sys_opera_log.go new file mode 100644 index 00000000..37e0db53 --- /dev/null +++ b/app/admin/router/sys_opera_log.go @@ -0,0 +1,25 @@ +package router + +import ( + "github.com/gin-gonic/gin" + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + "go-admin/app/admin/apis/system/sys_opera_log" + middleware2 "go-admin/common/middleware" +) + +func init() { + routerCheckRole = append(routerCheckRole, registerSysOperaLogRouter) +} + +// 需认证的路由代码 +func registerSysOperaLogRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + api := sys_opera_log.SysOperaLog{} + r := v1.Group("/sys-opera-log").Use(authMiddleware.MiddlewareFunc()).Use(middleware2.AuthCheckRole()) + { + r.GET("", api.GetSysOperaLogList) + r.GET("/:id", api.GetSysOperaLog) + r.POST("", api.InsertSysOperaLog) + r.PUT("/:id", api.UpdateSysOperaLog) + r.DELETE("", api.DeleteSysOperaLog) + } +} diff --git a/app/admin/router/sys_post.go b/app/admin/router/sys_post.go new file mode 100644 index 00000000..a77f8616 --- /dev/null +++ b/app/admin/router/sys_post.go @@ -0,0 +1,25 @@ +package router + +import ( + "github.com/gin-gonic/gin" + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + "go-admin/app/admin/apis/system/sys_post" + middleware2 "go-admin/common/middleware" +) + +func init() { + routerCheckRole = append(routerCheckRole, registerSyPostRouter) +} + +// 需认证的路由代码 +func registerSyPostRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + api := sys_post.SysPost{} + r := v1.Group("/post").Use(authMiddleware.MiddlewareFunc()).Use(middleware2.AuthCheckRole()) + { + r.GET("", api.GetSysPostList) + r.GET("/:id", api.GetSysPost) + r.POST("", api.InsertSysPost) + r.PUT("/:id", api.UpdateSysPost) + r.DELETE("/:id", api.DeleteSysPost) + } +} diff --git a/app/admin/router/sys_role.go b/app/admin/router/sys_role.go new file mode 100644 index 00000000..9ad9efa1 --- /dev/null +++ b/app/admin/router/sys_role.go @@ -0,0 +1,26 @@ +package router + +import ( + "github.com/gin-gonic/gin" + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + "go-admin/app/admin/apis/system/sys_role" + middleware2 "go-admin/common/middleware" +) + +func init() { + routerCheckRole = append(routerCheckRole, registerSysRoleRouter) +} + +// 需认证的路由代码 +func registerSysRoleRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + api := sys_role.SysRole{} + r := v1.Group("/role").Use(authMiddleware.MiddlewareFunc()).Use(middleware2.AuthCheckRole()) + { + r.GET("", api.GetSysRoleList) + r.GET("/:id", api.GetSysRole) + r.POST("", api.InsertSysRole) + r.PUT("/:id", api.UpdateSysRole) + r.DELETE("", api.DeleteSysRole) + } + v1.PUT("/roledatascope", api.UpdateRoleDataScope) +} diff --git a/app/admin/router/sys_router.go b/app/admin/router/sys_router.go new file mode 100644 index 00000000..ee4addff --- /dev/null +++ b/app/admin/router/sys_router.go @@ -0,0 +1,222 @@ +package router + +import ( + "mime" + + "github.com/gin-gonic/gin" + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + "github.com/go-admin-team/go-admin-core/sdk/pkg/ws" + ginSwagger "github.com/swaggo/gin-swagger" + "github.com/swaggo/gin-swagger/swaggerFiles" + + "go-admin/app/admin/apis/monitor" + "go-admin/app/admin/apis/public" + "go-admin/app/admin/apis/system" + "go-admin/app/admin/apis/system/dict" + "go-admin/app/admin/apis/system/sys_dept" + "go-admin/app/admin/apis/system/sys_menu" + "go-admin/app/admin/apis/tools" + "go-admin/common/middleware" + "go-admin/common/middleware/handler" + _ "go-admin/docs" +) + +func InitSysRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) *gin.RouterGroup { + g := r.Group("") + sysBaseRouter(g) + // 静态文件 + sysStaticFileRouter(g) + // swagger;注意:生产环境可以注释掉 + sysSwaggerRouter(g) + // 无需认证 + sysNoCheckRoleRouter(g) + // 需要认证 + sysCheckRoleRouterInit(g, authMiddleware) + return g +} + +func sysBaseRouter(r *gin.RouterGroup) { + + go ws.WebsocketManager.Start() + go ws.WebsocketManager.SendService() + go ws.WebsocketManager.SendAllService() + + r.GET("/", system.HelloWorld) + r.GET("/info", handler.Ping) +} + +func sysStaticFileRouter(r *gin.RouterGroup) { + err := mime.AddExtensionType(".js", "application/javascript") + if err != nil { + return + } + r.Static("/static", "./static") + r.Static("/form-generator", "./static/form-generator") +} + +func sysSwaggerRouter(r *gin.RouterGroup) { + r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) +} + +func sysNoCheckRoleRouter(r *gin.RouterGroup) { + v1 := r.Group("/api/v1") + + m := monitor.Monitor{} + v1.GET("/monitor/server", m.ServerInfo) + sys := system.System{} + v1.GET("/getCaptcha", sys.GenerateCaptchaHandler) + gen := tools.Gen{} + v1.GET("/gen/preview/:tableId", gen.Preview) + v1.GET("/gen/toproject/:tableId", gen.GenCode) + v1.GET("/gen/apitofile/:tableId", gen.GenApiToFile) + + v1.GET("/gen/todb/:tableId", gen.GenMenuAndApi) + sysTable := tools.SysTable{} + v1.GET("/gen/tabletree", sysTable.GetSysTablesTree) + + registerDBRouter(v1) + registerSysTableRouter(v1) + registerPublicRouter(v1) + registerSysSettingRouter(v1) +} + +func registerDBRouter(api *gin.RouterGroup) { + db := api.Group("/db") + { + gen := tools.Gen{} + db.GET("/tables/page", gen.GetDBTableList) + db.GET("/columns/page", gen.GetDBColumnList) + } +} + +func registerSysTableRouter(v1 *gin.RouterGroup) { + systables := v1.Group("/sys/tables") + { + sysTable := tools.SysTable{} + systables.GET("/page", sysTable.GetSysTableList) + tablesinfo := systables.Group("/info") + { + tablesinfo.POST("", sysTable.InsertSysTable) + tablesinfo.PUT("", sysTable.UpdateSysTable) + tablesinfo.DELETE("/:tableId", sysTable.DeleteSysTables) + tablesinfo.GET("/:tableId", sysTable.GetSysTables) + tablesinfo.GET("", sysTable.GetSysTablesInfo) + } + } +} + +func sysCheckRoleRouterInit(r *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + r.Group("").Use(authMiddleware.MiddlewareFunc()).GET("/ws/:id/:channel", ws.WebsocketManager.WsClient) + r.Group("").Use(authMiddleware.MiddlewareFunc()).GET("/wslogout/:id/:channel", ws.WebsocketManager.UnWsClient) + v1 := r.Group("/api/v1") + + v1.POST("/login", authMiddleware.LoginHandler) + // Refresh time can be longer than token timeout + v1.GET("/refresh_token", authMiddleware.RefreshHandler) + //registerPageRouter(v1, authMiddleware) + registerBaseRouter(v1, authMiddleware) + registerDictRouter(v1, authMiddleware) + //registerSysUserRouter(v1, authMiddleware) + //registerUserCenterRouter(v1, authMiddleware) +} + +func registerBaseRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + api := sys_menu.SysMenu{} + api2 := sys_dept.SysDept{} + v1auth := v1.Group("").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) + { + //v1auth.GET("/getinfo", system.GetInfo) + v1auth.GET("/roleMenuTreeselect/:roleId", api.GetMenuTreeSelect) + v1.GET("/menuTreeselect", api.GetMenuTreeSelect) + v1auth.GET("/roleDeptTreeselect/:roleId", api2.GetDeptTreeRoleSelect) + //GetDeptTreeRoleselect) + v1auth.POST("/logout", handler.LogOut) + } +} + +//func registerPageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { +// v1auth := v1.Group("").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) +// { +// v1auth.GET("/sysUserList", system.GetSysUserList) +// } +//} + +//func registerUserCenterRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { +// user := v1.Group("/user").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) +// { +// user.GET("/profile", system.GetSysUserProfile) +// user.POST("/avatar", system.InsetSysUserAvatar) +// user.PUT("/pwd", system.SysUserUpdatePwd) +// } +//} + +//func registerPostRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { +// post := v1.Group("/post").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) +// { +// post.GET("/:postId", system.GetPost) +// post.POST("", system.InsertPost) +// post.PUT("", system.UpdatePost) +// post.DELETE("/:postId", system.DeletePost) +// } +//} + +//func registerSysUserRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { +// sysuser := v1.Group("/sysUser").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) +// { +// sysuser.GET("/:userId", system.GetSysUser) +// sysuser.GET("/", system.GetSysUserInit) +// sysuser.POST("", system.InsertSysUser) +// sysuser.PUT("", system.UpdateSysUser) +// sysuser.DELETE("/:userId", system.DeleteSysUser) +// } +//} + +func registerDictRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + dictApi := dict.SysDictType{} + dataApi := dict.SysDictData{} + dicts := v1.Group("/dict").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) + { + + dicts.GET("/data", dataApi.GetSysDictDataList) + dicts.GET("/data/:dictCode", dataApi.GetSysDictData) + dicts.POST("/data", dataApi.InsertSysDictData) + dicts.PUT("/data/:dictCode", dataApi.UpdateSysDictData) + dicts.DELETE("/data", dataApi.DeleteSysDictData) + + dicts.GET("/type-option-select", dictApi.GetSysDictTypeAll) + dicts.GET("/type", dictApi.GetSysDictTypeList) + dicts.GET("/type/:id", dictApi.GetSysDictType) + dicts.POST("/type", dictApi.InsertSysDictType) + dicts.PUT("/type/:id", dictApi.UpdateSysDictType) + dicts.DELETE("/type", dictApi.DeleteSysDictType) + } + v1.Group("/dict").Use(authMiddleware.MiddlewareFunc()).GET("/data-all", dataApi.GetSysDictDataAll) +} + +//func registerDeptRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { +// dept := v1.Group("/dept").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) +// { +// dept.GET("/:deptId", system.GetDept) +// dept.POST("", system.InsertDept) +// dept.PUT("", system.UpdateDept) +// dept.DELETE("/:id", system.DeleteDept) +// } +//} +func registerSysSettingRouter(v1 *gin.RouterGroup) { + api := system.SysSetting{} + m := monitor.Monitor{} + setting := v1.Group("/setting") + { + setting.GET("", api.GetSetting) + setting.POST("", api.CreateOrUpdateSetting) + setting.GET("/serverInfo", m.ServerInfo) + } +} + +func registerPublicRouter(v1 *gin.RouterGroup) { + p := v1.Group("/public") + { + file := public.File{} + p.POST("/uploadFile", file.UploadFile) + } +} diff --git a/app/admin/router/sys_user.go b/app/admin/router/sys_user.go new file mode 100644 index 00000000..59e4a67e --- /dev/null +++ b/app/admin/router/sys_user.go @@ -0,0 +1,37 @@ +package router + +import ( + "github.com/gin-gonic/gin" + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + "go-admin/app/admin/apis/sys_user" + "go-admin/common/actions" + middleware2 "go-admin/common/middleware" +) + +func init() { + routerCheckRole = append(routerCheckRole, registerSysUserRouter) +} + +// 需认证的路由代码 +func registerSysUserRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + api := sys_user.SysUser{} + r := v1.Group("/sysUser").Use(authMiddleware.MiddlewareFunc()).Use(middleware2.AuthCheckRole()).Use(actions.PermissionAction()) + { + r.GET("", api.GetSysUserList) + r.GET("/:id", api.GetSysUser) + r.POST("", api.InsertSysUser) + r.PUT("", api.UpdateSysUser) + r.DELETE("", api.DeleteSysUser) + } + + user := v1.Group("/user").Use(authMiddleware.MiddlewareFunc()).Use(middleware2.AuthCheckRole()).Use(actions.PermissionAction()) + { + user.GET("/profile", api.GetSysUserProfile) + user.POST("/avatar", api.InsetSysUserAvatar) + user.PUT("/pwd", api.SysUserUpdatePwd) + } + v1auth := v1.Group("").Use(authMiddleware.MiddlewareFunc()) + { + v1auth.GET("/getinfo", api.GetInfo) + } +} diff --git a/app/admin/router/syscategory.go b/app/admin/router/syscategory.go deleted file mode 100644 index 187389b2..00000000 --- a/app/admin/router/syscategory.go +++ /dev/null @@ -1,26 +0,0 @@ -package router - -import ( - "github.com/gin-gonic/gin" - "go-admin/app/admin/apis/syscategory" - "go-admin/app/admin/middleware" - jwt "go-admin/pkg/jwtauth" -) - -// 需认证的路由代码 -func registerSysCategoryRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { - - r := v1.Group("/syscategory").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) - { - r.GET("/:id", syscategory.GetSysCategory) - r.POST("", syscategory.InsertSysCategory) - r.PUT("", syscategory.UpdateSysCategory) - r.DELETE("/:id", syscategory.DeleteSysCategory) - } - - l := v1.Group("").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) - { - l.GET("/syscategoryList", syscategory.GetSysCategoryList) - } - -} diff --git a/app/admin/router/syscontent.go b/app/admin/router/syscontent.go deleted file mode 100644 index f72488bb..00000000 --- a/app/admin/router/syscontent.go +++ /dev/null @@ -1,26 +0,0 @@ -package router - -import ( - "github.com/gin-gonic/gin" - "go-admin/app/admin/apis/syscontent" - "go-admin/app/admin/middleware" - jwt "go-admin/pkg/jwtauth" -) - -// 需认证的路由代码 -func registerSysContentRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { - - r := v1.Group("/syscontent").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) - { - r.GET("/:id", syscontent.GetSysContent) - r.POST("", syscontent.InsertSysContent) - r.PUT("", syscontent.UpdateSysContent) - r.DELETE("/:id", syscontent.DeleteSysContent) - } - - l := v1.Group("").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) - { - l.GET("/syscontentList", syscontent.GetSysContentList) - } - -} diff --git a/app/admin/router/sysfileinfo.go b/app/admin/router/sysfileinfo.go deleted file mode 100644 index b701c20f..00000000 --- a/app/admin/router/sysfileinfo.go +++ /dev/null @@ -1,35 +0,0 @@ -package router - -import ( - "github.com/gin-gonic/gin" - "go-admin/app/admin/apis/sysfiledir" - "go-admin/app/admin/apis/sysfileinfo" -) - -// 无需认证的路由代码 -func registerSysFileInfoRouter(v1 *gin.RouterGroup) { - - v1.GET("/sysfileinfoList", sysfileinfo.GetSysFileInfoList) - - r := v1.Group("/sysfileinfo") - { - r.GET("/:id", sysfileinfo.GetSysFileInfo) - r.POST("", sysfileinfo.InsertSysFileInfo) - r.PUT("", sysfileinfo.UpdateSysFileInfo) - r.DELETE("/:id", sysfileinfo.DeleteSysFileInfo) - } -} - -// 无需认证的路由代码 -func registerSysFileDirRouter(v1 *gin.RouterGroup) { - - v1.GET("/sysfiledirList", sysfiledir.GetSysFileDirList) - - r := v1.Group("/sysfiledir") - { - r.GET("/:id", sysfiledir.GetSysFileDir) - r.POST("", sysfiledir.InsertSysFileDir) - r.PUT("", sysfiledir.UpdateSysFileDir) - r.DELETE("/:id", sysfiledir.DeleteSysFileDir) - } -} diff --git a/app/admin/router/sysrouter.go b/app/admin/router/sysrouter.go deleted file mode 100644 index 04c48aa9..00000000 --- a/app/admin/router/sysrouter.go +++ /dev/null @@ -1,278 +0,0 @@ -package router - -import ( - "mime" - - log2 "go-admin/app/admin/apis/log" - "go-admin/app/admin/apis/monitor" - "go-admin/app/admin/apis/public" - "go-admin/app/admin/apis/system" - "go-admin/app/admin/apis/system/dict" - . "go-admin/app/admin/apis/tools" - "go-admin/app/admin/middleware" - "go-admin/app/admin/middleware/handler" - _ "go-admin/docs" - jwt "go-admin/pkg/jwtauth" - "go-admin/pkg/ws" - - "github.com/gin-gonic/gin" - ginSwagger "github.com/swaggo/gin-swagger" - "github.com/swaggo/gin-swagger/swaggerFiles" -) - -func InitSysRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) *gin.RouterGroup { - g := r.Group("") - sysBaseRouter(g) - // 静态文件 - sysStaticFileRouter(g) - // swagger;注意:生产环境可以注释掉 - sysSwaggerRouter(g) - // 无需认证 - sysNoCheckRoleRouter(g) - // 需要认证 - sysCheckRoleRouterInit(g, authMiddleware) - return g -} - -func sysBaseRouter(r *gin.RouterGroup) { - - go ws.WebsocketManager.Start() - go ws.WebsocketManager.SendService() - go ws.WebsocketManager.SendAllService() - - r.GET("/", system.HelloWorld) - r.GET("/info", handler.Ping) -} - -func sysStaticFileRouter(r *gin.RouterGroup) { - mime.AddExtensionType(".js", "application/javascript") - r.Static("/static", "./static") - r.Static("/form-generator", "./static/form-generator") -} - -func sysSwaggerRouter(r *gin.RouterGroup) { - r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) -} - -func sysNoCheckRoleRouter(r *gin.RouterGroup) { - v1 := r.Group("/api/v1") - - v1.GET("/monitor/server", monitor.ServerInfo) - v1.GET("/getCaptcha", system.GenerateCaptchaHandler) - v1.GET("/gen/preview/:tableId", Preview) - v1.GET("/gen/toproject/:tableId", GenCodeV3) - v1.GET("/gen/todb/:tableId", GenMenuAndApi) - v1.GET("/gen/tabletree", GetSysTablesTree) - v1.GET("/menuTreeselect", system.GetMenuTreeelect) - v1.GET("/dict/databytype/:dictType", dict.GetDictDataByDictType) - - registerDBRouter(v1) - - registerSysTableRouter(v1) - - registerPublicRouter(v1) - - registerSysSettingRouter(v1) - -} - -func registerDBRouter(api *gin.RouterGroup) { - db := api.Group("/db") - { - db.GET("/tables/page", GetDBTableList) - db.GET("/columns/page", GetDBColumnList) - } -} - -func registerSysTableRouter(v1 *gin.RouterGroup) { - systables := v1.Group("/sys/tables") - { - systables.GET("/page", GetSysTableList) - tablesinfo := systables.Group("/info") - { - tablesinfo.POST("", InsertSysTable) - tablesinfo.PUT("", UpdateSysTable) - tablesinfo.DELETE("/:tableId", DeleteSysTables) - tablesinfo.GET("/:tableId", GetSysTables) - tablesinfo.GET("", GetSysTablesInfo) - } - } -} - -func sysCheckRoleRouterInit(r *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { - r.POST("/login", authMiddleware.LoginHandler) - // Refresh time can be longer than token timeout - r.GET("/refresh_token", authMiddleware.RefreshHandler) - - r.Group("").Use(authMiddleware.MiddlewareFunc()).GET("/ws/:id/:channel", ws.WebsocketManager.WsClient) - - r.Group("").Use(authMiddleware.MiddlewareFunc()).GET("/wslogout/:id/:channel", ws.WebsocketManager.UnWsClient) - - v1 := r.Group("/api/v1") - - registerPageRouter(v1, authMiddleware) - registerBaseRouter(v1, authMiddleware) - registerDeptRouter(v1, authMiddleware) - registerDictRouter(v1, authMiddleware) - registerSysUserRouter(v1, authMiddleware) - registerRoleRouter(v1, authMiddleware) - registerConfigRouter(v1, authMiddleware) - registerUserCenterRouter(v1, authMiddleware) - registerPostRouter(v1, authMiddleware) - registerMenuRouter(v1, authMiddleware) - registerLoginLogRouter(v1, authMiddleware) - registerOperLogRouter(v1, authMiddleware) -} - -func registerBaseRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { - v1auth := v1.Group("").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) - { - v1auth.GET("/getinfo", system.GetInfo) - v1auth.GET("/menurole", system.GetMenuRole) - v1auth.PUT("/roledatascope", system.UpdateRoleDataScope) - v1auth.GET("/roleMenuTreeselect/:roleId", system.GetMenuTreeRoleselect) - v1auth.GET("/roleDeptTreeselect/:roleId", system.GetDeptTreeRoleselect) - - v1auth.POST("/logout", handler.LogOut) - v1auth.GET("/menuids", system.GetMenuIDS) - - v1auth.GET("/operloglist", log2.GetOperLogList) - v1auth.GET("/configKey/:configKey", system.GetConfigByConfigKey) - } -} - -func registerPageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { - v1auth := v1.Group("").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) - { - v1auth.GET("/deptList", system.GetDeptList) - v1auth.GET("/deptTree", system.GetDeptTree) - v1auth.GET("/sysUserList", system.GetSysUserList) - v1auth.GET("/rolelist", system.GetRoleList) - v1auth.GET("/configList", system.GetConfigList) - v1auth.GET("/postlist", system.GetPostList) - v1auth.GET("/menulist", system.GetMenuList) - v1auth.GET("/loginloglist", log2.GetLoginLogList) - } -} - -func registerUserCenterRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { - user := v1.Group("/user").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) - { - user.GET("/profile", system.GetSysUserProfile) - user.POST("/avatar", system.InsetSysUserAvatar) - user.PUT("/pwd", system.SysUserUpdatePwd) - } -} - -func registerOperLogRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { - operlog := v1.Group("/operlog").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) - { - operlog.GET("/:operId", log2.GetOperLog) - operlog.DELETE("/:operId", log2.DeleteOperLog) - } -} - -func registerLoginLogRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { - loginlog := v1.Group("/loginlog").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) - { - loginlog.GET("/:infoId", log2.GetLoginLog) - loginlog.POST("", log2.InsertLoginLog) - loginlog.PUT("", log2.UpdateLoginLog) - loginlog.DELETE("/:infoId", log2.DeleteLoginLog) - } -} - -func registerPostRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { - post := v1.Group("/post").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) - { - post.GET("/:postId", system.GetPost) - post.POST("", system.InsertPost) - post.PUT("", system.UpdatePost) - post.DELETE("/:postId", system.DeletePost) - } -} - -func registerMenuRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { - menu := v1.Group("/menu").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) - { - menu.GET("/:id", system.GetMenu) - menu.POST("", system.InsertMenu) - menu.PUT("", system.UpdateMenu) - menu.DELETE("/:id", system.DeleteMenu) - } -} - -func registerConfigRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { - config := v1.Group("/config").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) - { - config.GET("/:configId", system.GetConfig) - config.POST("", system.InsertConfig) - config.PUT("", system.UpdateConfig) - config.DELETE("/:configId", system.DeleteConfig) - } -} - -func registerRoleRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { - role := v1.Group("/role").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) - { - role.GET("/:roleId", system.GetRole) - role.POST("", system.InsertRole) - role.PUT("", system.UpdateRole) - role.DELETE("/:roleId", system.DeleteRole) - } -} - -func registerSysUserRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { - sysuser := v1.Group("/sysUser").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) - { - sysuser.GET("/:userId", system.GetSysUser) - sysuser.GET("/", system.GetSysUserInit) - sysuser.POST("", system.InsertSysUser) - sysuser.PUT("", system.UpdateSysUser) - sysuser.DELETE("/:userId", system.DeleteSysUser) - } -} - -func registerDictRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { - dicts := v1.Group("/dict").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) - { - dicts.GET("/datalist", dict.GetDictDataList) - dicts.GET("/typelist", dict.GetDictTypeList) - dicts.GET("/typeoptionselect", dict.GetDictTypeOptionSelect) - - dicts.GET("/data/:dictCode", dict.GetDictData) - dicts.POST("/data", dict.InsertDictData) - dicts.PUT("/data/", dict.UpdateDictData) - dicts.DELETE("/data/:dictCode", dict.DeleteDictData) - - dicts.GET("/type/:dictId", dict.GetDictType) - dicts.POST("/type", dict.InsertDictType) - dicts.PUT("/type", dict.UpdateDictType) - dicts.DELETE("/type/:dictId", dict.DeleteDictType) - } -} - -func registerDeptRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { - dept := v1.Group("/dept").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) - { - dept.GET("/:deptId", system.GetDept) - dept.POST("", system.InsertDept) - dept.PUT("", system.UpdateDept) - dept.DELETE("/:id", system.DeleteDept) - } -} -func registerSysSettingRouter(v1 *gin.RouterGroup) { - setting := v1.Group("/setting") - { - setting.GET("", system.GetSetting) - setting.POST("", system.CreateSetting) - setting.GET("/serverInfo", monitor.ServerInfo) - } -} - -func registerPublicRouter(v1 *gin.RouterGroup) { - p := v1.Group("/public") - { - p.POST("/uploadFile", public.UploadFile) - } -} diff --git a/app/admin/service/dto/sys_category.go b/app/admin/service/dto/sys_category.go new file mode 100644 index 00000000..88ca2585 --- /dev/null +++ b/app/admin/service/dto/sys_category.go @@ -0,0 +1,104 @@ +package dto + +import ( + "errors" + vd "github.com/bytedance/go-tagexpr/v2/validator" + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/api" + + "go-admin/app/admin/models" + "go-admin/common/dto" + common "go-admin/common/models" +) + +type SysCategorySearch struct { + dto.Pagination `search:"-"` + Name string `form:"name" search:"type:exact;column:name;table:sys_category" comment:"名称" vd:"?"` + Status string `form:"status" search:"type:exact;column:status;table:sys_category" comment:"状态" vd:"?"` + CateId int `form:"cateId" search:"type:exact;column:cate_id;table:sys_category" comment:"分类id" vd:"?"` +} + +func (m *SysCategorySearch) GetNeedSearch() interface{} { + return *m +} + +func (m *SysCategorySearch) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + + err := ctx.ShouldBind(m) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + + if err = vd.Validate(m); err != nil { + log.Errorf("Validate error: %s", err.Error()) + return err + } + return err +} + +func (m *SysCategorySearch) Generate() dto.Index { + o := *m + return &o +} + +type SysCategoryControl struct { + ID int `uri:"Id" comment:"标识"` + Name string `json:"name" comment:"名称" vd:"len($)>0 && $!=' '; msg:'invalid name: 不能是空字符串'"` + Img string `json:"img" comment:"图标" vd:"?"` + Sort int `json:"sort" comment:"排序" vd:"?"` + Status int `json:"status" comment:"状态" vd:"$>0; msg:'invalid status: 状态无效'"` + Remark string `json:"remark" comment:"备注" vd:"?"` +} + +func (s *SysCategoryControl) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Errorf("ShouldBindUri error: %s", err.Error()) + return errors.New("数据绑定出错") + } + err = ctx.ShouldBind(s) + if err != nil { + log.Errorf("ShouldBind error: %s", err.Error()) + err = errors.New("数据绑定出错") + } + if err1 := vd.Validate(s); err != nil { + log.Errorf("Validate error: %s", err1.Error()) + return err1 + } + return err +} + +func (s *SysCategoryControl) Generate() dto.Control { + cp := *s + return &cp +} + +func (s *SysCategoryControl) GenerateM() (common.ActiveRecord, error) { + return &models.SysCategory{ + Model: common.Model{Id: s.ID}, + Name: s.Name, + Img: s.Img, + Sort: s.Sort, + Status: s.Status, + Remark: s.Remark, + }, nil +} + +func (s *SysCategoryControl) GetId() interface{} { + return s.ID +} + +type SysCategoryById struct { + dto.ObjectById `vd:"?"` +} + +func (s *SysCategoryById) Generate() dto.Control { + cp := *s + return &cp +} + +func (s *SysCategoryById) GenerateM() (common.ActiveRecord, error) { + return &models.SysCategory{}, nil +} \ No newline at end of file diff --git a/app/admin/service/dto/sys_config.go b/app/admin/service/dto/sys_config.go new file mode 100644 index 00000000..ab277db3 --- /dev/null +++ b/app/admin/service/dto/sys_config.go @@ -0,0 +1,123 @@ +package dto + +import ( + "encoding/json" + + "github.com/gin-gonic/gin" + "github.com/gin-gonic/gin/binding" + "github.com/go-admin-team/go-admin-core/sdk/api" + + "go-admin/app/admin/models/system" + "go-admin/common/dto" + common "go-admin/common/models" +) + +// SysConfigSearch 列表或者搜索使用结构体 +type SysConfigSearch struct { + dto.Pagination `search:"-"` + ConfigName string `form:"configName" search:"type:contains;column:config_name;table:sys_config" comment:""` + ConfigKey string `form:"configKey" search:"type:contains;column:config_key;table:sys_config" comment:""` + ConfigType string `form:"configType" search:"type:exact;column:config_type;table:sys_config" comment:""` + IsFrontend int `form:"isFrontend" search:"type:exact;column:is_frontend;table:sys_config" comment:""` +} + +func (m *SysConfigSearch) GetNeedSearch() interface{} { + return *m +} + +// Bind 映射上下文中的结构体数据 +func (m *SysConfigSearch) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBind(m) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +// SysConfigControl 增、改使用的结构体 +type SysConfigControl struct { + ID int `uri:"Id" comment:"编码"` // 编码 + ConfigName string `json:"configName" comment:""` + ConfigKey string `uri:"configKey" json:"configKey" comment:""` + ConfigValue string `json:"configValue" comment:""` + ConfigType string `json:"configType" comment:""` + IsFrontend int `json:"isFrontend"` + Remark string `json:"remark" comment:""` +} + +// Bind 映射上下文中的结构体数据 +func (s *SysConfigControl) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Debugf("ShouldBindUri error: %s", err.Error()) + return err + } + err = ctx.ShouldBindBodyWith(s, binding.JSON) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + var jsonStr []byte + jsonStr, err = json.Marshal(s) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + ctx.Set("body", string(jsonStr)) + return err +} + +// Generate 结构体数据转化 从 SysConfigControl 至 system.SysConfig 对应的模型 +func (s *SysConfigControl) Generate() (*system.SysConfig, error) { + return &system.SysConfig{ + Model: common.Model{Id: s.ID}, + ConfigName: s.ConfigName, + ConfigKey: s.ConfigKey, + ConfigValue: s.ConfigValue, + ConfigType: s.ConfigType, + IsFrontend: s.IsFrontend, + Remark: s.Remark, + }, nil +} + +// GetId 获取数据对应的ID +func (s *SysConfigControl) GetId() interface{} { + return s.ID +} + +// SysConfigById 获取单个或者删除的结构体 +type SysConfigById struct { + Id int `uri:"id"` + Ids []int `json:"ids"` +} + +func (s *SysConfigById) Generate() *SysConfigById { + cp := *s + return &cp +} + +func (s *SysConfigById) GetId() interface{} { + if len(s.Ids) > 0 { + s.Ids = append(s.Ids, s.Id) + return s.Ids + } + return s.Id +} + +func (s *SysConfigById) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Debugf("ShouldBindUri error: %s", err.Error()) + return err + } + err = ctx.ShouldBind(s) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +func (s *SysConfigById) GenerateM() (*system.SysConfig, error) { + return &system.SysConfig{}, nil +} diff --git a/app/admin/service/dto/sys_content.go b/app/admin/service/dto/sys_content.go new file mode 100644 index 00000000..0a639793 --- /dev/null +++ b/app/admin/service/dto/sys_content.go @@ -0,0 +1,94 @@ +package dto + +import ( + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/api" + + "go-admin/app/admin/models" + "go-admin/common/dto" + common "go-admin/common/models" +) + +type SysContentSearch struct { + dto.Pagination `search:"-"` + Name string `form:"name" search:"type:exact;column:name;table:sys_category" comment:"名称"` + Status string `form:"status" search:"type:exact;column:status;table:sys_category" comment:"状态"` +} + +func (m *SysContentSearch) GetNeedSearch() interface{} { + return *m +} + +func (m *SysContentSearch) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBind(m) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +func (m *SysContentSearch) Generate() dto.Index { + o := *m + return &o +} + +type SysContentControl struct { + ID int `uri:"ID" comment:""` // + CateId int `json:"cateId" comment:""` + Name string `json:"name" comment:""` + Status int `json:"status" comment:""` + Img string `json:"img" comment:""` + Content string `json:"content" comment:""` + Remark string `json:"remark" comment:""` + Sort int `json:"sort" comment:""` +} + +func (s *SysContentControl) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Debugf("ShouldBindUri error: %s", err.Error()) + return err + } + err = ctx.ShouldBind(s) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +func (s *SysContentControl) Generate() dto.Control { + cp := *s + return &cp +} + +func (s *SysContentControl) GenerateM() (common.ActiveRecord, error) { + return &models.SysContent{ + Model: common.Model{s.ID}, + CateId: s.CateId, + Name: s.Name, + Status: s.Status, + Img: s.Img, + Content: s.Content, + Remark: s.Remark, + Sort: s.Sort, + }, nil +} + +func (s *SysContentControl) GetId() interface{} { + return s.ID +} + +type SysContentById struct { + dto.ObjectById +} + +func (s *SysContentById) Generate() dto.Control { + cp := *s + return &cp +} + +func (s *SysContentById) GenerateM() (common.ActiveRecord, error) { + return &models.SysContent{}, nil +} \ No newline at end of file diff --git a/app/admin/service/dto/sys_dept.go b/app/admin/service/dto/sys_dept.go new file mode 100644 index 00000000..f9c652eb --- /dev/null +++ b/app/admin/service/dto/sys_dept.go @@ -0,0 +1,133 @@ +package dto + +import ( + "encoding/json" + + "github.com/gin-gonic/gin" + "github.com/gin-gonic/gin/binding" + "github.com/go-admin-team/go-admin-core/sdk/api" + + "go-admin/app/admin/models/system" + "go-admin/common/dto" +) + +// SysConfigSearch 列表或者搜索使用结构体 +type SysDeptSearch struct { + dto.Pagination `search:"-"` + DeptId int `form:"deptId" search:"type:exact;column:dept_id;table:sys_dept" comment:"id"` //id + ParentId int `form:"parentId" search:"type:exact;column:parent_id;table:sys_dept" comment:"上级部门"` //上级部门 + DeptPath string `form:"deptPath" search:"type:exact;column:dept_path;table:sys_dept" comment:""` //路径 + DeptName string `form:"deptName" search:"type:exact;column:dept_name;table:sys_dept" comment:"部门名称"` //部门名称 + Sort int `form:"sort" search:"type:exact;column:sort;table:sys_dept" comment:"排序"` //排序 + Leader string `form:"leader" search:"type:exact;column:leader;table:sys_dept" comment:"负责人"` //负责人 + Phone string `form:"phone" search:"type:exact;column:phone;table:sys_dept" comment:"手机"` //手机 + Email string `form:"email" search:"type:exact;column:email;table:sys_dept" comment:"邮箱"` //邮箱 + Status string `form:"status" search:"type:exact;column:status;table:sys_dept" comment:"状态"` //状态 +} + +func (m *SysDeptSearch) GetNeedSearch() interface{} { + return *m +} + +// Bind 映射上下文中的结构体数据 +func (m *SysDeptSearch) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBind(m) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +// SysConfigControl 增、改使用的结构体 +type SysDeptControl struct { + DeptId int `uri:"id" comment:"编码"` // 编码 + ParentId int `form:"parentId" comment:"上级部门"` //上级部门 + DeptPath string `form:"deptPath" comment:""` //路径 + DeptName string `form:"deptName" comment:"部门名称"` //部门名称 + Sort int `form:"sort" comment:"排序"` //排序 + Leader string `form:"leader" comment:"负责人"` //负责人 + Phone string `form:"phone" comment:"手机"` //手机 + Email string `form:"email" comment:"邮箱"` //邮箱 + Status string `form:"status" comment:"状态"` //状态 +} + +// Bind 映射上下文中的结构体数据 +func (s *SysDeptControl) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Debugf("ShouldBindUri error: %s", err.Error()) + return err + } + err = ctx.ShouldBindBodyWith(s, binding.JSON) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + var jsonStr []byte + jsonStr, err = json.Marshal(s) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + ctx.Set("body", string(jsonStr)) + return err +} + +// Generate 结构体数据转化 从 SysConfigControl 至 system.SysConfig 对应的模型 +func (s *SysDeptControl) Generate() (*system.SysDept, error) { + return &system.SysDept{ + DeptId: s.DeptId, + DeptName: s.DeptName, + ParentId: s.ParentId, + DeptPath: s.DeptPath, + Sort: s.Sort, + Leader: s.Leader, + Phone: s.Phone, + Email: s.Email, + Status: s.Status, + }, nil +} + +// GetId 获取数据对应的ID +func (s *SysDeptControl) GetId() interface{} { + return s.DeptId +} + +// SysConfigById 获取单个或者删除的结构体 +type SysDeptById struct { + Id int `uri:"id"` + Ids []int `json:"ids"` +} + +func (s *SysDeptById) Generate() *SysDeptById { + cp := *s + return &cp +} + +func (s *SysDeptById) GetId() interface{} { + return s.Id +} + +func (s *SysDeptById) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Debugf("ShouldBindUri error: %s", err.Error()) + return err + } + err = ctx.ShouldBind(s) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +func (s *SysDeptById) GenerateM() (*system.SysDept, error) { + return &system.SysDept{}, nil +} + +type DeptLabel struct { + Id int `gorm:"-" json:"id"` + Label string `gorm:"-" json:"label"` + Children []DeptLabel `gorm:"-" json:"children"` +} diff --git a/app/admin/service/dto/sys_dict_data.go b/app/admin/service/dto/sys_dict_data.go new file mode 100644 index 00000000..130d5910 --- /dev/null +++ b/app/admin/service/dto/sys_dict_data.go @@ -0,0 +1,126 @@ +package dto + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/api" + + "go-admin/app/admin/models/system" + "go-admin/common/dto" + common "go-admin/common/models" +) + +type SysDictDataSearch struct { + dto.Pagination `search:"-"` + Id int `form:"id" search:"type:exact;column:dict_code;table:sys_dict_data" comment:""` + DictLabel string `form:"dictLabel" search:"type:contains;column:dict_label;table:sys_dict_data" comment:""` + DictValue string `form:"dictValue" search:"type:contains;column:dict_value;table:sys_dict_data" comment:""` + DictType string `form:"dictType" search:"type:contains;column:dict_type;table:sys_dict_data" comment:""` + Status string `form:"status" search:"type:exact;column:status;table:sys_dict_data" comment:""` +} + +func (m *SysDictDataSearch) GetNeedSearch() interface{} { + return *m +} + +func (m *SysDictDataSearch) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBind(m) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +func (m *SysDictDataSearch) Generate() dto.Index { + o := *m + return &o +} + +type SysDictDataControl struct { + Id int `uri:"dictCode" comment:""` + DictSort int `json:"dictSort" comment:""` + DictLabel string `json:"dictLabel" comment:""` + DictValue string `json:"dictValue" comment:""` + DictType string `json:"dictType" comment:""` + CssClass string `json:"cssClass" comment:""` + ListClass string `json:"listClass" comment:""` + IsDefault string `json:"isDefault" comment:""` + Status string `json:"status" comment:""` + Default string `json:"default" comment:""` + Remark string `json:"remark" comment:""` +} + +func (s *SysDictDataControl) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Debugf("ShouldBindUri error: %s", err.Error()) + return err + } + err = ctx.ShouldBind(s) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +func (s *SysDictDataControl) Generate() dto.Control { + cp := *s + return &cp +} + +func (s *SysDictDataControl) GenerateM() (common.ActiveRecord, error) { + return &system.SysDictData{ + DictCode: s.Id, + DictSort: s.DictSort, + DictLabel: s.DictLabel, + DictValue: s.DictValue, + DictType: s.DictType, + CssClass: s.CssClass, + ListClass: s.ListClass, + IsDefault: s.IsDefault, + Status: s.Status, + Default: s.Default, + Remark: s.Remark, + }, nil +} + +func (s *SysDictDataControl) GetId() interface{} { + return s.Id +} + +type SysDictDataById struct { + Id int `uri:"dictCode"` + Ids []int `json:"ids"` +} + +func (s *SysDictDataById) Bind(ctx *gin.Context) error { + if ctx.Request.Method == http.MethodDelete { + err := ctx.ShouldBind(&s.Ids) + if err != nil { + return err + } + if len(s.Ids) > 0 { + return nil + } + } + return ctx.ShouldBindUri(s) +} + +func (s *SysDictDataById) GetId() interface{} { + if len(s.Ids) > 0 { + return s.Ids + } + return s.Id +} + +func (s *SysDictDataById) Generate() dto.Control { + cp := *s + return &cp +} + +func (s *SysDictDataById) GenerateM() (common.ActiveRecord, error) { + return &system.SysDictData{}, nil +} diff --git a/app/admin/service/dto/sys_dict_type.go b/app/admin/service/dto/sys_dict_type.go new file mode 100644 index 00000000..377a7dd7 --- /dev/null +++ b/app/admin/service/dto/sys_dict_type.go @@ -0,0 +1,95 @@ +package dto + +import ( + "github.com/gin-gonic/gin" + + "github.com/go-admin-team/go-admin-core/sdk/api" + "go-admin/app/admin/models/system" + "go-admin/common/dto" + common "go-admin/common/models" +) + +type SysDictTypeSearch struct { + dto.Pagination `search:"-"` + DictId []int `form:"dictId" search:"type:in;column:dict_id;table:sys_dict_type"` + DictName string `form:"dictName" search:"type:icontains;column:dict_name;table:sys_dict_type"` + DictType string `form:"dictType" search:"type:icontains;column:dict_type;table:sys_dict_type"` + Status int `form:"status" search:"type:exact;column:status;table:sys_dict_type"` +} + +func (m *SysDictTypeSearch) GetNeedSearch() interface{} { + return *m +} + +func (m *SysDictTypeSearch) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBind(m) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +func (m *SysDictTypeSearch) Generate() dto.Index { + o := *m + return &o +} + +type SysDictTypeControl struct { + Id int `uri:"id" comment:""` // + + DictName string `json:"dictName" comment:""` + + DictType string `json:"dictType" comment:""` + + Status string `json:"status" comment:""` + + Remark string `json:"remark" comment:""` +} + +func (s *SysDictTypeControl) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Debugf("ShouldBindUri error: %s", err.Error()) + return err + } + err = ctx.ShouldBind(s) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +func (s *SysDictTypeControl) Generate() dto.Control { + cp := *s + return &cp +} + +func (s *SysDictTypeControl) GenerateM() (common.ActiveRecord, error) { + return &system.SysDictType{ + + ID: s.Id, + DictName: s.DictName, + DictType: s.DictType, + Status: s.Status, + Remark: s.Remark, + }, nil +} + +func (s *SysDictTypeControl) GetId() interface{} { + return s.Id +} + +type SysDictTypeById struct { + dto.ObjectById +} + +func (s *SysDictTypeById) Generate() dto.Control { + cp := *s + return &cp +} + +func (s *SysDictTypeById) GenerateM() (common.ActiveRecord, error) { + return &system.SysDictType{}, nil +} diff --git a/app/admin/service/dto/sys_file_dir.go b/app/admin/service/dto/sys_file_dir.go new file mode 100644 index 00000000..834258cf --- /dev/null +++ b/app/admin/service/dto/sys_file_dir.go @@ -0,0 +1,99 @@ +package dto + +import ( + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/api" + + "go-admin/app/admin/models" + "go-admin/common/dto" + common "go-admin/common/models" +) + +type SysFileDirSearch struct { + dto.Pagination `search:"-"` + + ID int `form:"Id" search:"type:exact;column:id;table:sys_file_dir" comment:"标识"` + Label string `form:"label" search:"type:exact;column:label;table:sys_file_dir" comment:"目录名称"` + PId string `form:"pId" search:"type:exact;column:p_id;table:sys_file_dir" comment:"上级目录"` + //Sort string `form:"sort" search:"type:exact;column:sort;table:sys_file_dir" comment:"排序"` + Path string `form:"path" search:"type:exact;column:path;table:sys_file_dir" comment:"路径"` +} + +func (m *SysFileDirSearch) GetNeedSearch() interface{} { + return *m +} + +func (m *SysFileDirSearch) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBind(m) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +func (m *SysFileDirSearch) Generate() dto.Index { + o := *m + return &o +} + +type SysFileDirControl struct { + ID int `uri:"Id" comment:"标识"` // 标识 + Label string `json:"label" comment:"目录名称"` + PId int `json:"pId" comment:"上级目录"` + Sort string `json:"sort" comment:"排序"` + Path string `json:"path" comment:"路径"` + CreateBy int `json:"-"` + UpdateBy int `json:"-"` +} + +func (s *SysFileDirControl) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Debugf("ShouldBindUri error: %s", err.Error()) + return err + } + err = ctx.ShouldBind(s) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +func (s *SysFileDirControl) Generate() dto.Control { + cp := *s + return &cp +} + +func (s *SysFileDirControl) GenerateM() (common.ActiveRecord, error) { + return &models.SysFileDir{ + Model: common.Model{Id: s.ID}, + Label: s.Label, + PId: s.PId, + //Sort: s.Sort, + Path: s.Path, + ControlBy: common.ControlBy{ + CreateBy: s.CreateBy, + UpdateBy: s.UpdateBy, + }, + }, nil +} + +func (s *SysFileDirControl) GetId() interface{} { + return s.ID +} + +type SysFileDirById struct { + dto.ObjectById + UpdateBy int `json:"-"` +} + +func (s *SysFileDirById) Generate() dto.Control { + cp := *s + return &cp +} + +func (s *SysFileDirById) GenerateM() (common.ActiveRecord, error) { + return &models.SysFileDir{}, nil +} diff --git a/app/admin/service/dto/sys_file_info.go b/app/admin/service/dto/sys_file_info.go new file mode 100644 index 00000000..ba6e4bdc --- /dev/null +++ b/app/admin/service/dto/sys_file_info.go @@ -0,0 +1,52 @@ +package dto + +import ( + "go-admin/app/admin/models" + "go-admin/common/dto" + common "go-admin/common/models" +) + +type SysFileInfoSearch struct { + dto.Pagination `search:"-"` + ID int `form:"Id" search:"type:exact;column:id;table:sys_file_info" comment:"标识"` + Type string `form:"type" search:"type:exact;column:type;table:sys_file_info" comment:"类型"` + Name string `form:"name" search:"type:exact;column:name;table:sys_file_info" comment:"名称"` + PId string `form:"pId" search:"type:exact;column:p_id;table:sys_file_info" comment:"目录"` + Source string `form:"source" search:"type:exact;column:source;table:sys_file_info" comment:"来源"` +} + +func (m *SysFileInfoSearch) GetNeedSearch() interface{} { + return *m +} + +type SysFileInfoControl struct { + ID int `uri:"id" comment:"标识"` // 标识 + Type string `json:"type" comment:"类型"` + Name string `json:"name" comment:"名称"` + Size string `json:"size" comment:"大小"` + PId int `json:"pId" comment:"目录"` + Source string `json:"source" comment:"来源"` + Url string `json:"url" comment:"地址"` + FullUrl string `json:"fullUrl" comment:"全地址"` + CreateBy int `json:"-"` + UpdateBy int `json:"-"` +} + +func (s *SysFileInfoControl) Generate() (*models.SysFileInfo, error) { + return &models.SysFileInfo{ + Model: common.Model{Id: s.ID}, + Type: s.Type, + Name: s.Name, + Size: s.Size, + PId: s.PId, + Source: s.Source, + Url: s.Url, + FullUrl: s.FullUrl, + ControlBy: common.ControlBy{CreateBy: s.CreateBy, UpdateBy: s.UpdateBy}, + }, nil +} + +type SysFileInfoById struct { + dto.ObjectById + UpdateBy int `json:"-"` +} diff --git a/app/admin/service/dto/sysjob.go b/app/admin/service/dto/sys_job.go similarity index 94% rename from app/admin/service/dto/sysjob.go rename to app/admin/service/dto/sys_job.go index 7ae6fd95..6953cab8 100644 --- a/app/admin/service/dto/sysjob.go +++ b/app/admin/service/dto/sys_job.go @@ -2,10 +2,10 @@ package dto import ( "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/api" "go-admin/app/admin/models" "go-admin/common/dto" - "go-admin/common/log" common "go-admin/common/models" ) @@ -24,9 +24,10 @@ func (m *SysJobSearch) GetNeedSearch() interface{} { } func (m *SysJobSearch) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) err := ctx.ShouldBind(m) if err != nil { - log.Errorf("MsgID[%s] Bind error: %s", err) + log.Errorf("Bind error: %s", err) } return err } @@ -37,7 +38,7 @@ func (m *SysJobSearch) Generate() dto.Index { } type SysJobControl struct { - JobId uint `json:"jobId"` + JobId int `json:"jobId"` JobName string `json:"jobName" validate:"required"` // 名称 JobGroup string `json:"jobGroup"` // 任务分组 JobType int `json:"jobType"` // 任务类型 @@ -93,7 +94,7 @@ func (s *SysJobById) GenerateM() (common.ActiveRecord, error) { } type SysJobItem struct { - JobId uint `json:"jobId"` + JobId int `json:"jobId"` JobName string `json:"jobName" validate:"required"` // 名称 JobGroup string `json:"jobGroup"` // 任务分组 JobType int `json:"jobType"` // 任务类型 diff --git a/app/admin/service/dto/sys_login_log.go b/app/admin/service/dto/sys_login_log.go new file mode 100644 index 00000000..19847130 --- /dev/null +++ b/app/admin/service/dto/sys_login_log.go @@ -0,0 +1,113 @@ +package dto + +import ( + "time" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/api" + + "go-admin/app/admin/models/system" + "go-admin/common/dto" + common "go-admin/common/models" +) + +type SysLoginLogSearch struct { + dto.Pagination `search:"-"` + Username string `form:"username" search:"type:exact;column:username;table:sys_login_log" comment:"用户名"` + Status string `form:"status" search:"type:exact;column:status;table:sys_login_log" comment:"状态"` + Ipaddr string `form:"ipaddr" search:"type:exact;column:ipaddr;table:sys_login_log" comment:"ip地址"` + LoginLocation string `form:"loginLocation" search:"type:exact;column:login_location;table:sys_login_log" comment:"归属地"` +} + +func (m *SysLoginLogSearch) GetNeedSearch() interface{} { + return *m +} + +func (m *SysLoginLogSearch) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBind(m) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +type SysLoginLogControl struct { + ID int `uri:"Id" comment:"主键"` // 主键 + Username string `json:"username" comment:"用户名"` + Status string `json:"status" comment:"状态"` + Ipaddr string `json:"ipaddr" comment:"ip地址"` + LoginLocation string `json:"loginLocation" comment:"归属地"` + Browser string `json:"browser" comment:"浏览器"` + Os string `json:"os" comment:"系统"` + Platform string `json:"platform" comment:"固件"` + LoginTime time.Time `json:"loginTime" comment:"登录时间"` + Remark string `json:"remark" comment:"备注"` + Msg string `json:"msg" comment:"信息"` +} + +func (s *SysLoginLogControl) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Debugf("ShouldBindUri error: %s", err.Error()) + return err + } + err = ctx.ShouldBind(s) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +func (s *SysLoginLogControl) Generate() (*system.SysLoginLog, error) { + return &system.SysLoginLog{ + Model: common.Model{Id: s.ID}, + Username: s.Username, + Status: s.Status, + Ipaddr: s.Ipaddr, + LoginLocation: s.LoginLocation, + Browser: s.Browser, + Os: s.Os, + Platform: s.Platform, + LoginTime: s.LoginTime, + Remark: s.Remark, + Msg: s.Msg, + }, nil +} + +func (s *SysLoginLogControl) GetId() interface{} { + return s.ID +} + +type SysLoginLogById struct { + Id int `uri:"id"` + Ids []int `json:"ids"` +} + +func (s *SysLoginLogById) GetId() interface{} { + return s.Id +} + +func (s *SysLoginLogById) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Debugf("ShouldBindUri error: %s", err.Error()) + return err + } + err = ctx.ShouldBind(&s.Ids) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +func (s *SysLoginLogById) Generate() *SysLoginLogById { + cp := *s + return &cp +} + +func (s *SysLoginLogById) GenerateM() (*system.SysLoginLog, error) { + return &system.SysLoginLog{}, nil +} diff --git a/app/admin/service/dto/sys_menu.go b/app/admin/service/dto/sys_menu.go new file mode 100644 index 00000000..dbf57569 --- /dev/null +++ b/app/admin/service/dto/sys_menu.go @@ -0,0 +1,155 @@ +package dto + +import ( + "encoding/json" + + "github.com/gin-gonic/gin" + "github.com/gin-gonic/gin/binding" + "github.com/go-admin-team/go-admin-core/sdk/api" + + "go-admin/app/admin/models/system" + "go-admin/common/dto" +) + +// SysMenuSearch 列表或者搜索使用结构体 +type SysMenuSearch struct { + dto.Pagination `search:"-"` + ParentId int `form:"parentId" search:"type:exact;column:parent_id;table:sys_dept" comment:"上级部门"` //上级部门 + DeptPath string `form:"deptPath" search:"type:exact;column:dept_path;table:sys_dept" comment:""` //路径 + DeptName string `form:"deptName" search:"type:exact;column:dept_name;table:sys_dept" comment:"部门名称"` //部门名称 + Sort int `form:"sort" search:"type:exact;column:sort;table:sys_dept" comment:"排序"` //排序 + Leader string `form:"leader" search:"type:exact;column:leader;table:sys_dept" comment:"负责人"` //负责人 + Phone string `form:"phone" search:"type:exact;column:phone;table:sys_dept" comment:"手机"` //手机 + Email string `form:"email" search:"type:exact;column:email;table:sys_dept" comment:"邮箱"` //邮箱 + Status string `form:"status" search:"type:exact;column:status;table:sys_dept" comment:"状态"` //状态 +} + +func (m *SysMenuSearch) GetNeedSearch() interface{} { + return *m +} + +// Bind 映射上下文中的结构体数据 +func (m *SysMenuSearch) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBind(m) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +// SysConfigControl 增、改使用的结构体 +type SysMenuControl struct { + MenuId int `uri:"id" comment:"编码"` // 编码 + MenuName string `form:"menuName" comment:"菜单name"` //菜单name + Title string `form:"title" comment:"显示名称"` //显示名称 + Icon string `form:"icon" comment:"图标"` //图标 + Path string `form:"path" comment:"路径"` //路径 + Paths string `form:"paths" comment:"id路径"` //id路径 + MenuType string `form:"menuType" comment:"菜单类型"` //菜单类型 + Action string `form:"action" comment:"请求方式"` //请求方式 + Permission string `form:"permission" comment:"权限编码"` //权限编码 + ParentId int `form:"parentId" comment:"上级菜单"` //上级菜单 + NoCache bool `form:"noCache" comment:"是否缓存"` //是否缓存 + Breadcrumb string `form:"breadcrumb" comment:"是否面包屑"` //是否面包屑 + Component string `form:"component" comment:"组件"` //组件 + Sort int `form:"sort" comment:"排序"` //排序 + Visible string `form:"visible" comment:"是否显示"` //是否显示 + IsFrame string `form:"isFrame" comment:"是否frame"` //是否frame +} + +// Bind 映射上下文中的结构体数据 +func (s *SysMenuControl) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Debugf("ShouldBindUri error: %s", err.Error()) + return err + } + err = ctx.ShouldBindBodyWith(s, binding.JSON) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + var jsonStr []byte + jsonStr, err = json.Marshal(s) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + ctx.Set("body", string(jsonStr)) + return err +} + +// Generate 结构体数据转化 从 SysConfigControl 至 system.SysConfig 对应的模型 +func (s *SysMenuControl) Generate() (*system.SysMenu, error) { + return &system.SysMenu{ + MenuId: s.MenuId, + MenuName: s.MenuName, + Title: s.Title, + Icon: s.Icon, + Path: s.Path, + Paths: s.Paths, + MenuType: s.MenuType, + Action: s.Action, + Permission: s.Permission, + ParentId: s.ParentId, + NoCache: s.NoCache, + Breadcrumb: s.Breadcrumb, + Component: s.Component, + Sort: s.Sort, + Visible: s.Visible, + IsFrame: s.IsFrame, + }, nil +} + +// GetId 获取数据对应的ID +func (s *SysMenuControl) GetId() interface{} { + return s.MenuId +} + +// SysConfigById 获取单个或者删除的结构体 +type SysMenuById struct { + Id int `uri:"id"` + Ids []int `json:"ids"` +} + +func (s *SysMenuById) Generate() *SysMenuById { + cp := *s + return &cp +} + +func (s *SysMenuById) GetId() interface{} { + return s.Id +} + +func (s *SysMenuById) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Debugf("ShouldBindUri error: %s", err.Error()) + return err + } + err = ctx.ShouldBind(s) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +func (s *SysMenuById) GenerateM() (*system.SysMenu, error) { + return &system.SysMenu{}, nil +} + +type MenuLabel struct { + Id int `json:"id" gorm:"-"` + Label string `json:"label" gorm:"-"` + Children []MenuLabel `json:"children" gorm:"-"` +} + +type MenuRole struct { + system.SysMenus + IsSelect bool `json:"is_select" gorm:"-"` +} + +type SelectRole struct { + RoleId int `uri:"roleId"` +} diff --git a/app/admin/service/dto/sys_opera_log.go b/app/admin/service/dto/sys_opera_log.go new file mode 100644 index 00000000..3d1c23df --- /dev/null +++ b/app/admin/service/dto/sys_opera_log.go @@ -0,0 +1,130 @@ +package dto + +import ( + "time" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/api" + + "go-admin/app/admin/models/system" + "go-admin/common/dto" + common "go-admin/common/models" +) + +type SysOperaLogSearch struct { + dto.Pagination `search:"-"` + + Title string `form:"title" search:"type:contains;column:title;table:sys_opera_log" comment:"操作模块"` + Method string `form:"method" search:"type:contains;column:method;table:sys_opera_log" comment:"函数"` + RequestMethod string `form:"requestMethod" search:"type:contains;column:request_method;table:sys_opera_log" comment:"请求方式"` + OperUrl string `form:"operUrl" search:"type:contains;column:oper_url;table:sys_opera_log" comment:"访问地址"` + OperIp string `form:"operIp" search:"type:exact;column:oper_ip;table:sys_opera_log" comment:"客户端ip"` +} + +func (m *SysOperaLogSearch) GetNeedSearch() interface{} { + return *m +} + +func (m *SysOperaLogSearch) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBind(m) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +type SysOperaLogControl struct { + ID int `uri:"Id" comment:"编码"` // 编码 + Title string `json:"title" comment:"操作模块"` + BusinessType string `json:"businessType" comment:"操作类型"` + BusinessTypes string `json:"businessTypes" comment:""` + Method string `json:"method" comment:"函数"` + RequestMethod string `json:"requestMethod" comment:"请求方式"` + OperatorType string `json:"operatorType" comment:"操作类型"` + OperName string `json:"operName" comment:"操作者"` + DeptName string `json:"deptName" comment:"部门名称"` + OperUrl string `json:"operUrl" comment:"访问地址"` + OperIp string `json:"operIp" comment:"客户端ip"` + OperLocation string `json:"operLocation" comment:"访问位置"` + OperParam string `json:"operParam" comment:"请求参数"` + Status string `json:"status" comment:"操作状态"` + OperTime time.Time `json:"operTime" comment:"操作时间"` + JsonResult string `json:"jsonResult" comment:"返回数据"` + Remark string `json:"remark" comment:"备注"` + LatencyTime string `json:"latencyTime" comment:"耗时"` + UserAgent string `json:"userAgent" comment:"ua"` +} + +func (s *SysOperaLogControl) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Debugf("ShouldBindUri error: %s", err.Error()) + return err + } + err = ctx.ShouldBind(s) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +func (s *SysOperaLogControl) Generate() (*system.SysOperaLog, error) { + return &system.SysOperaLog{ + Model: common.Model{Id: s.ID}, + Title: s.Title, + BusinessType: s.BusinessType, + BusinessTypes: s.BusinessTypes, + Method: s.Method, + RequestMethod: s.RequestMethod, + OperatorType: s.OperatorType, + OperName: s.OperName, + DeptName: s.DeptName, + OperUrl: s.OperUrl, + OperIp: s.OperIp, + OperLocation: s.OperLocation, + OperParam: s.OperParam, + Status: s.Status, + OperTime: s.OperTime, + JsonResult: s.JsonResult, + Remark: s.Remark, + LatencyTime: s.LatencyTime, + UserAgent: s.UserAgent, + }, nil +} + +func (s *SysOperaLogControl) GetId() interface{} { + return s.ID +} + +type SysOperaLogById struct { + Id int `uri:"id"` + Ids []int `json:"ids"` +} + +func (s *SysOperaLogById) GetId() interface{} { + if len(s.Ids) > 0 { + s.Ids = append(s.Ids, s.Id) + return s.Ids + } + return s.Id +} + +func (s *SysOperaLogById) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Debugf("ShouldBindUri error: %s", err.Error()) + return err + } + err = ctx.ShouldBind(&s.Ids) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +func (s *SysOperaLogById) SetUpdateBy(id int) { + +} diff --git a/app/admin/service/dto/sys_post.go b/app/admin/service/dto/sys_post.go new file mode 100644 index 00000000..95cc81f2 --- /dev/null +++ b/app/admin/service/dto/sys_post.go @@ -0,0 +1,118 @@ +package dto + +import ( + "encoding/json" + + "github.com/gin-gonic/gin" + "github.com/gin-gonic/gin/binding" + "github.com/go-admin-team/go-admin-core/sdk/api" + + "go-admin/app/admin/models/system" + "go-admin/common/dto" +) + +// SysPostSearch 列表或者搜索使用结构体 +type SysPostSearch struct { + dto.Pagination `search:"-"` + PostId int `form:"postId" search:"type:exact;column:post_id;table:sys_post" comment:"id"` // id + PostName string `form:"postName" search:"type:exact;column:post_name;table:sys_post" comment:"名称"` // 名称 + PostCode string `form:"postCode" search:"type:exact;column:post_code;table:sys_post" comment:"编码"` // 编码 + Sort int `form:"sort" search:"type:exact;column:sort;table:sys_post" comment:"排序"` // 排序 + Status int `form:"status" search:"type:exact;column:status;table:sys_post" comment:"状态"` // 状态 + Remark string `form:"remark" search:"type:exact;column:remark;table:sys_post" comment:"备注"` // 备注 +} + +func (m *SysPostSearch) GetNeedSearch() interface{} { + return *m +} + +// Bind 映射上下文中的结构体数据 +func (m *SysPostSearch) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBind(m) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +// SysConfigControl 增、改使用的结构体 +type SysPostControl struct { + PostId int `uri:"id" comment:"id"` // id + PostName string `form:"postName" comment:"名称"` // 名称 + PostCode string `form:"postCode" comment:"编码"` // 编码 + Sort int `form:"sort" comment:"排序"` // 排序 + Status int `form:"status" comment:"状态"` // 状态 + Remark string `form:"remark" comment:"备注"` // 备注 +} + +// Bind 映射上下文中的结构体数据 +func (s *SysPostControl) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Debugf("ShouldBindUri error: %s", err.Error()) + return err + } + err = ctx.ShouldBindBodyWith(s, binding.JSON) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + var jsonStr []byte + jsonStr, err = json.Marshal(s) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + ctx.Set("body", string(jsonStr)) + return err +} + +// Generate 结构体数据转化 从 SysConfigControl 至 system.SysConfig 对应的模型 +func (s *SysPostControl) Generate() (*system.SysPost, error) { + return &system.SysPost{ + PostId: s.PostId, + PostName: s.PostName, + PostCode: s.PostCode, + Sort: s.Sort, + Status: s.Status, + Remark: s.Remark, + }, nil +} + +// GetId 获取数据对应的ID +func (s *SysPostControl) GetId() interface{} { + return s.PostId +} + +// SysConfigById 获取单个或者删除的结构体 +type SysPostById struct { + Id int `uri:"id"` + Ids []int `json:"ids"` +} + +func (s *SysPostById) Generate() *SysPostById { + cp := *s + return &cp +} + +func (s *SysPostById) GetId() interface{} { + return s.Id +} + +func (s *SysPostById) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Debugf("ShouldBindUri error: %s", err.Error()) + return err + } + err = ctx.ShouldBind(s) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +func (s *SysPostById) GenerateM() (*system.SysPost, error) { + return &system.SysPost{}, nil +} diff --git a/app/admin/service/dto/sys_role.go b/app/admin/service/dto/sys_role.go new file mode 100644 index 00000000..0b8b98f0 --- /dev/null +++ b/app/admin/service/dto/sys_role.go @@ -0,0 +1,126 @@ +package dto + +import ( + "encoding/json" + + "github.com/gin-gonic/gin" + "github.com/gin-gonic/gin/binding" + "github.com/go-admin-team/go-admin-core/sdk/api" + + "go-admin/app/admin/models/system" + "go-admin/common/dto" +) + +// SysRoleSearch 列表或者搜索使用结构体 +type SysRoleSearch struct { + dto.Pagination `search:"-"` + + RoleId int `form:"roleId" search:"type:exact;column:role_id;table:sys_role" comment:"角色编码"` // 角色编码 + RoleName string `form:"roleName" search:"type:exact;column:role_name;table:sys_role" comment:"角色名称"` // 角色名称 + Status string `form:"status" search:"type:exact;column:status;table:sys_role" comment:"状态"` // 状态 + RoleKey string `form:"roleKey" search:"type:exact;column:role_key;table:sys_role" comment:"角色代码"` // 角色代码 + RoleSort int `form:"roleSort" search:"type:exact;column:role_sort;table:sys_role" comment:"角色排序"` // 角色排序 + Flag string `form:"flag" search:"type:exact;column:flag;table:sys_role" comment:"标记"` // 标记 + Remark string `form:"remark" search:"type:exact;column:remark;table:sys_role" comment:"备注"` // 备注 + Admin bool `form:"admin" search:"type:exact;column:admin;table:sys_role" comment:"是否管理员"` + DataScope string `form:"dataScope" search:"type:exact;column:data_scope;table:sys_role" comment:"是否管理员"` +} + +func (m *SysRoleSearch) GetNeedSearch() interface{} { + return *m +} + +// Bind 映射上下文中的结构体数据 +func (m *SysRoleSearch) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBind(m) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +// SysConfigControl 增、改使用的结构体 +type SysRoleControl struct { + RoleId int `uri:"id" comment:"角色编码"` // 角色编码 + RoleName string `form:"roleName" comment:"角色名称"` // 角色名称 + Status string `form:"status" comment:"状态"` // 状态 + RoleKey string `form:"roleKey" comment:"角色代码"` // 角色代码 + RoleSort int `form:"roleSort" comment:"角色排序"` // 角色排序 + Flag string `form:"flag" comment:"标记"` // 标记 + Remark string `form:"remark" comment:"备注"` // 备注 + Admin bool `form:"admin" comment:"是否管理员"` + DataScope string `form:"dataScope"` + MenuIds []int `json:"menuIds"` +} + +// Bind 映射上下文中的结构体数据 +func (s *SysRoleControl) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBindBodyWith(s, binding.JSON) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + err = ctx.ShouldBindUri(s) + if err != nil { + log.Debugf("ShouldBindUri error: %s", err.Error()) + return err + } + var jsonStr []byte + jsonStr, err = json.Marshal(s) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + ctx.Set("body", string(jsonStr)) + return err +} + +// Generate 结构体数据转化 从 SysConfigControl 至 system.SysConfig 对应的模型 +func (s *SysRoleControl) Generate() (*system.SysRole, error) { + return &system.SysRole{ + RoleId: s.RoleId, + RoleName: s.RoleName, + Status: s.Status, + RoleKey: s.RoleKey, + RoleSort: s.RoleSort, + Flag: s.Flag, + Remark: s.Remark, + Admin: s.Admin, + DataScope: s.DataScope, + MenuIds: s.MenuIds, + }, nil +} + +// GetId 获取数据对应的ID +func (s *SysRoleControl) GetId() interface{} { + return s.RoleId +} + +// SysConfigById 获取单个或者删除的结构体 +type SysRoleById struct { + dto.ObjectById +} + +func (s *SysRoleById) Generate() *SysRoleById { + cp := *s + return &cp +} + +func (s *SysRoleById) GetId() interface{} { + return s.Id +} + +func (s *SysRoleById) GenerateM() (*system.SysRole, error) { + return &system.SysRole{}, nil +} + +// RoleDataScopeReq 角色数据权限修改 +type RoleDataScopeReq struct { + RoleId int `json:"roleId" binding:"required"` + DataScope string `json:"dataScope" binding:"required"` + DeptIds []int `json:"deptIds"` +} + +type DeptIdList struct { + DeptId int `json:"DeptId"` +} \ No newline at end of file diff --git a/app/admin/service/dto/sys_setting.go b/app/admin/service/dto/sys_setting.go new file mode 100644 index 00000000..5a8c7716 --- /dev/null +++ b/app/admin/service/dto/sys_setting.go @@ -0,0 +1,88 @@ +package dto + +import ( + "encoding/json" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/api" + + "go-admin/app/admin/models" +) + +// SysConfigControl 增、改使用的结构体 +type SysSettingControl struct { + SettingsId int `json:"settings_id" binding:"required"` // 头像 + Name string `json:"name" binding:"required"` // 名称 + Logo string `json:"logo" binding:"required"` // 头像 +} + +// Bind 映射上下文中的结构体数据 +func (s *SysSettingControl) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + + err := ctx.ShouldBind(s) + if err != nil { + log.Errorf("ShouldBind error: %s", err.Error()) + return err + } + + err = ctx.ShouldBindUri(s) + if err != nil { + log.Errorf("ShouldBindUri error: %s", err.Error()) + return err + } + var jsonStr []byte + jsonStr, err = json.Marshal(s) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + ctx.Set("body", string(jsonStr)) + return err +} + +// Generate 结构体数据转化 从 SysConfigControl 至 system.SysConfig 对应的模型 +func (s *SysSettingControl) Generate() (*models.SysSetting, error) { + return &models.SysSetting{ + SettingsId: s.SettingsId, + Name: s.Name, + Logo: s.Logo, + }, nil +} + +// GetId 获取数据对应的ID +func (s *SysSettingControl) GetId() interface{} { + return s.SettingsId +} + +// SysConfigById 获取单个或者删除的结构体 +type SysSettingById struct { + Id int `uri:"id"` + Ids []int `json:"ids"` +} + +func (s *SysSettingById) Generate() *SysSettingById { + cp := *s + return &cp +} + +func (s *SysSettingById) GetId() interface{} { + return s.Id +} + +func (s *SysSettingById) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Debugf("ShouldBindUri error: %s", err.Error()) + return err + } + err = ctx.ShouldBind(s) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +func (s *SysSettingById) GenerateM() (*models.SysSetting, error) { + return &models.SysSetting{}, nil +} diff --git a/app/admin/service/dto/sys_user.go b/app/admin/service/dto/sys_user.go new file mode 100644 index 00000000..97826aca --- /dev/null +++ b/app/admin/service/dto/sys_user.go @@ -0,0 +1,118 @@ +package dto + +import ( + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/api" + + "go-admin/app/admin/models/system" + "go-admin/common/dto" + common "go-admin/common/models" +) + +type SysUserSearch struct { + dto.Pagination `search:"-"` + UserId int `form:"UserId" search:"type:exact;column:user_id;table:sys_user" comment:"用户ID"` + Username string `form:"username" search:"type:contains;column:username;table:sys_user" comment:"用户名"` + NickName string `form:"nickName" search:"type:contains;column:nick_name;table:sys_user" comment:"昵称"` + Phone string `form:"phone" search:"type:contains;column:phone;table:sys_user" comment:"手机号"` + RoleId string `form:"roleId" search:"type:exact;column:role_id;table:sys_user" comment:"角色ID"` + Sex string `form:"sex" search:"type:exact;column:sex;table:sys_user" comment:"性别"` + Email string `form:"email" search:"type:contains;column:email;table:sys_user" comment:"邮箱"` + DeptId string `form:"deptId" search:"type:exact;column:dept_id;table:sys_user" comment:"部门"` + PostId string `form:"postId" search:"type:exact;column:post_id;table:sys_user" comment:"岗位"` + Status string `form:"status" search:"type:exact;column:status;table:sys_user" comment:"状态"` +} + +func (m *SysUserSearch) GetNeedSearch() interface{} { + return *m +} + +func (m *SysUserSearch) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBind(m) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +func (m *SysUserSearch) Generate() dto.Index { + o := *m + return &o +} + +type SysUserControl struct { + UserId int `json:"userId" comment:"用户ID"` // 用户ID + Username string `json:"username" comment:"用户名"` + Password string `json:"password" comment:"密码"` + NickName string `json:"nickName" comment:"昵称"` + Phone string `json:"phone" comment:"手机号"` + RoleId int `json:"roleId" comment:"角色ID"` + Avatar string `json:"avatar" comment:"头像"` + Sex string `json:"sex" comment:"性别"` + Email string `json:"email" comment:"邮箱"` + DeptId int `json:"deptId" comment:"部门"` + PostId int `json:"postId" comment:"岗位"` + Remark string `json:"remark" comment:"备注"` + Status string `json:"status" comment:"状态"` +} + +func (s *SysUserControl) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + //err := ctx.ShouldBindUri(s) + //if err != nil { + // log.Debugf("ShouldBindUri error: %s", err.Error()) + // return err + //} + err := ctx.ShouldBind(s) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +func (s *SysUserControl) Generate() dto.Control { + cp := *s + return &cp +} + +func (s *SysUserControl) GenerateM() (common.ActiveRecord, error) { + return &system.SysUser{ + UserId: s.UserId, + Username: s.Username, + Password: s.Password, + NickName: s.NickName, + Phone: s.Phone, + RoleId: s.RoleId, + Avatar: s.Avatar, + Sex: s.Sex, + Email: s.Email, + DeptId: s.DeptId, + PostId: s.PostId, + Remark: s.Remark, + Status: s.Status, + }, nil +} + +func (s *SysUserControl) GetId() interface{} { + return s.UserId +} + +type SysUserById struct { + dto.ObjectById +} + +func (s *SysUserById) Generate() dto.Control { + cp := *s + return &cp +} + +func (s *SysUserById) GenerateM() (common.ActiveRecord, error) { + return &system.SysUser{}, nil +} + +// PassWord 密码 +type PassWord struct { + NewPassword string `json:"newPassword" binding:"required"` + OldPassword string `json:"oldPassword" binding:"required"` +} diff --git a/app/admin/service/dto/syschinaareadata.go b/app/admin/service/dto/syschinaareadata.go new file mode 100644 index 00000000..773571e8 --- /dev/null +++ b/app/admin/service/dto/syschinaareadata.go @@ -0,0 +1,98 @@ +package dto + +import ( + "time" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/api" + + "go-admin/app/admin/models" + "go-admin/common/dto" + common "go-admin/common/models" +) + +type SysChinaAreaDataSearch struct { + dto.Pagination `search:"-"` + PId string `form:"pId" search:"type:exact;column:p_id;table:sys_china_area_data" comment:"上级编码"` + Name string `form:"name" search:"type:exact;column:name;table:sys_china_area_data" comment:"名称"` +} + +func (m *SysChinaAreaDataSearch) GetNeedSearch() interface{} { + return *m +} + +func (m *SysChinaAreaDataSearch) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBind(m) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +type SysChinaAreaDataControl struct { + Id int `uri:"id" comment:"编码"` // 编码 + PId string `json:"pId" comment:"上级编码"` + Name string `json:"name" comment:"名称"` + CreateTime time.Time `json:"createTime" comment:""` + UpdateTime time.Time `json:"updateTime" comment:""` + DeleteTime time.Time `json:"deleteTime" comment:""` +} + +func (s *SysChinaAreaDataControl) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Debugf("ShouldBindUri error: %s", err.Error()) + return err + } + err = ctx.ShouldBind(s) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +func (s *SysChinaAreaDataControl) Generate() (*models.SysChinaAreaData, error) { + return &models.SysChinaAreaData{ + + Model: common.Model{Id: s.Id}, + PId: s.PId, + Name: s.Name, + }, nil +} + +func (s *SysChinaAreaDataControl) GetId() interface{} { + return s.Id +} + +type SysChinaAreaDataById struct { + Id int `uri:"id"` + Ids []int `json:"ids"` +} + +func (s *SysChinaAreaDataById) GetId() interface{} { + if len(s.Ids) > 0 { + s.Ids = append(s.Ids, s.Id) + return s.Ids + } + return s.Id +} + +func (s *SysChinaAreaDataById) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Debugf("ShouldBindUri error: %s", err.Error()) + return err + } + err = ctx.ShouldBind(s) + if err != nil { + log.Debugf("ShouldBind error: %s", err.Error()) + } + return err +} + +func (s *SysChinaAreaDataById) SetUpdateBy(id int) { + +} \ No newline at end of file diff --git a/app/admin/service/sys_china_area_data.go b/app/admin/service/sys_china_area_data.go new file mode 100644 index 00000000..2ff6aa6d --- /dev/null +++ b/app/admin/service/sys_china_area_data.go @@ -0,0 +1,106 @@ +package service + +import ( + "errors" + + "gorm.io/gorm" + + "go-admin/app/admin/models" + "go-admin/app/admin/service/dto" + "go-admin/common/actions" + cDto "go-admin/common/dto" + "go-admin/common/service" +) + +type SysChinaAreaData struct { + service.Service +} + +// GetSysChinaAreaDataPage 获取SysChinaAreaData列表 +func (e *SysChinaAreaData) GetSysChinaAreaDataPage(c *dto.SysChinaAreaDataSearch, p *actions.DataPermission, list *[]models.SysChinaAreaData, count *int64) error { + var data models.SysChinaAreaData + + err := e.Orm.Model(&data). + Scopes( + cDto.MakeCondition(c.GetNeedSearch()), + cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), + actions.Permission(data.TableName(), p), + ). + Find(list).Limit(-1).Offset(-1). + Count(count).Error + if err != nil { + e.Log.Errorf("Service GetSysChinaAreaDataPage error:%s", err) + return err + } + return nil +} + +// GetSysChinaAreaData 获取SysChinaAreaData对象 +func (e *SysChinaAreaData) GetSysChinaAreaData(d *dto.SysChinaAreaDataById, p *actions.DataPermission, model *models.SysChinaAreaData) error { + var data models.SysChinaAreaData + + err := e.Orm.Model(&data). + Scopes( + actions.Permission(data.TableName(), p), + ). + First(model, d.GetId()).Error + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + err = errors.New("查看对象不存在或无权查看") + e.Log.Errorf("db error:%s", err) + return err + } + if err != nil { + e.Log.Errorf("Service GetSysChinaAreaData error:%s", err) + return err + } + return nil +} + +// InsertSysChinaAreaData 创建SysChinaAreaData对象 +func (e *SysChinaAreaData) InsertSysChinaAreaData(model *models.SysChinaAreaData) error { + var data models.SysChinaAreaData + + err := e.Orm.Model(&data). + Create(model).Error + if err != nil { + e.Log.Errorf("Service InsertSysChinaAreaData error:%s", err) + return err + } + return nil +} + +// UpdateSysChinaAreaData 修改SysChinaAreaData对象 +func (e *SysChinaAreaData) UpdateSysChinaAreaData(c *models.SysChinaAreaData, p *actions.DataPermission) error { + db := e.Orm.Model(c). + Scopes( + actions.Permission(c.TableName(), p), + ).Where(c.GetId()).Updates(c) + if err := db.Error; err != nil { + e.Log.Errorf("Service UpdateSysChinaAreaData error: %s", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权更新该数据") + } + return nil +} + +// RemoveSysChinaAreaData 删除SysChinaAreaData +func (e *SysChinaAreaData) RemoveSysChinaAreaData(d *dto.SysChinaAreaDataById, p *actions.DataPermission) error { + + var data models.SysChinaAreaData + + db := e.Orm.Model(&data). + Scopes( + actions.Permission(data.TableName(), p), + ).Delete(&data, d.GetId()) + + if err := db.Error; err != nil { + e.Log.Errorf("Service RemoveSysChinaAreaData error: %s", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权删除该数据") + } + return nil +} \ No newline at end of file diff --git a/app/admin/service/sys_config.go b/app/admin/service/sys_config.go new file mode 100644 index 00000000..8674e8c9 --- /dev/null +++ b/app/admin/service/sys_config.go @@ -0,0 +1,132 @@ +package service + +import ( + "errors" + "go-admin/app/admin/models/system" + "go-admin/app/admin/service/dto" + cDto "go-admin/common/dto" + "go-admin/common/service" + "gorm.io/gorm" +) + +type SysConfig struct { + service.Service +} + +// GetSysConfigPage 获取SysConfig列表 +func (e *SysConfig) GetSysConfigPage(c *dto.SysConfigSearch, list *[]system.SysConfig, count *int64) error { + var err error + var data system.SysConfig + + err = e.Orm.Model(&data). + Scopes( + cDto.MakeCondition(c.GetNeedSearch()), + cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), + ). + Find(list).Limit(-1).Offset(-1). + Count(count).Error + if err != nil { + e.Log.Errorf("Service GetSysConfigPage error:%s", err) + return err + } + return nil +} + +func (e *SysConfig) GetSysConfigByKey(c *dto.SysConfigSearch, list *[]system.SysConfig) error { + var err error + var data system.SysConfig + + err = e.Orm.Model(&data). + Scopes( + cDto.MakeCondition(c.GetNeedSearch()), + ). + Find(list).Error + if err != nil { + e.Log.Errorf("Service GetSysConfigByKey error:%s", err) + return err + } + return nil +} + +// GetSysConfig 获取SysConfig对象 +func (e *SysConfig) GetSysConfig(d *dto.SysConfigById, model *system.SysConfig) error { + var data system.SysConfig + + err := e.Orm.Model(&data). + First(model, d.GetId()).Error + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + err = errors.New("查看对象不存在或无权查看") + e.Log.Errorf("Service GetSysConfigPage error:%s", err) + return err + } + if err != nil { + e.Log.Errorf("Service GetSysConfig error:%s", err) + return err + } + return nil +} + +// InsertSysConfig 创建SysConfig对象 +func (e *SysConfig) InsertSysConfig(model *system.SysConfig) error { + var err error + var data system.SysConfig + + err = e.Orm.Model(&data). + Create(model).Error + if err != nil { + e.Log.Errorf("Service InsertSysConfig error:%s", err) + return err + } + return nil +} + +// UpdateSysConfig 修改SysConfig对象 +func (e *SysConfig) UpdateSysConfig(c *system.SysConfig) error { + var err error + + db := e.Orm.Model(c). + Where(c.GetId()).Updates(c) + err = db.Error + if err != nil { + e.Log.Errorf("Service UpdateSysConfig error:%s", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权更新该数据") + + } + return nil +} + +// RemoveSysConfig 删除SysConfig +func (e *SysConfig) RemoveSysConfig(d *dto.SysConfigById, c *system.SysConfig) error { + var err error + var data system.SysConfig + + db := e.Orm.Model(&data). + Where(d.Ids).Delete(c) + if db.Error != nil { + err = db.Error + e.Log.Errorf("Service RemoveSysConfig error:%s", err) + return err + } + if db.RowsAffected == 0 { + err = errors.New("无权删除该数据") + return err + } + return nil +} + +// GetSysConfigByKEY 根据Key获取SysConfig +func (e *SysConfig) GetSysConfigByKEY(c *dto.SysConfigControl) error { + var err error + var data system.SysConfig + data.ConfigKey = c.ConfigKey + err = e.Orm.Table(data.TableName()).Where("config_key = ?", data.ConfigKey).First(c).Error + if err != nil { + e.Log.Errorf("Service GetSysConfigByKEY error:%s", err) + return err + } + + return nil +} \ No newline at end of file diff --git a/app/admin/service/sys_dept.go b/app/admin/service/sys_dept.go new file mode 100644 index 00000000..a92335fb --- /dev/null +++ b/app/admin/service/sys_dept.go @@ -0,0 +1,286 @@ +package service + +import ( + "errors" + log "github.com/go-admin-team/go-admin-core/logger" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + + "gorm.io/gorm" + + "go-admin/app/admin/models/system" + "go-admin/app/admin/service/dto" + cDto "go-admin/common/dto" + "go-admin/common/service" +) + +type SysDept struct { + service.Service +} + +// GetSysDeptPage 获取SysDept列表 +func (e *SysDept) GetSysDeptPage(c *dto.SysDeptSearch, list *[]system.SysDept) error { + var err error + var data system.SysDept + + err = e.Orm.Model(&data). + Scopes( + cDto.MakeCondition(c.GetNeedSearch()), + ). + Find(list).Error + if err != nil { + e.Log.Errorf("db error:%s", err) + return err + } + return nil +} + +// GetSysDept 获取SysDept对象 +func (e *SysDept) GetSysDept(d *dto.SysDeptById, model *system.SysDept) error { + var err error + var data system.SysDept + + db := e.Orm.Model(&data). + First(model, d.GetId()) + err = db.Error + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + err = errors.New("查看对象不存在或无权查看") + e.Log.Errorf("db error:%s", err) + return err + } + if db.Error != nil { + e.Log.Errorf("db error:%s", err) + return err + } + return nil +} + +// InsertSysDept 创建SysDept对象 +func (e *SysDept) InsertSysDept(model *system.SysDept) error { + var err error + var data system.SysDept + + err = e.Orm.Model(&data). + Create(model).Error + if err != nil { + e.Log.Errorf("db error:%s", err) + return err + } + deptPath := "/" + pkg.IntToString(model.DeptId) + if model.ParentId != 0 { + var deptP system.SysDept + e.Orm.Model(&data).First(&deptP, model.ParentId) + deptPath = deptP.DeptPath + deptPath + } else { + deptPath = "/0" + deptPath + } + var mp = map[string]string{} + mp["dept_path"] = deptPath + if err := e.Orm.Model(&model).Update("dept_path", deptPath).Error; err != nil { + e.Log.Errorf("db error:%s", err) + return err + } + return nil +} + +// UpdateSysDept 修改SysDept对象 +func (e *SysDept) UpdateSysDept(c *system.SysDept) error { + var err error + var data system.SysDept + + db := e.Orm.Model(&data). + Where(c.GetId()).Updates(c) + if db.Error != nil { + e.Log.Errorf("db error:%s", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权更新该数据") + } + + //参数1:是要修改的数据 + //参数2:是修改的数据 + + return nil +} + +// RemoveSysDept 删除SysDept +func (e *SysDept) RemoveSysDept(d *dto.SysDeptById) error { + var err error + var data system.SysDept + + db := e.Orm.Model(&data). + Where(d.GetId()).Delete(&data) + if db.Error != nil { + err = db.Error + e.Log.Errorf("Delete error: %s", err) + return err + } + if db.RowsAffected == 0 { + err = errors.New("无权删除该数据") + return err + } + return nil +} + +// GetSysDeptList 获取组织数据 +func (e *SysDept) getSysDeptList(c *dto.SysDeptSearch, list *[]system.SysDept) error { + var err error + var data system.SysDept + + err = e.Orm.Model(&data). + Scopes( + cDto.MakeCondition(c.GetNeedSearch()), + ). + Find(list).Error + if err != nil { + e.Log.Errorf("db error:%s", err) + return err + } + return nil +} + +// SetDeptTree 设置组织数据 +func (e *SysDept) SetDeptTree(c *dto.SysDeptSearch) (m []dto.DeptLabel, err error) { + var list []system.SysDept + err = e.getSysDeptList(c, &list) + + m = make([]dto.DeptLabel, 0) + for i := 0; i < len(list); i++ { + if list[i].ParentId != 0 { + continue + } + e := dto.DeptLabel{} + e.Id = list[i].DeptId + e.Label = list[i].DeptName + deptsInfo := deptTreeCall(&list, e) + + m = append(m, deptsInfo) + } + return +} + +// Call 递归构造组织数据 +func deptTreeCall(deptlist *[]system.SysDept, dept dto.DeptLabel) dto.DeptLabel { + list := *deptlist + min := make([]dto.DeptLabel, 0) + for j := 0; j < len(list); j++ { + if dept.Id != list[j].ParentId { + continue + } + mi := dto.DeptLabel{Id: list[j].DeptId, Label: list[j].DeptName, Children: []dto.DeptLabel{}} + ms := deptTreeCall(deptlist, mi) + min = append(min, ms) + } + dept.Children = min + return dept +} + +// SetDeptPage 设置dept页面数据 +func (e *SysDept) SetDeptPage(c *dto.SysDeptSearch) (m []system.SysDept, err error) { + var list []system.SysDept + err = e.getSysDeptList(c, &list) + + //m := make([]models.SysDept, 0) + for i := 0; i < len(list); i++ { + if list[i].ParentId != 0 { + continue + } + info := e.deptPageCall(&list, list[i]) + + m = append(m, info) + } + return +} + +func (e *SysDept) deptPageCall(deptlist *[]system.SysDept, menu system.SysDept) system.SysDept { + list := *deptlist + + min := make([]system.SysDept, 0) + for j := 0; j < len(list); j++ { + + if menu.DeptId != list[j].ParentId { + continue + } + mi := system.SysDept{} + mi.DeptId = list[j].DeptId + mi.ParentId = list[j].ParentId + mi.DeptPath = list[j].DeptPath + mi.DeptName = list[j].DeptName + mi.Sort = list[j].Sort + mi.Leader = list[j].Leader + mi.Phone = list[j].Phone + mi.Email = list[j].Email + mi.Status = list[j].Status + mi.CreatedAt = list[j].CreatedAt + mi.Children = []system.SysDept{} + ms := e.deptPageCall(deptlist, mi) + min = append(min, ms) + + } + menu.Children = min + return menu +} + +// GetRoleDeptId 获取角色的部门ID集合 +func (e *SysDept) GetRoleDeptId(roleId int) ([]int, error) { + deptIds := make([]int, 0) + deptList := make([]dto.DeptIdList, 0) + if err := e.Orm.Table("sys_role_dept"). + Select("sys_role_dept.dept_id"). + Joins("LEFT JOIN sys_dept on sys_dept.dept_id=sys_role_dept.dept_id"). + Where("role_id = ? ", roleId). + Where(" sys_role_dept.dept_id not in(select sys_dept.parent_id from sys_role_dept LEFT JOIN sys_dept on sys_dept.dept_id=sys_role_dept.dept_id where role_id =? )", roleId). + Find(&deptList).Error; err != nil { + return nil, err + } + + for i := 0; i < len(deptList); i++ { + deptIds = append(deptIds, deptList[i].DeptId) + } + + return deptIds, nil +} + +func (e *SysDept) SetDeptLabel() (m []dto.DeptLabel, err error) { + list := make([]system.SysDept, 0) + err = e.Orm.Find(&list).Error + if err != nil { + log.Error("find dept list error, %s", err.Error()) + return + } + + m = make([]dto.DeptLabel, 0) + var item dto.DeptLabel + for i := range list { + if list[i].ParentId != 0 { + continue + } + item = dto.DeptLabel{} + item.Id = list[i].DeptId + item.Label = list[i].DeptName + deptInfo := digitDeptLabel(&list, item) + + m = append(m, deptInfo) + } + return +} + +// digitDeptLabel +func digitDeptLabel(deptList *[]system.SysDept, dept dto.DeptLabel) dto.DeptLabel { + list := *deptList + + var mi dto.DeptLabel + min := make([]dto.DeptLabel, 0) + for j := 0; j < len(list); j++ { + + if dept.Id != list[j].ParentId { + continue + } + mi = dto.DeptLabel{Id: list[j].DeptId, Label: list[j].DeptName, Children: []dto.DeptLabel{}} + ms := digitDeptLabel(deptList, mi) + min = append(min, ms) + + } + dept.Children = min + return dept +} diff --git a/app/admin/service/sys_dict_data.go b/app/admin/service/sys_dict_data.go new file mode 100644 index 00000000..92179020 --- /dev/null +++ b/app/admin/service/sys_dict_data.go @@ -0,0 +1,123 @@ +package service + +import ( + "errors" + + "gorm.io/gorm" + + "go-admin/app/admin/models/system" + "go-admin/app/admin/service/dto" + cDto "go-admin/common/dto" + "go-admin/common/service" +) + +type SysDictData struct { + service.Service +} + +// GetPage 获取列表 +func (e *SysDictData) GetPage(c *dto.SysDictDataSearch, list *[]system.SysDictData, count *int64) error { + var err error + var data system.SysDictData + + err = e.Orm.Model(&data). + Scopes( + cDto.MakeCondition(c.GetNeedSearch()), + cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), + ). + Find(list).Limit(-1).Offset(-1). + Count(count).Error + if err != nil { + e.Log.Errorf("db error: %s", err) + return err + } + return nil +} + +// Get 获取对象 +func (e *SysDictData) Get(d *dto.SysDictDataById, model *system.SysDictData) error { + var err error + var data system.SysDictData + + db := e.Orm.Model(&data). + First(model, d.GetId()) + err = db.Error + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + err = errors.New("查看对象不存在或无权查看") + e.Log.Errorf("db error: %s", err) + return err + } + if db.Error != nil { + e.Log.Errorf("db error: %s", err) + return err + } + return nil +} + +// Insert 创建对象 +func (e *SysDictData) Insert(model *system.SysDictData) error { + var err error + var data system.SysDictData + + err = e.Orm.Model(&data). + Create(model).Error + if err != nil { + e.Log.Errorf("db error: %s", err) + return err + } + return nil +} + +// Update 修改对象 +func (e *SysDictData) Update(c *system.SysDictData) error { + var err error + var data system.SysDictData + + db := e.Orm.Model(&data). + Where(c.GetId()).Updates(c) + if db.Error != nil { + e.Log.Errorf("db error: %s", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权更新该数据") + + } + return nil +} + +// Remove 删除 +func (e *SysDictData) Remove(d *dto.SysDictDataById, c *system.SysDictData) error { + var err error + var data system.SysDictData + + db := e.Orm.Model(&data). + Where(d.GetId()).Delete(c) + if db.Error != nil { + err = db.Error + e.Log.Errorf("Delete error: %s", err) + return err + } + if db.RowsAffected == 0 { + err = errors.New("无权删除该数据") + return err + } + return nil +} + +// GetAll 获取所有 +func (e *SysDictData) GetAll(c *dto.SysDictDataSearch, list *[]system.SysDictData) error { + var err error + var data system.SysDictData + + err = e.Orm.Model(&data). + Scopes( + cDto.MakeCondition(c.GetNeedSearch()), + ). + Find(list).Error + if err != nil { + e.Log.Errorf("db error: %s", err) + return err + } + return nil +} diff --git a/app/admin/service/sys_dict_type.go b/app/admin/service/sys_dict_type.go new file mode 100644 index 00000000..c242df2c --- /dev/null +++ b/app/admin/service/sys_dict_type.go @@ -0,0 +1,123 @@ +package service + +import ( + "errors" + + "gorm.io/gorm" + + "go-admin/app/admin/models/system" + "go-admin/app/admin/service/dto" + cDto "go-admin/common/dto" + "go-admin/common/service" +) + +type SysDictType struct { + service.Service +} + +// GetPage 获取列表 +func (e *SysDictType) GetPage(c *dto.SysDictTypeSearch, list *[]system.SysDictType, count *int64) error { + var err error + var data system.SysDictType + + err = e.Orm.Model(&data). + Scopes( + cDto.MakeCondition(c.GetNeedSearch()), + cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), + ). + Find(list).Limit(-1).Offset(-1). + Count(count).Error + if err != nil { + e.Log.Errorf("db error: %s", err) + return err + } + return nil +} + +// Get 获取对象 +func (e *SysDictType) Get(d *dto.SysDictTypeById, model *system.SysDictType) error { + var err error + var data system.SysDictType + + db := e.Orm.Model(&data). + First(model, d.GetId()) + err = db.Error + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + err = errors.New("查看对象不存在或无权查看") + e.Log.Errorf("db error: %s", err) + return err + } + if db.Error != nil { + e.Log.Errorf("db error: %s", err) + return err + } + return nil +} + +// Insert 创建对象 +func (e *SysDictType) Insert(model *system.SysDictType) error { + var err error + var data system.SysDictType + + err = e.Orm.Model(&data). + Create(model).Error + if err != nil { + e.Log.Errorf("db error: %s", err) + return err + } + return nil +} + +// Update 修改对象 +func (e *SysDictType) Update(c *system.SysDictType) error { + var err error + var data system.SysDictType + + db := e.Orm.Model(&data). + Where(c.GetId()).Updates(c) + if db.Error != nil { + e.Log.Errorf("db error: %s", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权更新该数据") + + } + return nil +} + +// Remove 删除 +func (e *SysDictType) Remove(d *dto.SysDictTypeById, c *system.SysDictType) error { + var err error + var data system.SysDictType + + db := e.Orm.Model(&data). + Where(d.GetId()).Delete(c) + if db.Error != nil { + err = db.Error + e.Log.Errorf("Delete error: %s", err) + return err + } + if db.RowsAffected == 0 { + err = errors.New("无权删除该数据") + return err + } + return nil +} + +// GetAll 获取所有 +func (e *SysDictType) GetAll(c *dto.SysDictTypeSearch, list *[]system.SysDictType) error { + var err error + var data system.SysDictType + + err = e.Orm.Model(&data). + Scopes( + cDto.MakeCondition(c.GetNeedSearch()), + ). + Find(list).Error + if err != nil { + e.Log.Errorf("db error: %s", err) + return err + } + return nil +} diff --git a/app/admin/service/sys_file_dir.go b/app/admin/service/sys_file_dir.go new file mode 100644 index 00000000..541eec50 --- /dev/null +++ b/app/admin/service/sys_file_dir.go @@ -0,0 +1,168 @@ +package service + +import ( + "errors" + "fmt" + + "gorm.io/gorm" + + "go-admin/app/admin/models" + "go-admin/app/admin/service/dto" + "go-admin/common/actions" + cDto "go-admin/common/dto" + "go-admin/common/service" +) + +type SysFileDir struct { + service.Service +} + +// GetSysFileDirPage 获取SysFileDir列表 +func (e *SysFileDir) GetSysFileDirPage(c *dto.SysFileDirSearch, list *[]models.SysFileDirL) error { + var err error + var data models.SysFileDir + + err = e.Orm.Model(&data). + Scopes( + cDto.MakeCondition(c.GetNeedSearch()), + ). + Find(list). //Limit(-1).Offset(-1). + Error + if err != nil { + e.Log.Errorf("db error: %s", err) + return err + } + return nil +} + +// GetSysFileDir 获取SysFileDir对象 +func (e *SysFileDir) GetSysFileDir(d cDto.Control, model *models.SysFileDir) error { + var err error + var data models.SysFileDir + + db := e.Orm.Model(&data). + First(model, d.GetId()) + err = db.Error + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + err = errors.New("查看对象不存在或无权查看") + e.Log.Errorf("db error: %s", err) + return err + } + if db.Error != nil { + e.Log.Errorf("db error:%s", err) + return err + } + return nil +} + +// InsertSysFileDir 创建SysFileDir对象 +func (e *SysFileDir) InsertSysFileDir(model *dto.SysFileDirControl) error { + var err error + data, _ := model.GenerateM() + + err = e.Orm.Create(data).Error + if err != nil { + e.Log.Errorf("db error: %s", err) + return err + } + path := fmt.Sprintf("/%d", model.ID) + //db = e.Orm.Model(&data). + // First(&data, model.GetId()) + //err = db.Error + + if model.PId != 0 { + var dept models.SysFileDir + e.Orm.Model(&models.SysFileDir{}).Where("id = ?", model.PId).First(&dept) + path = dept.Path + path + } else { + path = "/0" + path + } + //var mp = map[string]string{} + //mp["path"] = path + if err = e.Orm.Model(&models.SysFileDir{}).Where("id = ?", model.ID).Update("path", path).Error; err != nil { + return err + } + + return nil +} + +// UpdateSysFileDir 修改SysFileDir对象 +func (e *SysFileDir) UpdateSysFileDir(c *dto.SysFileDirControl, p *actions.DataPermission) error { + var err error + data, _ := c.GenerateM() + + db := e.Orm. + Scopes( + actions.Permission(data.TableName(), p), + ).Where(c.ID).Updates(data) + if db.Error != nil { + e.Log.Errorf("db error: %s", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权更新该数据") + } + return nil +} + +// RemoveSysFileDir 删除SysFileDir +func (e *SysFileDir) RemoveSysFileDir(d *dto.SysFileDirById, p *actions.DataPermission) error { + var err error + var data models.SysFileDir + + db := e.Orm.Model(&data). + Scopes( + actions.Permission(data.TableName(), p), + ).Where(d.Id).Delete(&data) + if db.Error != nil { + err = db.Error + e.Log.Errorf("Delete error: %s", err) + return err + } + if db.RowsAffected == 0 { + err = errors.New("无权删除该数据") + return err + } + return nil +} + +func (e *SysFileDir) SetSysFileDir(c *dto.SysFileDirSearch) (*[]models.SysFileDirL, error) { + var list []models.SysFileDirL + err := e.GetSysFileDirPage(c, &list) + m := make([]models.SysFileDirL, 0) + for i := 0; i < len(list); i++ { + if list[i].PId != 0 { + continue + } + info := SysFileDirCall(&list, list[i]) + m = append(m, info) + } + return &m, err +} + +func SysFileDirCall(list *[]models.SysFileDirL, m models.SysFileDirL) models.SysFileDirL { + listGroup := *list + min := make([]models.SysFileDirL, 0) + for j := 0; j < len(listGroup); j++ { + if m.Id != listGroup[j].PId { + continue + } + mi := models.SysFileDirL{} + mi.Id = listGroup[j].Id + mi.PId = listGroup[j].PId + mi.Label = listGroup[j].Label + //mi.Sort = listGroup[j].Sort + mi.CreatedAt = listGroup[j].CreatedAt + mi.UpdatedAt = listGroup[j].UpdatedAt + mi.Children = []models.SysFileDirL{} + ms := SysFileDirCall(list, mi) + min = append(min, ms) + } + if len(min) > 0 { + m.Children = min + } else { + m.Children = nil + } + + return m +} diff --git a/app/admin/service/sys_file_info.go b/app/admin/service/sys_file_info.go new file mode 100644 index 00000000..d72db34c --- /dev/null +++ b/app/admin/service/sys_file_info.go @@ -0,0 +1,126 @@ +package service + +import ( + "errors" + + "gorm.io/gorm" + + "go-admin/app/admin/models" + "go-admin/app/admin/service/dto" + "go-admin/common/actions" + cDto "go-admin/common/dto" + "go-admin/common/service" +) + +type SysFileInfo struct { + service.Service +} + +// GetSysFileInfoPage 获取SysFileInfo列表 +func (e *SysFileInfo) GetSysFileInfoPage(c *dto.SysFileInfoSearch, p *actions.DataPermission, list *[]models.SysFileInfo, count *int64) error { + var err error + var data models.SysFileInfo + + err = e.Orm.Model(&data). + Scopes( + cDto.MakeCondition(c.GetNeedSearch()), + cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), + actions.Permission(data.TableName(), p), + ). + Find(list).Limit(-1).Offset(-1). + Count(count).Error + if err != nil { + e.Log.Errorf("db error: %s", err) + return err + } + return nil +} + +// GetSysFileInfo 获取SysFileInfo对象 +func (e *SysFileInfo) GetSysFileInfo(d *dto.SysFileInfoById, p *actions.DataPermission, model *models.SysFileInfo) error { + var err error + var data models.SysFileInfo + + db := e.Orm.Model(&data). + Scopes( + actions.Permission(data.TableName(), p), + ). + First(model, d.GetId()) + err = db.Error + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + err = errors.New("查看对象不存在或无权查看") + e.Log.Errorf("db error: %s", err) + return err + } + if db.Error != nil { + e.Log.Errorf("db error: %s", err) + return err + } + return nil +} + +// InsertSysFileInfo 创建SysFileInfo对象 +func (e *SysFileInfo) InsertSysFileInfo(model *dto.SysFileInfoControl) error { + var err error + var data *models.SysFileInfo + + data, err = model.Generate() + if err != nil { + e.Log.Errorf("db error: %s", err) + return err + } + + err = e.Orm.Model(&data). + Create(data).Error + if err != nil { + e.Log.Errorf("db error: %s", err) + return err + } + return nil +} + +// UpdateSysFileInfo 修改SysFileInfo对象 +func (e *SysFileInfo) UpdateSysFileInfo(c *dto.SysFileInfoControl, p *actions.DataPermission) error { + var err error + var data *models.SysFileInfo + + data, err = c.Generate() + if err != nil { + e.Log.Errorf("db error: %s", err) + return err + } + err = e.Orm.Debug().Model(&data). + Scopes( + actions.Permission(data.TableName(), p), + ).Where("id = ?", c.ID).Updates(&data).Error + if err != nil { + e.Log.Errorf("db error: %s", err) + return err + } + if err == gorm.ErrRecordNotFound { + return errors.New("无权更新该数据") + + } + return nil +} + +// RemoveSysFileInfo 删除SysFileInfo +func (e *SysFileInfo) RemoveSysFileInfo(d *dto.SysFileInfoById, p *actions.DataPermission) error { + var err error + var data models.SysFileInfo + + db := e.Orm.Model(&data). + Scopes( + actions.Permission(data.TableName(), p), + ).Where(d.GetId()).Delete(&data) + if db.Error != nil { + err = db.Error + e.Log.Errorf("Delete error: %s", err) + return err + } + if db.RowsAffected == 0 { + err = errors.New("无权删除该数据") + return err + } + return nil +} diff --git a/app/admin/service/sysjob.go b/app/admin/service/sys_job.go similarity index 71% rename from app/admin/service/sysjob.go rename to app/admin/service/sys_job.go index 2cf31ff5..dde262d7 100644 --- a/app/admin/service/sysjob.go +++ b/app/admin/service/sys_job.go @@ -1,44 +1,43 @@ package service import ( + "github.com/robfig/cron/v3" "time" "go-admin/app/admin/models" "go-admin/app/jobs" "go-admin/common/dto" - "go-admin/common/log" "go-admin/common/service" - "go-admin/tools/app/msg" ) type SysJob struct { service.Service + Cron *cron.Cron } // RemoveJob 删除job func (e *SysJob) RemoveJob(c *dto.GeneralDelDto) error { var err error var data models.SysJob - msgID := e.MsgID data.JobId = c.Id err = e.Orm.Table(data.TableName()).First(&data).Error if err != nil { - log.Errorf("msgID[%s] db error:%s", msgID, err) + e.Log.Errorf("db error: %s", err) return err } - cn := jobs.Remove(data.EntryId) + cn := jobs.Remove(e.Cron, data.EntryId) select { case res := <-cn: if res { err = e.Orm.Table(data.TableName()).Where("entry_id = ?", data.EntryId).Update("entry_id", 0).Error if err != nil { - log.Errorf("msgID[%s] db error:%s", msgID, err) + e.Log.Errorf("db error: %s", err) } return err } case <-time.After(time.Second * 1): - e.Msg = msg.TimeOut + e.Msg = "操作超时!" return nil } return nil @@ -48,10 +47,9 @@ func (e *SysJob) RemoveJob(c *dto.GeneralDelDto) error { func (e *SysJob) StartJob(c *dto.GeneralGetDto) error { var data models.SysJob var err error - msgID := e.MsgID err = e.Orm.Table(data.TableName()).First(&data, c.Id).Error if err != nil { - log.Errorf("msgID[%s] db error:%s", msgID, err) + e.Log.Errorf("db error: %s", err) return err } if data.JobType == 1 { @@ -60,9 +58,9 @@ func (e *SysJob) StartJob(c *dto.GeneralGetDto) error { j.CronExpression = data.CronExpression j.JobId = data.JobId j.Name = data.JobName - data.EntryId, err = jobs.AddJob(j) + data.EntryId, err = jobs.AddJob(e.Cron, j) if err != nil { - log.Errorf("msgID[%s] jobs AddJob[HttpJob] error:%s", msgID, err) + e.Log.Errorf("jobs AddJob[HttpJob] error: %s", err) } } else { var j = &jobs.ExecJob{} @@ -71,9 +69,9 @@ func (e *SysJob) StartJob(c *dto.GeneralGetDto) error { j.JobId = data.JobId j.Name = data.JobName j.Args = data.Args - data.EntryId, err = jobs.AddJob(j) + data.EntryId, err = jobs.AddJob(e.Cron, j) if err != nil { - log.Errorf("msgID[%s] jobs AddJob[ExecJob] error:%s", msgID, err) + e.Log.Errorf("jobs AddJob[ExecJob] error: %s", err) } } if err != nil { @@ -82,7 +80,7 @@ func (e *SysJob) StartJob(c *dto.GeneralGetDto) error { err = e.Orm.Table(data.TableName()).Where(c.Id).Updates(&data).Error if err != nil { - log.Errorf("msgID[%s] db error:%s", msgID, err) + e.Log.Errorf("db error: %s", err) } return err } diff --git a/app/admin/service/sys_login_log.go b/app/admin/service/sys_login_log.go new file mode 100644 index 00000000..800a1f1d --- /dev/null +++ b/app/admin/service/sys_login_log.go @@ -0,0 +1,107 @@ +package service + +import ( + "errors" + + "gorm.io/gorm" + + "go-admin/app/admin/models/system" + "go-admin/app/admin/service/dto" + cDto "go-admin/common/dto" + common "go-admin/common/models" + "go-admin/common/service" +) + +type SysLoginLog struct { + service.Service +} + +// GetSysLoginLogPage 获取SysLoginLog列表 +func (e *SysLoginLog) GetSysLoginLogPage(c *dto.SysLoginLogSearch, list *[]system.SysLoginLog, count *int64) error { + var err error + var data system.SysLoginLog + + err = e.Orm.Model(&data). + Scopes( + cDto.MakeCondition(c.GetNeedSearch()), + cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), + ). + Find(list).Limit(-1).Offset(-1). + Count(count).Error + if err != nil { + e.Log.Errorf("db error:%s", err) + return err + } + return nil +} + +// GetSysLoginLog 获取SysLoginLog对象 +func (e *SysLoginLog) GetSysLoginLog(d *dto.SysLoginLogById, model *system.SysLoginLog) error { + var err error + var data system.SysLoginLog + + db := e.Orm.Model(&data). + First(model, d.GetId()) + err = db.Error + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + err = errors.New("查看对象不存在或无权查看") + e.Log.Errorf("db error:%s", err) + return err + } + if db.Error != nil { + e.Log.Errorf("db error:%s", err) + return err + } + return nil +} + +// InsertSysLoginLog 创建SysLoginLog对象 +func (e *SysLoginLog) InsertSysLoginLog(model common.ActiveRecord) error { + var err error + var data system.SysLoginLog + + err = e.Orm.Model(&data). + Create(model).Error + if err != nil { + e.Log.Errorf("db error:%s", err) + return err + } + return nil +} + +// UpdateSysLoginLog 修改SysLoginLog对象 +func (e *SysLoginLog) UpdateSysLoginLog(c common.ActiveRecord) error { + var err error + var data system.SysLoginLog + + db := e.Orm.Model(&data). + Where(c.GetId()).Updates(c) + if db.Error != nil { + e.Log.Errorf("db error:%s", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权更新该数据") + + } + return nil +} + +// RemoveSysLoginLog 删除SysLoginLog +func (e *SysLoginLog) RemoveSysLoginLog(d *dto.SysLoginLogById, c common.ActiveRecord) error { + var err error + var data system.SysLoginLog + + db := e.Orm.Model(&data). + Where(d.Ids).Delete(c) + if db.Error != nil { + err = db.Error + e.Log.Errorf("Delete error: %s", err) + return err + } + if db.RowsAffected == 0 { + err = errors.New("无权删除该数据") + return err + } + return nil +} diff --git a/app/admin/service/sys_menu.go b/app/admin/service/sys_menu.go new file mode 100644 index 00000000..40422dec --- /dev/null +++ b/app/admin/service/sys_menu.go @@ -0,0 +1,305 @@ +package service + +import ( + "errors" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + "go-admin/app/admin/models/system" + "go-admin/app/admin/service/dto" + cDto "go-admin/common/dto" + "go-admin/common/service" + "gorm.io/gorm" +) + +type SysMenu struct { + service.Service +} + +// GetSysMenuPage 获取SysMenu列表 +func (e *SysMenu) GetSysMenuPage(c *dto.SysMenuSearch) (*[]system.SysMenu, error) { + var m = make([]system.SysMenu, 0) + var err error + var menu = make([]system.SysMenu, 0) + err = e.getSysMenuPage(c, &menu) + for i := 0; i < len(menu); i++ { + if menu[i].ParentId != 0 { + continue + } + menusInfo := menuCall(&menu, menu[i]) + + m = append(m, menusInfo) + } + return &m, err +} + +// getSysMenuPage 菜单列表 +func (e *SysMenu) getSysMenuPage(c *dto.SysMenuSearch, list *[]system.SysMenu) error { + var err error + var data system.SysMenu + + err = e.Orm.Model(&data). + Scopes( + cDto.OrderDest("sort", false), + cDto.MakeCondition(c.GetNeedSearch()), + ). + Find(list).Error + if err != nil { + e.Log.Errorf("db error:%s", err) + return err + } + return nil +} + +// GetSysMenu 获取SysMenu对象 +func (e *SysMenu) GetSysMenu(d *dto.SysMenuById, model *system.SysMenu) error { + var err error + var data system.SysMenu + + db := e.Orm.Model(&data). + First(model, d.GetId()) + err = db.Error + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + err = errors.New("查看对象不存在或无权查看") + e.Log.Errorf("db error:%s", err) + return err + } + if db.Error != nil { + e.Log.Errorf("db error:%s", err) + return err + } + return nil +} + +// InsertSysMenu 创建SysMenu对象 +func (e *SysMenu) InsertSysMenu(model *system.SysMenu) error { + var err error + var data system.SysMenu + + err = e.Orm.Model(&data). + Create(model).Error + if err != nil { + e.Log.Errorf("db error:%s", err) + return err + } + return nil +} + +func (e *SysMenu) initPaths(menu *system.SysMenu) error { + var err error + var data system.SysMenu + parentMenu := new(system.SysMenu) + if menu.ParentId != 0 { + e.Orm.Model(&data).First(parentMenu, menu.ParentId) + if parentMenu.Paths == "" { + err = errors.New("父级paths异常,请尝试对当前节点父级菜单进行更新操作!") + return err + } + menu.Paths = parentMenu.Paths + "/" + pkg.IntToString(menu.MenuId) + } else { + menu.Paths = "/0/" + pkg.IntToString(menu.MenuId) + } + e.Orm.Model(&data).Where("menu_id = ?", menu.MenuId).Update("paths", menu.Paths) + return err +} + +// UpdateSysMenu 修改SysMenu对象 +func (e *SysMenu) UpdateSysMenu(c *system.SysMenu) error { + var err error + var data system.SysMenu + + db := e.Orm.Model(&data). + Where(c.GetId()).Updates(c) + if db.Error != nil { + e.Log.Errorf("db error:%s", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权更新该数据") + + } + return nil +} + +// RemoveSysMenu 删除SysMenu +func (e *SysMenu) RemoveSysMenu(d *dto.SysMenuById) error { + var err error + var data system.SysMenu + + db := e.Orm.Model(&data). + Where(d.GetId()).Delete(&data) + if db.Error != nil { + err = db.Error + e.Log.Errorf("Delete error: %s", err) + return err + } + if db.RowsAffected == 0 { + err = errors.New("无权删除该数据") + return err + } + return nil +} + +// GetSysMenuList 获取菜单数据 +func (e *SysMenu) GetSysMenuList(c *dto.SysMenuSearch, list *[]system.SysMenu) error { + var err error + var data system.SysMenu + + err = e.Orm.Model(&data). + Scopes( + cDto.MakeCondition(c.GetNeedSearch()), + ). + Find(list).Error + if err != nil { + e.Log.Errorf("db error:%s", err) + return err + } + return nil +} + +// SetSysMenuTree 设置菜单数据 +func (e *SysMenu) SetSysMenuLabel() (m []dto.MenuLabel, err error) { + var list []system.SysMenu + err = e.GetSysMenuList(&dto.SysMenuSearch{}, &list) + + m = make([]dto.MenuLabel, 0) + for i := 0; i < len(list); i++ { + if list[i].ParentId != 0 { + continue + } + e := dto.MenuLabel{} + e.Id = list[i].MenuId + e.Label = list[i].Title + deptsInfo := menuLabelCall(&list, e) + + m = append(m, deptsInfo) + } + return +} + +// 左侧菜单 +func (e *SysMenu) GetSysMenuByRoleName(roleName string) (Menus []system.SysMenu, err error) { + var table *gorm.DB + var data system.SysMenu + + if roleName == "admin" { + table = e.Orm.Model(&data).Select("sys_menu.*") + table = table.Where(" menu_type in ('M','C')") + } else { + table = e.Orm.Model(&data).Select("sys_menu.*").Joins("left join sys_role_menu on sys_role_menu.menu_id=sys_menu.menu_id") + table = table.Where("sys_role_menu.role_name=? and menu_type in ('M','C')", roleName) + } + + err = table.Order("sort").Find(&Menus).Error + + if err != nil { + e.Log.Errorf("db error:%s", err) + return + } + return +} + +// menuLabelCall 递归构造组织数据 +func menuLabelCall(elist *[]system.SysMenu, dept dto.MenuLabel) dto.MenuLabel { + list := *elist + + min := make([]dto.MenuLabel, 0) + for j := 0; j < len(list); j++ { + + if dept.Id != list[j].ParentId { + continue + } + mi := dto.MenuLabel{} + mi.Id = list[j].MenuId + mi.Label = list[j].Title + mi.Children = []dto.MenuLabel{} + if list[j].MenuType != "F" { + ms := menuLabelCall(elist, mi) + min = append(min, ms) + } else { + min = append(min, mi) + } + } + if len(min) > 0 { + dept.Children = min + } else { + dept.Children = nil + } + return dept +} + +func menuCall(menulist *[]system.SysMenu, menu system.SysMenu) system.SysMenu { + list := *menulist + + min := make([]system.SysMenu, 0) + for j := 0; j < len(list); j++ { + + if menu.MenuId != list[j].ParentId { + continue + } + mi := system.SysMenu{} + mi.MenuId = list[j].MenuId + mi.MenuName = list[j].MenuName + mi.Title = list[j].Title + mi.Icon = list[j].Icon + mi.Path = list[j].Path + mi.MenuType = list[j].MenuType + mi.Action = list[j].Action + mi.Permission = list[j].Permission + mi.ParentId = list[j].ParentId + mi.NoCache = list[j].NoCache + mi.Breadcrumb = list[j].Breadcrumb + mi.Component = list[j].Component + mi.Sort = list[j].Sort + mi.Visible = list[j].Visible + mi.CreatedAt = list[j].CreatedAt + mi.Children = []system.SysMenu{} + + if mi.MenuType != "F" { + ms := menuCall(menulist, mi) + min = append(min, ms) + + } else { + min = append(min, mi) + } + + } + menu.Children = min + return menu +} + +func (e *SysMenu) SetMenuRole(roleName string) (m []system.SysMenu, err error) { + + menus, err := e.getByRoleName(roleName) + + m = make([]system.SysMenu, 0) + for i := 0; i < len(menus); i++ { + if menus[i].ParentId != 0 { + continue + } + menusInfo := menuCall(&menus, menus[i]) + + m = append(m, menusInfo) + } + return +} + +func (e *SysMenu) getByRoleName(roleName string) (Menus []system.SysMenu, err error) { + var data system.SysMenu + + var table *gorm.DB + if roleName == "admin" { + table = e.Orm.Model(&data).Select("sys_menu.*") + table = table.Where(" menu_type in ('M','C')") + } else { + table = e.Orm.Model(&data).Select("sys_menu.*").Joins("left join sys_role_menu on sys_role_menu.menu_id=sys_menu.menu_id") + table = table.Where("sys_role_menu.role_name=? and menu_type in ('M','C')", roleName) + } + err = table.Scopes( + cDto.OrderDest("sort", false), + ).Find(&Menus).Error + + if err != nil { + e.Log.Errorf("db error:%s", err) + return + } + return +} diff --git a/app/admin/service/sys_opera_log.go b/app/admin/service/sys_opera_log.go new file mode 100644 index 00000000..cb81586b --- /dev/null +++ b/app/admin/service/sys_opera_log.go @@ -0,0 +1,98 @@ +package service + +import ( + "errors" + "go-admin/app/admin/models/system" + "go-admin/app/admin/service/dto" + cDto "go-admin/common/dto" + "go-admin/common/service" + "gorm.io/gorm" +) + +type SysOperaLog struct { + service.Service +} + +// GetSysOperaLogPage 获取SysOperaLog列表 +func (e *SysOperaLog) GetSysOperaLogPage(c *dto.SysOperaLogSearch, list *[]system.SysOperaLog, count *int64) error { + var err error + var data system.SysOperaLog + + err = e.Orm.Model(&data). + Scopes( + cDto.MakeCondition(c.GetNeedSearch()), + cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), + ). + Find(list).Limit(-1).Offset(-1). + Count(count).Error + if err != nil { + e.Log.Errorf("Service GetSysOperaLogPage error:%s", err.Error()) + return err + } + return nil +} + +// GetSysOperaLog 获取SysOperaLog对象 +func (e *SysOperaLog) GetSysOperaLog(d *dto.SysOperaLogById, model *system.SysOperaLog) error { + var data system.SysOperaLog + + err := e.Orm.Model(&data). + First(model, d.GetId()).Error + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + err = errors.New("查看对象不存在或无权查看") + e.Log.Errorf("Service GetSysOperaLog error:%s", err.Error()) + return err + } + if err != nil { + e.Log.Errorf("Service GetSysOperaLog error:%s", err.Error()) + return err + } + return nil +} + +// InsertSysOperaLog 创建SysOperaLog对象 +func (e *SysOperaLog) InsertSysOperaLog(model *system.SysOperaLog) error { + var err error + var data system.SysOperaLog + + err = e.Orm.Model(&data). + Create(model).Error + if err != nil { + e.Log.Errorf("Service InsertSysOperaLog error:%s", err.Error()) + return err + } + return nil +} + +// UpdateSysOperaLog 修改SysOperaLog对象 +func (e *SysOperaLog) UpdateSysOperaLog(c *system.SysOperaLog) error { + var err error + + db := e.Orm.Model(c). + Where(c.GetId()).Updates(c) + if err = db.Error; err != nil { + e.Log.Errorf("Service UpdateSysOperaLog error:%s", err.Error()) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权更新该数据") + + } + return nil +} + +// RemoveSysOperaLog 删除SysOperaLog +func (e *SysOperaLog) RemoveSysOperaLog(d *dto.SysOperaLogById) error { + var err error + var data system.SysOperaLog + + db := e.Orm.Model(&data).Where(d.Ids).Delete(&data) + if err = db.Error; err != nil { + e.Log.Errorf("Service RemoveSysOperaLog error:%s", err.Error()) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权删除该数据") + } + return nil +} \ No newline at end of file diff --git a/app/admin/service/sys_post.go b/app/admin/service/sys_post.go new file mode 100644 index 00000000..7d3fe289 --- /dev/null +++ b/app/admin/service/sys_post.go @@ -0,0 +1,105 @@ +package service + +import ( + "errors" + + "gorm.io/gorm" + + "go-admin/app/admin/models/system" + "go-admin/app/admin/service/dto" + cDto "go-admin/common/dto" + "go-admin/common/service" +) + +type SysPost struct { + service.Service +} + +// GetSysPostPage 获取SysPost列表 +func (e *SysPost) GetSysPostPage(c *dto.SysPostSearch, list *[]system.SysPost, count *int64) error { + var err error + var data system.SysPost + + err = e.Orm.Model(&data). + Scopes( + cDto.MakeCondition(c.GetNeedSearch()), + cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), + ). + Find(list).Limit(-1).Offset(-1). + Count(count).Error + if err != nil { + e.Log.Errorf("db error:%s", err) + return err + } + return nil +} + +// GetSysPost 获取SysPost对象 +func (e *SysPost) GetSysPost(d *dto.SysPostById, model *system.SysPost) error { + var err error + var data system.SysPost + + db := e.Orm.Model(&data). + First(model, d.GetId()) + err = db.Error + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + err = errors.New("查看对象不存在或无权查看") + e.Log.Errorf("db error:%s", err) + return err + } + if db.Error != nil { + e.Log.Errorf("db error:%s", err) + return err + } + return nil +} + +// InsertSysPost 创建SysPost对象 +func (e *SysPost) InsertSysPost(model *system.SysPost) error { + var err error + var data system.SysPost + + err = e.Orm.Model(&data). + Create(model).Error + if err != nil { + e.Log.Errorf("db error:%s", err) + return err + } + return nil +} + +// UpdateSysPost 修改SysPost对象 +func (e *SysPost) UpdateSysPost(c *system.SysPost) error { + var err error + var data system.SysPost + + db := e.Orm.Model(&data). + Where(c.GetId()).Updates(c) + if db.Error != nil { + e.Log.Errorf("db error:%s", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权更新该数据") + + } + return nil +} + +// RemoveSysPost 删除SysPost +func (e *SysPost) RemoveSysPost(d *dto.SysPostById) error { + var err error + var data system.SysPost + + db := e.Orm.Model(&data).Delete(&data, d.GetId()) + if db.Error != nil { + err = db.Error + e.Log.Errorf("Delete error: %s", err) + return err + } + if db.RowsAffected == 0 { + err = errors.New("无权删除该数据") + return err + } + return nil +} diff --git a/app/admin/service/sys_role.go b/app/admin/service/sys_role.go new file mode 100644 index 00000000..fedff993 --- /dev/null +++ b/app/admin/service/sys_role.go @@ -0,0 +1,224 @@ +package service + +import ( + "errors" + + "gorm.io/gorm" + + "go-admin/app/admin/models" + "go-admin/app/admin/models/system" + "go-admin/app/admin/service/dto" + cDto "go-admin/common/dto" + "go-admin/common/service" +) + +type SysRole struct { + service.Service +} + +// GetSysRolePage 获取SysRole列表 +func (e *SysRole) GetSysRolePage(c *dto.SysRoleSearch, list *[]system.SysRole, count *int64) error { + var err error + var data system.SysRole + + err = e.Orm.Model(&data). + Scopes( + cDto.MakeCondition(c.GetNeedSearch()), + cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), + ). + Find(list).Limit(-1).Offset(-1). + Count(count).Error + if err != nil { + e.Log.Errorf("db error:%s", err) + return err + } + return nil +} + +// GetSysRole 获取SysRole对象 +func (e *SysRole) GetSysRole(d *dto.SysRoleById, model *system.SysRole) error { + var err error + + db := e.Orm.First(model, d.GetId()) + err = db.Error + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + err = errors.New("查看对象不存在或无权查看") + e.Log.Errorf("db error:%s", err) + return err + } + if err != nil { + e.Log.Errorf("db error:%s", err) + return err + } + model.MenuIds, err = e.GetRoleMenuId(e.Orm, model.RoleId) + if err != nil { + e.Log.Errorf("get menuIds error, %s", err.Error()) + return err + } + return nil +} + +// InsertSysRole 创建SysRole对象 +func (e *SysRole) InsertSysRole(c *system.SysRole) error { + var err error + var data system.SysRole + + tx := e.Orm.Begin() + defer func() { + if err != nil { + tx.Rollback() + } else { + tx.Commit() + } + }() + + err = tx.Model(&data). + Create(c).Error + if err != nil { + e.Log.Errorf("db error:%s", err) + return err + } + if len(c.MenuIds) > 0 { + s := SysRoleMenu{} + s.Orm = e.Orm + s.Log = e.Log + err = s.ReloadRule(tx, c.RoleId, c.MenuIds) + if err != nil { + e.Log.Errorf("reload casbin rule error, %", err.Error()) + return err + } + } + return nil +} + +// UpdateSysRole 修改SysRole对象 +func (e *SysRole) UpdateSysRole(c *system.SysRole) error { + var err error + + tx := e.Orm.Debug().Begin() + defer func() { + if err != nil { + tx.Rollback() + } else { + tx.Commit() + } + }() + db := tx.Model(&c). + Where(c.GetId()).Updates(c) + if db.Error != nil { + e.Log.Errorf("db error:%s", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权更新该数据") + } + + var t system.RoleMenu + err = t.DeleteRoleMenu(tx, c.RoleId) + if err != nil { + e.Log.Errorf("delete role menu error, %", err.Error()) + return err + } + if len(c.MenuIds) > 0 { + s := SysRoleMenu{} + s.Orm = e.Orm + s.Log = e.Log + err = s.ReloadRule(tx, c.RoleId, c.MenuIds) + if err != nil { + e.Log.Errorf("reload casbin rule error, %", err.Error()) + return err + } + } + return nil +} + +// RemoveSysRole 删除SysRole +func (e *SysRole) RemoveSysRole(d *dto.SysRoleById) error { + var err error + var data system.SysRole + + tx := e.Orm.Begin() + defer func() { + if err != nil { + tx.Rollback() + } else { + tx.Commit() + } + }() + + s := SysRoleMenu{} + s.Orm = tx + s.Log = e.Log + for _, roleId := range d.Ids { + err = s.DeleteRoleMenu(tx, roleId) + if err != nil { + e.Log.Errorf("insert role menu error, %", err.Error()) + return err + } + } + db := tx.Model(&data).Delete(&data, d.Ids) + if db.Error != nil { + err = db.Error + e.Log.Errorf("Delete error: %s", err) + return err + } + if db.RowsAffected == 0 { + err = errors.New("无权删除该数据") + return err + } + return nil +} + +// 获取角色对应的菜单ids +func (e *SysRole) GetRoleMenuId(tx *gorm.DB, roleId int) ([]int, error) { + menuIds := make([]int, 0) + menuList := make([]models.MenuIdList, 0) + if err := tx.Table("sys_role_menu"). + Select("sys_role_menu.menu_id"). + Where("role_id = ? ", roleId). + Where(" sys_role_menu.menu_id not in(select sys_menu.parent_id from sys_role_menu "+ + "LEFT JOIN sys_menu on sys_menu.menu_id=sys_role_menu.menu_id where role_id =? and parent_id is not null)", roleId). + Find(&menuList).Error; err != nil { + return nil, err + } + + for i := 0; i < len(menuList); i++ { + menuIds = append(menuIds, menuList[i].MenuId) + } + return menuIds, nil +} + +func (e *SysRole) UpdateDataScope(c *system.SysRole) (err error) { + tx := e.Orm.Begin() + defer func() { + if err != nil { + tx.Rollback() + } else { + tx.Commit() + } + }() + err = tx.Model(&system.SysRole{}).Where("role_id = ?", c.RoleId).Select("data_scope", "update_by").Updates(c).Error + if err != nil { + return err + } + + err = tx.Where("role_id = ?", c.RoleId).Delete(&system.SysRoleDept{}).Error + if err != nil { + return err + } + + if c.DataScope == "2" { + deptRoles := make([]system.SysRoleDept, len(c.DeptIds)) + for i := range c.DeptIds { + deptRoles[i] = system.SysRoleDept{ + RoleId: c.RoleId, + DeptId: c.DeptIds[i], + } + } + err = tx.Create(&deptRoles).Error + if err != nil { + return err + } + } + return err +} \ No newline at end of file diff --git a/app/admin/service/sys_role_menu.go b/app/admin/service/sys_role_menu.go new file mode 100644 index 00000000..0f271c9c --- /dev/null +++ b/app/admin/service/sys_role_menu.go @@ -0,0 +1,113 @@ +package service + +import ( + log "github.com/go-admin-team/go-admin-core/logger" + "go-admin/app/admin/models" + "go-admin/app/admin/models/system" + "go-admin/common/service" + "gorm.io/gorm" +) + +type SysRoleMenu struct { + service.Service +} + +func (e *SysRoleMenu) ReloadRule(tx *gorm.DB, roleId int, menuId []int) (err error) { + var role system.SysRole + + msgID := e.MsgID + + menu := make([]models.Menu, 0) + roleMenu := make([]system.RoleMenu, len(menuId)) + casbinRule := make([]system.CasbinRule, 0) + //先删除所有的 + err = e.DeleteRoleMenu(tx, roleId) + if err != nil { + return + } + + // 在事务中做一些数据库操作(从这一点使用'tx',而不是'db') + err = tx.Where("role_id = ?", roleId).First(&role).Error + if err != nil { + log.Errorf("msgID[%s] get role error, %s", msgID, err.Error()) + return + } + err = tx.Where("menu_id in (?)", menuId). + //Select("path, action, menu_id, menu_type"). + Find(&menu).Error + if err != nil { + log.Errorf("msgID[%s] get menu error, %s", msgID, err.Error()) + return + } + for i := range menu { + roleMenu[i] = system.RoleMenu{ + RoleId: role.RoleId, + MenuId: menu[i].MenuId, + RoleName: role.RoleKey, + } + if menu[i].MenuType == "A" { + casbinRule = append(casbinRule, system.CasbinRule{ + PType: "p", + V0: role.RoleKey, + V1: menu[i].Path, + V2: menu[i].Action, + }) + } + } + err = tx.Create(&roleMenu).Error + if err != nil { + log.Errorf("msgID[%s] batch create role's menu error, %s", msgID, err.Error()) + return + } + if len(casbinRule) > 0 { + err = tx.Create(&casbinRule).Error + if err != nil { + log.Errorf("msgID[%s] batch create casbin rule error, %s", msgID, err.Error()) + return + } + } + + return +} + +func (e *SysRoleMenu) DeleteRoleMenu(tx *gorm.DB, roleId int) (err error) { + msgID := e.MsgID + err = tx.Where("role_id = ?", roleId). + Delete(&system.SysRoleDept{}).Error + if err != nil { + log.Errorf("msgID[%s] delete role's dept error, %s", msgID, err.Error()) + return + } + err = tx.Where("role_id = ?", roleId). + Delete(&system.RoleMenu{}).Error + if err != nil { + log.Errorf("msgID[%s] delete role's menu error, %s", msgID, err.Error()) + return + } + var role system.SysRole + err = tx.Where("role_id = ?", roleId). + First(&role).Error + if err != nil { + log.Errorf("msgID[%s] get role error, %s", msgID, err.Error()) + return + } + err = tx.Where("v0 = ?", role.RoleKey). + Delete(&system.CasbinRule{}).Error + if err != nil { + log.Errorf("msgID[%s] delete casbin rule error, %s", msgID, err.Error()) + return + } + return +} + +func (e *SysRoleMenu) GetIDS(tx *gorm.DB, roleName string) ([]system.MenuPath, error) { + var r []system.MenuPath + table := tx.Select("sys_menu.path").Table("sys_role_menu") + table = table.Joins("left join sys_role on sys_role.role_id=sys_role_menu.role_id") + table = table.Joins("left join sys_menu on sys_menu.id=sys_role_menu.menu_id") + table = table.Where("sys_role.role_name = ? and sys_menu.type=1", roleName) + if err := table.Find(&r).Error; err != nil { + return nil, err + } + return r, nil +} diff --git a/app/admin/service/sys_setting.go b/app/admin/service/sys_setting.go new file mode 100644 index 00000000..5e61c0a1 --- /dev/null +++ b/app/admin/service/sys_setting.go @@ -0,0 +1,52 @@ +package service + +import ( + "errors" + + "gorm.io/gorm" + + "go-admin/app/admin/models" + "go-admin/common/service" +) + +type SysSetting struct { + service.Service +} + +// GetSysSetting 获取SysSetting对象 +func (e *SysSetting) GetSysSetting(model *models.SysSetting) error { + var err error + var data models.SysSetting + + db := e.Orm.Model(&data). + First(model) + err = db.Error + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + err = errors.New("查看对象不存在或无权查看") + e.Log.Errorf("db error:%s", err) + return err + } + if db.Error != nil { + e.Log.Errorf("db error:%s", err) + return err + } + return nil +} + +// UpdateSysSetting 修改SysSetting对象 +func (e *SysSetting) UpdateSysSetting(c *models.SysSetting) error { + var err error + var data models.SysSetting + + db := e.Orm.Model(&data). + Where(c.GetId()).Updates(c) + if db.Error != nil { + e.Log.Errorf("db error:%s", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权更新该数据") + + } + return nil +} diff --git a/app/admin/service/sys_user.go b/app/admin/service/sys_user.go new file mode 100644 index 00000000..8681a291 --- /dev/null +++ b/app/admin/service/sys_user.go @@ -0,0 +1,179 @@ +package service + +import ( + "errors" + + log "github.com/go-admin-team/go-admin-core/logger" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + "gorm.io/gorm" + + "go-admin/app/admin/models/system" + "go-admin/common/actions" + cDto "go-admin/common/dto" + common "go-admin/common/models" + "go-admin/common/service" +) + +type SysUser struct { + service.Service +} + +// GetSysUserPage 获取SysUser列表 +func (e *SysUser) GetSysUserPage(c cDto.Index, p *actions.DataPermission, list *[]system.SysUser, count *int64) error { + var err error + var data system.SysUser + + err = e.Orm.Model(&data). + Scopes( + cDto.MakeCondition(c.GetNeedSearch()), + cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), + actions.Permission(data.TableName(), p), + ). + Preload("Dept"). + Find(list).Limit(-1).Offset(-1). + Count(count).Error + if err != nil { + e.Log.Errorf("db error: %s", err) + return err + } + return nil +} + +// GetSysUser 获取SysUser对象 +func (e *SysUser) GetSysUser(d cDto.Control, p *actions.DataPermission, model *system.SysUser) error { + var err error + var data system.SysUser + + db := e.Orm.Model(&data). + Scopes( + actions.Permission(data.TableName(), p), + ). + First(model, d.GetId()) + err = db.Error + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + err = errors.New("查看对象不存在或无权查看") + e.Log.Errorf("db error: %s", err) + return err + } + if db.Error != nil { + e.Log.Errorf("db error: %s", err) + return err + } + return nil +} + +// InsertSysUser 创建SysUser对象 +func (e *SysUser) InsertSysUser(model common.ActiveRecord) error { + var err error + var data system.SysUser + + err = e.Orm.Model(&data). + Create(model).Error + if err != nil { + e.Log.Errorf("db error: %s", err) + return err + } + return nil +} + +// UpdateSysUser 修改SysUser对象 +func (e *SysUser) UpdateSysUser(c common.ActiveRecord, p *actions.DataPermission) error { + var err error + + db := e.Orm.Model(c). + Scopes( + actions.Permission(c.TableName(), p), + ).Where(c.GetId()).Updates(c) + if db.Error != nil { + e.Log.Errorf("db error: %s", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权更新该数据") + + } + return nil +} + +// RemoveSysUser 删除SysUser +func (e *SysUser) RemoveSysUser(d cDto.Control, c common.ActiveRecord, p *actions.DataPermission) error { + var err error + var data system.SysUser + + db := e.Orm.Model(&data). + Scopes( + actions.Permission(data.TableName(), p), + ).Where(d.GetId()).Delete(c) + if db.Error != nil { + err = db.Error + e.Log.Errorf("Delete error: %s", err) + return err + } + if db.RowsAffected == 0 { + err = errors.New("无权删除该数据") + return err + } + return nil +} + +// UpdateSysUserPwd 修改SysUser对象密码 +func (e *SysUser) UpdateSysUserPwd(id int, oldPassword, newPassword string, p *actions.DataPermission) error { + var err error + + if newPassword == "" { + return nil + } + c := &system.SysUser{} + + err = e.Orm.Model(c). + Scopes( + actions.Permission(c.TableName(), p), + ).Where(id).Select("UserId", "Password", "Salt").First(c).Error + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return errors.New("无权更新该数据") + } + e.Log.Errorf("db error: %s", err) + return err + } + var ok bool + ok, err = pkg.CompareHashAndPassword(c.Password, oldPassword) + if err != nil { + e.Log.Errorf("CompareHashAndPassword error, %s", err.Error()) + return err + } + if !ok { + err = errors.New("incorrect Password") + e.Log.Warnf("user[%d] %s", id, err.Error()) + return err + } + c.Password = newPassword + db := e.Orm.Model(c).Where(id).Select("Password", "Salt").Updates(c) + if err = db.Error; err != nil { + e.Log.Errorf("db error: %s", err) + return err + } + if db.RowsAffected == 0 { + err = errors.New("set password error") + log.Warnf("db update error") + return err + } + return nil +} + +func (e *SysUser) GetSysUserProfile(id int, user *system.SysUser, roles *[]system.SysRole, posts *[]system.SysPost) error { + err := e.Orm.Preload("Dept").First(user, "user_id = ?", id).Error + if err != nil { + return err + } + err = e.Orm.Find(roles, user.RoleId).Error + if err != nil { + return err + } + err = e.Orm.Find(posts, user.PostIds).Error + if err != nil { + return err + } + + return nil +} diff --git a/app/jobs/jobbase.go b/app/jobs/jobbase.go index 2555dc80..3a212279 100644 --- a/app/jobs/jobbase.go +++ b/app/jobs/jobbase.go @@ -2,15 +2,17 @@ package jobs import ( "fmt" + log "github.com/go-admin-team/go-admin-core/logger" + "github.com/go-admin-team/go-admin-core/sdk" + "gorm.io/gorm" "sync" "time" "github.com/robfig/cron/v3" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + "github.com/go-admin-team/go-admin-core/sdk/pkg/cronjob" "go-admin/app/admin/models" - "go-admin/common/global" - "go-admin/pkg" - "go-admin/pkg/cronjob" ) var timeFormat = "2006-01-02 15:04:05" @@ -22,7 +24,7 @@ var lock sync.Mutex type JobCore struct { InvokeTarget string Name string - JobId uint + JobId int EntryId int CronExpression string Args string @@ -41,10 +43,14 @@ func (e *ExecJob) Run() { startTime := time.Now() var obj = jobList[e.InvokeTarget] if obj == nil { - global.JobLogger.Warning(" ExecJob Run job nil", e) + log.Warn("[Job] ExecJob Run job nil") return } - CallExec(obj.(JobsExec), e.Args) + err := CallExec(obj.(JobsExec), e.Args) + if err != nil { + // 如果失败暂停一段时间重试 + fmt.Println(time.Now().Format(timeFormat), " [ERROR] mission failed! ", err) + } // 结束时间 endTime := time.Now() @@ -53,7 +59,8 @@ func (e *ExecJob) Run() { //TODO: 待完善部分 //str := time.Now().Format(timeFormat) + " [INFO] JobCore " + string(e.EntryId) + "exec success , spend :" + latencyTime.String() //ws.SendAll(str) - global.JobLogger.Info(time.Now().Format(timeFormat), " [INFO] JobCore ", e, "exec success , spend :", latencyTime) + log.Info("[Job] JobCore %s exec success , spend :%v", e.Name, latencyTime) + return } //http 任务接口 @@ -61,19 +68,21 @@ func (h *HttpJob) Run() { startTime := time.Now() var count = 0 + var err error + var str string /* 循环 */ LOOP: if count < retryCount { /* 跳过迭代 */ - str, err := pkg.Get(h.InvokeTarget) + str, err = pkg.Get(h.InvokeTarget) if err != nil { // 如果失败暂停一段时间重试 fmt.Println(time.Now().Format(timeFormat), " [ERROR] mission failed! ", err) - fmt.Printf(time.Now().Format(timeFormat)+" [INFO] Retry after the task fails %d seconds! %s \n", time.Duration(count)*time.Second, str) - time.Sleep(time.Duration(count) * time.Second) + fmt.Printf(time.Now().Format(timeFormat)+" [INFO] Retry after the task fails %d seconds! %s \n", (count+1)*5, str) + time.Sleep(time.Duration(count+1) * 5 * time.Second) + count = count + 1 goto LOOP } - count = count + 1 } // 结束时间 endTime := time.Now() @@ -82,19 +91,26 @@ LOOP: latencyTime := endTime.Sub(startTime) //TODO: 待完善部分 - global.JobLogger.Info(time.Now().Format(timeFormat), " [INFO] JobCore ", h, "exec success , spend :", latencyTime) + log.Infof("[Job] JobCore %s exec success , spend :%v", h.Name, latencyTime) + return } // 初始化 -func Setup() { +func Setup(dbs map[string]*gorm.DB) { fmt.Println(time.Now().Format(timeFormat), " [INFO] JobCore Starting...") - global.GADMCron = cronjob.NewWithSeconds() + for k, db := range dbs { + sdk.Runtime.SetCrontab(k, cronjob.NewWithSeconds()) + setup(k, db) + } +} +func setup(key string, db *gorm.DB) { + crontab := sdk.Runtime.GetCrontabKey(key) sysJob := models.SysJob{} jobList := make([]models.SysJob, 0) - err := sysJob.GetList(&jobList) + err := sysJob.GetList(db, &jobList) if err != nil { fmt.Println(time.Now().Format(timeFormat), " [ERROR] JobCore init error", err) } @@ -102,7 +118,7 @@ func Setup() { fmt.Println(time.Now().Format(timeFormat), " [INFO] JobCore total:0") } - _, err = sysJob.RemoveAllEntryID() + _, err = sysJob.RemoveAllEntryID(db) if err != nil { fmt.Println(time.Now().Format(timeFormat), " [ERROR] JobCore remove entry_id error", err) } @@ -115,7 +131,7 @@ func Setup() { j.JobId = jobList[i].JobId j.Name = jobList[i].JobName - sysJob.EntryId, err = AddJob(j) + sysJob.EntryId, err = AddJob(crontab, j) } else if jobList[i].JobType == 2 { j := &ExecJob{} j.InvokeTarget = jobList[i].InvokeTarget @@ -123,30 +139,30 @@ func Setup() { j.JobId = jobList[i].JobId j.Name = jobList[i].JobName j.Args = jobList[i].Args - sysJob.EntryId, err = AddJob(j) + sysJob.EntryId, err = AddJob(crontab, j) } - err = sysJob.Update(jobList[i].JobId) + err = sysJob.Update(db, jobList[i].JobId) } // 其中任务 - global.GADMCron.Start() + crontab.Start() fmt.Println(time.Now().Format(timeFormat), " [INFO] JobCore start success.") // 关闭任务 - defer global.GADMCron.Stop() + defer crontab.Stop() select {} } // 添加任务 AddJob(invokeTarget string, jobId int, jobName string, cronExpression string) -func AddJob(job Job) (int, error) { +func AddJob(c *cron.Cron, job Job) (int, error) { if job == nil { fmt.Println("unknown") return 0, nil } - return job.addJob() + return job.addJob(c) } -func (h *HttpJob) addJob() (int, error) { - id, err := global.GADMCron.AddJob(h.CronExpression, h) +func (h *HttpJob) addJob(c *cron.Cron) (int, error) { + id, err := c.AddJob(h.CronExpression, h) if err != nil { fmt.Println(time.Now().Format(timeFormat), " [ERROR] JobCore AddJob error", err) return 0, err @@ -155,8 +171,8 @@ func (h *HttpJob) addJob() (int, error) { return EntryId, nil } -func (h *ExecJob) addJob() (int, error) { - id, err := global.GADMCron.AddJob(h.CronExpression, h) +func (h *ExecJob) addJob(c *cron.Cron) (int, error) { + id, err := c.AddJob(h.CronExpression, h) if err != nil { fmt.Println(time.Now().Format(timeFormat), " [ERROR] JobCore AddJob error", err) return 0, err @@ -166,10 +182,10 @@ func (h *ExecJob) addJob() (int, error) { } // 移除任务 -func Remove(entryID int) chan bool { +func Remove(c *cron.Cron, entryID int) chan bool { ch := make(chan bool) go func() { - global.GADMCron.Remove(cron.EntryID(entryID)) + c.Remove(cron.EntryID(entryID)) fmt.Println(time.Now().Format(timeFormat), " [INFO] JobCore Remove success ,info entryID :", entryID) ch <- true }() @@ -177,11 +193,11 @@ func Remove(entryID int) chan bool { } // 任务停止 -func Stop() chan bool { - ch := make(chan bool) - go func() { - global.GADMCron.Stop() - ch <- true - }() - return ch -} +//func Stop() chan bool { +// ch := make(chan bool) +// go func() { +// global.GADMCron.Stop() +// ch <- true +// }() +// return ch +//} diff --git a/app/jobs/type.go b/app/jobs/type.go index a7ede6af..b29b6b9d 100644 --- a/app/jobs/type.go +++ b/app/jobs/type.go @@ -1,8 +1,10 @@ package jobs +import "github.com/robfig/cron/v3" + type Job interface { Run() - addJob() (int, error) + addJob(*cron.Cron) (int, error) } type JobsExec interface { diff --git a/cmd/api/server.go b/cmd/api/server.go index 097e4cd8..48b13d67 100644 --- a/cmd/api/server.go +++ b/cmd/api/server.go @@ -3,30 +3,31 @@ package api import ( "context" "fmt" - "go-admin/app/admin/router" - "io/ioutil" + "log" "net/http" "os" "os/signal" "time" "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/config/source/file" + "github.com/go-admin-team/go-admin-core/sdk" + "github.com/go-admin-team/go-admin-core/sdk/config" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + "github.com/go-admin-team/go-admin-core/sdk/pkg/captcha" + "github.com/go-admin-team/go-admin-core/sdk/pkg/logger" "github.com/spf13/cobra" - "github.com/spf13/viper" + "go-admin/app/admin/models/system" + "go-admin/app/admin/router" "go-admin/app/jobs" "go-admin/common/database" "go-admin/common/global" - mycasbin "go-admin/pkg/casbin" - "go-admin/pkg/logger" - "go-admin/tools" - "go-admin/tools/config" + ext "go-admin/config" ) var ( configYml string - port string - mode string StartCmd = &cobra.Command{ Use: "server", Short: "Start API server", @@ -45,91 +46,131 @@ var AppRouters = make([]func(), 0) func init() { StartCmd.PersistentFlags().StringVarP(&configYml, "config", "c", "config/settings.yml", "Start server with provided configuration file") - StartCmd.PersistentFlags().StringVarP(&port, "port", "p", "8000", "Tcp port server listening on") - StartCmd.PersistentFlags().StringVarP(&mode, "mode", "m", "dev", "server mode ; eg:dev,test,prod") //注册路由 fixme 其他应用的路由,在本目录新建文件放在init方法 AppRouters = append(AppRouters, router.InitRouter) } func setup() { - + // 注入配置扩展项 + config.ExtendConfig = &ext.ExtConfig //1. 读取配置 - config.Setup(configYml) + config.Setup(file.NewSource, file.WithPath(configYml)) + go config.Watch() //2. 设置日志 - logger.Setup() + sdk.Runtime.SetLogger( + logger.SetupLogger( + config.LoggerConfig.Type, + config.LoggerConfig.Path, + config.LoggerConfig.Level, + config.LoggerConfig.Stdout)) //3. 初始化数据库链接 - database.Setup(config.DatabaseConfig.Driver) - //4. 接口访问控制加载 - mycasbin.Setup() + database.Setup() + //4. 设置缓存 + cacheAdapter, err := config.CacheConfig.Setup() + if err != nil { + log.Fatalf("cache setup error, %s\n", err.Error()) + } + sdk.Runtime.SetCacheAdapter(cacheAdapter) + //5. 设置验证码store + captcha.SetStore(captcha.NewCacheStore(cacheAdapter, 600)) - usageStr := `starting api server` - global.Logger.Info(usageStr) + //6. 设置队列 + if !config.QueueConfig.Empty() { + queueAdapter, err := config.QueueConfig.Setup() + if err != nil { + log.Fatalf("queue setup error, %s\n", err.Error()) + } + sdk.Runtime.SetQueueAdapter(queueAdapter) + } + //7. 设置分布式锁 + if !config.LockerConfig.Empty() { + lockerAdapter, err := config.LockerConfig.Setup() + if err != nil { + log.Fatalf("locker setup error, %s\n", err.Error()) + } + sdk.Runtime.SetLockerAdapter(lockerAdapter) + } + + usageStr := `starting api server...` + log.Println(usageStr) + //注册监听函数 + queue := sdk.Runtime.GetMemoryQueue("") + queue.Register(global.LoginLog, system.SaveLoginLog) + queue.Register(global.OperateLog, system.SaveOperaLog) + go queue.Run() } func run() error { - if viper.GetString("settings.application.mode") == string(tools.ModeProd) { + defer config.Stop() + + if config.ApplicationConfig.Mode == pkg.ModeProd.String() { gin.SetMode(gin.ReleaseMode) } - engine := global.Cfg.GetEngine() + engine := sdk.Runtime.GetEngine() if engine == nil { engine = gin.New() } + if config.ApplicationConfig.Mode == "dev" { + //监控 + AppRouters = append(AppRouters, router.Monitor) + } + for _, f := range AppRouters { f() } srv := &http.Server{ - Addr: config.ApplicationConfig.Host + ":" + config.ApplicationConfig.Port, - Handler: global.Cfg.GetEngine(), + Addr: fmt.Sprintf("%s:%d", config.ApplicationConfig.Host, config.ApplicationConfig.Port), + Handler: sdk.Runtime.GetEngine(), } go func() { jobs.InitJob() - jobs.Setup() + jobs.Setup(sdk.Runtime.GetDb()) }() + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + go func() { // 服务连接 if config.SslConfig.Enable { if err := srv.ListenAndServeTLS(config.SslConfig.Pem, config.SslConfig.KeyStr); err != nil && err != http.ErrServerClosed { - global.Logger.Fatal("listen: ", err) + log.Fatal("listen: ", err) } } else { if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { - global.Logger.Fatal("listen: ", err) + log.Fatal("listen: ", err) } } }() - content, _ := ioutil.ReadFile("./static/go-admin.txt") - fmt.Println(tools.Red(string(content))) + fmt.Println(pkg.Red(string(global.LogoContent))) tip() - fmt.Println(tools.Green("Server run at:")) - fmt.Printf("- Local: http://localhost:%s/ \r\n", config.ApplicationConfig.Port) - fmt.Printf("- Network: http://%s:%s/ \r\n", tools.GetLocaHonst(), config.ApplicationConfig.Port) - fmt.Println(tools.Green("Swagger run at:")) - fmt.Printf("- Local: http://localhost:%s/swagger/index.html \r\n", config.ApplicationConfig.Port) - fmt.Printf("- Network: http://%s:%s/swagger/index.html \r\n", tools.GetLocaHonst(), config.ApplicationConfig.Port) - fmt.Printf("%s Enter Control + C Shutdown Server \r\n", tools.GetCurrentTimeStr()) + fmt.Println(pkg.Green("Server run at:")) + fmt.Printf("- Local: http://localhost:%d/ \r\n", config.ApplicationConfig.Port) + fmt.Printf("- Network: http://%s:%d/ \r\n", pkg.GetLocaHonst(), config.ApplicationConfig.Port) + fmt.Println(pkg.Green("Swagger run at:")) + fmt.Printf("- Local: http://localhost:%d/swagger/index.html \r\n", config.ApplicationConfig.Port) + fmt.Printf("- Network: http://%s:%d/swagger/index.html \r\n", pkg.GetLocaHonst(), config.ApplicationConfig.Port) + fmt.Printf("%s Enter Control + C Shutdown Server \r\n", pkg.GetCurrentTimeStr()) // 等待中断信号以优雅地关闭服务器(设置 5 秒的超时时间) quit := make(chan os.Signal) signal.Notify(quit, os.Interrupt) <-quit - fmt.Printf("%s Shutdown Server ... \r\n", tools.GetCurrentTimeStr()) + fmt.Printf("%s Shutdown Server ... \r\n", pkg.GetCurrentTimeStr()) - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() if err := srv.Shutdown(ctx); err != nil { - global.Logger.Fatal("Server Shutdown:", err) + log.Fatal("Server Shutdown:", err) } - global.Logger.Println("Server exiting") + log.Println("Server exiting") return nil } func tip() { - usageStr := `欢迎使用 ` + tools.Green(`go-admin `+global.Version) + ` 可以使用 ` + tools.Red(`-h`) + ` 查看命令` + usageStr := `欢迎使用 ` + pkg.Green(`go-admin `+global.Version) + ` 可以使用 ` + pkg.Red(`-h`) + ` 查看命令` fmt.Printf("%s \n\n", usageStr) } diff --git a/cmd/cobra.go b/cmd/cobra.go index caeb17d1..b4b04ceb 100644 --- a/cmd/cobra.go +++ b/cmd/cobra.go @@ -3,6 +3,8 @@ package cmd import ( "errors" "fmt" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + "go-admin/common/global" "os" "github.com/spf13/cobra" @@ -11,8 +13,6 @@ import ( "go-admin/cmd/config" "go-admin/cmd/migrate" "go-admin/cmd/version" - "go-admin/common/global" - "go-admin/tools" ) var rootCmd = &cobra.Command{ @@ -23,7 +23,7 @@ var rootCmd = &cobra.Command{ Args: func(cmd *cobra.Command, args []string) error { if len(args) < 1 { tip() - return errors.New(tools.Red("requires at least one arg")) + return errors.New(pkg.Red("requires at least one arg")) } return nil }, @@ -34,7 +34,7 @@ var rootCmd = &cobra.Command{ } func tip() { - usageStr := `欢迎使用 ` + tools.Green(`go-admin `+global.Version) + ` 可以使用 ` + tools.Red(`-h`) + ` 查看命令` + usageStr := `欢迎使用 ` + pkg.Green(`go-admin `+global.Version) + ` 可以使用 ` + pkg.Red(`-h`) + ` 查看命令` usageStr1 := `也可以参考 http://doc.zhangwj.com/go-admin-site/guide/ksks.html 里边的【启动】章节` fmt.Printf("%s\n", usageStr) fmt.Printf("%s\n", usageStr1) diff --git a/cmd/config/server.go b/cmd/config/server.go index 8cae4cac..388b4ed7 100644 --- a/cmd/config/server.go +++ b/cmd/config/server.go @@ -4,14 +4,14 @@ import ( "encoding/json" "fmt" + "github.com/go-admin-team/go-admin-core/config/source/file" "github.com/spf13/cobra" - "go-admin/tools/config" + "github.com/go-admin-team/go-admin-core/sdk/config" ) var ( configYml string - mode string StartCmd = &cobra.Command{ Use: "config", Short: "Get Application config info", @@ -27,7 +27,7 @@ func init() { } func run() { - config.Setup(configYml) + config.Setup(file.NewSource, file.WithPath(configYml)) application, errs := json.MarshalIndent(config.ApplicationConfig, "", " ") //转换成JSON返回的是byte[] if errs != nil { @@ -41,7 +41,8 @@ func run() { } fmt.Println("jwt:", string(jwt)) - database, errs := json.MarshalIndent(config.DatabaseConfig, "", " ") //转换成JSON返回的是byte[] + // todo 需要兼容 + database, errs := json.MarshalIndent(config.DatabasesConfig, "", " ") //转换成JSON返回的是byte[] if errs != nil { fmt.Println(errs.Error()) } diff --git a/cmd/migrate/migration/init.go b/cmd/migrate/migration/init.go index 2cc3f10a..54261d1e 100644 --- a/cmd/migrate/migration/init.go +++ b/cmd/migrate/migration/init.go @@ -1,14 +1,14 @@ package migration import ( - "fmt" - "github.com/spf13/cast" - "gorm.io/gorm" "log" "path/filepath" "sort" "strconv" "sync" + + "github.com/spf13/cast" + "gorm.io/gorm" ) var Migrate = &Migration{ @@ -40,11 +40,12 @@ func (e *Migration) Migrate() { for k := range e.version { versions = append(versions, k) } - sort.IntsAreSorted(versions) + if !sort.IntsAreSorted(versions) { + sort.Ints(versions) + } var err error var count int64 for _, v := range versions { - fmt.Println(v) err = e.db.Debug().Table("sys_migration").Where("version = ?", v).Count(&count).Error if err != nil { log.Fatalln(err) diff --git a/cmd/migrate/migration/models/by.go b/cmd/migrate/migration/models/by.go new file mode 100644 index 00000000..c9dd9061 --- /dev/null +++ b/cmd/migrate/migration/models/by.go @@ -0,0 +1,22 @@ +package models + +import ( + "time" + + "gorm.io/gorm" +) + +type ControlBy struct { + CreateBy int `json:"createBy" gorm:"index;comment:创建者"` + UpdateBy int `json:"updateBy" gorm:"index;comment:更新者"` +} + +type Model struct { + Id int `json:"id" gorm:"primaryKey;autoIncrement;comment:主键编码"` +} + +type ModelTime struct { + CreatedAt time.Time `json:"createdAt" gorm:"comment:创建时间"` + UpdatedAt time.Time `json:"updatedAt" gorm:"comment:最后更新时间"` + DeletedAt gorm.DeletedAt `json:"-" gorm:"index;comment:删除时间"` +} diff --git a/app/admin/models/casbinrule.go b/cmd/migrate/migration/models/casbinrule.go similarity index 100% rename from app/admin/models/casbinrule.go rename to cmd/migrate/migration/models/casbinrule.go diff --git a/cmd/migrate/migration/models/dictdata.go b/cmd/migrate/migration/models/dictdata.go new file mode 100644 index 00000000..4111aacd --- /dev/null +++ b/cmd/migrate/migration/models/dictdata.go @@ -0,0 +1,21 @@ +package models + +type DictData struct { + DictCode int `gorm:"primaryKey;autoIncrement;" json:"dictCode" example:"1"` //字典编码 + DictSort int `gorm:"" json:"dictSort"` //显示顺序 + DictLabel string `gorm:"size:128;" json:"dictLabel"` //数据标签 + DictValue string `gorm:"size:255;" json:"dictValue"` //数据键值 + DictType string `gorm:"size:64;" json:"dictType"` //字典类型 + CssClass string `gorm:"size:128;" json:"cssClass"` // + ListClass string `gorm:"size:128;" json:"listClass"` // + IsDefault string `gorm:"size:8;" json:"isDefault"` // + Status string `gorm:"size:4;" json:"status"` //状态 + Default string `gorm:"size:8;" json:"default"` // + Remark string `gorm:"size:255;" json:"remark"` //备注 + ControlBy + ModelTime +} + +func (DictData) TableName() string { + return "sys_dict_data" +} diff --git a/cmd/migrate/migration/models/dicttype.go b/cmd/migrate/migration/models/dicttype.go new file mode 100644 index 00000000..823b5070 --- /dev/null +++ b/cmd/migrate/migration/models/dicttype.go @@ -0,0 +1,15 @@ +package models + +type DictType struct { + DictId int `gorm:"primaryKey;autoIncrement;" json:"dictId"` + DictName string `gorm:"size:128;" json:"dictName"` //字典名称 + DictType string `gorm:"size:128;" json:"dictType"` //字典类型 + Status string `gorm:"size:4;" json:"status"` //状态 + Remark string `gorm:"size:255;" json:"remark"` //备注 + ControlBy + ModelTime +} + +func (DictType) TableName() string { + return "sys_dict_type" +} diff --git a/cmd/migrate/migration/models/initdb.go b/cmd/migrate/migration/models/initdb.go new file mode 100644 index 00000000..9bb37a2a --- /dev/null +++ b/cmd/migrate/migration/models/initdb.go @@ -0,0 +1,55 @@ +package models + +import ( + "fmt" + "go-admin/common/global" + "gorm.io/gorm" + "io/ioutil" + "log" + "strings" +) + +func InitDb(db *gorm.DB) (err error) { + filePath := "config/db.sql" + err = ExecSql(db, filePath) + if global.Driver == "postgres" { + filePath = "config/pg.sql" + err = ExecSql(db, filePath) + } + return err +} + +func ExecSql(db *gorm.DB, filePath string) error { + sql, err := Ioutil(filePath) + if err != nil { + fmt.Println("数据库基础数据初始化脚本读取失败!原因:", err.Error()) + return err + } + sqlList := strings.Split(sql, ";") + for i := 0; i < len(sqlList)-1; i++ { + if strings.Contains(sqlList[i], "--") { + fmt.Println(sqlList[i]) + continue + } + sql := strings.Replace(sqlList[i]+";", "\n", "", 0) + sql = strings.TrimSpace(sql) + if err = db.Exec(sql).Error; err != nil { + log.Printf("error sql: %s", sql) + if !strings.Contains(err.Error(), "Query was empty") { + return err + } + } + } + return nil +} + +func Ioutil(filePath string) (string, error) { + if contents, err := ioutil.ReadFile(filePath); err == nil { + //因为contents是[]byte类型,直接转换成string类型后会多一行空格,需要使用strings.Replace替换换行符 + result := strings.Replace(string(contents), "\n", "", 1) + fmt.Println("Use ioutil.ReadFile to read a file:", result) + return result, nil + } else { + return "", err + } +} diff --git a/cmd/migrate/migration/models/model.go b/cmd/migrate/migration/models/model.go new file mode 100644 index 00000000..4a1c439b --- /dev/null +++ b/cmd/migrate/migration/models/model.go @@ -0,0 +1,11 @@ +package models + +import ( + "time" +) + +type BaseModel struct { + CreatedAt time.Time `json:"createdAt"` + UpdatedAt time.Time `json:"updatedAt"` + DeletedAt *time.Time `json:"deletedAt"` +} diff --git a/cmd/migrate/migration/models/post.go b/cmd/migrate/migration/models/post.go new file mode 100644 index 00000000..3329b4a2 --- /dev/null +++ b/cmd/migrate/migration/models/post.go @@ -0,0 +1,16 @@ +package models + +type Post struct { + PostId int `gorm:"primaryKey;autoIncrement" json:"postId"` //岗位编号 + PostName string `gorm:"size:128;" json:"postName"` //岗位名称 + PostCode string `gorm:"size:128;" json:"postCode"` //岗位代码 + Sort int `gorm:"" json:"sort"` //岗位排序 + Status string `gorm:"size:4;" json:"status"` //状态 + Remark string `gorm:"size:255;" json:"remark"` //描述 + ModelTime + ControlBy +} + +func (Post) TableName() string { + return "sys_post" +} diff --git a/cmd/migrate/migration/models/role.go b/cmd/migrate/migration/models/role.go new file mode 100644 index 00000000..015aefe5 --- /dev/null +++ b/cmd/migrate/migration/models/role.go @@ -0,0 +1,19 @@ +package models + +type SysRole struct { + RoleId int `json:"roleId" gorm:"primaryKey;autoIncrement"` // 角色编码 + RoleName string `json:"roleName" gorm:"size:128;"` // 角色名称 + Status string `json:"status" gorm:"size:4;"` // + RoleKey string `json:"roleKey" gorm:"size:128;"` //角色代码 + RoleSort int `json:"roleSort" gorm:""` //角色排序 + Flag string `json:"flag" gorm:"size:128;"` // + Remark string `json:"remark" gorm:"size:255;"` //备注 + Admin bool `json:"admin" gorm:"size:4;"` + DataScope string `json:"dataScope" gorm:"size:128;"` + ModelTime + ControlBy +} + +func (SysRole) TableName() string { + return "sys_role" +} diff --git a/cmd/migrate/migration/models/role_dept.go b/cmd/migrate/migration/models/role_dept.go new file mode 100644 index 00000000..0a794e00 --- /dev/null +++ b/cmd/migrate/migration/models/role_dept.go @@ -0,0 +1,11 @@ +package models + +//sys_role_dept +type SysRoleDept struct { + RoleId int `gorm:"size:11;primaryKey"` + DeptId int `gorm:"size:11;primaryKey"` +} + +func (SysRoleDept) TableName() string { + return "sys_role_dept" +} diff --git a/cmd/migrate/migration/models/rolemenu.go b/cmd/migrate/migration/models/rolemenu.go new file mode 100644 index 00000000..f2ca38df --- /dev/null +++ b/cmd/migrate/migration/models/rolemenu.go @@ -0,0 +1,12 @@ +package models + +type RoleMenu struct { + RoleId int `gorm:""` + MenuId int `gorm:""` + RoleName string `gorm:"size:128)"` + ControlBy +} + +func (RoleMenu) TableName() string { + return "sys_role_menu" +} diff --git a/cmd/migrate/migration/models/sys_config.go b/cmd/migrate/migration/models/sys_config.go new file mode 100644 index 00000000..f8b53f29 --- /dev/null +++ b/cmd/migrate/migration/models/sys_config.go @@ -0,0 +1,17 @@ +package models + +type SysConfig struct { + Model + ConfigName string `json:"configName" gorm:"type:varchar(128);comment:ConfigName"` // + ConfigKey string `json:"configKey" gorm:"type:varchar(128);comment:ConfigKey"` // + ConfigValue string `json:"configValue" gorm:"type:varchar(255);comment:ConfigValue"` // + ConfigType string `json:"configType" gorm:"type:varchar(64);comment:ConfigType"` + IsFrontend int `json:"isFrontend" gorm:"type:varchar(64);comment:是否前台"` // + Remark string `json:"remark" gorm:"type:varchar(128);comment:Remark"` // + ControlBy + ModelTime +} + +func (SysConfig) TableName() string { + return "sys_config" +} diff --git a/cmd/migrate/migration/models/sys_dept.go b/cmd/migrate/migration/models/sys_dept.go new file mode 100644 index 00000000..2fc66a7f --- /dev/null +++ b/cmd/migrate/migration/models/sys_dept.go @@ -0,0 +1,19 @@ +package models + +type SysDept struct { + DeptId int `json:"deptId" gorm:"primaryKey;autoIncrement;"` //部门编码 + ParentId int `json:"parentId" gorm:""` //上级部门 + DeptPath string `json:"deptPath" gorm:"size:255;"` // + DeptName string `json:"deptName" gorm:"size:128;"` //部门名称 + Sort int `json:"sort" gorm:""` //排序 + Leader string `json:"leader" gorm:"size:128;"` //负责人 + Phone string `json:"phone" gorm:"size:11;"` //手机 + Email string `json:"email" gorm:"size:64;"` //邮箱 + Status string `json:"status" gorm:"size:4;"` //状态 + ControlBy + ModelTime +} + +func (SysDept) TableName() string { + return "sys_dept" +} diff --git a/cmd/migrate/migration/models/sys_file_dir.go b/cmd/migrate/migration/models/sys_file_dir.go new file mode 100644 index 00000000..83181f0f --- /dev/null +++ b/cmd/migrate/migration/models/sys_file_dir.go @@ -0,0 +1,16 @@ +package models + +type SysFileDir struct { + Model + Label string `json:"label" gorm:"type:varchar(255);comment:目录名称"` // 目录名称 + PId int `json:"pId" gorm:"type:int(11);comment:上级目录"` // 上级目录 + Sort string `json:"sort" gorm:"type:bigint(20);comment:排序"` // 排序 + Path string `json:"path" gorm:"type:varchar(255);comment:路径"` // 路径 + Children []SysFileDir `json:"children,omitempty" gorm:"-"` // 下级信息 + ControlBy + ModelTime +} + +func (SysFileDir) TableName() string { /**/ + return "sys_file_dir" +} diff --git a/cmd/migrate/migration/models/sys_file_info.go b/cmd/migrate/migration/models/sys_file_info.go new file mode 100644 index 00000000..66fe8515 --- /dev/null +++ b/cmd/migrate/migration/models/sys_file_info.go @@ -0,0 +1,18 @@ +package models + +type SysFileInfo struct { + Model + Type string `json:"type" gorm:"type:varchar(255);comment:类型"` // + Name string `json:"name" gorm:"type:varchar(255);comment:名称"` // + Size string `json:"size" gorm:"type:int(11);comment:大小"` // + PId int `json:"pId" gorm:"type:int(11);comment:目录"` // + Source string `json:"source" gorm:"type:varchar(255);comment:来源"` // + Url string `json:"url" gorm:"type:varchar(255);comment:地址"` // + FullUrl string `json:"fullUrl" gorm:"type:varchar(255);comment:全地址"` // + ControlBy + ModelTime +} + +func (SysFileInfo) TableName() string { + return "sys_file_info" +} diff --git a/cmd/migrate/migration/models/sys_login_log.go b/cmd/migrate/migration/models/sys_login_log.go new file mode 100644 index 00000000..f4a878bc --- /dev/null +++ b/cmd/migrate/migration/models/sys_login_log.go @@ -0,0 +1,26 @@ +package models + +import ( + "time" +) + +type SysLoginLog struct { + Model + Username string `json:"username" gorm:"type:varchar(128);comment:用户名"` + Status string `json:"status" gorm:"type:varchar(4);comment:状态"` + Ipaddr string `json:"ipaddr" gorm:"type:varchar(255);comment:ip地址"` + LoginLocation string `json:"loginLocation" gorm:"type:varchar(255);comment:归属地"` + Browser string `json:"browser" gorm:"type:varchar(255);comment:浏览器"` + Os string `json:"os" gorm:"type:varchar(255);comment:系统"` + Platform string `json:"platform" gorm:"type:varchar(255);comment:固件"` + LoginTime time.Time `json:"loginTime" gorm:"type:timestamp;comment:登录时间"` + Remark string `json:"remark" gorm:"type:varchar(255);comment:备注"` + Msg string `json:"msg" gorm:"type:varchar(255);comment:信息"` + CreatedAt time.Time `json:"createdAt" gorm:"comment:创建时间"` + UpdatedAt time.Time `json:"updatedAt" gorm:"comment:最后更新时间"` + ControlBy +} + +func (SysLoginLog) TableName() string { + return "sys_login_log" +} diff --git a/cmd/migrate/migration/models/sys_menu.go b/cmd/migrate/migration/models/sys_menu.go new file mode 100644 index 00000000..c0f88487 --- /dev/null +++ b/cmd/migrate/migration/models/sys_menu.go @@ -0,0 +1,28 @@ +package models + +type SysMenu struct { + MenuId int `json:"menuId" gorm:"primaryKey;autoIncrement"` + MenuName string `json:"menuName" gorm:"size:128;"` + Title string `json:"title" gorm:"size:128;"` + Icon string `json:"icon" gorm:"size:128;"` + Path string `json:"path" gorm:"size:128;"` + Paths string `json:"paths" gorm:"size:128;"` + MenuType string `json:"menuType" gorm:"size:1;"` + Action string `json:"action" gorm:"size:16;"` + Permission string `json:"permission" gorm:"size:255;"` + ParentId int `json:"parentId" gorm:"size:11;"` + NoCache bool `json:"noCache" gorm:"size:8;"` + Breadcrumb string `json:"breadcrumb" gorm:"size:255;"` + Component string `json:"component" gorm:"size:255;"` + Sort int `json:"sort" gorm:"size:4;"` + Visible string `json:"visible" gorm:"size:1;"` + IsFrame string `json:"isFrame" gorm:"size:1;DEFAULT:0;"` + DataScope string `json:"dataScope" gorm:"-"` + Params string `json:"params" gorm:"-"` + ControlBy + ModelTime +} + +func (SysMenu) TableName() string { + return "sys_menu" +} diff --git a/cmd/migrate/migration/models/sys_opera_log.go b/cmd/migrate/migration/models/sys_opera_log.go new file mode 100644 index 00000000..3143dba4 --- /dev/null +++ b/cmd/migrate/migration/models/sys_opera_log.go @@ -0,0 +1,34 @@ +package models + +import ( + "time" +) + +type SysOperaLog struct { + Model + Title string `json:"title" gorm:"type:varchar(255);comment:操作模块"` + BusinessType string `json:"businessType" gorm:"type:varchar(128);comment:操作类型"` + BusinessTypes string `json:"businessTypes" gorm:"type:varchar(128);comment:BusinessTypes"` + Method string `json:"method" gorm:"type:varchar(128);comment:函数"` + RequestMethod string `json:"requestMethod" gorm:"type:varchar(128);comment:请求方式"` + OperatorType string `json:"operatorType" gorm:"type:varchar(128);comment:操作类型"` + OperName string `json:"operName" gorm:"type:varchar(128);comment:操作者"` + DeptName string `json:"deptName" gorm:"type:varchar(128);comment:部门名称"` + OperUrl string `json:"operUrl" gorm:"type:varchar(255);comment:访问地址"` + OperIp string `json:"operIp" gorm:"type:varchar(128);comment:客户端ip"` + OperLocation string `json:"operLocation" gorm:"type:varchar(128);comment:访问位置"` + OperParam string `json:"operParam" gorm:"type:varchar(255);comment:请求参数"` + Status string `json:"status" gorm:"type:varchar(4);comment:操作状态"` + OperTime time.Time `json:"operTime" gorm:"type:timestamp;comment:操作时间"` + JsonResult string `json:"jsonResult" gorm:"type:varchar(255);comment:返回数据"` + Remark string `json:"remark" gorm:"type:varchar(255);comment:备注"` + LatencyTime string `json:"latencyTime" gorm:"type:varchar(128);comment:耗时"` + UserAgent string `json:"userAgent" gorm:"type:varchar(255);comment:ua"` + CreatedAt time.Time `json:"createdAt" gorm:"comment:创建时间"` + UpdatedAt time.Time `json:"updatedAt" gorm:"comment:最后更新时间"` + ControlBy +} + +func (SysOperaLog) TableName() string { + return "sys_opera_log" +} diff --git a/cmd/migrate/migration/models/sys_user.go b/cmd/migrate/migration/models/sys_user.go new file mode 100644 index 00000000..017d92ef --- /dev/null +++ b/cmd/migrate/migration/models/sys_user.go @@ -0,0 +1,48 @@ +package models + +import ( + "golang.org/x/crypto/bcrypt" + "gorm.io/gorm" +) + +type SysUser struct { + ControlBy + ModelTime + UserId int `gorm:"primaryKey;autoIncrement;comment:编码" json:"userId"` + Username string `json:"username" gorm:"type:varchar(64);comment:用户名"` + Password string `json:"-" gorm:"type:varchar(128);comment:密码"` + NickName string `json:"nickName" gorm:"type:varchar(128);comment:昵称"` + Phone string `json:"phone" gorm:"type:varchar(11);comment:手机号"` + RoleId int `json:"roleId" gorm:"type:bigint(20);comment:角色ID"` + Salt string `json:"-" gorm:"type:varchar(255);comment:加盐"` + Avatar string `json:"avatar" gorm:"type:varchar(255);comment:头像"` + Sex string `json:"sex" gorm:"type:varchar(255);comment:性别"` + Email string `json:"email" gorm:"type:varchar(128);comment:邮箱"` + DeptId int `json:"deptId" gorm:"type:bigint(20);comment:部门"` + PostId int `json:"postId" gorm:"type:bigint(20);comment:岗位"` + Remark string `json:"remark" gorm:"type:varchar(255);comment:备注"` + Status string `json:"status" gorm:"type:varchar(4);comment:状态"` +} + +func (SysUser) TableName() string { + return "sys_user" +} + +//加密 +func (e *SysUser) Encrypt() (err error) { + if e.Password == "" { + return + } + + var hash []byte + if hash, err = bcrypt.GenerateFromPassword([]byte(e.Password), bcrypt.DefaultCost); err != nil { + return + } else { + e.Password = string(hash) + return + } +} + +func (e *SysUser) BeforeCreate(_ *gorm.DB) error { + return e.Encrypt() +} diff --git a/cmd/migrate/migration/models/syscategory.go b/cmd/migrate/migration/models/syscategory.go new file mode 100644 index 00000000..f2edac3e --- /dev/null +++ b/cmd/migrate/migration/models/syscategory.go @@ -0,0 +1,16 @@ +package models + +type SysCategory struct { + Model + Name string `json:"name" gorm:"type:varchar(255);comment:名称"` // + Img string `json:"img" gorm:"type:varchar(255);comment:图标"` // + Sort int `json:"sort" gorm:"type:int(4);comment:排序"` // + Status int `json:"status" gorm:"type:int(1);comment:状态"` // + Remark string `json:"remark" gorm:"type:varchar(255);comment:备注"` // + ControlBy + ModelTime +} + +func (SysCategory) TableName() string { + return "sys_category" +} diff --git a/cmd/migrate/migration/models/syscolumns.go b/cmd/migrate/migration/models/syscolumns.go new file mode 100644 index 00000000..2c8377ed --- /dev/null +++ b/cmd/migrate/migration/models/syscolumns.go @@ -0,0 +1,44 @@ +package models + +type SysColumns struct { + ColumnId int `gorm:"primaryKey;autoIncrement" json:"columnId"` + TableId int `gorm:"" json:"tableId"` + ColumnName string `gorm:"size:128;" json:"columnName"` + ColumnComment string `gorm:"column:column_comment;size:128;" json:"columnComment"` + ColumnType string `gorm:"column:column_type;size:128;" json:"columnType"` + GoType string `gorm:"column:go_type;size:128;" json:"goType"` + GoField string `gorm:"column:go_field;size:128;" json:"goField"` + JsonField string `gorm:"column:json_field;size:128;" json:"jsonField"` + IsPk string `gorm:"column:is_pk;size:4;" json:"isPk"` + IsIncrement string `gorm:"column:is_increment;size:4;" json:"isIncrement"` + IsRequired string `gorm:"column:is_required;size:4;" json:"isRequired"` + IsInsert string `gorm:"column:is_insert;size:4;" json:"isInsert"` + IsEdit string `gorm:"column:is_edit;size:4;" json:"isEdit"` + IsList string `gorm:"column:is_list;size:4;" json:"isList"` + IsQuery string `gorm:"column:is_query;size:4;" json:"isQuery"` + QueryType string `gorm:"column:query_type;size:128;" json:"queryType"` + HtmlType string `gorm:"column:html_type;size:128;" json:"htmlType"` + DictType string `gorm:"column:dict_type;size:128;" json:"dictType"` + Sort int `gorm:"column:sort;" json:"sort"` + List string `gorm:"column:list;size:1;" json:"list"` + Pk bool `gorm:"column:pk;size:1;" json:"pk"` + Required bool `gorm:"column:required;size:1;" json:"required"` + SuperColumn bool `gorm:"column:super_column;size:1;" json:"superColumn"` + UsableColumn bool `gorm:"column:usable_column;size:1;" json:"usableColumn"` + Increment bool `gorm:"column:increment;size:1;" json:"increment"` + Insert bool `gorm:"column:insert;size:1;" json:"insert"` + Edit bool `gorm:"column:edit;size:1;" json:"edit"` + Query bool `gorm:"column:query;size:1;" json:"query"` + Remark string `gorm:"column:remark;size:255;" json:"remark"` + FkTableName string `gorm:"" json:"fkTableName"` + FkTableNameClass string `gorm:"" json:"fkTableNameClass"` + FkTableNamePackage string `gorm:"" json:"fkTableNamePackage"` + FkLabelId string `gorm:"" json:"fkLabelId"` + FkLabelName string `gorm:"size:255;" json:"fkLabelName"` + ModelTime + ControlBy +} + +func (SysColumns) TableName() string { + return "sys_columns" +} diff --git a/cmd/migrate/migration/models/syscontent.go b/cmd/migrate/migration/models/syscontent.go new file mode 100644 index 00000000..04c9ef11 --- /dev/null +++ b/cmd/migrate/migration/models/syscontent.go @@ -0,0 +1,19 @@ +package models + +type SysContent struct { + Model + CateId int `json:"cateId" gorm:"type:int(11);comment:分类id"` + Name string `json:"name" gorm:"type:varchar(255);comment:名称"` + Status int `json:"status" gorm:"type:int(1);comment:状态"` + Img string `json:"img" gorm:"type:varchar(255);comment:图片"` + Content string `json:"content" gorm:"type:text;comment:内容"` + Remark string `json:"remark" gorm:"type:varchar(255);comment:备注"` + Sort int `json:"sort" gorm:"type:int(4);comment:排序"` + ControlBy + ModelTime +} + +// TableName +func (SysContent) TableName() string { + return "sys_content" +} diff --git a/cmd/migrate/migration/models/sysjob.go b/cmd/migrate/migration/models/sysjob.go new file mode 100644 index 00000000..e826d106 --- /dev/null +++ b/cmd/migrate/migration/models/sysjob.go @@ -0,0 +1,21 @@ +package models + +type SysJob struct { + JobId int `json:"jobId" gorm:"primaryKey;autoIncrement"` // 编码 + JobName string `json:"jobName" gorm:"size:255;"` // 名称 + JobGroup string `json:"jobGroup" gorm:"size:255;"` // 任务分组 + JobType int `json:"jobType" gorm:"size:1;"` // 任务类型 + CronExpression string `json:"cronExpression" gorm:"size:255;"` // cron表达式 + InvokeTarget string `json:"invokeTarget" gorm:"size:255;"` // 调用目标 + Args string `json:"args" gorm:"size:255;"` // 目标参数 + MisfirePolicy int `json:"misfirePolicy" gorm:"size:255;"` // 执行策略 + Concurrent int `json:"concurrent" gorm:"size:1;"` // 是否并发 + Status int `json:"status" gorm:"size:1;"` // 状态 + EntryId int `json:"entry_id" gorm:"size:11;"` // job启动时返回的id + ModelTime + ControlBy +} + +func (SysJob) TableName() string { + return "sys_job" +} diff --git a/cmd/migrate/migration/models/systables.go b/cmd/migrate/migration/models/systables.go new file mode 100644 index 00000000..d79993b6 --- /dev/null +++ b/cmd/migrate/migration/models/systables.go @@ -0,0 +1,36 @@ +package models + +type SysTables struct { + TableId int `gorm:"primaryKey;autoIncrement" json:"tableId"` //表编码 + TBName string `gorm:"column:table_name;size:255;" json:"tableName"` //表名称 + TableComment string `gorm:"size:255;" json:"tableComment"` //表备注 + ClassName string `gorm:"size:255;" json:"className"` //类名 + TplCategory string `gorm:"size:255;" json:"tplCategory"` // + PackageName string `gorm:"size:255;" json:"packageName"` //包名 + ModuleName string `gorm:"size:255;" json:"moduleName"` //模块名 + BusinessName string `gorm:"size:255;" json:"businessName"` // + FunctionName string `gorm:"size:255;" json:"functionName"` //功能名称 + FunctionAuthor string `gorm:"size:255;" json:"functionAuthor"` //功能作者 + PkColumn string `gorm:"size:255;" json:"pkColumn"` + PkGoField string `gorm:"size:255;" json:"pkGoField"` + PkJsonField string `gorm:"size:255;" json:"pkJsonField"` + Options string `gorm:"size:255;" json:"options"` + TreeCode string `gorm:"size:255;" json:"treeCode"` + TreeParentCode string `gorm:"size:255;" json:"treeParentCode"` + TreeName string `gorm:"size:255;" json:"treeName"` + Tree bool `gorm:"size:1;" json:"tree"` + Crud bool `gorm:"size:1;" json:"crud"` + Remark string `gorm:"size:255;" json:"remark"` + IsDataScope int `gorm:"size:1;" json:"isDataScope"` + IsActions int `gorm:"size:1;" json:"isActions"` + IsAuth int `gorm:"size:1;" json:"isAuth"` + IsLogicalDelete string `gorm:"size:1;" json:"isLogicalDelete"` + LogicalDelete bool `gorm:"size:1;" json:"logicalDelete"` + LogicalDeleteColumn string `gorm:"size:128;" json:"logicalDeleteColumn"` + ModelTime + ControlBy +} + +func (SysTables) TableName() string { + return "sys_tables" +} diff --git a/cmd/migrate/migration/models/system.go b/cmd/migrate/migration/models/system.go new file mode 100644 index 00000000..b0498c3f --- /dev/null +++ b/cmd/migrate/migration/models/system.go @@ -0,0 +1,12 @@ +package models + +type SysSetting struct { + SettingsId int `json:"settings_id" gorm:"primary_key;AUTO_INCREMENT"` + Name string `json:"name" gorm:"type:varchar(256);"` + Logo string `json:"logo" gorm:"type:varchar(256);"` + ModelTime +} + +func (SysSetting) TableName() string { + return "sys_setting" +} diff --git a/cmd/migrate/migration/version-local/doc.go b/cmd/migrate/migration/version-local/doc.go new file mode 100644 index 00000000..2cec8bc4 --- /dev/null +++ b/cmd/migrate/migration/version-local/doc.go @@ -0,0 +1,8 @@ +package version_local + +func init() { +} + +/** +开发者项目的迁移脚本放在这个目录里,init写法参考version目录里的migrate或者自动生成 +*/ diff --git a/cmd/migrate/migration/version/1599190683659_tables.go b/cmd/migrate/migration/version/1599190683659_tables.go index 4e0a8673..ba23366d 100644 --- a/cmd/migrate/migration/version/1599190683659_tables.go +++ b/cmd/migrate/migration/version/1599190683659_tables.go @@ -5,9 +5,8 @@ import ( "gorm.io/gorm" - "go-admin/app/admin/models" - "go-admin/app/admin/models/tools" "go-admin/cmd/migrate/migration" + "go-admin/cmd/migrate/migration/models" common "go-admin/common/models" ) @@ -21,11 +20,11 @@ func _1599190683659Tables(db *gorm.DB, version string) error { new(models.CasbinRule), new(models.SysDept), new(models.SysConfig), - new(tools.SysTables), - new(tools.SysColumns), - new(models.Menu), - new(models.LoginLog), - new(models.SysOperLog), + new(models.SysTables), + new(models.SysColumns), + new(models.SysMenu), + new(models.SysLoginLog), + new(models.SysOperaLog), new(models.RoleMenu), new(models.SysRoleDept), new(models.SysUser), diff --git a/cmd/migrate/migration/version/1599190683670_migrate.go b/cmd/migrate/migration/version/1599190683670_migrate.go index 85a6196f..a420bbee 100644 --- a/cmd/migrate/migration/version/1599190683670_migrate.go +++ b/cmd/migrate/migration/version/1599190683670_migrate.go @@ -1,14 +1,14 @@ package version import ( - common "go-admin/common/models" "runtime" "time" "gorm.io/gorm" - "go-admin/app/admin/models" "go-admin/cmd/migrate/migration" + "go-admin/cmd/migrate/migration/models" + common "go-admin/common/models" ) func init() { @@ -19,333 +19,167 @@ func init() { func _1599190683670Test(db *gorm.DB, version string) error { return db.Transaction(func(tx *gorm.DB) error { - list1 := []models.RoleMenu{ - {RoleId: 1, MenuId: 2, RoleName: "admin"}, - {RoleId: 1, MenuId: 3, RoleName: "admin"}, - {RoleId: 1, MenuId: 43, RoleName: "admin"}, - {RoleId: 1, MenuId: 44, RoleName: "admin"}, - {RoleId: 1, MenuId: 45, RoleName: "admin"}, - {RoleId: 1, MenuId: 46, RoleName: "admin"}, - {RoleId: 1, MenuId: 51, RoleName: "admin"}, - {RoleId: 1, MenuId: 52, RoleName: "admin"}, - {RoleId: 1, MenuId: 56, RoleName: "admin"}, - {RoleId: 1, MenuId: 57, RoleName: "admin"}, - {RoleId: 1, MenuId: 58, RoleName: "admin"}, - {RoleId: 1, MenuId: 59, RoleName: "admin"}, - {RoleId: 1, MenuId: 60, RoleName: "admin"}, - {RoleId: 1, MenuId: 61, RoleName: "admin"}, - {RoleId: 1, MenuId: 62, RoleName: "admin"}, - {RoleId: 1, MenuId: 63, RoleName: "admin"}, - {RoleId: 1, MenuId: 64, RoleName: "admin"}, - {RoleId: 1, MenuId: 66, RoleName: "admin"}, - {RoleId: 1, MenuId: 67, RoleName: "admin"}, - {RoleId: 1, MenuId: 68, RoleName: "admin"}, - {RoleId: 1, MenuId: 69, RoleName: "admin"}, - {RoleId: 1, MenuId: 70, RoleName: "admin"}, - {RoleId: 1, MenuId: 71, RoleName: "admin"}, - {RoleId: 1, MenuId: 72, RoleName: "admin"}, - {RoleId: 1, MenuId: 73, RoleName: "admin"}, - {RoleId: 1, MenuId: 74, RoleName: "admin"}, - {RoleId: 1, MenuId: 75, RoleName: "admin"}, - {RoleId: 1, MenuId: 76, RoleName: "admin"}, - {RoleId: 1, MenuId: 77, RoleName: "admin"}, - {RoleId: 1, MenuId: 78, RoleName: "admin"}, - {RoleId: 1, MenuId: 79, RoleName: "admin"}, - {RoleId: 1, MenuId: 80, RoleName: "admin"}, - {RoleId: 1, MenuId: 81, RoleName: "admin"}, - {RoleId: 1, MenuId: 82, RoleName: "admin"}, - {RoleId: 1, MenuId: 83, RoleName: "admin"}, - {RoleId: 1, MenuId: 84, RoleName: "admin"}, - {RoleId: 1, MenuId: 85, RoleName: "admin"}, - {RoleId: 1, MenuId: 86, RoleName: "admin"}, - {RoleId: 1, MenuId: 87, RoleName: "admin"}, - {RoleId: 1, MenuId: 89, RoleName: "admin"}, - {RoleId: 1, MenuId: 90, RoleName: "admin"}, - {RoleId: 1, MenuId: 91, RoleName: "admin"}, - {RoleId: 1, MenuId: 92, RoleName: "admin"}, - {RoleId: 1, MenuId: 93, RoleName: "admin"}, - {RoleId: 1, MenuId: 94, RoleName: "admin"}, - {RoleId: 1, MenuId: 95, RoleName: "admin"}, - {RoleId: 1, MenuId: 96, RoleName: "admin"}, - {RoleId: 1, MenuId: 97, RoleName: "admin"}, - {RoleId: 1, MenuId: 103, RoleName: "admin"}, - {RoleId: 1, MenuId: 104, RoleName: "admin"}, - {RoleId: 1, MenuId: 105, RoleName: "admin"}, - {RoleId: 1, MenuId: 106, RoleName: "admin"}, - {RoleId: 1, MenuId: 107, RoleName: "admin"}, - {RoleId: 1, MenuId: 108, RoleName: "admin"}, - {RoleId: 1, MenuId: 109, RoleName: "admin"}, - {RoleId: 1, MenuId: 110, RoleName: "admin"}, - {RoleId: 1, MenuId: 111, RoleName: "admin"}, - {RoleId: 1, MenuId: 112, RoleName: "admin"}, - {RoleId: 1, MenuId: 113, RoleName: "admin"}, - {RoleId: 1, MenuId: 114, RoleName: "admin"}, - {RoleId: 1, MenuId: 115, RoleName: "admin"}, - {RoleId: 1, MenuId: 116, RoleName: "admin"}, - {RoleId: 1, MenuId: 117, RoleName: "admin"}, - {RoleId: 1, MenuId: 118, RoleName: "admin"}, - {RoleId: 1, MenuId: 119, RoleName: "admin"}, - {RoleId: 1, MenuId: 120, RoleName: "admin"}, - {RoleId: 1, MenuId: 121, RoleName: "admin"}, - {RoleId: 1, MenuId: 122, RoleName: "admin"}, - {RoleId: 1, MenuId: 123, RoleName: "admin"}, - {RoleId: 1, MenuId: 138, RoleName: "admin"}, - {RoleId: 1, MenuId: 142, RoleName: "admin"}, - {RoleId: 1, MenuId: 201, RoleName: "admin"}, - {RoleId: 1, MenuId: 202, RoleName: "admin"}, - {RoleId: 1, MenuId: 203, RoleName: "admin"}, - {RoleId: 1, MenuId: 204, RoleName: "admin"}, - {RoleId: 1, MenuId: 205, RoleName: "admin"}, - {RoleId: 1, MenuId: 206, RoleName: "admin"}, - {RoleId: 1, MenuId: 211, RoleName: "admin"}, - {RoleId: 1, MenuId: 212, RoleName: "admin"}, - {RoleId: 1, MenuId: 213, RoleName: "admin"}, - {RoleId: 1, MenuId: 214, RoleName: "admin"}, - {RoleId: 1, MenuId: 215, RoleName: "admin"}, - {RoleId: 1, MenuId: 216, RoleName: "admin"}, - {RoleId: 1, MenuId: 217, RoleName: "admin"}, - {RoleId: 1, MenuId: 220, RoleName: "admin"}, - {RoleId: 1, MenuId: 221, RoleName: "admin"}, - {RoleId: 1, MenuId: 222, RoleName: "admin"}, - {RoleId: 1, MenuId: 223, RoleName: "admin"}, - {RoleId: 1, MenuId: 224, RoleName: "admin"}, - {RoleId: 1, MenuId: 225, RoleName: "admin"}, - {RoleId: 1, MenuId: 226, RoleName: "admin"}, - {RoleId: 1, MenuId: 227, RoleName: "admin"}, - {RoleId: 1, MenuId: 228, RoleName: "admin"}, - {RoleId: 1, MenuId: 229, RoleName: "admin"}, - {RoleId: 1, MenuId: 230, RoleName: "admin"}, - {RoleId: 1, MenuId: 231, RoleName: "admin"}, - {RoleId: 1, MenuId: 232, RoleName: "admin"}, - {RoleId: 1, MenuId: 233, RoleName: "admin"}, - {RoleId: 1, MenuId: 234, RoleName: "admin"}, - {RoleId: 1, MenuId: 235, RoleName: "admin"}, - {RoleId: 1, MenuId: 236, RoleName: "admin"}, - {RoleId: 1, MenuId: 237, RoleName: "admin"}, - {RoleId: 1, MenuId: 238, RoleName: "admin"}, - {RoleId: 1, MenuId: 239, RoleName: "admin"}, - {RoleId: 1, MenuId: 240, RoleName: "admin"}, - {RoleId: 1, MenuId: 241, RoleName: "admin"}, - {RoleId: 1, MenuId: 242, RoleName: "admin"}, - {RoleId: 1, MenuId: 243, RoleName: "admin"}, - {RoleId: 1, MenuId: 244, RoleName: "admin"}, - {RoleId: 1, MenuId: 245, RoleName: "admin"}, - {RoleId: 1, MenuId: 246, RoleName: "admin"}, - {RoleId: 1, MenuId: 247, RoleName: "admin"}, - {RoleId: 1, MenuId: 248, RoleName: "admin"}, - {RoleId: 1, MenuId: 249, RoleName: "admin"}, - {RoleId: 1, MenuId: 250, RoleName: "admin"}, - {RoleId: 1, MenuId: 251, RoleName: "admin"}, - {RoleId: 1, MenuId: 252, RoleName: "admin"}, - {RoleId: 1, MenuId: 253, RoleName: "admin"}, - {RoleId: 1, MenuId: 254, RoleName: "admin"}, - {RoleId: 1, MenuId: 255, RoleName: "admin"}, - {RoleId: 1, MenuId: 256, RoleName: "admin"}, - {RoleId: 1, MenuId: 257, RoleName: "admin"}, - {RoleId: 1, MenuId: 258, RoleName: "admin"}, - {RoleId: 1, MenuId: 259, RoleName: "admin"}, - {RoleId: 1, MenuId: 260, RoleName: "admin"}, - {RoleId: 1, MenuId: 261, RoleName: "admin"}, - {RoleId: 1, MenuId: 262, RoleName: "admin"}, - {RoleId: 1, MenuId: 263, RoleName: "admin"}, - {RoleId: 1, MenuId: 264, RoleName: "admin"}, - {RoleId: 1, MenuId: 267, RoleName: "admin"}, - {RoleId: 1, MenuId: 269, RoleName: "admin"}, - {RoleId: 1, MenuId: 459, RoleName: "admin"}, - {RoleId: 1, MenuId: 460, RoleName: "admin"}, - {RoleId: 1, MenuId: 461, RoleName: "admin"}, - {RoleId: 1, MenuId: 462, RoleName: "admin"}, - {RoleId: 1, MenuId: 463, RoleName: "admin"}, - {RoleId: 1, MenuId: 464, RoleName: "admin"}, - {RoleId: 1, MenuId: 465, RoleName: "admin"}, - {RoleId: 1, MenuId: 466, RoleName: "admin"}, - {RoleId: 1, MenuId: 467, RoleName: "admin"}, - {RoleId: 1, MenuId: 468, RoleName: "admin"}, - {RoleId: 1, MenuId: 469, RoleName: "admin"}, - {RoleId: 1, MenuId: 470, RoleName: "admin"}, - {RoleId: 1, MenuId: 471, RoleName: "admin"}, - {RoleId: 1, MenuId: 473, RoleName: "admin"}, - {RoleId: 1, MenuId: 474, RoleName: "admin"}, - {RoleId: 1, MenuId: 475, RoleName: "admin"}, - {RoleId: 1, MenuId: 476, RoleName: "admin"}, - {RoleId: 1, MenuId: 477, RoleName: "admin"}, - {RoleId: 1, MenuId: 478, RoleName: "admin"}, - {RoleId: 1, MenuId: 479, RoleName: "admin"}, - {RoleId: 1, MenuId: 480, RoleName: "admin"}, - {RoleId: 1, MenuId: 481, RoleName: "admin"}, - {RoleId: 1, MenuId: 482, RoleName: "admin"}, - {RoleId: 1, MenuId: 483, RoleName: "admin"}, - } - list2 := []models.CasbinRule{ - {PType: "p", V0: "admin", V1: "/api/v1/menulist", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/menu", V2: "POST"}, - {PType: "p", V0: "admin", V1: "/api/v1/dict/databytype/", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/menu", V2: "PUT"}, - {PType: "p", V0: "admin", V1: "/api/v1/menu/:id", V2: "DELETE"}, - {PType: "p", V0: "admin", V1: "/api/v1/sysUserList", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/sysUser/:id", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/sysUser/", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/sysUser", V2: "POST"}, - {PType: "p", V0: "admin", V1: "/api/v1/sysUser", V2: "PUT"}, - {PType: "p", V0: "admin", V1: "/api/v1/sysUser/:id", V2: "DELETE"}, - {PType: "p", V0: "admin", V1: "/api/v1/user/profile", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/rolelist", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/role/:id", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/role", V2: "POST"}, - {PType: "p", V0: "admin", V1: "/api/v1/role", V2: "PUT"}, - {PType: "p", V0: "admin", V1: "/api/v1/role/:id", V2: "DELETE"}, - {PType: "p", V0: "admin", V1: "/api/v1/configList", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/config/:id", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/config", V2: "POST"}, - {PType: "p", V0: "admin", V1: "/api/v1/config", V2: "PUT"}, - {PType: "p", V0: "admin", V1: "/api/v1/config/:id", V2: "DELETE"}, - {PType: "p", V0: "admin", V1: "/api/v1/menurole", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/roleMenuTreeselect/:id", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/menuTreeselect", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/rolemenu", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/rolemenu", V2: "POST"}, - {PType: "p", V0: "admin", V1: "/api/v1/rolemenu/:id", V2: "DELETE"}, - {PType: "p", V0: "admin", V1: "/api/v1/deptList", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/dept/:id", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/dept", V2: "POST"}, - {PType: "p", V0: "admin", V1: "/api/v1/dept", V2: "PUT"}, - {PType: "p", V0: "admin", V1: "/api/v1/dept/:id", V2: "DELETE"}, - {PType: "p", V0: "admin", V1: "/api/v1/dict/datalist", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/dict/data/:id", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/dict/databytype/:id", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/dict/data", V2: "POST"}, - {PType: "p", V0: "admin", V1: "/api/v1/dict/data/", V2: "PUT"}, - {PType: "p", V0: "admin", V1: "/api/v1/dict/data/:id", V2: "DELETE"}, - {PType: "p", V0: "admin", V1: "/api/v1/dict/typelist", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/dict/type/:id", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/dict/type", V2: "POST"}, - {PType: "p", V0: "admin", V1: "/api/v1/dict/type", V2: "PUT"}, - {PType: "p", V0: "admin", V1: "/api/v1/dict/type/:id", V2: "DELETE"}, - {PType: "p", V0: "admin", V1: "/api/v1/postlist", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/post/:id", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/post", V2: "POST"}, - {PType: "p", V0: "admin", V1: "/api/v1/post", V2: "PUT"}, - {PType: "p", V0: "admin", V1: "/api/v1/post/:id", V2: "DELETE"}, - {PType: "p", V0: "admin", V1: "/api/v1/menu/:id", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/menuids", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/loginloglist", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/loginlog/:id", V2: "DELETE"}, - {PType: "p", V0: "admin", V1: "/api/v1/operloglist", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/getinfo", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/roledatascope", V2: "PUT"}, - {PType: "p", V0: "admin", V1: "/api/v1/roleDeptTreeselect/:id", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/deptTree", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/configKey/:id", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/logout", V2: "POST"}, - {PType: "p", V0: "admin", V1: "/api/v1/user/avatar", V2: "POST"}, - {PType: "p", V0: "admin", V1: "/api/v1/user/pwd", V2: "PUT"}, - {PType: "p", V0: "admin", V1: "/api/v1/dict/typeoptionselect", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/sysjob", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/sysjob/:id", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/sysjob", V2: "POST"}, - {PType: "p", V0: "admin", V1: "/api/v1/sysjob", V2: "PUT"}, - {PType: "p", V0: "admin", V1: "/api/v1/sysjob", V2: "DELETE"}, - {PType: "p", V0: "admin", V1: "/api/v1/syssettingList", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/syssetting/:id", V2: "GET"}, - {PType: "p", V0: "admin", V1: "/api/v1/syssetting", V2: "POST"}, - {PType: "p", V0: "admin", V1: "/api/v1/syssetting", V2: "PUT"}, - {PType: "p", V0: "admin", V1: "/api/v1/syssetting/:id", V2: "DELETE"}, - } - list3 := []models.SysDept{ - {DeptId: 1, ParentId: 0, DeptPath: "/0/1", DeptName: "爱拓科技", Sort: 0, Leader: "aituo", Phone: "13782218188", Email: "atuo@aituo.com", Status: "0", CreateBy: "1", UpdateBy: "1", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DeptId: 7, ParentId: 1, DeptPath: "/0/1/7", DeptName: "研发部", Sort: 1, Leader: "aituo", Phone: "13782218188", Email: "atuo@aituo.com", Status: "0", CreateBy: "1", UpdateBy: "1", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DeptId: 8, ParentId: 1, DeptPath: "/0/1/8", DeptName: "运维部", Sort: 0, Leader: "aituo", Phone: "13782218188", Email: "atuo@aituo.com", Status: "0", CreateBy: "1", UpdateBy: "1", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DeptId: 9, ParentId: 1, DeptPath: "/0/1/9", DeptName: "客服部", Sort: 0, Leader: "aituo", Phone: "13782218188", Email: "atuo@aituo.com", Status: "0", CreateBy: "1", UpdateBy: "1", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DeptId: 10, ParentId: 1, DeptPath: "/0/1/10", DeptName: "人力资源", Sort: 3, Leader: "aituo", Phone: "13782218188", Email: "atuo@aituo.com", Status: "1", CreateBy: "1", UpdateBy: "1", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DeptId: 1, ParentId: 0, DeptPath: "/0/1", DeptName: "爱拓科技", Sort: 0, Leader: "aituo", Phone: "13782218188", Email: "atuo@aituo.com", Status: "2", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DeptId: 7, ParentId: 1, DeptPath: "/0/1/7", DeptName: "研发部", Sort: 1, Leader: "aituo", Phone: "13782218188", Email: "atuo@aituo.com", Status: "2", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DeptId: 8, ParentId: 1, DeptPath: "/0/1/8", DeptName: "运维部", Sort: 0, Leader: "aituo", Phone: "13782218188", Email: "atuo@aituo.com", Status: "2", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DeptId: 9, ParentId: 1, DeptPath: "/0/1/9", DeptName: "客服部", Sort: 0, Leader: "aituo", Phone: "13782218188", Email: "atuo@aituo.com", Status: "2", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DeptId: 10, ParentId: 1, DeptPath: "/0/1/10", DeptName: "人力资源", Sort: 3, Leader: "aituo", Phone: "13782218188", Email: "atuo@aituo.com", Status: "1", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, } list4 := []models.SysConfig{ - {ConfigId: 1, ConfigName: "主框架页-默认皮肤样式名称", ConfigKey: "sys_index_skinName", ConfigValue: "skin-blue", ConfigType: "Y", Remark: "蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow", CreateBy: "1", UpdateBy: "1", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {ConfigId: 2, ConfigName: "用户管理-账号初始密码", ConfigKey: "sys.user.initPassword", ConfigValue: "123456", ConfigType: "Y", Remark: "初始化密码 123456", CreateBy: "1", UpdateBy: "1", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {ConfigId: 3, ConfigName: "主框架页-侧边栏主题", ConfigKey: "sys_index_sideTheme", ConfigValue: "theme-dark", ConfigType: "Y", Remark: "深色主题theme-dark,浅色主题theme-light", CreateBy: "1", UpdateBy: "1", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {Model: models.Model{Id: 1}, ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}, ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, ConfigName: "主框架页-默认皮肤样式名称", ConfigKey: "sys_index_skinName", ConfigValue: "skin-blue", ConfigType: "Y", Remark: "蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow"}, + {Model: models.Model{Id: 2}, ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}, ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, ConfigName: "用户管理-账号初始密码", ConfigKey: "sys.user.initPassword", ConfigValue: "123456", ConfigType: "Y", Remark: "初始化密码 123456"}, + {Model: models.Model{Id: 3}, ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}, ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, ConfigName: "主框架页-侧边栏主题", ConfigKey: "sys_index_sideTheme", ConfigValue: "theme-dark", ConfigType: "Y", Remark: "深色主题theme-dark,浅色主题theme-light"}, } list5 := []models.Post{ - {PostId: 1, PostName: "首席执行官", PostCode: "CEO", Sort: 0, Status: "0", Remark: "首席执行官", CreateBy: "1", UpdateBy: "1", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {PostId: 2, PostName: "首席技术执行官", PostCode: "CTO", Sort: 2, Status: "0", Remark: "首席技术执行官", CreateBy: "1", UpdateBy: "1", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {PostId: 3, PostName: "首席运营官", PostCode: "COO", Sort: 3, Status: "0", Remark: "测试工程师", CreateBy: "1", UpdateBy: "1", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {PostId: 1, PostName: "首席执行官", PostCode: "CEO", Sort: 0, Status: "2", Remark: "首席执行官", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {PostId: 2, PostName: "首席技术执行官", PostCode: "CTO", Sort: 2, Status: "2", Remark: "首席技术执行官", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {PostId: 3, PostName: "首席运营官", PostCode: "COO", Sort: 3, Status: "2", Remark: "测试工程师", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, } list6 := []models.SysRole{ - {1, "系统管理员", "0", "admin", 1, "", "1", "", "", true, "", models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}, "", []int{}, []int{}}, + { + RoleId: 1, + RoleName: "系统管理员", + Status: "2", + RoleKey: "admin", + RoleSort: 1, + Flag: "", + Remark: "", + Admin: true, + DataScope: "", + ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}, + ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, + }, } list7 := []models.DictType{ - {DictId: 1, DictName: "系统开关", DictType: "sys_normal_disable", Status: "0", CreateBy: "1", UpdateBy: "1", Remark: "系统开关列表", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictId: 2, DictName: "用户性别", DictType: "sys_user_sex", Status: "0", CreateBy: "1", UpdateBy: "", Remark: "用户性别列表", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictId: 3, DictName: "菜单状态", DictType: "sys_show_hide", Status: "0", CreateBy: "1", UpdateBy: "", Remark: "菜单状态列表", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictId: 4, DictName: "系统是否", DictType: "sys_yes_no", Status: "0", CreateBy: "1", UpdateBy: "", Remark: "系统是否列表", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictId: 5, DictName: "任务状态", DictType: "sys_job_status", Status: "0", CreateBy: "1", UpdateBy: "", Remark: "任务状态列表", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictId: 6, DictName: "任务分组", DictType: "sys_job_group", Status: "0", CreateBy: "1", UpdateBy: "", Remark: "任务分组列表", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictId: 7, DictName: "通知类型", DictType: "sys_notice_type", Status: "0", CreateBy: "1", UpdateBy: "", Remark: "通知类型列表", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictId: 8, DictName: "系统状态", DictType: "sys_common_status", Status: "0", CreateBy: "1", UpdateBy: "", Remark: "登录状态列表", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictId: 9, DictName: "操作类型", DictType: "sys_oper_type", Status: "0", CreateBy: "1", UpdateBy: "", Remark: "操作类型列表", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictId: 10, DictName: "通知状态", DictType: "sys_notice_status", Status: "0", CreateBy: "1", UpdateBy: "", Remark: "通知状态列表", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictId: 1, DictName: "系统开关", DictType: "sys_normal_disable", Status: "2", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "系统开关列表", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictId: 2, DictName: "用户性别", DictType: "sys_user_sex", Status: "2", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "用户性别列表", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictId: 3, DictName: "菜单状态", DictType: "sys_show_hide", Status: "2", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "菜单状态列表", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictId: 4, DictName: "系统是否", DictType: "sys_yes_no", Status: "2", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "系统是否列表", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictId: 5, DictName: "任务状态", DictType: "sys_job_status", Status: "2", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "任务状态列表", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictId: 6, DictName: "任务分组", DictType: "sys_job_group", Status: "2", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "任务分组列表", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictId: 7, DictName: "通知类型", DictType: "sys_notice_type", Status: "2", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "通知类型列表", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictId: 8, DictName: "系统状态", DictType: "sys_common_status", Status: "2", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "登录状态列表", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictId: 9, DictName: "操作类型", DictType: "sys_oper_type", Status: "2", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "操作类型列表", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictId: 10, DictName: "通知状态", DictType: "sys_notice_status", Status: "2", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "通知状态列表", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, } list8 := []models.SysUser{ - {models.SysUserId{1}, models.LoginM{models.UserName{"admin"}, models.PassWord{"$2a$10$cKFFTCzGOvaIHHJY2K45Zuwt8TD6oPzYi4s5MzYIBAWCLL6ZhouP2"}}, models.SysUserB{"zhangwj", "13818888888", 1, "", "", "0", "1@qq.com", 1, 1, "1", "1", "", "0", models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}, "", ""}}, + { + ControlBy: models.ControlBy{ + CreateBy: 1, + UpdateBy: 1, + }, + ModelTime: models.ModelTime{ + CreatedAt: time.Now(), + UpdatedAt: time.Now(), + }, + UserId: 1, + Username: "admin", + Password: "123456", + NickName: "zhangwj", + Phone: "13818888888", + RoleId: 1, + Salt: "", + Avatar: "", + Sex: "1", + Email: "1@qq.com", + DeptId: 1, + PostId: 1, + Remark: "", + Status: "2", + }, + //{models.SysUserId{1}, models.LoginM{models.UserName{"admin"}, models.PassWord{"$2a$10$cKFFTCzGOvaIHHJY2K45Zuwt8TD6oPzYi4s5MzYIBAWCLL6ZhouP2"}}, models.SysUserB{"zhangwj", "13818888888", 1, "", "", "0", "1@qq.com", 1, 1, "1", "1", "", "2", models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}, "", ""}}, } list9 := []models.DictData{ - {DictCode: 1, DictSort: 0, DictLabel: "正常", DictValue: "0", DictType: "sys_normal_disable", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "系统正常", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 2, DictSort: 0, DictLabel: "停用", DictValue: "1", DictType: "sys_normal_disable", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "系统停用", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 3, DictSort: 0, DictLabel: "男", DictValue: "0", DictType: "sys_user_sex", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "性别男", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 4, DictSort: 0, DictLabel: "女", DictValue: "1", DictType: "sys_user_sex", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "性别女", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 5, DictSort: 0, DictLabel: "未知", DictValue: "2", DictType: "sys_user_sex", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "性别未知", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 6, DictSort: 0, DictLabel: "显示", DictValue: "0", DictType: "sys_show_hide", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "显示菜单", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 7, DictSort: 0, DictLabel: "隐藏", DictValue: "1", DictType: "sys_show_hide", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "隐藏菜单", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 8, DictSort: 0, DictLabel: "是", DictValue: "Y", DictType: "sys_yes_no", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "系统默认是", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 9, DictSort: 0, DictLabel: "否", DictValue: "N", DictType: "sys_yes_no", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "系统默认否", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 10, DictSort: 0, DictLabel: "正常", DictValue: "2", DictType: "sys_job_status", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "正常状态", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 11, DictSort: 0, DictLabel: "停用", DictValue: "1", DictType: "sys_job_status", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "停用状态", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 12, DictSort: 0, DictLabel: "默认", DictValue: "DEFAULT", DictType: "sys_job_group", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "默认分组", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 13, DictSort: 0, DictLabel: "系统", DictValue: "SYSTEM", DictType: "sys_job_group", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "系统分组", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 14, DictSort: 0, DictLabel: "通知", DictValue: "1", DictType: "sys_notice_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "通知", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 15, DictSort: 0, DictLabel: "公告", DictValue: "2", DictType: "sys_notice_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "公告", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 16, DictSort: 0, DictLabel: "正常", DictValue: "0", DictType: "sys_common_status", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "正常状态", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 17, DictSort: 0, DictLabel: "关闭", DictValue: "1", DictType: "sys_common_status", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "关闭状态", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 18, DictSort: 0, DictLabel: "新增", DictValue: "1", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "新增操作", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 19, DictSort: 0, DictLabel: "修改", DictValue: "2", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "修改操作", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 20, DictSort: 0, DictLabel: "删除", DictValue: "3", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "删除操作", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 21, DictSort: 0, DictLabel: "授权", DictValue: "4", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "授权操作", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 22, DictSort: 0, DictLabel: "导出", DictValue: "5", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "导出操作", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 23, DictSort: 0, DictLabel: "导入", DictValue: "6", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "导入操作", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 24, DictSort: 0, DictLabel: "强退", DictValue: "7", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "强退操作", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 25, DictSort: 0, DictLabel: "生成代码", DictValue: "8", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "生成操作", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 26, DictSort: 0, DictLabel: "清空数据", DictValue: "9", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "清空操作", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 27, DictSort: 0, DictLabel: "成功", DictValue: "0", DictType: "sys_notice_status", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "成功状态", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 28, DictSort: 0, DictLabel: "失败", DictValue: "1", DictType: "sys_notice_status", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "", Remark: "失败状态", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 29, DictSort: 0, DictLabel: "登录", DictValue: "10", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "1", Remark: "登录操作", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 30, DictSort: 0, DictLabel: "退出", DictValue: "11", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "1", Remark: "", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, - {DictCode: 31, DictSort: 0, DictLabel: "获取验证码", DictValue: "12", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "0", Default: "", CreateBy: "1", UpdateBy: "1", Remark: "获取验证码", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 1, DictSort: 0, DictLabel: "正常", DictValue: "2", DictType: "sys_normal_disable", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "系统正常", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 2, DictSort: 0, DictLabel: "停用", DictValue: "1", DictType: "sys_normal_disable", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "系统停用", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 3, DictSort: 0, DictLabel: "男", DictValue: "0", DictType: "sys_user_sex", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "性别男", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 4, DictSort: 0, DictLabel: "女", DictValue: "1", DictType: "sys_user_sex", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "性别女", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 5, DictSort: 0, DictLabel: "未知", DictValue: "2", DictType: "sys_user_sex", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "性别未知", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 6, DictSort: 0, DictLabel: "显示", DictValue: "0", DictType: "sys_show_hide", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "显示菜单", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 7, DictSort: 0, DictLabel: "隐藏", DictValue: "1", DictType: "sys_show_hide", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "隐藏菜单", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 8, DictSort: 0, DictLabel: "是", DictValue: "Y", DictType: "sys_yes_no", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "系统默认是", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 9, DictSort: 0, DictLabel: "否", DictValue: "N", DictType: "sys_yes_no", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "系统默认否", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 10, DictSort: 0, DictLabel: "正常", DictValue: "2", DictType: "sys_job_status", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "正常状态", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 11, DictSort: 0, DictLabel: "停用", DictValue: "1", DictType: "sys_job_status", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "停用状态", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 12, DictSort: 0, DictLabel: "默认", DictValue: "DEFAULT", DictType: "sys_job_group", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "默认分组", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 13, DictSort: 0, DictLabel: "系统", DictValue: "SYSTEM", DictType: "sys_job_group", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "系统分组", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 14, DictSort: 0, DictLabel: "通知", DictValue: "1", DictType: "sys_notice_type", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "通知", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 15, DictSort: 0, DictLabel: "公告", DictValue: "2", DictType: "sys_notice_type", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "公告", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 16, DictSort: 0, DictLabel: "正常", DictValue: "0", DictType: "sys_common_status", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "正常状态", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 17, DictSort: 0, DictLabel: "关闭", DictValue: "1", DictType: "sys_common_status", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "关闭状态", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 18, DictSort: 0, DictLabel: "新增", DictValue: "1", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "新增操作", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 19, DictSort: 0, DictLabel: "修改", DictValue: "2", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "修改操作", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 20, DictSort: 0, DictLabel: "删除", DictValue: "3", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "删除操作", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 21, DictSort: 0, DictLabel: "授权", DictValue: "4", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "授权操作", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 22, DictSort: 0, DictLabel: "导出", DictValue: "5", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "导出操作", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 23, DictSort: 0, DictLabel: "导入", DictValue: "6", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "导入操作", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 24, DictSort: 0, DictLabel: "强退", DictValue: "7", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "强退操作", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 25, DictSort: 0, DictLabel: "生成代码", DictValue: "8", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "生成操作", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 26, DictSort: 0, DictLabel: "清空数据", DictValue: "9", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "清空操作", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 27, DictSort: 0, DictLabel: "成功", DictValue: "0", DictType: "sys_notice_status", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "成功状态", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 28, DictSort: 0, DictLabel: "失败", DictValue: "1", DictType: "sys_notice_status", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "失败状态", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 29, DictSort: 0, DictLabel: "登录", DictValue: "10", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "登录操作", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 30, DictSort: 0, DictLabel: "退出", DictValue: "11", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {DictCode: 31, DictSort: 0, DictLabel: "获取验证码", DictValue: "12", DictType: "sys_oper_type", CssClass: "", ListClass: "", IsDefault: "", Status: "2", Default: "", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, Remark: "获取验证码", ModelTime: models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, } list10 := []models.SysSetting{ - {1, "go-admin管理系统", "https://gitee.com/mydearzwj/image/raw/master/img/go-admin.png", models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, + {1, "go-admin管理系统", "https://gitee.com/mydearzwj/image/raw/master/img/go-admin.png", models.ModelTime{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, } list11 := []models.SysJob{ - {1, "接口测试", "DEFAULT", 1, "0/5 * * * * ", "http://localhost:8000", "", 1, 1, 1, 0, "", "", models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}, ""}, - {2, "函数测试", "DEFAULT", 2, "0/5 * * * * ", "ExamplesOne", "参数", 1, 1, 1, 0, "", "", models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}, ""}, + { + JobId: 1, + JobName: "接口测试", + JobGroup: "DEFAULT", + JobType: 1, + CronExpression: "0/5 * * * * ", + InvokeTarget: "http://localhost:8000", + Args: "", + MisfirePolicy: 1, + Concurrent: 1, + Status: 1, + EntryId: 0, + ControlBy: models.ControlBy{ + CreateBy: 1, + UpdateBy: 1, + }, + ModelTime: models.ModelTime{ + CreatedAt: time.Now(), + UpdatedAt: time.Now(), + }, + }, + models.SysJob{ + JobId: 2, + JobName: "函数测试", + JobGroup: "DEFAULT", + JobType: 2, + CronExpression: "0/5 * * * * ", + InvokeTarget: "ExamplesOne", + Args: "参数", + MisfirePolicy: 1, + Concurrent: 1, + Status: 1, + EntryId: 0, + ControlBy: models.ControlBy{ + CreateBy: 1, + UpdateBy: 1, + }, + ModelTime: models.ModelTime{ + CreatedAt: time.Now(), + UpdatedAt: time.Now(), + }, + }, } - err := tx.Create(list1).Error - if err != nil { - return err - } - err = tx.Create(list2).Error - if err != nil { - return err - } - - err = tx.Create(list3).Error + err := tx.Create(list3).Error if err != nil { return err } diff --git a/cmd/migrate/migration/version/1599190683680_migrate.go b/cmd/migrate/migration/version/1599190683680_migrate.go index 8a5c5a37..d6032449 100644 --- a/cmd/migrate/migration/version/1599190683680_migrate.go +++ b/cmd/migrate/migration/version/1599190683680_migrate.go @@ -5,8 +5,8 @@ import ( "gorm.io/gorm" - "go-admin/app/admin/models" "go-admin/cmd/migrate/migration" + "go-admin/cmd/migrate/migration/models" common "go-admin/common/models" ) @@ -19,32 +19,32 @@ func _1599190683680Test(db *gorm.DB, version string) error { return db.Transaction(func(tx *gorm.DB) error { var err error - list := []models.Menu{ - {MenuId: 496, MenuName: "Sources", Title: "资源管理", Icon: "network", Path: "/sources", Paths: "/0/496", MenuType: "M", Action: "无", Permission: "", ParentId: 0, NoCache: true, Breadcrumb: "", Component: "Layout", Sort: 3, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "1"}, - {MenuId: 497, MenuName: "File", Title: "文件管理", Icon: "documentation", Path: "file-manage", Paths: "/0/496/497", MenuType: "C", Action: "", Permission: "", ParentId: 496, NoCache: true, Breadcrumb: "", Component: "/fileManage/index", Sort: 0, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "1"}, - {MenuId: 498, MenuName: "", Title: "内容管理", Icon: "pass", Path: "/content", Paths: "/0/498", MenuType: "M", Action: "无", Permission: "", ParentId: 0, NoCache: true, Breadcrumb: "", Component: "Layout", Sort: 4, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "1"}, - {MenuId: 499, MenuName: "SysCategory", Title: "分类", Icon: "pass", Path: "syscategory", Paths: "/0/498/499", MenuType: "C", Action: "无", Permission: "syscategory:syscategory:list", ParentId: 498, NoCache: true, Breadcrumb: "", Component: "/syscategory/index", Sort: 0, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "0"}, - {MenuId: 500, MenuName: "", Title: "分页获取分类", Icon: "pass", Path: "", Paths: "/0/498/499/500", MenuType: "F", Action: "无", Permission: "syscategory:syscategory:query", ParentId: 499, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "0"}, - {MenuId: 501, MenuName: "", Title: "创建分类", Icon: "pass", Path: "", Paths: "/0/498/499/501", MenuType: "F", Action: "无", Permission: "syscategory:syscategory:add", ParentId: 499, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "0"}, - {MenuId: 502, MenuName: "", Title: "修改分类", Icon: "pass", Path: "", Paths: "/0/498/499/502", MenuType: "F", Action: "无", Permission: "syscategory:syscategory:edit", ParentId: 499, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "0"}, - {MenuId: 503, MenuName: "", Title: "删除分类", Icon: "pass", Path: "", Paths: "/0/498/499/503", MenuType: "F", Action: "无", Permission: "syscategory:syscategory:remove", ParentId: 499, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "0"}, - {MenuId: 504, MenuName: "Category", Title: "分类", Icon: "bug", Path: "category", Paths: "/0/63/504", MenuType: "M", Action: "无", Permission: "", ParentId: 63, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"}, - {MenuId: 505, MenuName: "", Title: "分页获取分类", Icon: "bug", Path: "/api/v1/syscategoryList", Paths: "/0/63/504/505", MenuType: "A", Action: "GET", Permission: "", ParentId: 504, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"}, - {MenuId: 506, MenuName: "", Title: "根据id获取分类", Icon: "bug", Path: "/api/v1/syscategory/:id", Paths: "/0/63/504/506", MenuType: "A", Action: "GET", Permission: "", ParentId: 504, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"}, - {MenuId: 507, MenuName: "", Title: "创建分类", Icon: "bug", Path: "/api/v1/syscategory", Paths: "/0/63/504/507", MenuType: "A", Action: "POST", Permission: "", ParentId: 504, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"}, - {MenuId: 508, MenuName: "", Title: "修改分类", Icon: "bug", Path: "/api/v1/syscategory", Paths: "/0/63/504/508", MenuType: "A", Action: "PUT", Permission: "", ParentId: 504, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"}, - {MenuId: 509, MenuName: "", Title: "删除分类", Icon: "bug", Path: "/api/v1/syscategory/:id", Paths: "/0/63/504/509", MenuType: "A", Action: "DELETE", Permission: "", ParentId: 504, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"}, - {MenuId: 511, MenuName: "SysContent", Title: "内容管理", Icon: "pass", Path: "syscontent", Paths: "/0/498/511", MenuType: "C", Action: "无", Permission: "syscontent:syscontent:list", ParentId: 498, NoCache: true, Breadcrumb: "", Component: "/syscontent/index", Sort: 0, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "0"}, - {MenuId: 512, MenuName: "", Title: "分页获取内容管理", Icon: "pass", Path: "", Paths: "/0/510/511/512", MenuType: "F", Action: "无", Permission: "syscontent:syscontent:query", ParentId: 511, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "0"}, - {MenuId: 513, MenuName: "", Title: "创建内容管理", Icon: "pass", Path: "", Paths: "/0/510/511/513", MenuType: "F", Action: "无", Permission: "syscontent:syscontent:add", ParentId: 511, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "0"}, - {MenuId: 514, MenuName: "", Title: "修改内容管理", Icon: "pass", Path: "", Paths: "/0/510/511/514", MenuType: "F", Action: "无", Permission: "syscontent:syscontent:edit", ParentId: 511, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "0"}, - {MenuId: 515, MenuName: "", Title: "删除内容管理", Icon: "pass", Path: "", Paths: "/0/510/511/515", MenuType: "F", Action: "无", Permission: "syscontent:syscontent:remove", ParentId: 511, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", CreateBy: "1", UpdateBy: "1", IsFrame: "0"}, - {MenuId: 516, MenuName: "Content", Title: "内容管理", Icon: "bug", Path: "content", Paths: "/0/63/516", MenuType: "M", Action: "无", Permission: "", ParentId: 63, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"}, - {MenuId: 517, MenuName: "", Title: "分页获取内容管理", Icon: "bug", Path: "/api/v1/syscontentList", Paths: "/0/63/516/517", MenuType: "A", Action: "GET", Permission: "", ParentId: 516, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"}, - {MenuId: 518, MenuName: "", Title: "根据id获取内容管理", Icon: "bug", Path: "/api/v1/syscontent/:id", Paths: "/0/63/516/518", MenuType: "A", Action: "GET", Permission: "", ParentId: 516, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"}, - {MenuId: 519, MenuName: "", Title: "创建内容管理", Icon: "bug", Path: "/api/v1/syscontent", Paths: "/0/63/516/519", MenuType: "A", Action: "POST", Permission: "", ParentId: 516, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"}, - {MenuId: 520, MenuName: "", Title: "修改内容管理", Icon: "bug", Path: "/api/v1/syscontent", Paths: "/0/63/516/520", MenuType: "A", Action: "PUT", Permission: "", ParentId: 516, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"}, - {MenuId: 521, MenuName: "", Title: "删除内容管理", Icon: "bug", Path: "/api/v1/syscontent/:id", Paths: "/0/63/516/521", MenuType: "A", Action: "DELETE", Permission: "", ParentId: 516, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", CreateBy: "1", UpdateBy: "1", IsFrame: "0"}, + list := []models.SysMenu{ + {MenuId: 496, MenuName: "Sources", Title: "资源管理", Icon: "network", Path: "/sources", Paths: "/0/496", MenuType: "M", Action: "无", Permission: "", ParentId: 0, NoCache: true, Breadcrumb: "", Component: "Layout", Sort: 3, Visible: "0", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "1"}, + {MenuId: 497, MenuName: "File", Title: "文件管理", Icon: "documentation", Path: "file-manage", Paths: "/0/496/497", MenuType: "C", Action: "", Permission: "", ParentId: 496, NoCache: true, Breadcrumb: "", Component: "/fileManage/index", Sort: 0, Visible: "0", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "1"}, + {MenuId: 498, MenuName: "", Title: "内容管理", Icon: "pass", Path: "/content", Paths: "/0/498", MenuType: "M", Action: "无", Permission: "", ParentId: 0, NoCache: true, Breadcrumb: "", Component: "Layout", Sort: 4, Visible: "0", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "1"}, + {MenuId: 499, MenuName: "SysCategory", Title: "分类", Icon: "pass", Path: "syscategory", Paths: "/0/498/499", MenuType: "C", Action: "无", Permission: "syscategory:syscategory:list", ParentId: 498, NoCache: true, Breadcrumb: "", Component: "/syscategory/index", Sort: 0, Visible: "0", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "0"}, + {MenuId: 500, MenuName: "", Title: "分页获取分类", Icon: "pass", Path: "", Paths: "/0/498/499/500", MenuType: "F", Action: "无", Permission: "syscategory:syscategory:query", ParentId: 499, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "0"}, + {MenuId: 501, MenuName: "", Title: "创建分类", Icon: "pass", Path: "", Paths: "/0/498/499/501", MenuType: "F", Action: "无", Permission: "syscategory:syscategory:add", ParentId: 499, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "0"}, + {MenuId: 502, MenuName: "", Title: "修改分类", Icon: "pass", Path: "", Paths: "/0/498/499/502", MenuType: "F", Action: "无", Permission: "syscategory:syscategory:edit", ParentId: 499, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "0"}, + {MenuId: 503, MenuName: "", Title: "删除分类", Icon: "pass", Path: "", Paths: "/0/498/499/503", MenuType: "F", Action: "无", Permission: "syscategory:syscategory:remove", ParentId: 499, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "0"}, + {MenuId: 504, MenuName: "Category", Title: "分类", Icon: "bug", Path: "category", Paths: "/0/63/504", MenuType: "M", Action: "无", Permission: "", ParentId: 63, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "0"}, + {MenuId: 505, MenuName: "", Title: "分页获取分类", Icon: "bug", Path: "/api/v1/syscategoryList", Paths: "/0/63/504/505", MenuType: "A", Action: "GET", Permission: "", ParentId: 504, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "0"}, + {MenuId: 506, MenuName: "", Title: "根据id获取分类", Icon: "bug", Path: "/api/v1/syscategory/:id", Paths: "/0/63/504/506", MenuType: "A", Action: "GET", Permission: "", ParentId: 504, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "0"}, + {MenuId: 507, MenuName: "", Title: "创建分类", Icon: "bug", Path: "/api/v1/syscategory", Paths: "/0/63/504/507", MenuType: "A", Action: "POST", Permission: "", ParentId: 504, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "0"}, + {MenuId: 508, MenuName: "", Title: "修改分类", Icon: "bug", Path: "/api/v1/syscategory", Paths: "/0/63/504/508", MenuType: "A", Action: "PUT", Permission: "", ParentId: 504, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "0"}, + {MenuId: 509, MenuName: "", Title: "删除分类", Icon: "bug", Path: "/api/v1/syscategory/:id", Paths: "/0/63/504/509", MenuType: "A", Action: "DELETE", Permission: "", ParentId: 504, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "0"}, + {MenuId: 511, MenuName: "SysContent", Title: "内容管理", Icon: "pass", Path: "syscontent", Paths: "/0/498/511", MenuType: "C", Action: "无", Permission: "syscontent:syscontent:list", ParentId: 498, NoCache: true, Breadcrumb: "", Component: "/syscontent/index", Sort: 0, Visible: "0", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "0"}, + {MenuId: 512, MenuName: "", Title: "分页获取内容管理", Icon: "pass", Path: "", Paths: "/0/510/511/512", MenuType: "F", Action: "无", Permission: "syscontent:syscontent:query", ParentId: 511, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "0"}, + {MenuId: 513, MenuName: "", Title: "创建内容管理", Icon: "pass", Path: "", Paths: "/0/510/511/513", MenuType: "F", Action: "无", Permission: "syscontent:syscontent:add", ParentId: 511, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "0"}, + {MenuId: 514, MenuName: "", Title: "修改内容管理", Icon: "pass", Path: "", Paths: "/0/510/511/514", MenuType: "F", Action: "无", Permission: "syscontent:syscontent:edit", ParentId: 511, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "0"}, + {MenuId: 515, MenuName: "", Title: "删除内容管理", Icon: "pass", Path: "", Paths: "/0/510/511/515", MenuType: "F", Action: "无", Permission: "syscontent:syscontent:remove", ParentId: 511, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "0", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "0"}, + {MenuId: 516, MenuName: "Content", Title: "内容管理", Icon: "bug", Path: "content", Paths: "/0/63/516", MenuType: "M", Action: "无", Permission: "", ParentId: 63, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "0"}, + {MenuId: 517, MenuName: "", Title: "分页获取内容管理", Icon: "bug", Path: "/api/v1/syscontentList", Paths: "/0/63/516/517", MenuType: "A", Action: "GET", Permission: "", ParentId: 516, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "0"}, + {MenuId: 518, MenuName: "", Title: "根据id获取内容管理", Icon: "bug", Path: "/api/v1/syscontent/:id", Paths: "/0/63/516/518", MenuType: "A", Action: "GET", Permission: "", ParentId: 516, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "0"}, + {MenuId: 519, MenuName: "", Title: "创建内容管理", Icon: "bug", Path: "/api/v1/syscontent", Paths: "/0/63/516/519", MenuType: "A", Action: "POST", Permission: "", ParentId: 516, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "0"}, + {MenuId: 520, MenuName: "", Title: "修改内容管理", Icon: "bug", Path: "/api/v1/syscontent", Paths: "/0/63/516/520", MenuType: "A", Action: "PUT", Permission: "", ParentId: 516, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "0"}, + {MenuId: 521, MenuName: "", Title: "删除内容管理", Icon: "bug", Path: "/api/v1/syscontent/:id", Paths: "/0/63/516/521", MenuType: "A", Action: "DELETE", Permission: "", ParentId: 516, NoCache: true, Breadcrumb: "", Component: "", Sort: 0, Visible: "1", ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, IsFrame: "0"}, } err = tx.Create(list).Error diff --git a/cmd/migrate/migration/version/1600089797118_migrate.go b/cmd/migrate/migration/version/1600089797118_migrate.go index e84b032b..af9e8a40 100644 --- a/cmd/migrate/migration/version/1600089797118_migrate.go +++ b/cmd/migrate/migration/version/1600089797118_migrate.go @@ -5,8 +5,8 @@ import ( "gorm.io/gorm" - "go-admin/app/admin/models" "go-admin/cmd/migrate/migration" + "go-admin/cmd/migrate/migration/models" common "go-admin/common/models" ) @@ -18,12 +18,14 @@ func init() { func _1600089797118Migrate(db *gorm.DB, version string) error { return db.Transaction(func(tx *gorm.DB) error { f := &models.SysFileDir{ - Label: "根目录", - PId: 0, - Sort: 0, - Path: "", - CreateBy: "1", - UpdateBy: "1", + Label: "根目录", + PId: 0, + Sort: "0", + Path: "", + ControlBy: models.ControlBy{ + CreateBy: 1, + UpdateBy: 1, + }, } err := tx.Create(f).Error if err != nil { diff --git a/cmd/migrate/migration/version/1602644950000_migrate.go b/cmd/migrate/migration/version/1602644950000_migrate.go new file mode 100644 index 00000000..b3984673 --- /dev/null +++ b/cmd/migrate/migration/version/1602644950000_migrate.go @@ -0,0 +1,44 @@ +package version + +import ( + "runtime" + + "gorm.io/gorm" + + "go-admin/cmd/migrate/migration" + "go-admin/cmd/migrate/migration/models" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1602644950000Test) +} + +func _1602644950000Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + if tx.Migrator().HasColumn(&models.SysConfig{}, "config_id") { + err := tx.Migrator().RenameColumn(&models.SysConfig{}, "config_id", "id") + if err != nil { + return err + } + } + list2 := []models.CasbinRule{ + {PType: "p", V0: "admin", V1: "/api/v1/config", V2: "GET"}, + } + err := tx.Create(list2).Error + if err != nil { + return err + } + + menu := models.SysMenu{MenuId: 86, Path: "/api/v1/config"} + err = tx.Model(&menu).Where("menu_id = ?", 86).Update("Path", "/api/v1/config").Error + if err != nil { + return err + } + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/migration/version/1603465014697_migrate.go b/cmd/migrate/migration/version/1603465014697_migrate.go new file mode 100644 index 00000000..e10311a9 --- /dev/null +++ b/cmd/migrate/migration/version/1603465014697_migrate.go @@ -0,0 +1,28 @@ +package version + +import ( + "runtime" + + "gorm.io/gorm" + + "go-admin/cmd/migrate/migration" + "go-admin/cmd/migrate/migration/models" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1603465014697Test) +} + +func _1603465014697Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + err := tx.Debug().Model(&models.SysMenu{}).Where("path = ?", "/api/v1/syscategoryList").Update("path", "/api/v1/syscategory").Error + if err != nil { + return err + } + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/migration/version/1603516925109_migrate.go b/cmd/migrate/migration/version/1603516925109_migrate.go new file mode 100644 index 00000000..d41e24b4 --- /dev/null +++ b/cmd/migrate/migration/version/1603516925109_migrate.go @@ -0,0 +1,41 @@ +package version + +import ( + "runtime" + + "gorm.io/gorm" + + "go-admin/cmd/migrate/migration" + "go-admin/cmd/migrate/migration/models" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1603516925109Test) +} + +func _1603516925109Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + _ = tx.Migrator().RenameTable("sys_operlog", "sys_opera_log") + _ = tx.Migrator().RenameTable("sys_loginlog", "sys_login_log") + + if tx.Migrator().HasColumn(&models.SysLoginLog{}, "info_id") { + err := tx.Migrator().RenameColumn(&models.SysLoginLog{}, "info_id", "id") + if err != nil { + return err + } + } + + if tx.Migrator().HasColumn(&models.SysOperaLog{}, "oper_id") { + err := tx.Migrator().RenameColumn(&models.SysOperaLog{}, "oper_id", "id") + if err != nil { + return err + } + } + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/migration/version/1606579402398_migrate.go b/cmd/migrate/migration/version/1606579402398_migrate.go new file mode 100644 index 00000000..e0b725e0 --- /dev/null +++ b/cmd/migrate/migration/version/1606579402398_migrate.go @@ -0,0 +1,43 @@ +package version + +import ( + "runtime" + + "gorm.io/gorm" + + "go-admin/cmd/migrate/migration" + "go-admin/cmd/migrate/migration/models" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1606579402398Test) +} + +func _1606579402398Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + + dicData := models.DictData{} + err := tx.Model(&dicData).Where("dict_code = ?", 1).Update("dict_value", 2).Error + if err != nil { + return err + } + + dicType := models.DictType{} + err = tx.Model(&dicType).Where("status = ?", 0).Update("status", 2).Error + if err != nil { + return err + } + + user := models.SysUser{} + err = tx.Model(&user).Where("user_id = ?", 1).Update("status", 2).Error + if err != nil { + return err + } + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/migration/version/1606582844753_migrate.go b/cmd/migrate/migration/version/1606582844753_migrate.go new file mode 100644 index 00000000..5864b0e8 --- /dev/null +++ b/cmd/migrate/migration/version/1606582844753_migrate.go @@ -0,0 +1,49 @@ +package version + +import ( + "runtime" + + "gorm.io/gorm" + + "go-admin/cmd/migrate/migration" + "go-admin/cmd/migrate/migration/models" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1606582844753Test) +} + +func _1606582844753Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + + dept := models.SysDept{} + err := tx.Model(&dept).Where("status = ?", 0).Update("status", 2).Error + if err != nil { + return err + } + + dictData := models.DictData{} + err = tx.Model(&dictData).Where("status = ?", 0).Update("status", 2).Error + if err != nil { + return err + } + sql1 := "INSERT INTO `sys_menu`(`menu_id`, `menu_name`, `title`, `icon`, `path`, `paths`, `menu_type`, `action`, `permission`, `parent_id`, `no_cache`, `breadcrumb`, `component`, `sort`, `visible`, `create_by`, `update_by`, `is_frame`, `created_at`, `updated_at`, `deleted_at`) VALUES (522, 'SysContentCreate', '新增', 'form', 'syscontent/create', '/0/498/522', 'C', '', 'syscontent:syscontent:add', 498, 0, '', '/syscontent/create.vue', 0, '1', '1', '1', '1', '2020-11-08 17:00:35.259', '2020-11-12 22:55:50.739', NULL);" + sql2 := "INSERT INTO `sys_menu`(`menu_id`, `menu_name`, `title`, `icon`, `path`, `paths`, `menu_type`, `action`, `permission`, `parent_id`, `no_cache`, `breadcrumb`, `component`, `sort`, `visible`, `create_by`, `update_by`, `is_frame`, `created_at`, `updated_at`, `deleted_at`) VALUES (523, 'SysContentEdit', '编辑', 'edit', 'syscontent/edit:id', '/0/498/523', 'C', '', 'syscontent:syscontent:edit', 498, 0, '', '/syscontent/edit.vue', 0, '1', '1', '1', '1', '2020-11-12 22:53:42.643', '2020-11-12 22:54:56.852', NULL);" + + err = tx.Exec(sql1).Error + if err != nil { + return err + } + + err = tx.Exec(sql2).Error + if err != nil { + return err + } + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/migration/version/1610427732413_migrate.go b/cmd/migrate/migration/version/1610427732413_migrate.go new file mode 100644 index 00000000..eb898442 --- /dev/null +++ b/cmd/migrate/migration/version/1610427732413_migrate.go @@ -0,0 +1,32 @@ +package version + +import ( + "runtime" + + "gorm.io/gorm" + + "go-admin/cmd/migrate/migration" + "go-admin/cmd/migrate/migration/models" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1610427732413Test) +} + +func _1610427732413Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + + // TODO: 这里开始写入要变更的内容 + user := models.SysUser{} + err := tx.Model(&user).Where("status = ?", 0).Update("status", 2).Error + if err != nil { + return err + } + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/migration/version/1610804233204_migrate.go b/cmd/migrate/migration/version/1610804233204_migrate.go new file mode 100644 index 00000000..52d82ac4 --- /dev/null +++ b/cmd/migrate/migration/version/1610804233204_migrate.go @@ -0,0 +1,38 @@ +package version + +import ( + "runtime" + + "gorm.io/gorm" + + "go-admin/cmd/migrate/migration" + "go-admin/cmd/migrate/migration/models" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1610804233204Test) +} + +func _1610804233204Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + + // TODO: 这里开始写入要变更的内容 + post := models.Post{} + err := tx.Model(&post).Where("status = ?", 0).Update("status", 2).Error + if err != nil { + return err + } + + role := models.SysRole{} + err = tx.Model(&role).Where("status = ?", 0).Update("status", 2).Error + if err != nil { + return err + } + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/migration/version/1613638159444_migrate.go b/cmd/migrate/migration/version/1613638159444_migrate.go new file mode 100644 index 00000000..dcb55804 --- /dev/null +++ b/cmd/migrate/migration/version/1613638159444_migrate.go @@ -0,0 +1,46 @@ +package version + +import ( + "runtime" + + "gorm.io/gorm" + + "go-admin/cmd/migrate/migration" + "go-admin/cmd/migrate/migration/models" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1613638159444Test) +} + +func _1613638159444Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + + // TODO: 这里开始写入要变更的内容 + + // TODO: 例如 修改表字段 使用过程中请删除此段代码 + err := tx.Migrator().AlterColumn(&models.SysRole{}, "create_by") + if err != nil { + return err + } + err = tx.Migrator().AlterColumn(&models.SysRole{}, "update_by") + if err != nil { + return err + } + + err = tx.Migrator().AlterColumn(&models.SysMenu{}, "update_by") + if err != nil { + return err + } + err = tx.Migrator().AlterColumn(&models.SysMenu{}, "create_by") + if err != nil { + return err + } + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/migration/version/1613697961697_migrate.go b/cmd/migrate/migration/version/1613697961697_migrate.go new file mode 100644 index 00000000..12da56d5 --- /dev/null +++ b/cmd/migrate/migration/version/1613697961697_migrate.go @@ -0,0 +1,44 @@ +package version + +import ( + "runtime" + + "gorm.io/gorm" + + "go-admin/cmd/migrate/migration" + "go-admin/cmd/migrate/migration/models" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1613697961697Test) +} + +func _1613697961697Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + + //修改字段类型 + err := tx.Migrator().AlterColumn(&models.SysMenu{}, "create_by") + if err != nil { + return err + } + err = tx.Migrator().AlterColumn(&models.SysMenu{}, "update_by") + if err != nil { + return err + } + + err = tx.Migrator().AlterColumn(&models.SysRole{}, "create_by") + if err != nil { + return err + } + err = tx.Migrator().AlterColumn(&models.SysRole{}, "update_by") + if err != nil { + return err + } + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/migration/version/1613720892819_migrate.go b/cmd/migrate/migration/version/1613720892819_migrate.go new file mode 100644 index 00000000..0d739a90 --- /dev/null +++ b/cmd/migrate/migration/version/1613720892819_migrate.go @@ -0,0 +1,73 @@ +package version + +import ( + "runtime" + + "gorm.io/gorm" + + "go-admin/cmd/migrate/migration" + "go-admin/cmd/migrate/migration/models" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1613720892819Test) +} + +func _1613720892819Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + + // TODO: 这里开始写入要变更的内容 + t := &models.DictType{ + DictName: "内容状态", + DictType: "sys_content_status", + Status: "2", + ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, + } + err := tx.Create(t).Error + if err != nil { + return err + } + + data := make([]models.DictData, 2) + data[0] = models.DictData{ + DictSort: 0, + DictLabel: "正常", + DictValue: "1", + DictType: "sys_content_status", + Status: "1", + ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, + } + data[1] = models.DictData{ + DictSort: 1, + DictLabel: "禁用", + DictValue: "2", + DictType: "sys_content_status", + Status: "1", + ControlBy: models.ControlBy{CreateBy: 1, UpdateBy: 1}, + } + err = tx.Create(data).Error + if err != nil { + return err + } + + // TODO: 例如 修改表字段 使用过程中请删除此段代码 + //err := tx.Migrator().RenameColumn(&models.SysConfig{}, "config_id", "id") + //if err != nil { + // return err + //} + + // TODO: 例如 新增表结构 使用过程中请删除此段代码 + //err = tx.Debug().Migrator().AutoMigrate( + // new(models.CasbinRule), + // ) + //if err != nil { + // return err + //} + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/migration/version/1613783303115_migrate.go b/cmd/migrate/migration/version/1613783303115_migrate.go new file mode 100644 index 00000000..af6bd33a --- /dev/null +++ b/cmd/migrate/migration/version/1613783303115_migrate.go @@ -0,0 +1,60 @@ +package version + +import ( + "runtime" + + "gorm.io/gorm" + + "go-admin/cmd/migrate/migration" + "go-admin/cmd/migrate/migration/models" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1613783303115Test) +} + +func _1613783303115Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + + //修改字段类型 + err := tx.Model(&models.DictType{}).Select("create_by").Not("create_by > 0").Update("create_by", "0").Error + if err != nil { + return err + } + err = tx.Model(&models.DictType{}).Select("update_by").Not("update_by > 0").Update("update_by", "0").Error + if err != nil { + return err + } + err = tx.Model(&models.DictType{}).Select("create_by").Not("create_by > 0").Update("create_by", "0").Error + if err != nil { + return err + } + err = tx.Model(&models.DictType{}).Select("update_by").Not("update_by > 0").Update("update_by", "0").Error + if err != nil { + return err + } + err = tx.Migrator().AlterColumn(&models.DictType{}, "create_by") + if err != nil { + return err + } + err = tx.Migrator().AlterColumn(&models.DictType{}, "update_by") + if err != nil { + return err + } + + err = tx.Migrator().AlterColumn(&models.DictType{}, "create_by") + if err != nil { + return err + } + err = tx.Migrator().AlterColumn(&models.DictType{}, "update_by") + if err != nil { + return err + } + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/migration/version/1613978564961_migrate.go b/cmd/migrate/migration/version/1613978564961_migrate.go new file mode 100644 index 00000000..9a02e4cc --- /dev/null +++ b/cmd/migrate/migration/version/1613978564961_migrate.go @@ -0,0 +1,32 @@ +package version + +import ( + "runtime" + + "gorm.io/gorm" + + "go-admin/cmd/migrate/migration" + "go-admin/cmd/migrate/migration/models" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1613978564961Test) +} + +func _1613978564961Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + + // TODO: 这里开始写入要变更的内容 + menu := models.SysMenu{MenuId: 110, Path: "/api/v1/config"} + err := tx.Model(&menu).Where("menu_id = ?", 110).Update("Path", "/api/v1/dict/data-all").Error + if err != nil { + return err + } + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/migration/version/1613998164781_migrate.go b/cmd/migrate/migration/version/1613998164781_migrate.go new file mode 100644 index 00000000..880a0823 --- /dev/null +++ b/cmd/migrate/migration/version/1613998164781_migrate.go @@ -0,0 +1,104 @@ +package version + +import ( + "runtime" + + "gorm.io/gorm" + + "go-admin/cmd/migrate/migration" + "go-admin/cmd/migrate/migration/models" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1613998164781Test) +} + +func _1613998164781Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + + err := tx.Model(&models.SysMenu{}).Where("path = ?", "/api/v1/deptList").Update("path", "/api/v1/dept").Error + if err != nil { + return err + } + + err = tx.Model(&models.SysMenu{}).Where("path = ?", "/api/v1/roleList").Update("path", "/api/v1/role").Error + if err != nil { + return err + } + + err = tx.Model(&models.SysMenu{}).Where("path = ?", "/api/v1/menuList").Update("path", "/api/v1/menu").Error + if err != nil { + return err + } + + err = tx.Model(&models.SysMenu{}).Where("path = ?", "/api/v1/postList").Update("path", "/api/v1/post").Error + if err != nil { + return err + } + + err = tx.Model(&models.SysMenu{}).Where("path = ?", "/api/v1/dict/typelist").Update("path", "/api/v1/dict/type").Error + if err != nil { + return err + } + + err = tx.Model(&models.SysMenu{}).Where("path = ?", "/api/v1/dict/datalist").Update("path", "/api/v1/dict/data").Error + if err != nil { + return err + } + + err = tx.Model(&models.SysMenu{}).Where("path like ?", "/api/v1/dict/data"). + Where("action = ?", "PUT").Update("path", "/api/v1/dict/data/:id").Error + if err != nil { + return err + } + + err = tx.Model(&models.SysMenu{}).Where("path like ?", "/api/v1/dict/data/:id"). + Where("action = ?", "DELETE").Update("path", "/api/v1/dict/data").Error + if err != nil { + return err + } + + err = tx.Model(&models.SysMenu{}).Where("path like ?", "/api/v1/dict/type"). + Where("action = ?", "PUT").Update("path", "/api/v1/dict/type/:id").Error + if err != nil { + return err + } + + err = tx.Model(&models.SysMenu{}).Where("path like ?", "/api/v1/dict/type/:id"). + Where("action = ?", "DELETE").Update("path", "/api/v1/dict/type").Error + if err != nil { + return err + } + + err = tx.Model(&models.SysMenu{}).Where("path = ?", "/api/v1/operloglist").Update("path", "/api/v1/sys-opera-log").Error + if err != nil { + return err + } + + err = tx.Model(&models.SysMenu{}).Where("path = ?", "/api/v1/loginloglist").Update("path", "/api/v1/sys-login-log").Error + if err != nil { + return err + } + + err = tx.Model(&models.SysMenu{}).Where("path = ?", "/api/v1/loginlog/:id").Where("action = ?", "DELETE").Update("path", "/api/v1/sys-opera-log").Error + if err != nil { + return err + } + + err = tx.Model(&models.SysMenu{}).Where("path like ?", "/api/v1/operloglist%").Where("action = ?", "DELETE").Update("path", "/api/v1/sys-opera-log").Error + if err != nil { + return err + } + + err = tx.Model(&models.SysMenu{}).Where("path like ?", "/api/v1/role/:id").Where("action = ?", "DELETE").Update("path", "/api/v1/role").Error + if err != nil { + return err + } + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/migration/version/1614073723691_migrate.go b/cmd/migrate/migration/version/1614073723691_migrate.go new file mode 100644 index 00000000..04a151e3 --- /dev/null +++ b/cmd/migrate/migration/version/1614073723691_migrate.go @@ -0,0 +1,32 @@ +package version + +import ( + "runtime" + + "gorm.io/gorm" + + "go-admin/cmd/migrate/migration" + "go-admin/cmd/migrate/migration/models" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1614073723691Test) +} + +func _1614073723691Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + + // TODO: 这里开始写入要变更的内容 + + err := tx.Model(&models.SysMenu{}).Where("path = ?", "/api/v1/syscontentList").Update("path", "/api/v1/syscontent").Error + if err != nil { + return err + } + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/migration/version/1614159531111_migrate.go b/cmd/migrate/migration/version/1614159531111_migrate.go new file mode 100644 index 00000000..ad44723a --- /dev/null +++ b/cmd/migrate/migration/version/1614159531111_migrate.go @@ -0,0 +1,36 @@ +package version + +import ( + "runtime" + + "gorm.io/gorm" + + "go-admin/cmd/migrate/migration" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1614159531111Test) +} + +func _1614159531111Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + + sql1 := "INSERT INTO `sys_menu`(`menu_id`, `menu_name`, `title`, `icon`, `path`, `paths`, `menu_type`, `action`, `permission`, `parent_id`, `no_cache`, `breadcrumb`, `component`, `sort`, `visible`, `is_frame`, `create_by`, `update_by`, `created_at`, `updated_at`, `deleted_at`) VALUES (525, '', '公共资源目录获取', 'bug', '/api/v1/sysfiledir', '', 'A', 'GET', '', 256, 0, '', '', 0, '1', '1', 1, 1, '2021-02-24 17:36:02.900', '2021-02-24 17:36:16.600', NULL);" + sql2 := "INSERT INTO `sys_menu`(`menu_id`, `menu_name`, `title`, `icon`, `path`, `paths`, `menu_type`, `action`, `permission`, `parent_id`, `no_cache`, `breadcrumb`, `component`, `sort`, `visible`, `is_frame`, `create_by`, `update_by`, `created_at`, `updated_at`, `deleted_at`) VALUES (526, '', '公共资源获取', 'bug', '/api/v1/sysfileinfo', '', 'A', 'GET', '', 256, 0, '', '', 0, '1', '1', 1, 0, '2021-02-24 17:36:49.575', '2021-02-24 17:36:49.575', NULL);" + err := tx.Exec(sql1).Error + if err != nil { + return err + } + + err = tx.Exec(sql2).Error + if err != nil { + return err + } + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/migration/version/1614604763713_migrate.go b/cmd/migrate/migration/version/1614604763713_migrate.go new file mode 100644 index 00000000..6123b678 --- /dev/null +++ b/cmd/migrate/migration/version/1614604763713_migrate.go @@ -0,0 +1,71 @@ +package version + +import ( + "runtime" + + "gorm.io/gorm" + + "go-admin/cmd/migrate/migration" + "go-admin/cmd/migrate/migration/models" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1614604763713Test) +} + +func _1614604763713Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + + err := tx.Model(&models.SysMenu{}).Where("path = ?", "/api/v1/dict/typeoptionselect").Update("path", "/api/v1/dict/type-option-select").Error + if err != nil { + return err + } + + err = tx.Model(&models.SysMenu{}).Where("action = ?", "GET"). + Where("path = ?", "/api/v1/sysUserList").Update("path", "/api/v1/sysUser").Error + if err != nil { + return err + } + + err = tx.Model(&models.SysMenu{}).Where("action = ?", "DELETE"). + Where("path = ?", "/api/v1/sysUser/:id").Update("path", "/api/v1/sysUser").Error + if err != nil { + return err + } + + err = tx.Migrator().AlterColumn(&models.SysUser{}, "create_by") + if err != nil { + return err + } + err = tx.Migrator().AlterColumn(&models.SysUser{}, "update_by") + if err != nil { + return err + } + + err = tx.Migrator().AlterColumn(&models.SysContent{}, "create_by") + if err != nil { + return err + } + err = tx.Migrator().AlterColumn(&models.SysContent{}, "update_by") + if err != nil { + return err + } + err = tx.Model(&models.SysMenu{}).Where("action = ?", "PUT"). + Where("path = ?", "/api/v1/syscontent").Update("path", "/api/v1/syscontent/:id").Error + if err != nil { + return err + } + + err = tx.Model(&models.SysMenu{}).Where("action = ?", "DELETE"). + Where("path = ?", "/api/v1/syscontent/:id").Update("path", "/api/v1/syscontent").Error + if err != nil { + return err + } + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/migration/version/1615447091566_migrate.go b/cmd/migrate/migration/version/1615447091566_migrate.go new file mode 100644 index 00000000..b80b3f43 --- /dev/null +++ b/cmd/migrate/migration/version/1615447091566_migrate.go @@ -0,0 +1,36 @@ +package version + +import ( + "fmt" + "runtime" + + "gorm.io/gorm" + + "go-admin/cmd/migrate/migration" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1615447091566Test) +} + +func _1615447091566Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + + // TODO: 这里开始写入要变更的内容 + + // TODO: 例如 修改表字段 使用过程中请删除此段代码 + sql1 := "INSERT INTO `sys_menu`(`menu_id`, `menu_name`, `title`, `icon`, `path`, `paths`, `menu_type`, `action`, `permission`, `parent_id`, `no_cache`, `breadcrumb`, `component`, `sort`, `visible`, `create_by`, `update_by`, `is_frame`, `created_at`, `updated_at`, `deleted_at`) VALUES (522, 'SysContentCreate', '新增', 'form', 'syscontent/create', '/0/498/522', 'C', '', 'syscontent:syscontent:add', 498, 0, '', '/syscontent/create.vue', 0, '1', '1', '1', '1', '2020-11-08 17:00:35.259', '2020-11-12 22:55:50.739', NULL);" + + err := tx.Exec(sql1).Error + if err != nil { + fmt.Println(err) + return nil + } + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/migration/version/1615948084336_migrate.go b/cmd/migrate/migration/version/1615948084336_migrate.go new file mode 100644 index 00000000..f8544aad --- /dev/null +++ b/cmd/migrate/migration/version/1615948084336_migrate.go @@ -0,0 +1,30 @@ +package version + +import ( + "runtime" + "strings" + + "gorm.io/gorm" + + "go-admin/cmd/migrate/migration" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1615948084336Test) +} + +func _1615948084336Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + + err := tx.Exec("alter table sys_config add is_frontend int default 1 null comment '是否前台参数' after config_type").Error + if err != nil && !strings.Contains(err.Error(), "Duplicate column name 'is_frontend'") { + return err + } + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/migration/version/1615950701614_migrate.go b/cmd/migrate/migration/version/1615950701614_migrate.go new file mode 100644 index 00000000..ebeab9c2 --- /dev/null +++ b/cmd/migrate/migration/version/1615950701614_migrate.go @@ -0,0 +1,34 @@ +package version + +import ( + "runtime" + + "gorm.io/gorm" + + "go-admin/cmd/migrate/migration" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1615950701614Test) +} + +func _1615950701614Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + + err := tx.Exec("UPDATE sys_dict_data t SET t.dict_value = '2' WHERE t.dict_code = 16").Error + if err != nil { + return err + } + + err = tx.Exec("UPDATE sys_opera_log t SET t.status = '2' WHERE t.status = '0'").Error + if err != nil { + return err + } + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/migration/version/1615961953379_migrate.go b/cmd/migrate/migration/version/1615961953379_migrate.go new file mode 100644 index 00000000..c290a0be --- /dev/null +++ b/cmd/migrate/migration/version/1615961953379_migrate.go @@ -0,0 +1,34 @@ +package version + +import ( + "runtime" + + "gorm.io/gorm" + + "go-admin/cmd/migrate/migration" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1615961953379Test) +} + +func _1615961953379Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + + err := tx.Exec("INSERT INTO `sys_config` (`id`, `config_name`, `config_key`, `config_value`, `config_type`, `is_frontend`, `remark`, `create_by`, `update_by`, `created_at`, `updated_at`, `deleted_at`) VALUES (4, '系统名称', 'sys_app_name', 'go-admin管理系统', 'Y', 1, '', 1, 0, '2021-03-17 08:52:06.067', '2021-03-17 08:52:06.067', NULL);").Error + if err != nil { + return err + } + + err = tx.Exec("INSERT INTO `sys_config` (`id`, `config_name`, `config_key`, `config_value`, `config_type`, `is_frontend`, `remark`, `create_by`, `update_by`, `created_at`, `updated_at`, `deleted_at`) VALUES (5, '系统logo', 'sys_app_logo', 'https://gitee.com/mydearzwj/image/raw/master/img/go-admin.png', 'Y', 1, '', 1, 0, '2021-03-17 08:53:19.462', '2021-03-17 08:53:19.462', NULL);").Error + if err != nil { + return err + } + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/migration/version/1619418811873_migrate.go b/cmd/migrate/migration/version/1619418811873_migrate.go new file mode 100644 index 00000000..ba913527 --- /dev/null +++ b/cmd/migrate/migration/version/1619418811873_migrate.go @@ -0,0 +1,64 @@ +package version + +import ( + "go-admin/cmd/migrate/migration/models" + "gorm.io/gorm" + "runtime" + + "go-admin/cmd/migrate/migration" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1619418811873Test) +} + +func _1619418811873Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + + // TODO: 这里开始写入要变更的内容 + err := tx.Migrator().AlterColumn(&models.SysRole{}, "CreateBy") + if err != nil { + return err + } + err = tx.Migrator().AlterColumn(&models.SysRole{}, "UpdateBy") + if err != nil { + return err + } + err = tx.Migrator().AlterColumn(&models.SysJob{}, "CreateBy") + if err != nil { + return err + } + err = tx.Migrator().AlterColumn(&models.SysJob{}, "UpdateBy") + if err != nil { + return err + } + err = tx.Migrator().AlterColumn(&models.RoleMenu{}, "CreateBy") + if err != nil { + return err + } + err = tx.Migrator().AlterColumn(&models.RoleMenu{}, "UpdateBy") + if err != nil { + return err + } + + // TODO: 例如 修改表字段 使用过程中请删除此段代码 + //err := tx.Migrator().RenameColumn(&models.SysConfig{}, "config_id", "id") + //if err != nil { + // return err + //} + + // TODO: 例如 新增表结构 使用过程中请删除此段代码 + //err = tx.Debug().Migrator().AutoMigrate( + // new(models.CasbinRule), + // ) + //if err != nil { + // return err + //} + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/server.go b/cmd/migrate/server.go index d40a3901..f9ba1274 100644 --- a/cmd/migrate/server.go +++ b/cmd/migrate/server.go @@ -1,20 +1,31 @@ package migrate import ( + "bytes" "fmt" + "github.com/go-admin-team/go-admin-core/sdk" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + "strconv" + "text/template" + "time" + + "github.com/go-admin-team/go-admin-core/config/source/file" "github.com/spf13/cobra" + + "github.com/go-admin-team/go-admin-core/sdk/config" + "github.com/go-admin-team/go-admin-core/sdk/pkg/logger" "go-admin/cmd/migrate/migration" _ "go-admin/cmd/migrate/migration/version" + _ "go-admin/cmd/migrate/migration/version-local" "go-admin/common/database" - "go-admin/common/global" "go-admin/common/models" - "go-admin/pkg/logger" - "go-admin/tools/config" ) var ( configYml string - exec bool + generate bool + goAdmin bool + host string StartCmd = &cobra.Command{ Use: "migrate", Short: "Initialize the database", @@ -25,41 +36,78 @@ var ( } ) +// fixme 在您看不见代码的时候运行迁移,我觉得是不安全的,所以编译后最好不要去执行迁移 func init() { StartCmd.PersistentFlags().StringVarP(&configYml, "config", "c", "config/settings.yml", "Start server with provided configuration file") - //StartCmd.PersistentFlags().BoolVarP(&exec, "exec", "e", false, "exec script") + StartCmd.PersistentFlags().BoolVarP(&generate, "generate", "g", false, "generate migration file") + StartCmd.PersistentFlags().BoolVarP(&goAdmin, "goAdmin", "a", false, "generate go-admin migration file") + StartCmd.PersistentFlags().StringVarP(&host, "domain", "d", "*", "select tenant host") } func run() { - usage := `start init` - fmt.Println(usage) - //1. 读取配置 - config.Setup(configYml) - //2. 设置日志 - logger.Setup() - //3. 初始化数据库链接 - database.Setup(config.DatabaseConfig.Driver) - //4. 数据库迁移 - fmt.Println("数据库迁移开始") - _ = migrateModel() - //fmt.Println("数据库结构初始化成功!") - //5. 数据初始化完成 - //if err := models.InitDb(); err != nil { - // global.Logger.Fatalf("数据库基础数据初始化失败!error: %v ", err) - //} - usage = `数据库基础数据初始化成功` - fmt.Println(usage) + + if !generate { + fmt.Println(`start init`) + //1. 读取配置 + config.Setup(file.NewSource, file.WithPath(configYml)) + //2. 设置日志 + sdk.Runtime.SetLogger( + logger.SetupLogger( + config.LoggerConfig.Type, + config.LoggerConfig.Path, + config.LoggerConfig.Level, + config.LoggerConfig.Stdout)) + _ = initDB() + } else { + fmt.Println(`generate migration file`) + _ = genFile() + } } func migrateModel() error { - if config.DatabaseConfig.Driver == "mysql" { - global.Eloquent.Set("gorm:table_options", "ENGINE=InnoDB CHARSET=utf8mb4") + if host == "" { + host = "*" } - err := global.Eloquent.Debug().AutoMigrate(&models.Migration{}) + db := sdk.Runtime.GetDbByKey(host) + if config.DatabasesConfig[host].Driver == "mysql" { + //初始化数据库时候用 + db.Set("gorm:table_options", "ENGINE=InnoDB CHARSET=utf8mb4") + } + err := db.Debug().AutoMigrate(&models.Migration{}) if err != nil { return err } - migration.Migrate.SetDb(global.Eloquent.Debug()) + migration.Migrate.SetDb(db.Debug()) migration.Migrate.Migrate() return err } +func initDB() error { + //3. 初始化数据库链接 + database.Setup() + //4. 数据库迁移 + fmt.Println("数据库迁移开始") + _ = migrateModel() + fmt.Println(`数据库基础数据初始化成功`) + return nil +} + +func genFile() error { + t1, err := template.ParseFiles("template/migrate.template") + if err != nil { + return err + } + m := map[string]string{} + m["GenerateTime"] = strconv.FormatInt(time.Now().UnixNano()/1e6, 10) + m["Package"] = "version_local" + if goAdmin { + m["Package"] = "version" + } + var b1 bytes.Buffer + err = t1.Execute(&b1, m) + if goAdmin { + pkg.FileCreate(b1, "./cmd/migrate/migration/version/"+m["GenerateTime"]+"_migrate.go") + } else { + pkg.FileCreate(b1, "./cmd/migrate/migration/version-local/"+m["GenerateTime"]+"_migrate.go") + } + return nil +} diff --git a/cmd/version/server.go b/cmd/version/server.go index cb46e41d..329e1ead 100644 --- a/cmd/version/server.go +++ b/cmd/version/server.go @@ -2,17 +2,12 @@ package version import ( "fmt" - "github.com/spf13/cobra" - "go-admin/common/global" ) var ( - configYml string - port string - mode string - StartCmd = &cobra.Command{ + StartCmd = &cobra.Command{ Use: "version", Short: "Get version info", Example: "go-admin version", diff --git a/common/actions/create.go b/common/actions/create.go index 89110626..4de722d9 100644 --- a/common/actions/create.go +++ b/common/actions/create.go @@ -4,45 +4,46 @@ import ( "net/http" "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/api" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" + "github.com/go-admin-team/go-admin-core/sdk/pkg/response" "go-admin/common/dto" - "go-admin/common/log" "go-admin/common/models" - "go-admin/tools" - "go-admin/tools/app" ) // CreateAction 通用新增动作 func CreateAction(control dto.Control) gin.HandlerFunc { return func(c *gin.Context) { - db, err := tools.GetOrm(c) + log := api.GetRequestLogger(c) + db, err := pkg.GetOrm(c) if err != nil { log.Error(err) return } - msgID := tools.GenerateMsgIDFromContext(c) //新增操作 req := control.Generate() err = req.Bind(c) if err != nil { - app.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") + response.Error(c, http.StatusUnprocessableEntity, err, err.Error()) return } var object models.ActiveRecord object, err = req.GenerateM() if err != nil { - app.Error(c, http.StatusInternalServerError, err, "模型生成失败") + response.Error(c, http.StatusInternalServerError, err, "模型生成失败") return } - object.SetCreateBy(tools.GetUserIdUint(c)) + object.SetCreateBy(user.GetUserId(c)) err = db.WithContext(c).Create(object).Error if err != nil { - log.Errorf("MsgID[%s] Create error: %s", msgID, err) - app.Error(c, http.StatusInternalServerError, err, "创建失败") + log.Errorf("Create error: %s", err) + response.Error(c, http.StatusInternalServerError, err, "创建失败") return } - app.OK(c, object.GetId(), "创建成功") + response.OK(c, object.GetId(), "创建成功") c.Next() } -} +} \ No newline at end of file diff --git a/common/actions/delete.go b/common/actions/delete.go index f8c3a5fa..ff4f35fe 100644 --- a/common/actions/delete.go +++ b/common/actions/delete.go @@ -4,40 +4,41 @@ import ( "net/http" "github.com/gin-gonic/gin" + log "github.com/go-admin-team/go-admin-core/logger" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" + "github.com/go-admin-team/go-admin-core/sdk/pkg/response" "go-admin/common/dto" - "go-admin/common/log" "go-admin/common/models" - "go-admin/tools" - "go-admin/tools/app" ) // DeleteAction 通用删除动作 func DeleteAction(control dto.Control) gin.HandlerFunc { return func(c *gin.Context) { - db, err := tools.GetOrm(c) + db, err := pkg.GetOrm(c) if err != nil { log.Error(err) return } - msgID := tools.GenerateMsgIDFromContext(c) + msgID := pkg.GenerateMsgIDFromContext(c) //删除操作 req := control.Generate() err = req.Bind(c) if err != nil { log.Errorf("MsgID[%s] Bind error: %s", msgID, err) - app.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") + response.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") return } var object models.ActiveRecord object, err = req.GenerateM() if err != nil { - app.Error(c, http.StatusInternalServerError, err, "模型生成失败") + response.Error(c, http.StatusInternalServerError, err, "模型生成失败") return } - object.SetUpdateBy(tools.GetUserIdUint(c)) + object.SetUpdateBy(user.GetUserId(c)) //数据权限检查 p := GetPermissionFromContext(c) @@ -47,14 +48,14 @@ func DeleteAction(control dto.Control) gin.HandlerFunc { ).Where(req.GetId()).Delete(object) if db.Error != nil { log.Errorf("MsgID[%s] Delete error: %s", msgID, err) - app.Error(c, http.StatusInternalServerError, err, "删除失败") + response.Error(c, http.StatusInternalServerError, err, "删除失败") return } if db.RowsAffected == 0 { - app.Error(c, http.StatusForbidden, nil, "无权删除该数据") + response.Error(c, http.StatusForbidden, nil, "无权删除该数据") return } - app.OK(c, object.GetId(), "删除成功") + response.OK(c, object.GetId(), "删除成功") c.Next() } } diff --git a/common/actions/index.go b/common/actions/index.go index 3f8f7fab..aeafe3f5 100644 --- a/common/actions/index.go +++ b/common/actions/index.go @@ -5,25 +5,25 @@ import ( "net/http" "github.com/gin-gonic/gin" + log "github.com/go-admin-team/go-admin-core/logger" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + "github.com/go-admin-team/go-admin-core/sdk/pkg/response" "gorm.io/gorm" "go-admin/common/dto" - "go-admin/common/log" "go-admin/common/models" - "go-admin/tools" - "go-admin/tools/app" ) // IndexAction 通用查询动作 func IndexAction(m models.ActiveRecord, d dto.Index, f func() interface{}) gin.HandlerFunc { return func(c *gin.Context) { - db, err := tools.GetOrm(c) + db, err := pkg.GetOrm(c) if err != nil { log.Error(err) return } - msgID := tools.GenerateMsgIDFromContext(c) + msgID := pkg.GenerateMsgIDFromContext(c) list := f() object := m.Generate() req := d.Generate() @@ -32,7 +32,7 @@ func IndexAction(m models.ActiveRecord, d dto.Index, f func() interface{}) gin.H //查询列表 err = req.Bind(c) if err != nil { - app.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") + response.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") return } @@ -49,10 +49,10 @@ func IndexAction(m models.ActiveRecord, d dto.Index, f func() interface{}) gin.H Count(&count).Error if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { log.Errorf("MsgID[%s] Index error: %s", msgID, err) - app.Error(c, http.StatusInternalServerError, err, "查询失败") + response.Error(c, http.StatusInternalServerError, err, "查询失败") return } - app.PageOK(c, list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") + response.PageOK(c, list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") c.Next() } } diff --git a/common/actions/permission.go b/common/actions/permission.go index 92df6435..357f0a53 100644 --- a/common/actions/permission.go +++ b/common/actions/permission.go @@ -5,12 +5,12 @@ import ( "net/http" "github.com/gin-gonic/gin" + log "github.com/go-admin-team/go-admin-core/logger" + "github.com/go-admin-team/go-admin-core/sdk/config" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" + "github.com/go-admin-team/go-admin-core/sdk/pkg/response" "gorm.io/gorm" - - "go-admin/common/log" - "go-admin/tools" - "go-admin/tools/app" - "go-admin/tools/config" ) type DataPermission struct { @@ -22,19 +22,19 @@ type DataPermission struct { func PermissionAction() gin.HandlerFunc { return func(c *gin.Context) { - db, err := tools.GetOrm(c) + db, err := pkg.GetOrm(c) if err != nil { log.Error(err) return } - msgID := tools.GenerateMsgIDFromContext(c) + msgID := pkg.GenerateMsgIDFromContext(c) var p = new(DataPermission) - if userId := tools.GetUserIdStr(c); userId != "" { + if userId := user.GetUserIdStr(c); userId != "" { p, err = newDataPermission(db, userId) if err != nil { log.Errorf("MsgID[%s] PermissionAction error: %s", msgID, err) - app.Error(c, http.StatusInternalServerError, err, "权限范围鉴定错误") + response.Error(c, http.StatusInternalServerError, err, "权限范围鉴定错误") c.Abort() return } @@ -71,7 +71,7 @@ func Permission(tableName string, p *DataPermission) func(db *gorm.DB) *gorm.DB case "3": return db.Where(tableName+".create_by in (SELECT user_id from sys_user where dept_id = ? )", p.DeptId) case "4": - return db.Where(tableName+".create_by in (SELECT user_id from sys_user where sys_user.dept_id in(select dept_id from sys_dept where dept_path like ? ))", "%"+tools.IntToString(p.DeptId)+"%") + return db.Where(tableName+".create_by in (SELECT user_id from sys_user where sys_user.dept_id in(select dept_id from sys_dept where dept_path like ? ))", "%/"+pkg.IntToString(p.DeptId)+"/%") case "5": return db.Where(tableName+".create_by = ?", p.UserId) default: @@ -94,4 +94,4 @@ func getPermissionFromContext(c *gin.Context) *DataPermission { // PermissionForNoAction 提供非action写法数据范围约束 func GetPermissionFromContext(c *gin.Context) *DataPermission { return getPermissionFromContext(c) -} \ No newline at end of file +} diff --git a/common/actions/update.go b/common/actions/update.go index ac788c88..51be20b6 100644 --- a/common/actions/update.go +++ b/common/actions/update.go @@ -4,38 +4,39 @@ import ( "net/http" "github.com/gin-gonic/gin" + log "github.com/go-admin-team/go-admin-core/logger" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" + "github.com/go-admin-team/go-admin-core/sdk/pkg/response" "go-admin/common/dto" - "go-admin/common/log" "go-admin/common/models" - "go-admin/tools" - "go-admin/tools/app" ) // UpdateAction 通用更新动作 func UpdateAction(control dto.Control) gin.HandlerFunc { return func(c *gin.Context) { - db, err := tools.GetOrm(c) + db, err := pkg.GetOrm(c) if err != nil { log.Error(err) return } - msgID := tools.GenerateMsgIDFromContext(c) + msgID := pkg.GenerateMsgIDFromContext(c) req := control.Generate() //更新操作 err = req.Bind(c) if err != nil { - app.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") + response.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") return } var object models.ActiveRecord object, err = req.GenerateM() if err != nil { - app.Error(c, http.StatusInternalServerError, err, "模型生成失败") + response.Error(c, http.StatusInternalServerError, err, "模型生成失败") return } - object.SetUpdateBy(tools.GetUserIdUint(c)) + object.SetUpdateBy(user.GetUserId(c)) //数据权限检查 p := GetPermissionFromContext(c) @@ -45,14 +46,14 @@ func UpdateAction(control dto.Control) gin.HandlerFunc { ).Where(req.GetId()).Updates(object) if db.Error != nil { log.Errorf("MsgID[%s] Update error: %s", msgID, err) - app.Error(c, http.StatusInternalServerError, err, "更新失败") + response.Error(c, http.StatusInternalServerError, err, "更新失败") return } if db.RowsAffected == 0 { - app.Error(c, http.StatusForbidden, nil, "无权更新该数据") + response.Error(c, http.StatusForbidden, nil, "无权更新该数据") return } - app.OK(c, object.GetId(), "更新成功") + response.OK(c, object.GetId(), "更新成功") c.Next() } } diff --git a/common/actions/view.go b/common/actions/view.go index 015d54b2..97e06610 100644 --- a/common/actions/view.go +++ b/common/actions/view.go @@ -2,39 +2,39 @@ package actions import ( "errors" + "github.com/go-admin-team/go-admin-core/sdk/pkg/response" "net/http" "github.com/gin-gonic/gin" + log "github.com/go-admin-team/go-admin-core/logger" + "github.com/go-admin-team/go-admin-core/sdk/pkg" "gorm.io/gorm" "go-admin/common/dto" - "go-admin/common/log" "go-admin/common/models" - "go-admin/tools" - "go-admin/tools/app" ) // ViewAction 通用详情动作 func ViewAction(control dto.Control, f func() interface{}) gin.HandlerFunc { return func(c *gin.Context) { - db, err := tools.GetOrm(c) + db, err := pkg.GetOrm(c) if err != nil { log.Error(err) return } - msgID := tools.GenerateMsgIDFromContext(c) + msgID := pkg.GenerateMsgIDFromContext(c) //查看详情 req := control.Generate() err = req.Bind(c) if err != nil { - app.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") + response.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") return } var object models.ActiveRecord object, err = req.GenerateM() if err != nil { - app.Error(c, http.StatusInternalServerError, err, "模型生成失败") + response.Error(c, http.StatusInternalServerError, err, "模型生成失败") return } @@ -53,15 +53,15 @@ func ViewAction(control dto.Control, f func() interface{}) gin.HandlerFunc { ).Where(req.GetId()).First(rsp).Error if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { - app.Error(c, http.StatusNotFound, nil, "查看对象不存在或无权查看") + response.Error(c, http.StatusNotFound, nil, "查看对象不存在或无权查看") return } if err != nil { log.Errorf("MsgID[%s] View error: %s", msgID, err) - app.Error(c, http.StatusInternalServerError, err, "查看失败") + response.Error(c, http.StatusInternalServerError, err, "查看失败") return } - app.OK(c, rsp, "查看成功") + response.OK(c, rsp, "查看成功") c.Next() } } diff --git a/common/apis/api.go b/common/apis/api.go index db4868d0..a81824aa 100644 --- a/common/apis/api.go +++ b/common/apis/api.go @@ -1,57 +1,73 @@ package apis import ( - "github.com/gin-gonic/gin" - "gorm.io/gorm" + "github.com/gin-gonic/gin/binding" "net/http" - "go-admin/common/models" - "go-admin/tools" + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/api" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + "github.com/go-admin-team/go-admin-core/sdk/pkg/logger" + "github.com/go-admin-team/go-admin-core/sdk/pkg/response" + "gorm.io/gorm" ) type Api struct { + Context *gin.Context + Logger *logger.Logger +} + +func (e *Api) SetContext(c *gin.Context) { + e.Context = c +} + +// GetLogger 获取上下文提供的日志 +func (e Api) GetLogger() *logger.Logger { + return api.GetRequestLogger(e.Context) +} + +func (e Api) Bind(d interface{}, bindings ...binding.Binding) error { + var err error + for i := range bindings { + switch bindings[i] { + case binding.JSON: + err = e.Context.ShouldBindWith(d, binding.JSON) + default: + err = e.Context.ShouldBindUri(d) + } + if err != nil { + return err + } + } + return nil } // GetOrm 获取Orm DB -func (e *Api) GetOrm(c *gin.Context) (*gorm.DB, error) { - return tools.GetOrm(c) +func (e Api) GetOrm() (*gorm.DB, error) { + db, err := pkg.GetOrm(e.Context) + if err != nil { + e.Error(http.StatusInternalServerError, err, "数据库连接获取失败") + return nil, err + } + return db, nil } // Error 通常错误数据处理 -func (e *Api) Error(c *gin.Context, code int, err error, msg string) { - var res models.Response - if err != nil { - res.Msg = err.Error() - } - if msg != "" { - res.Msg = msg - } - res.RequestId = tools.GenerateMsgIDFromContext(c) - c.JSON(http.StatusOK, res.ReturnError(code)) +func (e Api) Error(code int, err error, msg string) { + response.Error(e.Context, code, err, msg) } // OK 通常成功数据处理 -func (e *Api) OK(c *gin.Context, data interface{}, msg string) { - var res models.Response - res.Data = data - if msg != "" { - res.Msg = msg - } - res.RequestId = tools.GenerateMsgIDFromContext(c) - c.JSON(http.StatusOK, res.ReturnOK()) +func (e Api) OK(data interface{}, msg string) { + response.OK(e.Context, data, msg) } // PageOK 分页数据处理 -func (e *Api) PageOK(c *gin.Context, result interface{}, count int, pageIndex int, pageSize int, msg string) { - var res models.Page - res.List = result - res.Count = count - res.PageIndex = pageIndex - res.PageSize = pageSize - e.OK(c, res, msg) +func (e Api) PageOK(result interface{}, count int, pageIndex int, pageSize int, msg string) { + response.PageOK(e.Context, result, count, pageIndex, pageSize, msg) } // Custom 兼容函数 -func (e *Api) Custom(c *gin.Context, data gin.H) { - c.JSON(http.StatusOK, data) +func (e Api) Custom(data gin.H) { + response.Custum(e.Context, data) } diff --git a/common/apis/request_logger.go b/common/apis/request_logger.go new file mode 100644 index 00000000..d3df51c4 --- /dev/null +++ b/common/apis/request_logger.go @@ -0,0 +1,10 @@ +package apis + +// GetRequestLogger 获取上下文提供的日志 +//func GetRequestLogger(c *gin.Context) *logger.Logger { +// requestId := pkg.GenerateMsgIDFromContext(c) +// log := sdk.Runtime.GetLogger().Fields(map[string]interface{}{ +// strings.ToLower(pkg.TrafficKey): requestId, +// }) +// return &logger.Logger{Logger: log} +//} \ No newline at end of file diff --git a/common/config/config.go b/common/config/config.go deleted file mode 100644 index 4ac318dd..00000000 --- a/common/config/config.go +++ /dev/null @@ -1,79 +0,0 @@ -package config - -import ( - "database/sql" - "net/http" - - "go-admin/logger" -) - -type Config struct { - saas bool - dbs map[string]*DBConfig - db *DBConfig - engine http.Handler -} - -type DBConfig struct { - Driver string - DB *sql.DB -} - -// SetDbs 设置对应key的db -func (c *Config) SetDbs(key string, db *DBConfig) { - c.dbs[key] = db -} - -// GetDbs 获取所有map里的db数据 -func (c *Config) GetDbs() map[string]*DBConfig { - return c.dbs -} - -// GetDbByKey 根据key获取db -func (c *Config) GetDbByKey(key string) *DBConfig { - return c.dbs[key] -} - -// SetDb 设置单个db -func (c *Config) SetDb(db *DBConfig) { - c.db = db -} - -// GetDb 获取单个db -func (c *Config) GetDb() *DBConfig { - return c.db -} - -// SetEngine 设置路由引擎 -func (c *Config) SetEngine(engine http.Handler) { - c.engine = engine -} - -// GetEngine 获取路由引擎 -func (c *Config) GetEngine() http.Handler { - return c.engine -} - -// SetLogger 设置日志组件 -func (c *Config) SetLogger(l logger.Logger) { - logger.DefaultLogger = l -} - -// GetLogger 获取日志组件 -func (c *Config) GetLogger() logger.Logger { - return logger.DefaultLogger -} - -// SetSaas 设置是否是saas应用 -func (c *Config) SetSaas(saas bool) { - c.saas = saas -} - -// GetSaas 获取是否是saas应用 -func (c *Config) GetSaas() bool { - return c.saas -} - -func DefaultConfig() *Config { - return &Config{} -} diff --git a/common/config/type.go b/common/config/type.go deleted file mode 100644 index 8fbed122..00000000 --- a/common/config/type.go +++ /dev/null @@ -1,28 +0,0 @@ -package config - -import ( - "net/http" - - "go-admin/logger" -) - -type Conf interface { - //多db设置,⚠️SetDbs不允许并发,可以根据自己的业务,例如app分库、host分库 - SetDbs(key string, db *DBConfig) - GetDbs() map[string]*DBConfig - GetDbByKey(key string) *DBConfig - GetSaas() bool - SetSaas(bool) - - //单库业务实现这两个接口 - SetDb(db *DBConfig) - GetDb() *DBConfig - - //使用的路由 - SetEngine(engine http.Handler) - GetEngine() http.Handler - - //使用go-admin定义的logger,参考来源go-micro - SetLogger(logger logger.Logger) - GetLogger() logger.Logger -} diff --git a/common/database/initialize.go b/common/database/initialize.go index c377458d..b7804355 100644 --- a/common/database/initialize.go +++ b/common/database/initialize.go @@ -1,20 +1,69 @@ package database -func Setup(driver string) { - dbType := driver - if dbType == "mysql" { - var db = new(Mysql) - db.Setup() - } +import ( + "time" - //TODO: 如果需要sqlite3请开启下面注释 - //if dbType == "sqlite3" { - // var db = new(SqLite) - // db.Setup() - //} + log "github.com/go-admin-team/go-admin-core/logger" + "github.com/go-admin-team/go-admin-core/sdk" + toolsConfig "github.com/go-admin-team/go-admin-core/sdk/config" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + mycasbin "github.com/go-admin-team/go-admin-core/sdk/pkg/casbin" + toolsDB "github.com/go-admin-team/go-admin-core/tools/database" + . "github.com/go-admin-team/go-admin-core/tools/gorm/logger" + "gorm.io/gorm" + "gorm.io/gorm/logger" + "gorm.io/gorm/schema" - if dbType == "postgres" { - var db = new(PgSql) - db.Setup() + "go-admin/common/global" +) + +// Setup 配置数据库 +func Setup() { + for k := range toolsConfig.DatabasesConfig { + setupSimpleDatabase(k, toolsConfig.DatabasesConfig[k]) } } + +func setupSimpleDatabase(host string, c *toolsConfig.Database) { + if global.Driver == "" { + global.Driver = c.Driver + } + log.Infof("%s => %s", host, pkg.Green(c.Source)) + registers := make([]toolsDB.ResolverConfigure, len(c.Registers)) + for i := range c.Registers { + registers[i] = toolsDB.NewResolverConfigure( + c.Registers[i].Sources, + c.Registers[i].Replicas, + c.Registers[i].Policy, + c.Registers[i].Tables) + } + resolverConfig := toolsDB.NewConfigure(c.Source, c.MaxIdleConns, c.MaxOpenConns, c.ConnMaxIdleTime, c.ConnMaxLifeTime, registers) + db, err := resolverConfig.Init(&gorm.Config{ + NamingStrategy: schema.NamingStrategy{ + SingularTable: true, + }, + Logger: New( + logger.Config{ + SlowThreshold: time.Second, + Colorful: true, + LogLevel: logger.LogLevel( + log.DefaultLogger.Options().Level.LevelForGorm()), + }, + ), + }, opens[c.Driver]) + + if err != nil { + log.Fatal(pkg.Red(c.Driver+" connect error :"), err) + } else { + log.Info(pkg.Green(c.Driver + " connect success !")) + } + + e := mycasbin.Setup(db, "sys_") + + //if host == "*" { + // global.Eloquent = db + //} + + sdk.Runtime.SetDb(host, db) + sdk.Runtime.SetCasbin(host, e) +} diff --git a/common/database/interface.go b/common/database/interface.go deleted file mode 100644 index 0fc32337..00000000 --- a/common/database/interface.go +++ /dev/null @@ -1,10 +0,0 @@ -package database - -import "gorm.io/gorm" - -type Database interface { - Setup() - Open(conn string, cfg *gorm.Config) (db *gorm.DB, err error) - GetConnect() string - GetDriver() string -} diff --git a/common/database/mysql_drive.go b/common/database/mysql_drive.go deleted file mode 100644 index fa83e47a..00000000 --- a/common/database/mysql_drive.go +++ /dev/null @@ -1,70 +0,0 @@ -package database - -import ( - "database/sql" - "log" - "os" - "time" - - "gorm.io/driver/mysql" - "gorm.io/gorm" - "gorm.io/gorm/logger" - "gorm.io/gorm/schema" - - "go-admin/common/config" - "go-admin/common/global" - "go-admin/tools" - toolsConfig "go-admin/tools/config" -) - -type Mysql struct { -} - -func (e *Mysql) Setup() { - global.Source = e.GetConnect() - global.Logger.Info(tools.Green(global.Source)) - db, err := sql.Open("mysql", global.Source) - if err != nil { - global.Logger.Fatal(tools.Red(e.GetDriver()+" connect error :"), err) - } - global.Cfg.SetDb(&config.DBConfig{ - Driver: "mysql", - DB: db, - }) - global.Eloquent, err = e.Open(db, &gorm.Config{ - NamingStrategy: schema.NamingStrategy{ - SingularTable: true, - }, - }) - if err != nil { - global.Logger.Fatal(tools.Red(e.GetDriver()+" connect error :"), err) - } else { - global.Logger.Info(tools.Green(e.GetDriver() + " connect success !")) - } - - if global.Eloquent.Error != nil { - global.Logger.Fatal(tools.Red(" database error :"), global.Eloquent.Error) - } - - if toolsConfig.LoggerConfig.EnabledDB { - global.Eloquent.Logger = logger.New(log.New(os.Stdout, "\r\n", log.LstdFlags), logger.Config{ - SlowThreshold: time.Second, - Colorful: true, - LogLevel: logger.Info, - }) - } -} - -// 打开数据库连接 -func (e *Mysql) Open(db *sql.DB, cfg *gorm.Config) (*gorm.DB, error) { - return gorm.Open(mysql.New(mysql.Config{Conn: db}), cfg) -} - -// 获取数据库连接 -func (e *Mysql) GetConnect() string { - return toolsConfig.DatabaseConfig.Source -} - -func (e *Mysql) GetDriver() string { - return toolsConfig.DatabaseConfig.Driver -} diff --git a/common/database/open.go b/common/database/open.go new file mode 100644 index 00000000..50c10fea --- /dev/null +++ b/common/database/open.go @@ -0,0 +1,14 @@ +// +build !sqlite3 + +package database + +import ( + "gorm.io/driver/mysql" + "gorm.io/driver/postgres" + "gorm.io/gorm" +) + +var opens = map[string]func(string) gorm.Dialector{ + "mysql": mysql.Open, + "postgres": postgres.Open, +} diff --git a/common/database/open_sqlite3.go b/common/database/open_sqlite3.go new file mode 100644 index 00000000..51754190 --- /dev/null +++ b/common/database/open_sqlite3.go @@ -0,0 +1,16 @@ +// +build sqlite3 + +package database + +import ( + "gorm.io/driver/mysql" + "gorm.io/driver/postgres" + "gorm.io/driver/sqlite" + "gorm.io/gorm" +) + +var opens = map[string]func(string) gorm.Dialector{ + "mysql": mysql.Open, + "postgres": postgres.Open, + "sqlite3": sqlite.Open, +} diff --git a/common/database/pgsql_driver.go b/common/database/pgsql_driver.go deleted file mode 100644 index e3980e13..00000000 --- a/common/database/pgsql_driver.go +++ /dev/null @@ -1,71 +0,0 @@ -package database - -import ( - "database/sql" - "log" - "os" - "time" - - "gorm.io/driver/postgres" - "gorm.io/gorm" - "gorm.io/gorm/logger" - "gorm.io/gorm/schema" - - "go-admin/common/config" - "go-admin/common/global" - "go-admin/tools" - toolsConfig "go-admin/tools/config" -) - -type PgSql struct { -} - -func (e *PgSql) Setup() { - var err error - - global.Source = e.GetConnect() - log.Println(global.Source) - db, err := sql.Open("postgresql", global.Source) - if err != nil { - global.Logger.Fatal(tools.Red(e.GetDriver()+" connect error :"), err) - } - global.Cfg.SetDb(&config.DBConfig{ - Driver: "mysql", - DB: db, - }) - global.Eloquent, err = e.Open(db, &gorm.Config{ - NamingStrategy: schema.NamingStrategy{ - SingularTable: true, - }, - }) - if err != nil { - log.Fatalf("%s connect error %v", e.GetDriver(), err) - } else { - log.Printf("%s connect success!", e.GetDriver()) - } - - if global.Eloquent.Error != nil { - log.Fatalf("database error %v", global.Eloquent.Error) - } - - if toolsConfig.LoggerConfig.EnabledDB { - global.Eloquent.Logger = logger.New(log.New(os.Stdout, "\r\n", log.LstdFlags), logger.Config{ - SlowThreshold: time.Second, - Colorful: true, - LogLevel: logger.Info, - }) - } -} - -// 打开数据库连接 -func (e *PgSql) Open(db *sql.DB, cfg *gorm.Config) (*gorm.DB, error) { - return gorm.Open(postgres.New(postgres.Config{Conn: db}), cfg) -} - -func (e *PgSql) GetConnect() string { - return toolsConfig.DatabaseConfig.Source -} - -func (e *PgSql) GetDriver() string { - return toolsConfig.DatabaseConfig.Driver -} diff --git a/common/database/sqlite3_driver.go b/common/database/sqlite3_driver.go deleted file mode 100644 index bbe5f764..00000000 --- a/common/database/sqlite3_driver.go +++ /dev/null @@ -1,64 +0,0 @@ -// +build sqlite3 - -package database - -import ( - "log" - "os" - "time" - - "gorm.io/driver/sqlite" - "gorm.io/gorm" - "gorm.io/gorm/logger" - "gorm.io/gorm/schema" - - "go-admin/common/global" - "go-admin/tools/config" -) - -type SqLite struct { -} - -func (e *SqLite) Setup() { - var err error - - global.Source = e.GetConnect() - log.Println(global.Source) - global.Eloquent, err = e.Open(e.GetDriver(), &gorm.Config{ - NamingStrategy: schema.NamingStrategy{ - SingularTable: true, - }, - }) - - if err != nil { - log.Fatalf("%s connect error %v", e.GetDriver(), err) - } else { - log.Printf("%s connect success!", e.GetDriver()) - } - - if global.Eloquent.Error != nil { - log.Fatalf("database error %v", global.Eloquent.Error) - } - - if config.LoggerConfig.EnabledDB { - global.Eloquent.Logger = logger.New(log.New(os.Stdout, "\r\n", log.LstdFlags), logger.Config{ - SlowThreshold: time.Second, - Colorful: true, - LogLevel: logger.Info, - }) - } -} - -// 打开数据库连接 -func (*SqLite) Open(conn string, cfg *gorm.Config) (db *gorm.DB, err error) { - eloquent, err := gorm.Open(sqlite.Open(conn), cfg) - return eloquent, err -} - -func (e *SqLite) GetConnect() string { - return config.DatabaseConfig.Source -} - -func (e *SqLite) GetDriver() string { - return config.DatabaseConfig.Driver -} diff --git a/common/dto/generate.go b/common/dto/generate.go index f8f7d6c0..c5ed7fae 100644 --- a/common/dto/generate.go +++ b/common/dto/generate.go @@ -1,9 +1,11 @@ package dto import ( + vd "github.com/bytedance/go-tagexpr/v2/validator" "net/http" "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/api" ) type ObjectById struct { @@ -12,20 +14,39 @@ type ObjectById struct { } func (s *ObjectById) Bind(ctx *gin.Context) error { + var err error + log := api.GetRequestLogger(ctx) + err = ctx.ShouldBindUri(s) + if err != nil { + log.Warnf("ShouldBindUri error: %s", err.Error()) + return err + } if ctx.Request.Method == http.MethodDelete { - err := ctx.Bind(s) + err = ctx.ShouldBind(&s) if err != nil { + log.Warnf("ShouldBind error: %s", err.Error()) return err } if len(s.Ids) > 0 { return nil } + if s.Ids == nil { + s.Ids = make([]int, 0) + } + if s.Id != 0 { + s.Ids = append(s.Ids, s.Id) + } } - return ctx.BindUri(s) + if err = vd.Validate(s); err != nil { + log.Errorf("Validate error: %s", err.Error()) + return err + } + return err } func (s *ObjectById) GetId() interface{} { if len(s.Ids) > 0 { + s.Ids = append(s.Ids, s.Id) return s.Ids } return s.Id diff --git a/common/dto/order.go b/common/dto/order.go new file mode 100644 index 00000000..25455fbe --- /dev/null +++ b/common/dto/order.go @@ -0,0 +1,12 @@ +package dto + +import ( + "gorm.io/gorm" + "gorm.io/gorm/clause" +) + +func OrderDest(sort string, bl bool) func(db *gorm.DB) *gorm.DB { + return func(db *gorm.DB) *gorm.DB { + return db.Order(clause.OrderByColumn{Column: clause.Column{Name: sort}, Desc: bl}) + } +} diff --git a/common/dto/search.go b/common/dto/search.go index e73daccc..72cc60e4 100644 --- a/common/dto/search.go +++ b/common/dto/search.go @@ -1,19 +1,18 @@ package dto import ( - "go-admin/tools/config" - - "github.com/matchstalk/go-admin-core/search" + "github.com/go-admin-team/go-admin-core/tools/search" + "go-admin/common/global" "gorm.io/gorm" ) type GeneralDelDto struct { - Id uint `uri:"id" json:"id" validate:"required"` - Ids []uint `json:"ids"` + Id int `uri:"id" json:"id" validate:"required"` + Ids []int `json:"ids"` } -func (g GeneralDelDto) GetIds() []uint { - ids := make([]uint, 0) +func (g GeneralDelDto) GetIds() []int { + ids := make([]int, 0) if g.Id != 0 { ids = append(ids, g.Id) } @@ -36,7 +35,7 @@ func (g GeneralDelDto) GetIds() []uint { } type GeneralGetDto struct { - Id uint `uri:"id" json:"id" validate:"required"` + Id int `uri:"id" json:"id" validate:"required"` } func MakeCondition(q interface{}) func(db *gorm.DB) *gorm.DB { @@ -45,7 +44,7 @@ func MakeCondition(q interface{}) func(db *gorm.DB) *gorm.DB { GormPublic: search.GormPublic{}, Join: make([]*search.GormJoin, 0), } - search.ResolveSearchQuery(config.DatabaseConfig.Driver, q, condition) + search.ResolveSearchQuery(global.Driver, q, condition) for _, join := range condition.Join { if join == nil { continue diff --git a/common/file_store/initialize.go b/common/file_store/initialize.go new file mode 100644 index 00000000..2190b217 --- /dev/null +++ b/common/file_store/initialize.go @@ -0,0 +1,13 @@ +package file_store + +type FileStore struct { +} + +// Setup 配置数据库 +func (e *FileStore) Setup(driver string) { + //fileStoreType := driver + //if fileStoreType == "ALiYunOSS" { + // var store = new(ALiYunOSS) + // store.Setup() + //} +} diff --git a/common/file_store/interface.go b/common/file_store/interface.go new file mode 100644 index 00000000..5ba5c427 --- /dev/null +++ b/common/file_store/interface.go @@ -0,0 +1,6 @@ +package file_store + +type FileStoreType interface { + Setup() error + UpLoad(yourObjectName string, localFile string) error +} diff --git a/common/file_store/oss.go b/common/file_store/oss.go new file mode 100644 index 00000000..b9ae6623 --- /dev/null +++ b/common/file_store/oss.go @@ -0,0 +1,54 @@ +package file_store + +import ( + "github.com/aliyun/aliyun-oss-go-sdk/oss" + "log" +) + +type ALiYunOSS struct { + Client interface{} + Endpoint string + AccessKeyId string + AccessKeySecret string + BucketName string +} + +func (e *ALiYunOSS) Setup() error { + e.AccessKeyId = "LTAI4G3S4hDLxg6Zmu4UTBwG" + e.AccessKeySecret = "C8sj70orL03bwk6wNXX0jbNjAbLCb8" + e.Endpoint = "oss-cn-shanghai.aliyuncs.com" + e.BucketName = "youshikeji" + + client, err := oss.New(e.Endpoint, e.AccessKeyId, e.AccessKeySecret) + if err != nil { + log.Println("Error:", err) + return err + } + e.Client = client + return nil +} + +// UpLoad 文件上传 +func (e *ALiYunOSS) UpLoad(yourObjectName string, localFile string) error { + err := e.Setup() + if err != nil { + log.Println("Error:", err) + return err + } + // 获取存储空间。 + bucket, err := e.Client.(*oss.Client).Bucket(e.BucketName) + if err != nil { + log.Println("Error:", err) + return err + } + + // 设置分片大小为100 KB,指定分片上传并发数为3,并开启断点续传上传。 + // 其中与objectKey是同一概念,表示断点续传上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。 + // "LocalFile"为filePath,100*1024为partSize。 + err = bucket.UploadFile(yourObjectName, localFile, 100*1024, oss.Routines(3), oss.Checkpoint(true, "")) + if err != nil { + log.Println("Error:", err) + return err + } + return nil +} diff --git a/common/global/adm.go b/common/global/adm.go index 9ef4e8d7..7350d9ef 100644 --- a/common/global/adm.go +++ b/common/global/adm.go @@ -1,35 +1,12 @@ package global -import ( - "github.com/casbin/casbin/v2" - "github.com/gin-gonic/gin" - "github.com/gogf/gf/os/glog" - "github.com/robfig/cron/v3" - "go-admin/common/config" - "gorm.io/gorm" -) - const ( - // go-admin Version Info - Version = "1.2.0" + // Version go-admin Version Info + Version = "1.3.7" ) -var Cfg config.Conf = config.DefaultConfig() - -var GinEngine *gin.Engine -var CasbinEnforcer *casbin.SyncedEnforcer -var Eloquent *gorm.DB - -var GADMCron *cron.Cron - var ( Source string Driver string DBName string ) - -var ( - Logger *glog.Logger - JobLogger *glog.Logger - RequestLogger *glog.Logger -) diff --git a/common/global/casbin.go b/common/global/casbin.go new file mode 100644 index 00000000..72b7e6cf --- /dev/null +++ b/common/global/casbin.go @@ -0,0 +1,18 @@ +package global + +import ( + "github.com/casbin/casbin/v2" + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk" + "github.com/go-admin-team/go-admin-core/sdk/api" +) + +func LoadPolicy(c *gin.Context) (*casbin.SyncedEnforcer, error) { + log := api.GetRequestLogger(c) + if err := sdk.Runtime.GetCasbinKey(c.Request.Host).LoadPolicy(); err == nil { + return sdk.Runtime.GetCasbinKey(c.Request.Host), err + } else { + log.Errorf("casbin rbac_model or policy init error, %s ", err.Error()) + return nil, err + } +} diff --git a/common/global/logo.go b/common/global/logo.go new file mode 100644 index 00000000..e4ed4714 --- /dev/null +++ b/common/global/logo.go @@ -0,0 +1,4 @@ +package global + +// LogoContent go-admin ascii显示,减少静态文件依赖 +var LogoContent = []byte{10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 95, 95, 95, 95, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 44, 45, 45, 45, 44, 32, 32, 32, 32, 32, 32, 32, 32, 44, 39, 32, 32, 44, 32, 96, 46, 32, 32, 44, 45, 45, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 44, 45, 45, 45, 46, 32, 32, 32, 32, 32, 32, 44, 45, 45, 45, 44, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 44, 45, 45, 45, 46, 39, 124, 32, 32, 32, 32, 32, 44, 45, 43, 45, 44, 46, 39, 32, 95, 32, 124, 44, 45, 45, 46, 39, 124, 32, 32, 32, 32, 32, 32, 32, 32, 32, 44, 45, 45, 45, 44, 10, 32, 32, 44, 45, 45, 45, 45, 46, 95, 44, 46, 32, 32, 39, 32, 32, 32, 44, 39, 92, 32, 32, 32, 44, 39, 32, 32, 46, 39, 32, 124, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 124, 32, 32, 32, 124, 32, 58, 32, 32, 44, 45, 43, 45, 46, 32, 59, 32, 32, 32, 44, 32, 124, 124, 124, 32, 32, 124, 44, 32, 32, 32, 32, 32, 32, 44, 45, 43, 45, 46, 32, 47, 32, 32, 124, 10, 32, 47, 32, 32, 32, 47, 32, 32, 39, 32, 47, 32, 47, 32, 32, 32, 47, 32, 32, 32, 124, 44, 45, 45, 45, 46, 39, 32, 32, 32, 44, 32, 44, 45, 45, 46, 45, 45, 46, 32, 32, 32, 32, 32, 32, 124, 32, 32, 32, 124, 32, 124, 32, 44, 45, 45, 46, 39, 124, 39, 32, 32, 32, 124, 32, 32, 124, 124, 96, 45, 45, 39, 95, 32, 32, 32, 32, 32, 44, 45, 45, 46, 39, 124, 39, 32, 32, 32, 124, 10, 124, 32, 32, 32, 58, 32, 32, 32, 32, 32, 124, 46, 32, 32, 32, 59, 32, 44, 46, 32, 58, 124, 32, 32, 32, 124, 32, 32, 32, 32, 124, 47, 32, 32, 32, 32, 32, 32, 32, 92, 32, 32, 32, 44, 45, 45, 46, 95, 95, 124, 32, 124, 124, 32, 32, 32, 124, 32, 32, 44, 39, 44, 32, 124, 32, 32, 124, 44, 44, 39, 32, 44, 39, 124, 32, 32, 32, 124, 32, 32, 32, 124, 32, 32, 44, 34, 39, 32, 124, 10, 124, 32, 32, 32, 124, 32, 46, 92, 32, 32, 46, 39, 32, 32, 32, 124, 32, 124, 58, 32, 58, 58, 32, 32, 32, 58, 32, 32, 46, 39, 46, 45, 45, 46, 32, 32, 46, 45, 46, 32, 124, 32, 47, 32, 32, 32, 44, 39, 32, 32, 32, 124, 124, 32, 32, 32, 124, 32, 47, 32, 32, 124, 32, 124, 45, 45, 39, 32, 39, 32, 32, 124, 32, 124, 32, 32, 32, 124, 32, 32, 32, 124, 32, 47, 32, 32, 124, 32, 124, 10, 46, 32, 32, 32, 59, 32, 39, 59, 32, 32, 124, 39, 32, 32, 32, 124, 32, 46, 59, 32, 58, 58, 32, 32, 32, 124, 46, 39, 32, 32, 32, 92, 95, 95, 92, 47, 58, 32, 46, 32, 46, 46, 32, 32, 32, 39, 32, 32, 47, 32, 32, 124, 124, 32, 32, 32, 58, 32, 124, 32, 32, 124, 32, 44, 32, 32, 32, 32, 124, 32, 32, 124, 32, 58, 32, 32, 32, 124, 32, 32, 32, 124, 32, 124, 32, 32, 124, 32, 124, 10, 39, 32, 32, 32, 46, 32, 32, 32, 46, 32, 124, 124, 32, 32, 32, 58, 32, 32, 32, 32, 124, 96, 45, 45, 45, 39, 32, 32, 32, 32, 32, 44, 34, 32, 46, 45, 45, 46, 59, 32, 124, 39, 32, 32, 32, 59, 32, 124, 58, 32, 32, 124, 124, 32, 32, 32, 58, 32, 124, 32, 32, 124, 47, 32, 32, 32, 32, 32, 39, 32, 32, 58, 32, 124, 95, 95, 32, 124, 32, 32, 32, 124, 32, 124, 32, 32, 124, 47, 10, 32, 96, 45, 45, 45, 96, 45, 39, 124, 32, 124, 32, 92, 32, 32, 32, 92, 32, 32, 47, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 47, 32, 32, 47, 32, 32, 44, 46, 32, 32, 124, 124, 32, 32, 32, 124, 32, 39, 47, 32, 32, 39, 124, 32, 32, 32, 124, 32, 124, 96, 45, 39, 32, 32, 32, 32, 32, 32, 124, 32, 32, 124, 32, 39, 46, 39, 124, 124, 32, 32, 32, 124, 32, 124, 45, 45, 39, 10, 32, 46, 39, 95, 95, 47, 92, 95, 58, 32, 124, 32, 32, 96, 45, 45, 45, 45, 39, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 59, 32, 32, 58, 32, 32, 32, 46, 39, 32, 32, 32, 92, 32, 32, 32, 58, 32, 32, 32, 32, 58, 124, 124, 32, 32, 32, 59, 47, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 59, 32, 32, 58, 32, 32, 32, 32, 59, 124, 32, 32, 32, 124, 47, 10, 32, 124, 32, 32, 32, 58, 32, 32, 32, 32, 58, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 124, 32, 32, 44, 32, 32, 32, 32, 32, 46, 45, 46, 47, 92, 32, 32, 32, 92, 32, 32, 47, 32, 32, 39, 45, 45, 45, 39, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 124, 32, 32, 44, 32, 32, 32, 47, 32, 39, 45, 45, 45, 39, 10, 32, 32, 92, 32, 32, 32, 92, 32, 32, 47, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 96, 45, 45, 96, 45, 45, 45, 39, 32, 32, 32, 32, 32, 96, 45, 45, 45, 45, 39, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 45, 45, 45, 96, 45, 39, 10, 32, 32, 32, 96, 45, 45, 96, 45, 39, 10} diff --git a/common/global/topic.go b/common/global/topic.go new file mode 100644 index 00000000..ae88ce4d --- /dev/null +++ b/common/global/topic.go @@ -0,0 +1,6 @@ +package global + +const ( + LoginLog = "login_log_queue" + OperateLog = "operate_log_queue" +) diff --git a/common/log/log.go b/common/log/log.go deleted file mode 100644 index 42e1866d..00000000 --- a/common/log/log.go +++ /dev/null @@ -1,30 +0,0 @@ -package log - -import "go-admin/logger" - -var ( - // Trace trace级日志输出 - Trace = logger.Trace - // Trace trace级日志输出 - Tracef = logger.Tracef - // Debug debug级日志输出 - Debug = logger.Debug - // Debugf debug级日志输出 - Debugf = logger.Debugf - // Info info级日志输出 - Info = logger.Info - // Infof info级日志输出 - Infof = logger.Infof - // Warn warn级日志输出 - Warn = logger.Warn - // Warnf warn级日志输出 - Warnf = logger.Warnf - // Error error级日志输出 - Error = logger.Error - // Errorf error级日志输出 - Errorf = logger.Errorf - // Fatal fatal级日志输出 - Fatal = logger.Fatal - // Fatalf fatal级日志输出 - Fatalf = logger.Fatalf -) diff --git a/app/admin/middleware/auth.go b/common/middleware/auth.go similarity index 57% rename from app/admin/middleware/auth.go rename to common/middleware/auth.go index a7519a16..95e035a1 100644 --- a/app/admin/middleware/auth.go +++ b/common/middleware/auth.go @@ -3,16 +3,25 @@ package middleware import ( "time" - "go-admin/app/admin/middleware/handler" - jwt "go-admin/pkg/jwtauth" - "go-admin/tools/config" + "github.com/go-admin-team/go-admin-core/sdk/config" + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + "go-admin/common/middleware/handler" ) +// AuthInit jwt验证new func AuthInit() (*jwt.GinJWTMiddleware, error) { + timeout := time.Hour + if config.ApplicationConfig.Mode == "dev" { + timeout = time.Duration(876010) * time.Hour + } else { + if config.JwtConfig.Timeout != 0 { + timeout = time.Duration(config.JwtConfig.Timeout) * time.Second + } + } return jwt.New(&jwt.GinJWTMiddleware{ Realm: "test zone", Key: []byte(config.ApplicationConfig.JwtSecret), - Timeout: time.Hour, + Timeout: timeout, MaxRefresh: time.Hour, PayloadFunc: handler.PayloadFunc, IdentityHandler: handler.IdentityHandler, diff --git a/app/admin/middleware/customerror.go b/common/middleware/customerror.go similarity index 100% rename from app/admin/middleware/customerror.go rename to common/middleware/customerror.go diff --git a/common/middleware/db.go b/common/middleware/db.go index 272ec3df..0e73a2d1 100644 --- a/common/middleware/db.go +++ b/common/middleware/db.go @@ -2,16 +2,10 @@ package middleware import ( "github.com/gin-gonic/gin" - "gorm.io/gorm" + "github.com/go-admin-team/go-admin-core/sdk" ) -func WithContextDb(dbMap map[string]*gorm.DB) gin.HandlerFunc { - return func(c *gin.Context) { - if db, ok := dbMap["*"]; ok { - c.Set("db", db) - } else { - c.Set("db", dbMap[c.Request.Host]) - } - c.Next() - } +func WithContextDb(c *gin.Context) { + c.Set("db", sdk.Runtime.GetDbByKey(c.Request.Host).WithContext(c)) + c.Next() } diff --git a/app/admin/middleware/handler/auth.go b/common/middleware/handler/auth.go similarity index 61% rename from app/admin/middleware/handler/auth.go rename to common/middleware/handler/auth.go index f16c3511..36d940ea 100644 --- a/app/admin/middleware/handler/auth.go +++ b/common/middleware/handler/auth.go @@ -4,22 +4,24 @@ import ( "net/http" "github.com/gin-gonic/gin" - "github.com/mojocn/base64Captcha" + "github.com/go-admin-team/go-admin-core/sdk" + "github.com/go-admin-team/go-admin-core/sdk/api" + "github.com/go-admin-team/go-admin-core/sdk/config" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + "github.com/go-admin-team/go-admin-core/sdk/pkg/captcha" + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" + "github.com/go-admin-team/go-admin-core/sdk/pkg/response" "github.com/mssola/user_agent" - "go-admin/app/admin/models" + "go-admin/app/admin/models/system" "go-admin/common/global" - jwt "go-admin/pkg/jwtauth" - "go-admin/tools" - "go-admin/tools/config" ) -var store = base64Captcha.DefaultMemStore - func PayloadFunc(data interface{}) jwt.MapClaims { if v, ok := data.(map[string]interface{}); ok { - u, _ := v["user"].(models.SysUser) - r, _ := v["role"].(models.SysRole) + u, _ := v["user"].(SysUser) + r, _ := v["role"].(SysRole) return jwt.MapClaims{ jwt.IdentityKey: u.UserId, jwt.RoleIdKey: r.RoleId, @@ -53,66 +55,86 @@ func IdentityHandler(c *gin.Context) interface{} { // @Description 注意:开发模式:需要注意全部字段不能为空,账号密码外可以传入0值 // @Accept application/json // @Product application/json -// @Param account body models.Login true "account" +// @Param account body Login true "account" // @Success 200 {string} string "{"code": 200, "expire": "2019-08-07T12:45:48+08:00", "token": ".eyJleHAiOjE1NjUxNTMxNDgsImlkIjoiYWRtaW4iLCJvcmlnX2lhdCI6MTU2NTE0OTU0OH0.-zvzHvbg0A" }" // @Router /login [post] func Authenticator(c *gin.Context) (interface{}, error) { - var loginVals models.Login - var status = "0" + log := api.GetRequestLogger(c) + db, err := pkg.GetOrm(c) + if err != nil { + log.Errorf("get db error, %s", err.Error()) + response.Error(c, http.StatusInternalServerError, err, "数据库连接获取失败") + return nil, jwt.ErrFailedAuthentication + } + + var loginVals Login + var status = "2" var msg = "登录成功" var username = "" + defer func() { + LoginLogToDB(c, status, msg, username) + }() - if err := c.ShouldBind(&loginVals); err != nil { + if err = c.ShouldBind(&loginVals); err != nil { username = loginVals.Username msg = "数据解析失败" status = "1" - LoginLogToDB(c, status, msg, username) return nil, jwt.ErrMissingLoginValues } if config.ApplicationConfig.Mode != "dev" { - if !store.Verify(loginVals.UUID, loginVals.Code, true) { + if !captcha.Verify(loginVals.UUID, loginVals.Code, true) { username = loginVals.Username msg = "验证码错误" status = "1" - LoginLogToDB(c, status, msg, username) return nil, jwt.ErrInvalidVerificationode } } - user, role, e := loginVals.GetUser() + user, role, e := loginVals.GetUser(db) if e == nil { username = loginVals.Username - LoginLogToDB(c, status, msg, username) return map[string]interface{}{"user": user, "role": role}, nil } else { msg = "登录失败" status = "1" - LoginLogToDB(c, status, msg, username) - global.RequestLogger.Println(e.Error()) + log.Warnf("%s login failed!", loginVals.Username) } return nil, jwt.ErrFailedAuthentication } -// Write log to database +// LoginLogToDB Write log to database func LoginLogToDB(c *gin.Context, status string, msg string, username string) { - if config.LoggerConfig.EnabledDB { - var loginlog models.LoginLog - ua := user_agent.New(c.Request.UserAgent()) - loginlog.Ipaddr = c.ClientIP() - loginlog.Username = username - location := tools.GetLocation(c.ClientIP()) - loginlog.LoginLocation = location - loginlog.LoginTime = tools.GetCurrentTime() - loginlog.Status = status - loginlog.Remark = c.Request.UserAgent() - browserName, browserVersion := ua.Browser() - loginlog.Browser = browserName + " " + browserVersion - loginlog.Os = ua.OS() - loginlog.Msg = msg - loginlog.Platform = ua.Platform() - _, _ = loginlog.Create() + if !config.LoggerConfig.EnabledDB { + return + } + log := api.GetRequestLogger(c) + l := make(map[string]interface{}) + + ua := user_agent.New(c.Request.UserAgent()) + l["ipaddr"] = c.ClientIP() + l["loginLocation"] = pkg.GetLocation(c.ClientIP()) + l["loginTime"] = pkg.GetCurrentTime() + l["status"] = status + l["remark"] = c.Request.UserAgent() + browserName, browserVersion := ua.Browser() + l["browser"] = browserName + " " + browserVersion + l["os"] = ua.OS() + l["platform"] = ua.Platform() + l["username"] = username + l["msg"] = msg + + q := sdk.Runtime.GetMemoryQueue(c.Request.Host) + message, err := sdk.Runtime.GetStreamMessage("", global.LoginLog, l) + if err != nil { + log.Errorf("GetStreamMessage error, %s", err.Error()) + //日志报错错误,不中断请求 + } else { + err = q.Append(message) + if err != nil { + log.Errorf("Append message error, %s", err.Error()) + } } } @@ -126,22 +148,7 @@ func LoginLogToDB(c *gin.Context, status string, msg string, username string) { // @Router /logout [post] // @Security Bearer func LogOut(c *gin.Context) { - var loginlog models.LoginLog - ua := user_agent.New(c.Request.UserAgent()) - loginlog.Ipaddr = c.ClientIP() - location := tools.GetLocation(c.ClientIP()) - loginlog.LoginLocation = location - loginlog.LoginTime = tools.GetCurrentTime() - loginlog.Status = "0" - loginlog.Remark = c.Request.UserAgent() - browserName, browserVersion := ua.Browser() - loginlog.Browser = browserName + " " + browserVersion - loginlog.Os = ua.OS() - loginlog.Platform = ua.Platform() - loginlog.Username = tools.GetUserName(c) - loginlog.Msg = "退出成功" - loginlog.Create() - + LoginLogToDB(c, "2", "退出成功", user.GetUserName(c)) c.JSON(http.StatusOK, gin.H{ "code": 200, "msg": "退出成功", @@ -152,12 +159,12 @@ func LogOut(c *gin.Context) { func Authorizator(data interface{}, c *gin.Context) bool { if v, ok := data.(map[string]interface{}); ok { - u, _ := v["user"].(models.SysUser) - r, _ := v["role"].(models.SysRole) + u, _ := v["user"].(system.SysUser) + r, _ := v["role"].(system.SysRole) c.Set("role", r.RoleName) c.Set("roleIds", r.RoleId) c.Set("userId", u.UserId) - c.Set("userName", u.UserName) + c.Set("userName", u.Username) c.Set("dataScope", r.DataScope) return true diff --git a/app/admin/middleware/handler/httpshandler.go b/common/middleware/handler/httpshandler.go similarity index 87% rename from app/admin/middleware/handler/httpshandler.go rename to common/middleware/handler/httpshandler.go index e8123056..e1274390 100644 --- a/app/admin/middleware/handler/httpshandler.go +++ b/common/middleware/handler/httpshandler.go @@ -4,7 +4,7 @@ import ( "github.com/gin-gonic/gin" "github.com/unrolled/secure" - "go-admin/tools/config" + "github.com/go-admin-team/go-admin-core/sdk/config" ) func TlsHandler() gin.HandlerFunc { diff --git a/common/middleware/handler/login.go b/common/middleware/handler/login.go new file mode 100644 index 00000000..619ac0f5 --- /dev/null +++ b/common/middleware/handler/login.go @@ -0,0 +1,33 @@ +package handler + +import ( + log "github.com/go-admin-team/go-admin-core/logger" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + "gorm.io/gorm" +) + +type Login struct { + Username string `form:"UserName" json:"username" binding:"required"` + Password string `form:"Password" json:"password" binding:"required"` + Code string `form:"Code" json:"code" binding:"required"` + UUID string `form:"UUID" json:"uuid" binding:"required"` +} + +func (u *Login) GetUser(tx *gorm.DB) (user SysUser, role SysRole, err error) { + err = tx.Table("sys_user").Where("username = ? and status = 2", u.Username).First(&user).Error + if err != nil { + log.Errorf("get user error, %s", err.Error()) + return + } + _, err = pkg.CompareHashAndPassword(user.Password, u.Password) + if err != nil { + log.Errorf("user login error, %s", err.Error()) + return + } + err = tx.Table("sys_role").Where("role_id = ? ", user.RoleId).First(&role).Error + if err != nil { + log.Errorf("get role error, %s", err.Error()) + return + } + return +} diff --git a/app/admin/middleware/handler/ping.go b/common/middleware/handler/ping.go similarity index 100% rename from app/admin/middleware/handler/ping.go rename to common/middleware/handler/ping.go diff --git a/common/middleware/handler/role.go b/common/middleware/handler/role.go new file mode 100644 index 00000000..0895ebcd --- /dev/null +++ b/common/middleware/handler/role.go @@ -0,0 +1,24 @@ +package handler + +import "go-admin/common/models" + +type SysRole struct { + RoleId int `json:"roleId" gorm:"primaryKey;autoIncrement"` // 角色编码 + RoleName string `json:"roleName" gorm:"size:128;"` // 角色名称 + Status string `json:"status" gorm:"size:4;"` // + RoleKey string `json:"roleKey" gorm:"size:128;"` //角色代码 + RoleSort int `json:"roleSort" gorm:""` //角色排序 + Flag string `json:"flag" gorm:"size:128;"` // + Remark string `json:"remark" gorm:"size:255;"` //备注 + Admin bool `json:"admin" gorm:"size:4;"` + DataScope string `json:"dataScope" gorm:"size:128;"` + Params string `json:"params" gorm:"-"` + MenuIds []int `json:"menuIds" gorm:"-"` + DeptIds []int `json:"deptIds" gorm:"-"` + models.ControlBy + models.ModelTime +} + +func (SysRole) TableName() string { + return "sys_role" +} diff --git a/common/middleware/handler/user.go b/common/middleware/handler/user.go new file mode 100644 index 00000000..346d59d0 --- /dev/null +++ b/common/middleware/handler/user.go @@ -0,0 +1,40 @@ +package handler + +import ( + "go-admin/common/models" + "gorm.io/gorm" +) + +type SysUser struct { + models.ControlBy + models.ModelTime + UserId int `gorm:"primaryKey;autoIncrement;comment:编码" json:"userId"` + Username string `json:"username" gorm:"type:varchar(64);comment:用户名"` + Password string `json:"-" gorm:"type:varchar(128);comment:密码"` + NickName string `json:"nickName" gorm:"type:varchar(128);comment:昵称"` + Phone string `json:"phone" gorm:"type:varchar(11);comment:手机号"` + RoleId int `json:"roleId" gorm:"type:bigint(20);comment:角色ID"` + Salt string `json:"-" gorm:"type:varchar(255);comment:加盐"` + Avatar string `json:"avatar" gorm:"type:varchar(255);comment:头像"` + Sex string `json:"sex" gorm:"type:varchar(255);comment:性别"` + Email string `json:"email" gorm:"type:varchar(128);comment:邮箱"` + DeptId int `json:"deptId" gorm:"type:bigint(20);comment:部门"` + PostId int `json:"postId" gorm:"type:bigint(20);comment:岗位"` + Remark string `json:"remark" gorm:"type:varchar(255);comment:备注"` + Status string `json:"status" gorm:"type:varchar(4);comment:状态"` + DeptIds []int `json:"deptIds" gorm:"-"` + PostIds []int `json:"postIds" gorm:"-"` + RoleIds []int `json:"roleIds" gorm:"-"` + //Dept *SysDept `json:"dept"` +} + +func (SysUser) TableName() string { + return "sys_user" +} + +func (e *SysUser) AfterFind(_ *gorm.DB) error { + e.DeptIds = []int{e.DeptId} + e.PostIds = []int{e.PostId} + e.RoleIds = []int{e.RoleId} + return nil +} diff --git a/app/admin/middleware/header.go b/common/middleware/header.go similarity index 100% rename from app/admin/middleware/header.go rename to common/middleware/header.go diff --git a/app/admin/middleware/init.go b/common/middleware/init.go similarity index 80% rename from app/admin/middleware/init.go rename to common/middleware/init.go index f2a95755..d81a4f77 100644 --- a/app/admin/middleware/init.go +++ b/common/middleware/init.go @@ -5,6 +5,8 @@ import ( ) func InitMiddleware(r *gin.Engine) { + // 数据库链接 + r.Use(WithContextDb) // 日志处理 r.Use(LoggerToFile()) // 自定义错误处理 @@ -15,4 +17,6 @@ func InitMiddleware(r *gin.Engine) { r.Use(Options) // Secure is a middleware function that appends security r.Use(Secure) + // 链路追踪 + //r.Use(middleware.Trace()) } diff --git a/common/middleware/logger.go b/common/middleware/logger.go new file mode 100644 index 00000000..21acf890 --- /dev/null +++ b/common/middleware/logger.go @@ -0,0 +1,136 @@ +package middleware + +import ( + "encoding/json" + "net/http" + "strings" + "time" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk" + "github.com/go-admin-team/go-admin-core/sdk/api" + "github.com/go-admin-team/go-admin-core/sdk/config" + "github.com/go-admin-team/go-admin-core/sdk/pkg" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" + + "go-admin/common/global" +) + +// LoggerToFile 日志记录到文件 +func LoggerToFile() gin.HandlerFunc { + return func(c *gin.Context) { + // 开始时间 + startTime := time.Now() + // 处理请求 + + c.Next() + if strings.Index(c.Request.RequestURI, "/api/v1/logout") > -1 || + strings.Index(c.Request.RequestURI, "/login") > -1 { + return + } + // 结束时间 + endTime := time.Now() + if c.Request.Method == http.MethodOptions { + return + } + log := api.GetRequestLogger(c) + + bd, bl := c.Get("body") + var body = "" + if bl { + body = bd.(string) + } + + rt, bl := c.Get("result") + var result = "" + if bl { + rb, err := json.Marshal(rt) + if err != nil { + log.Warnf("json Marshal result error, %s", err.Error()) + } else { + result = string(rb) + } + } + + st, bl := c.Get("status") + var statusBus = 0 + if bl { + statusBus = st.(int) + } + + // 请求方式 + reqMethod := c.Request.Method + // 请求路由 + reqUri := c.Request.RequestURI + // 状态码 + statusCode := c.Writer.Status() + // 请求IP + clientIP := c.ClientIP() + // 执行时间 + latencyTime := endTime.Sub(startTime) + // 日志格式 + logData := map[string]interface{}{ + "statusCode": statusCode, + "latencyTime": latencyTime, + "clientIP": clientIP, + "method": reqMethod, + "uri": reqUri, + } + log.Info(logData) + //l := logger.Logger{Logger: log.Fields(logData)} + //l.Info(logData) + if c.Request.Method != "GET" && c.Request.Method != "OPTIONS" && config.LoggerConfig.EnabledDB { + SetDBOperLog(c, clientIP, statusCode, reqUri, reqMethod, latencyTime, body, result, statusBus) + } + } +} + +// SetDBOperLog 写入操作日志表 fixme 该方法后续即将弃用 +func SetDBOperLog(c *gin.Context, clientIP string, statusCode int, reqUri string, reqMethod string, latencyTime time.Duration, body string, result string, status int) { + log := api.GetRequestLogger(c) + l := make(map[string]interface{}) + l["_fullPath"] = c.FullPath() + l["operUrl"] = reqUri + l["method"] = reqMethod + l["operIp"] = clientIP + l["operLocation"] = pkg.GetLocation(clientIP) + l["operName"] = user.GetUserName(c) + l["requestMethod"] = c.Request.Method + l["operParam"] = body + l["operTime"] = time.Now() + if reqUri == "/login" { + l["businessType"] = "10" + l["title"] = "用户登录" + l["operName"] = "-" + } else if strings.Contains(reqUri, "/api/v1/logout") { + l["businessType"] = "11" + l["title"] = "退出登录" + } else if strings.Contains(reqUri, "/api/v1/getCaptcha") { + l["businessType"] = "12" + l["title"] = "验证码" + } else { + if reqMethod == "POST" { + l["businessType"] = "1" + } else if reqMethod == "PUT" { + l["businessType"] = "2" + } else if reqMethod == "DELETE" { + l["businessType"] = "3" + } + } + if status == http.StatusOK { + l["status"] = "2" + } else { + l["status"] = "1" + } + q := sdk.Runtime.GetMemoryQueue(c.Request.Host) + message, err := sdk.Runtime.GetStreamMessage("", global.OperateLog, l) + if err != nil { + log.Errorf("GetStreamMessage error, %s", err.Error()) + //日志报错错误,不中断请求 + } else { + err = q.Append(message) + if err != nil { + log.Errorf("Append message error, %s", err.Error()) + } + } +} diff --git a/common/middleware/permission.go b/common/middleware/permission.go new file mode 100644 index 00000000..109f97ba --- /dev/null +++ b/common/middleware/permission.go @@ -0,0 +1,48 @@ +package middleware + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk" + "github.com/go-admin-team/go-admin-core/sdk/api" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + "github.com/go-admin-team/go-admin-core/sdk/pkg/response" +) + +//权限检查中间件 +func AuthCheckRole() gin.HandlerFunc { + return func(c *gin.Context) { + log := api.GetRequestLogger(c) + data, _ := c.Get(jwtauth.JwtPayloadKey) + v := data.(jwtauth.MapClaims) + e := sdk.Runtime.GetCasbinKey(c.Request.Host) + var res bool + var err error + //检查权限 + if v["rolekey"] == "admin" { + res = true + log.Infof("info:%s method:%s path:%s", v["rolekey"], c.Request.Method, c.Request.URL.Path) + } else { + res, err = e.Enforce(v["rolekey"], c.Request.URL.Path, c.Request.Method) + if err != nil { + log.Errorf("AuthCheckRole error:%s method:%s path:%s", err, c.Request.Method, c.Request.URL.Path) + response.Error(c, 500, err, "") + return + } + } + + if res { + log.Infof("isTrue: %v role: %s method: %s path: %s", res, v["rolekey"], c.Request.Method, c.Request.URL.Path) + c.Next() + } else { + log.Warnf("isTrue: %v role: %s method: %s path: %s message: %s", res, v["rolekey"], c.Request.Method, c.Request.URL.Path, "当前request无权限,请管理员确认!") + c.JSON(http.StatusOK, gin.H{ + "code": 403, + "msg": "对不起,您没有该接口访问权限,请联系管理员", + }) + c.Abort() + return + } + } +} diff --git a/common/middleware/request_id.go b/common/middleware/request_id.go new file mode 100644 index 00000000..47161c34 --- /dev/null +++ b/common/middleware/request_id.go @@ -0,0 +1,29 @@ +package middleware + +import ( + "net/http" + "strings" + + "github.com/gin-gonic/gin" + "github.com/google/uuid" +) + +// RequestId 自动增加requestId +func RequestId(trafficKey string) gin.HandlerFunc { + return func(c *gin.Context) { + if c.Request.Method == http.MethodOptions { + c.Next() + return + } + requestId := c.GetHeader(trafficKey) + if requestId == "" { + requestId = c.GetHeader(strings.ToLower(trafficKey)) + } + if requestId == "" { + requestId = uuid.New().String() + } + c.Request.Header.Set(trafficKey, requestId) + c.Set(trafficKey, requestId) + c.Next() + } +} diff --git a/common/middleware/sentinel.go b/common/middleware/sentinel.go new file mode 100644 index 00000000..c4ea95a1 --- /dev/null +++ b/common/middleware/sentinel.go @@ -0,0 +1,23 @@ +package middleware + +import ( + sentinelPlugin "github.com/alibaba/sentinel-golang/adapter/gin" + "github.com/alibaba/sentinel-golang/core/system" + "github.com/gin-gonic/gin" + + log "github.com/go-admin-team/go-admin-core/logger" +) + +// Sentinel 限流 +func Sentinel() gin.HandlerFunc { + if _, err := system.LoadRules([]*system.Rule{ + { + MetricType: system.InboundQPS, + TriggerCount: 200, + Strategy: system.BBR, + }, + }); err != nil { + log.Fatalf("Unexpected error: %+v", err) + } + return sentinelPlugin.SentinelMiddleware() +} diff --git a/common/middleware/trace.go b/common/middleware/trace.go new file mode 100644 index 00000000..84a32c80 --- /dev/null +++ b/common/middleware/trace.go @@ -0,0 +1,27 @@ +package middleware + +import ( + "github.com/gin-gonic/gin" + "github.com/opentracing/opentracing-go" +) + +// Trace 链路追踪 +func Trace() gin.HandlerFunc { + return func(ctx *gin.Context) { + var sp opentracing.Span + opName := ctx.Request.URL.Path + // Attempt to join a trace by getting trace context from the headers. + wireContext, err := opentracing.GlobalTracer().Extract( + opentracing.TextMap, + opentracing.HTTPHeadersCarrier(ctx.Request.Header)) + if err != nil { + // If for whatever reason we can't join, go ahead an start a new root span. + sp = opentracing.StartSpan(opName) + } else { + sp = opentracing.StartSpan(opName, opentracing.ChildOf(wireContext)) + } + ctx.Set("traceSpan", sp) + ctx.Next() + sp.Finish() + } +} diff --git a/common/models/by.go b/common/models/by.go index 1bf7de87..15d3b42f 100644 --- a/common/models/by.go +++ b/common/models/by.go @@ -1,14 +1,30 @@ package models +import ( + "time" + + "gorm.io/gorm" +) + type ControlBy struct { - CreateBy uint `gorm:"index;comment:'创建者'"` - UpdateBy uint `gorm:"index;comment:'更新者'"` + CreateBy int `json:"createBy" gorm:"index;comment:创建者"` + UpdateBy int `json:"updateBy" gorm:"index;comment:更新者"` } -func (e *ControlBy) SetCreateBy(createBy uint) { +func (e *ControlBy) SetCreateBy(createBy int) { e.CreateBy = createBy } -func (e *ControlBy) SetUpdateBy(updateBy uint) { +func (e *ControlBy) SetUpdateBy(updateBy int) { e.UpdateBy = updateBy } + +type Model struct { + Id int `json:"id" gorm:"primaryKey;autoIncrement;comment:主键编码"` +} + +type ModelTime struct { + CreatedAt time.Time `json:"createdAt" gorm:"comment:创建时间"` + UpdatedAt time.Time `json:"updatedAt" gorm:"comment:最后更新时间"` + DeletedAt gorm.DeletedAt `json:"-" gorm:"index;comment:删除时间"` +} diff --git a/common/models/migrate.go b/common/models/migrate.go index 0a70d042..5573cb22 100644 --- a/common/models/migrate.go +++ b/common/models/migrate.go @@ -3,7 +3,7 @@ package models import "time" type Migration struct { - Version string `gorm:"primary_key"` + Version string `gorm:"primaryKey"` ApplyTime time.Time `gorm:"autoCreateTime"` } diff --git a/common/models/response.go b/common/models/response.go index 2bf6f724..8ee06254 100644 --- a/common/models/response.go +++ b/common/models/response.go @@ -27,4 +27,4 @@ func (res *Response) ReturnOK() *Response { func (res *Response) ReturnError(code int) *Response { res.Code = code return res -} \ No newline at end of file +} diff --git a/common/models/type.go b/common/models/type.go index 23f3a0d1..2087d556 100644 --- a/common/models/type.go +++ b/common/models/type.go @@ -4,8 +4,8 @@ import "gorm.io/gorm/schema" type ActiveRecord interface { schema.Tabler - SetCreateBy(createBy uint) - SetUpdateBy(updateBy uint) + SetCreateBy(createBy int) + SetUpdateBy(updateBy int) Generate() ActiveRecord GetId() interface{} } diff --git a/common/models/user.go b/common/models/user.go index 0ecc338d..6053bb3b 100644 --- a/common/models/user.go +++ b/common/models/user.go @@ -3,7 +3,7 @@ package models import ( "gorm.io/gorm" - "go-admin/pkg" + "github.com/go-admin-team/go-admin-core/sdk/pkg" ) // BaseUser 密码登录基础用户 diff --git a/common/service/service.go b/common/service/service.go index 05dbf273..87e0cd66 100644 --- a/common/service/service.go +++ b/common/service/service.go @@ -1,9 +1,13 @@ package service -import "gorm.io/gorm" +import ( + "github.com/go-admin-team/go-admin-core/sdk/pkg/logger" + "gorm.io/gorm" +) type Service struct { Orm *gorm.DB Msg string MsgID string + Log *logger.Logger } diff --git a/config/db.sql b/config/db.sql index 5a16e11c..d572e503 100644 --- a/config/db.sql +++ b/config/db.sql @@ -120,16 +120,16 @@ INSERT INTO sys_menu VALUES (252, '', '获取登录用户信息', '', '/api/v1/g INSERT INTO sys_menu VALUES (253, '', '角色数据权限', '', '/api/v1/roledatascope', '/0/63/256/253', 'A', 'PUT', '', 256, 0, '', '', 0, '1', '1', '1', '0', '2020-04-11 15:52:48', '2020-07-10 20:47:58', NULL); INSERT INTO sys_menu VALUES (254, '', '部门树接口【数据权限】', '', '/api/v1/roleDeptTreeselect/:id', '/0/63/256/254', 'A', 'GET', '', 256, 0, '', '', 0, '1', '1', '1', '0', '2020-04-11 15:52:48', NULL, NULL); INSERT INTO sys_menu VALUES (255, '', '部门树【用户列表】', '', '/api/v1/deptTree', '/0/63/256/255', 'A', 'GET', '', 256, 0, '', '', 0, '1', '1', '1', '0', '2020-04-11 15:52:48', NULL, NULL); -INSERT INTO sys_menu VALUES (256, '', '必开接口', '', '', '/0/63/256', 'M', 'GET', '', 63, 0, '', '', 0, '1', '1', '', '0', '2020-04-11 15:52:48', NULL, NULL); +INSERT INTO sys_menu VALUES (256, '', '必开接口', '', '', '/0/63/256', 'M', 'GET', '', 63, 0, '', '', 0, '1', '1', '1', '0', '2020-04-11 15:52:48', NULL, NULL); INSERT INTO sys_menu VALUES (257, '', '通过key获取参数', 'bug', '/api/v1/configKey/:id', '/0/63/256/257', 'A', 'GET', '', 256, 0, '', '', 1, '1', '1', '1', '0', '2020-04-11 15:52:48', NULL, NULL); INSERT INTO sys_menu VALUES (258, '', '退出登录', '', '/api/v1/logout', '/0/63/256/258', 'A', 'POST', '', 256, 0, '', '', 0, '1', '1', '1', '0', '2020-04-11 15:52:48', NULL, NULL); INSERT INTO sys_menu VALUES (259, '', '头像上传', '', '/api/v1/user/avatar', '/0/63/256/267/259', 'A', 'POST', '', 267, 0, '', '', 0, '1', '1', '1', '0', '2020-04-11 15:52:48', '2020-05-03 20:50:05', NULL); -INSERT INTO sys_menu VALUES (260, '', '修改密码', '', '/api/v1/user/pwd', '/0/63/256/260', 'A', 'PUT', '', 256, 0, '', '', 0, '1', '1', '', '0', '2020-04-11 15:52:48', NULL, NULL); +INSERT INTO sys_menu VALUES (260, '', '修改密码', '', '/api/v1/user/pwd', '/0/63/256/260', 'A', 'PUT', '', 256, 0, '', '', 0, '1', '1', '1', '0', '2020-04-11 15:52:48', NULL, NULL); INSERT INTO sys_menu VALUES (261, 'Gen', '代码生成', 'code', 'gen', '/0/60/261', 'C', '', '', 60, 0, '', '/tools/gen/index', 2, '0', '1', '1', '0', '2020-04-11 15:52:48', '2020-04-12 11:18:12', NULL); INSERT INTO sys_menu VALUES (262, 'EditTable', '代码生成修改', 'build', 'editTable', '/0/60/262', 'C', '', '', 60, 0, '', '/tools/gen/editTable', 100, '1', '1', '1', '0', '2020-04-11 15:52:48', '2020-05-03 20:38:36', NULL); -INSERT INTO sys_menu VALUES (263, '', '字典类型下拉框【生成功能】', '', '/api/v1/dict/typeoptionselect', '/0/63/256/263', 'A', 'GET', '', 256, 0, '', '', 0, '1', '1', '', '0', '2020-04-11 15:52:48', NULL, NULL); +INSERT INTO sys_menu VALUES (263, '', '字典类型下拉框【生成功能】', '', '/api/v1/dict/typeoptionselect', '/0/63/256/263', 'A', 'GET', '', 256, 0, '', '', 0, '1', '1', '1', '0', '2020-04-11 15:52:48', NULL, NULL); INSERT INTO sys_menu VALUES (264, 'Build', '表单构建', 'build', 'build', '/0/60/264', 'C', '', '', 60, 0, '', '/tools/build/index', 1, '0', '1', '1', '1', '2020-04-11 15:52:48', '2020-07-18 13:51:47', NULL); -INSERT INTO sys_menu VALUES (267, '', '个人中心', '', '', '/0/63/256/267', 'M', '', '', 256, 0, '', '', 0, '1', '1', '', '1', '2020-05-03 20:49:39', '2020-05-03 20:49:39', NULL); +INSERT INTO sys_menu VALUES (267, '', '个人中心', '', '', '/0/63/256/267', 'M', '', '', 256, 0, '', '', 0, '1', '1', '1', '1', '2020-05-03 20:49:39', '2020-05-03 20:49:39', NULL); INSERT INTO sys_menu VALUES (269, 'Server', '服务监控', 'druid', 'system/monitor', '/0/60/269', 'C', '', 'monitor:server:list', 60, 0, '', '/system/monitor', 0, '0', '1', '1', '1', '2020-04-14 00:28:19', '2020-08-09 02:07:53', NULL); INSERT INTO sys_menu VALUES (459, 'sys_job管理', '定时任务', 'time-range', '/sys_job', '/0/459', 'M', '无', '', 0, 0, '', 'Layout', 2, '0', '1', '1', '0', '2020-08-03 09:17:37', '2020-08-09 01:27:11', NULL); INSERT INTO sys_menu VALUES (460, 'sys_job管理', '定时任务', 'tool', 'sys_job', '/0/459/460', 'C', '无', 'sysjob:sysjob:list', 459, 0, '', '/sysjob/index', 0, '0', '1', '1', '0', '2020-08-03 09:17:37', '2020-08-04 15:18:32', NULL); @@ -144,17 +144,17 @@ INSERT INTO sys_menu VALUES (468, 'sys_job', '创建定时任务', 'bug', '/api/ INSERT INTO sys_menu VALUES (469, 'sys_job', '修改定时任务', 'bug', '/api/v1/sysjob', '/0/63/465/469', 'A', 'PUT', '', 465, 0, '', '', 0, '1', '1', '1', '0', '2020-08-03 09:17:37', '2020-08-03 09:17:37', NULL); INSERT INTO sys_menu VALUES (470, 'sys_job', '删除定时任务', 'bug', '/api/v1/sysjob/:id', '/0/63/465/470', 'A', 'DELETE', '', 465, 0, '', '', 0, '1', '1', '1', '0', '2020-08-03 09:17:37', '2020-08-03 09:17:37', NULL); INSERT INTO sys_menu VALUES (471, 'job_log', '日志', 'bug', 'job_log', '/0/459/471', 'C', '', '', 459, 0, '', '/sysjob/log', 0, '1', '1', '1', '1', '2020-08-05 21:24:46', '2020-08-06 00:02:20', NULL); -INSERT INTO sys_menu VALUES (473, 'sysSetting', '系统配置', 'form', 'syssettings', '/0/60/473', 'C', '无', 'syssetting:syssetting:list', 60, 0, '', '/system/settings', 0, '0', '1', '1', '0', '2020-08-09 01:05:22', '2020-08-09 02:17:10', NULL); -INSERT INTO sys_menu VALUES (474, 'sys_setting', '分页获取SysSetting', 'pass', 'sys_setting', '/0/60/473/474', 'F', '无', 'syssetting:syssetting:query', 473, 0, '', '', 0, '0', '1', '1', '0', '2020-08-09 01:05:22', '2020-08-09 01:05:22', NULL); -INSERT INTO sys_menu VALUES (475, 'sys_setting', '创建SysSetting', 'pass', 'sys_setting', '/0/60/473/475', 'F', '无', 'syssetting:syssetting:add', 473, 0, '', '', 0, '0', '1', '1', '0', '2020-08-09 01:05:22', '2020-08-09 01:05:22', NULL); -INSERT INTO sys_menu VALUES (476, 'sys_setting', '修改SysSetting', 'pass', 'sys_setting', '/0/60/473/476', 'F', '无', 'syssetting:syssetting:edit', 473, 0, '', '', 0, '0', '1', '1', '0', '2020-08-09 01:05:22', '2020-08-09 01:05:22', NULL); -INSERT INTO sys_menu VALUES (477, 'sys_setting', '删除SysSetting', 'pass', 'sys_setting', '/0/60/473/477', 'F', '无', 'syssetting:syssetting:remove', 473, 0, '', '', 0, '0', '1', '1', '0', '2020-08-09 01:05:22', '2020-08-09 01:05:22', NULL); -INSERT INTO sys_menu VALUES (478, 'sys_setting', 'SysSetting', 'bug', 'sys_setting', '/0/63/478', 'M', '无', '', 63, 0, '', '', 0, '1', '1', '1', '0', '2020-08-09 01:05:22', '2020-08-09 01:05:22', NULL); -INSERT INTO sys_menu VALUES (479, 'sys_setting', '分页获取SysSetting', 'bug', '/api/v1/syssettingList', '/0/63/478/479', 'A', 'GET', '', 478, 0, '', '', 0, '1', '1', '1', '0', '2020-08-09 01:05:22', '2020-08-09 01:05:22', NULL); -INSERT INTO sys_menu VALUES (480, 'sys_setting', '根据id获取SysSetting', 'bug', '/api/v1/syssetting/:id', '/0/63/478/480', 'A', 'GET', '', 478, 0, '', '', 0, '1', '1', '1', '0', '2020-08-09 01:05:22', '2020-08-09 01:05:22', NULL); -INSERT INTO sys_menu VALUES (481, 'sys_setting', '创建SysSetting', 'bug', '/api/v1/syssetting', '/0/63/478/481', 'A', 'POST', '', 478, 0, '', '', 0, '1', '1', '1', '0', '2020-08-09 01:05:22', '2020-08-09 01:05:22', NULL); -INSERT INTO sys_menu VALUES (482, 'sys_setting', '修改SysSetting', 'bug', '/api/v1/syssetting', '/0/63/478/482', 'A', 'PUT', '', 478, 0, '', '', 0, '1', '1', '1', '0', '2020-08-09 01:05:22', '2020-08-09 01:05:22', NULL); -INSERT INTO sys_menu VALUES (483, 'sys_setting', '删除SysSetting', 'bug', '/api/v1/syssetting/:id', '/0/63/478/483', 'A', 'DELETE', '', 478, 0, '', '', 0, '1', '1', '1', '0', '2020-08-09 01:05:22', '2020-08-09 01:05:22', NULL); +-- INSERT INTO sys_menu VALUES (473, 'sysSetting', '系统配置', 'form', 'syssettings', '/0/60/473', 'C', '无', 'syssetting:syssetting:list', 60, 0, '', '/system/settings', 0, '0', '1', '1', '0', '2020-08-09 01:05:22', '2020-08-09 02:17:10', NULL); +-- INSERT INTO sys_menu VALUES (474, 'sys_setting', '分页获取SysSetting', 'pass', 'sys_setting', '/0/60/473/474', 'F', '无', 'syssetting:syssetting:query', 473, 0, '', '', 0, '0', '1', '1', '0', '2020-08-09 01:05:22', '2020-08-09 01:05:22', NULL); +-- INSERT INTO sys_menu VALUES (475, 'sys_setting', '创建SysSetting', 'pass', 'sys_setting', '/0/60/473/475', 'F', '无', 'syssetting:syssetting:add', 473, 0, '', '', 0, '0', '1', '1', '0', '2020-08-09 01:05:22', '2020-08-09 01:05:22', NULL); +-- INSERT INTO sys_menu VALUES (476, 'sys_setting', '修改SysSetting', 'pass', 'sys_setting', '/0/60/473/476', 'F', '无', 'syssetting:syssetting:edit', 473, 0, '', '', 0, '0', '1', '1', '0', '2020-08-09 01:05:22', '2020-08-09 01:05:22', NULL); +-- INSERT INTO sys_menu VALUES (477, 'sys_setting', '删除SysSetting', 'pass', 'sys_setting', '/0/60/473/477', 'F', '无', 'syssetting:syssetting:remove', 473, 0, '', '', 0, '0', '1', '1', '0', '2020-08-09 01:05:22', '2020-08-09 01:05:22', NULL); +-- INSERT INTO sys_menu VALUES (478, 'sys_setting', 'SysSetting', 'bug', 'sys_setting', '/0/63/478', 'M', '无', '', 63, 0, '', '', 0, '1', '1', '1', '0', '2020-08-09 01:05:22', '2020-08-09 01:05:22', NULL); +-- INSERT INTO sys_menu VALUES (479, 'sys_setting', '分页获取SysSetting', 'bug', '/api/v1/syssettingList', '/0/63/478/479', 'A', 'GET', '', 478, 0, '', '', 0, '1', '1', '1', '0', '2020-08-09 01:05:22', '2020-08-09 01:05:22', NULL); +-- INSERT INTO sys_menu VALUES (480, 'sys_setting', '根据id获取SysSetting', 'bug', '/api/v1/syssetting/:id', '/0/63/478/480', 'A', 'GET', '', 478, 0, '', '', 0, '1', '1', '1', '0', '2020-08-09 01:05:22', '2020-08-09 01:05:22', NULL); +-- INSERT INTO sys_menu VALUES (481, 'sys_setting', '创建SysSetting', 'bug', '/api/v1/syssetting', '/0/63/478/481', 'A', 'POST', '', 478, 0, '', '', 0, '1', '1', '1', '0', '2020-08-09 01:05:22', '2020-08-09 01:05:22', NULL); +-- INSERT INTO sys_menu VALUES (482, 'sys_setting', '修改SysSetting', 'bug', '/api/v1/syssetting', '/0/63/478/482', 'A', 'PUT', '', 478, 0, '', '', 0, '1', '1', '1', '0', '2020-08-09 01:05:22', '2020-08-09 01:05:22', NULL); +-- INSERT INTO sys_menu VALUES (483, 'sys_setting', '删除SysSetting', 'bug', '/api/v1/syssetting/:id', '/0/63/478/483', 'A', 'DELETE', '', 478, 0, '', '', 0, '1', '1', '1', '0', '2020-08-09 01:05:22', '2020-08-09 01:05:22', NULL); COMMIT; --- 数据完成 ; +-- 数据完成 ; \ No newline at end of file diff --git a/config/extend.go b/config/extend.go new file mode 100644 index 00000000..e477fbf9 --- /dev/null +++ b/config/extend.go @@ -0,0 +1,16 @@ +package config + +var ExtConfig Extand + +// 扩展配置 +// extend: +// demo: +// name: demo-name +// 使用方法: config.ExtConfig......即可!! +type Extand struct { + // Demo Demo // 这里配置对应配置文件的结构即可 +} + +type Demo struct { + Name string +} \ No newline at end of file diff --git a/config/settings.full.yml b/config/settings.full.yml index 54b3ab59..16538388 100644 --- a/config/settings.full.yml +++ b/config/settings.full.yml @@ -24,18 +24,12 @@ settings: logger: # 日志存放路径 path: temp/logs - # 控制台日志 - stdout: true - # 日志等级 - level: all - # 业务日志开关 - enabledbus: false - # 请求日志开关 - enabledreq: false + # 日志输出,file:文件,default:命令行,其他:命令行 + stdout: '' #控制台日志,启用后,不输出到文件 + # 日志等级, trace, debug, info, warn, error, fatal + level: trace # 数据库日志开关 dev模式,将自动开启 enableddb: false - # 自动任务日志开关 dev模式,将自动开启 - enabledjob: false jwt: # token 密钥,生产环境时及的修改 secret: go-admin @@ -48,8 +42,17 @@ settings: source: user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8&parseTime=True&loc=Local&timeout=1000ms # source: sqlite3.db # source: host=myhost port=myport user=gorm dbname=gorm password=mypassword + registers: + - sources: + - user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8&parseTime=True&loc=Local&timeout=1000ms gen: # 代码生成读取的数据库名称 dbname: dbname # 代码生成是使用前端代码存放位置,需要指定到src文件夹,相对路径 frontpath: ../go-admin-ui/src + queue: + memory: + poolSize: 100 + extend: # 扩展项使用说明 + demo: + name: data diff --git a/config/settings.sqlite.yml b/config/settings.sqlite.yml new file mode 100644 index 00000000..987ead5a --- /dev/null +++ b/config/settings.sqlite.yml @@ -0,0 +1,38 @@ +settings: + application: + # dev开发环境 test测试环境 prod线上环境 + mode: dev + # 服务器ip,默认使用 0.0.0.0 + host: 0.0.0.0 + # 服务名称 + name: testApp + # 端口号 + port: 8000 # 服务端口号 + readtimeout: 1 + writertimeout: 2 + # 数据权限功能开关 + enabledp: false + logger: + # 日志存放路径 + path: temp/logs + # 日志输出,file:文件,default:命令行,其他:命令行 + stdout: '' #控制台日志,启用后,不输出到文件 + # 日志等级, trace, debug, info, warn, error, fatal + level: trace + # 数据库日志开关 dev模式,将自动开启 + enableddb: false + jwt: + # token 密钥,生产环境时及的修改 + secret: go-admin + # token 过期时间 单位:秒 + timeout: 3600 + database: + # 数据库类型 mysql,sqlite3, postgres + driver: sqlite3 + # 数据库连接sqlite3数据文件的路径 + source: sqlite3.db + gen: + # 代码生成读取的数据库名称 + dbname: dbname + # 代码生成是使用前端代码存放位置,需要指定到src文件夹,相对路径 + frontpath: ../go-admin-ui/src diff --git a/config/settings.yml b/config/settings.yml index e16f3d67..8544457e 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -15,18 +15,12 @@ settings: logger: # 日志存放路径 path: temp/logs - # 控制台日志 - stdout: true - # 日志等级 - level: all - # 业务日志开关 - enabledbus: true - # 请求日志开关 - enabledreq: false + # 日志输出,file:文件,default:命令行,其他:命令行 + stdout: '' #控制台日志,启用后,不输出到文件 + # 日志等级, trace, debug, info, warn, error, fatal + level: trace # 数据库日志开关 dev模式,将自动开启 enableddb: false - # 自动任务日志开关 dev模式,将自动开启 - enabledjob: false jwt: # token 密钥,生产环境时及的修改 secret: go-admin @@ -37,8 +31,22 @@ settings: driver: mysql # 数据库连接字符串 mysql 缺省信息 charset=utf8&parseTime=True&loc=Local&timeout=1000ms source: user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8&parseTime=True&loc=Local&timeout=1000ms +# databases: +# 'locaohost:8000': +# driver: mysql +# # 数据库连接字符串 mysql 缺省信息 charset=utf8&parseTime=True&loc=Local&timeout=1000ms +# source: user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8&parseTime=True&loc=Local&timeout=1000ms +# registers: +# - sources: +# - user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8&parseTime=True&loc=Local&timeout=1000ms gen: # 代码生成读取的数据库名称 dbname: dbname # 代码生成是使用前端代码存放位置,需要指定到src文件夹,相对路径 frontpath: ../go-admin-ui/src + queue: + memory: + poolSize: 100 + extend: # 扩展项使用说明 + demo: + name: data diff --git a/debug/log/log.go b/debug/log/log.go deleted file mode 100644 index dabdb899..00000000 --- a/debug/log/log.go +++ /dev/null @@ -1,56 +0,0 @@ -// Package log provides debug logging -package log - -import ( - "encoding/json" - "fmt" - "time" -) - -var ( - // Default buffer size if any - DefaultSize = 256 - // Default formatter - DefaultFormat = TextFormat -) - -// Log is debug log interface for reading and writing logs -type Log interface { - // Read reads log entries from the logger - Read(...ReadOption) ([]Record, error) - // Write writes records to log - Write(Record) error - // Stream log records - Stream() (Stream, error) -} - -// Record is log record entry -type Record struct { - // Timestamp of logged event - Timestamp time.Time `json:"timestamp"` - // Metadata to enrich log record - Metadata map[string]string `json:"metadata"` - // Value contains log entry - Message interface{} `json:"message"` -} - -// Stream returns a log stream -type Stream interface { - Chan() <-chan Record - Stop() error -} - -// Format is a function which formats the output -type FormatFunc func(Record) string - -// TextFormat returns text format -func TextFormat(r Record) string { - t := r.Timestamp.Format("2006-01-02 15:04:05") - return fmt.Sprintf("%s %v", t, r.Message) -} - -// JSONFormat is a json Format func -func JSONFormat(r Record) string { - b, _ := json.Marshal(r) - return string(b) -} diff --git a/debug/log/options.go b/debug/log/options.go deleted file mode 100644 index 63281857..00000000 --- a/debug/log/options.go +++ /dev/null @@ -1,70 +0,0 @@ -package log - -import "time" - -// Option used by the logger -type Option func(*Options) - -// Options are logger options -type Options struct { - // Name of the log - Name string - // Size is the size of ring buffer - Size int - // Format specifies the output format - Format FormatFunc -} - -// Name of the log -func Name(n string) Option { - return func(o *Options) { - o.Name = n - } -} - -// Size sets the size of the ring buffer -func Size(s int) Option { - return func(o *Options) { - o.Size = s - } -} - -func Format(f FormatFunc) Option { - return func(o *Options) { - o.Format = f - } -} - -// DefaultOptions returns default options -func DefaultOptions() Options { - return Options{ - Size: DefaultSize, - } -} - -// ReadOptions for querying the logs -type ReadOptions struct { - // Since what time in past to return the logs - Since time.Time - // Count specifies number of logs to return - Count int - // Stream requests continuous log stream - Stream bool -} - -// ReadOption used for reading the logs -type ReadOption func(*ReadOptions) - -// Since sets the time since which to return the log records -func Since(s time.Time) ReadOption { - return func(o *ReadOptions) { - o.Since = s - } -} - -// Count sets the number of log records to return -func Count(c int) ReadOption { - return func(o *ReadOptions) { - o.Count = c - } -} diff --git a/docs/docs.go b/docs/docs.go index e82ac1d1..9afd04a6 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -1,6 +1,5 @@ // GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// This file was generated by swaggo/swag at -// 2020-08-27 14:47:40.749512 +0800 CST m=+0.171410739 +// This file was generated by swaggo/swag package docs @@ -22,190 +21,13 @@ var doc = `{ "contact": {}, "license": { "name": "MIT", - "url": "https://github.com/wenjianzhang/go-admin/blob/master/LICENSE.md" + "url": "https://github.com/go-admin-team/go-admin/blob/master/LICENSE.md" }, "version": "{{.Version}}" }, "host": "{{.Host}}", "basePath": "{{.BasePath}}", "paths": { - "/api/v1/config": { - "put": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "配置" - ], - "summary": "修改配置", - "parameters": [ - { - "description": "body", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.SysConfig" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/config/{configId}": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "配置" - ], - "summary": "获取配置", - "parameters": [ - { - "type": "integer", - "description": "配置编码", - "name": "configId", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"code\": 200, \"data\": [...]}", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - } - }, - "delete": { - "description": "删除数据", - "tags": [ - "配置" - ], - "summary": "删除配置", - "parameters": [ - { - "type": "integer", - "description": "configId", - "name": "configId", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"删除失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/configKey/{configKey}": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "配置" - ], - "summary": "获取配置", - "parameters": [ - { - "type": "integer", - "description": "configKey", - "name": "configKey", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"code\": 200, \"data\": [...]}", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - } - } - }, - "/api/v1/configList": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "配置" - ], - "summary": "配置列表数据", - "parameters": [ - { - "type": "string", - "description": "configKey", - "name": "configKey", - "in": "query" - }, - { - "type": "string", - "description": "configName", - "name": "configName", - "in": "query" - }, - { - "type": "string", - "description": "configType", - "name": "configType", - "in": "query" - }, - { - "type": "integer", - "description": "页条数", - "name": "pageSize", - "in": "query" - }, - { - "type": "integer", - "description": "页码", - "name": "pageIndex", - "in": "query" - } - ], - "responses": { - "200": { - "description": "{\"code\": 200, \"data\": [...]}", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - } - } - }, "/api/v1/db/columns/page": { "get": { "description": "数据库表列分页列表 / database table column page list", @@ -237,7 +59,7 @@ var doc = `{ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" } } } @@ -274,51 +96,49 @@ var doc = `{ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" } } } } }, "/api/v1/dept": { - "put": { + "get": { "security": [ { "Bearer": [] } ], - "description": "获取JSON", - "consumes": [ - "application/json" - ], + "description": "分页列表", "tags": [ "部门" ], - "summary": "修改部门", + "summary": "分页部门列表数据", "parameters": [ { - "type": "integer", - "description": "id", - "name": "id", - "in": "path", - "required": true + "type": "string", + "description": "name", + "name": "name", + "in": "query" }, { - "description": "body", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.SysDept" - } + "type": "string", + "description": "id", + "name": "id", + "in": "query" + }, + { + "type": "string", + "description": "position", + "name": "position", + "in": "query" } ], "responses": { "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", + "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "type": "string" + "$ref": "#/definitions/response.Response" } } } @@ -344,8 +164,7 @@ var doc = `{ "in": "body", "required": true, "schema": { - "type": "object", - "$ref": "#/definitions/models.SysDept" + "$ref": "#/definitions/dto.SysDeptControl" } } ], @@ -357,6 +176,32 @@ var doc = `{ } } } + }, + "delete": { + "description": "删除数据", + "tags": [ + "部门" + ], + "summary": "删除部门", + "parameters": [ + { + "description": "body", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SysDeptById" + } + } + ], + "responses": { + "200": { + "description": "{\"code\": -1, \"message\": \"删除失败\"}", + "schema": { + "type": "string" + } + } + } } }, "/api/v1/dept/{deptId}": { @@ -389,81 +234,11 @@ var doc = `{ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" } } } - } - }, - "/api/v1/dept/{id}": { - "delete": { - "description": "删除数据", - "tags": [ - "部门" - ], - "summary": "删除部门", - "parameters": [ - { - "type": "integer", - "description": "id", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"删除失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/deptList": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "分页列表", - "tags": [ - "部门" - ], - "summary": "分页部门列表数据", - "parameters": [ - { - "type": "string", - "description": "name", - "name": "name", - "in": "query" - }, - { - "type": "string", - "description": "id", - "name": "id", - "in": "query" - }, - { - "type": "string", - "description": "position", - "name": "position", - "in": "query" - } - ], - "responses": { - "200": { - "description": "{\"code\": 200, \"data\": [...]}", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - } - } - }, - "/api/v1/dict/data": { + }, "put": { "security": [ { @@ -475,53 +250,24 @@ var doc = `{ "application/json" ], "tags": [ - "字典数据" + "部门" ], - "summary": "修改字典数据", + "summary": "修改部门", "parameters": [ + { + "type": "integer", + "description": "id", + "name": "id", + "in": "path", + "required": true + }, { "description": "body", "name": "data", "in": "body", "required": true, "schema": { - "type": "object", - "$ref": "#/definitions/models.DictType" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", - "schema": { - "type": "string" - } - } - } - }, - "post": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "字典数据" - ], - "summary": "添加字典数据", - "parameters": [ - { - "description": "data", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.DictType" + "$ref": "#/definitions/dto.SysDeptControl" } } ], @@ -535,7 +281,7 @@ var doc = `{ } } }, - "/api/v1/dict/data/list": { + "/api/v1/dict/data": { "get": { "security": [ { @@ -583,7 +329,41 @@ var doc = `{ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "获取JSON", + "consumes": [ + "application/json" + ], + "tags": [ + "字典数据" + ], + "summary": "添加字典数据", + "parameters": [ + { + "description": "data", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SysDictDataControl" + } + } + ], + "responses": { + "200": { + "description": "{\"code\": -1, \"message\": \"添加失败\"}", + "schema": { + "type": "string" } } } @@ -614,7 +394,41 @@ var doc = `{ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "description": "获取JSON", + "consumes": [ + "application/json" + ], + "tags": [ + "字典数据" + ], + "summary": "修改字典数据", + "parameters": [ + { + "description": "body", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SysDictDataControl" + } + } + ], + "responses": { + "200": { + "description": "{\"code\": -1, \"message\": \"添加失败\"}", + "schema": { + "type": "string" } } } @@ -644,110 +458,7 @@ var doc = `{ } } }, - "/api/v1/dict/databyType/{dictType}": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "字典数据" - ], - "summary": "通过字典类型获取字典数据", - "parameters": [ - { - "type": "integer", - "description": "dictType", - "name": "dictType", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"code\": 200, \"data\": [...]}", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - } - } - }, "/api/v1/dict/type": { - "put": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "字典类型" - ], - "summary": "修改字典类型", - "parameters": [ - { - "description": "body", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.DictType" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", - "schema": { - "type": "string" - } - } - } - }, - "post": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "字典类型" - ], - "summary": "添加字典类型", - "parameters": [ - { - "description": "data", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.DictType" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/dict/type/list": { "get": { "security": [ { @@ -795,7 +506,83 @@ var doc = `{ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.PageResponse" + "$ref": "#/definitions/response.Response" + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "获取JSON", + "consumes": [ + "application/json" + ], + "tags": [ + "字典类型" + ], + "summary": "添加字典类型", + "parameters": [ + { + "description": "data", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SysDictTypeControl" + } + } + ], + "responses": { + "200": { + "description": "{\"code\": -1, \"message\": \"添加失败\"}", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/dict/type-option-select": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "获取JSON", + "tags": [ + "字典类型" + ], + "summary": "字典类型全部数据", + "parameters": [ + { + "type": "string", + "description": "dictName", + "name": "dictName", + "in": "query" + }, + { + "type": "string", + "description": "dictId", + "name": "dictId", + "in": "query" + }, + { + "type": "string", + "description": "dictType", + "name": "dictType", + "in": "query" + } + ], + "responses": { + "200": { + "description": "{\"code\": 200, \"data\": [...]}", + "schema": { + "$ref": "#/definitions/response.Response" } } } @@ -826,7 +613,41 @@ var doc = `{ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "description": "获取JSON", + "consumes": [ + "application/json" + ], + "tags": [ + "字典类型" + ], + "summary": "修改字典类型", + "parameters": [ + { + "description": "body", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SysDictTypeControl" + } + } + ], + "responses": { + "200": { + "description": "{\"code\": -1, \"message\": \"添加失败\"}", + "schema": { + "type": "string" } } } @@ -856,216 +677,7 @@ var doc = `{ } } }, - "/api/v1/loginlog": { - "put": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "登录日志" - ], - "summary": "修改登录日志", - "parameters": [ - { - "description": "body", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.LoginLog" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", - "schema": { - "type": "string" - } - } - } - }, - "post": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "登录日志" - ], - "summary": "添加登录日志", - "parameters": [ - { - "description": "data", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.LoginLog" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/loginlog/{infoId}": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "登录日志" - ], - "summary": "通过编码获取登录日志", - "parameters": [ - { - "type": "integer", - "description": "infoId", - "name": "infoId", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"code\": 200, \"data\": [...]}", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - } - }, - "delete": { - "description": "删除数据", - "tags": [ - "登录日志" - ], - "summary": "批量删除登录日志", - "parameters": [ - { - "type": "string", - "description": "以逗号(,)分割的infoId", - "name": "infoId", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"删除失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/loginloglist": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "登录日志" - ], - "summary": "登录日志列表", - "parameters": [ - { - "type": "string", - "description": "status", - "name": "status", - "in": "query" - }, - { - "type": "string", - "description": "dictCode", - "name": "dictCode", - "in": "query" - }, - { - "type": "string", - "description": "dictType", - "name": "dictType", - "in": "query" - }, - { - "type": "integer", - "description": "页条数", - "name": "pageSize", - "in": "query" - }, - { - "type": "integer", - "description": "页码", - "name": "pageIndex", - "in": "query" - } - ], - "responses": { - "200": { - "description": "{\"code\": 200, \"data\": [...]}", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - } - } - }, "/api/v1/menu": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "菜单" - ], - "summary": "Menu列表数据", - "parameters": [ - { - "type": "string", - "description": "menuName", - "name": "menuName", - "in": "query" - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"抱歉未找到相关信息\"}", - "schema": { - "type": "string" - } - } - } - }, "post": { "security": [ { @@ -1133,7 +745,63 @@ var doc = `{ } } }, + "/api/v1/menu/": { + "delete": { + "description": "删除数据", + "tags": [ + "菜单" + ], + "summary": "删除菜单", + "parameters": [ + { + "description": "body", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SysMenuById" + } + } + ], + "responses": { + "200": { + "description": "{\"code\": -1, \"message\": \"删除失败\"}", + "schema": { + "type": "string" + } + } + } + } + }, "/api/v1/menu/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "获取JSON", + "tags": [ + "菜单" + ], + "summary": "Menu详情数据", + "parameters": [ + { + "type": "string", + "description": "menuName", + "name": "menuName", + "in": "query" + } + ], + "responses": { + "200": { + "description": "{\"code\": -1, \"message\": \"抱歉未找到相关信息\"}", + "schema": { + "type": "string" + } + } + } + }, "put": { "security": [ { @@ -1162,8 +830,7 @@ var doc = `{ "in": "body", "required": true, "schema": { - "type": "object", - "$ref": "#/definitions/models.Menu" + "$ref": "#/definitions/dto.SysMenuControl" } } ], @@ -1175,30 +842,6 @@ var doc = `{ } } } - }, - "delete": { - "description": "删除数据", - "tags": [ - "菜单" - ], - "summary": "删除菜单", - "parameters": [ - { - "type": "integer", - "description": "id", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"删除失败\"}", - "schema": { - "type": "string" - } - } - } } }, "/api/v1/menuTreeselect": { @@ -1318,154 +961,6 @@ var doc = `{ } } }, - "/api/v1/operlog": { - "post": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "操作日志" - ], - "summary": "添加操作日志", - "parameters": [ - { - "description": "data", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.SysOperLog" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/operlog/{infoId}": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "登录日志" - ], - "summary": "通过编码获取登录日志", - "parameters": [ - { - "type": "integer", - "description": "infoId", - "name": "infoId", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"code\": 200, \"data\": [...]}", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - } - } - }, - "/api/v1/operlog/{operId}": { - "delete": { - "description": "删除数据", - "tags": [ - "操作日志" - ], - "summary": "批量删除操作日志", - "parameters": [ - { - "type": "string", - "description": "以逗号(,)分割的operId", - "name": "operId", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"删除失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/operloglist": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "登录日志" - ], - "summary": "登录日志列表", - "parameters": [ - { - "type": "string", - "description": "status", - "name": "status", - "in": "query" - }, - { - "type": "string", - "description": "dictCode", - "name": "dictCode", - "in": "query" - }, - { - "type": "string", - "description": "dictType", - "name": "dictType", - "in": "query" - }, - { - "type": "integer", - "description": "页条数", - "name": "pageSize", - "in": "query" - }, - { - "type": "integer", - "description": "页码", - "name": "pageIndex", - "in": "query" - } - ], - "responses": { - "200": { - "description": "{\"code\": 200, \"data\": [...]}", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - } - } - }, "/api/v1/post": { "get": { "security": [ @@ -1508,7 +1003,7 @@ var doc = `{ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" } } } @@ -1534,8 +1029,7 @@ var doc = `{ "in": "body", "required": true, "schema": { - "type": "object", - "$ref": "#/definitions/models.Post" + "$ref": "#/definitions/dto.SysPostControl" } } ], @@ -1571,8 +1065,7 @@ var doc = `{ "in": "body", "required": true, "schema": { - "type": "object", - "$ref": "#/definitions/models.Post" + "$ref": "#/definitions/dto.SysPostControl" } } ], @@ -1611,7 +1104,7 @@ var doc = `{ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" } } } @@ -1684,122 +1177,6 @@ var doc = `{ } }, "/api/v1/role": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "角色/Role" - ], - "summary": "获取Role数据", - "parameters": [ - { - "type": "string", - "description": "roleId", - "name": "roleId", - "in": "path" - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"抱歉未找到相关信息\"}", - "schema": { - "type": "string" - } - } - } - }, - "put": { - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "角色/Role" - ], - "summary": "修改用户角色", - "parameters": [ - { - "description": "body", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.SysRole" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"修改失败\"}", - "schema": { - "type": "string" - } - } - } - }, - "post": { - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "角色/Role" - ], - "summary": "创建角色", - "parameters": [ - { - "description": "data", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.SysRole" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/role/{roleId}": { - "delete": { - "description": "删除数据", - "tags": [ - "角色/Role" - ], - "summary": "删除用户角色", - "parameters": [ - { - "type": "integer", - "description": "roleId", - "name": "roleId", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"删除失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/rolelist": { "get": { "security": [ { @@ -1847,13 +1224,78 @@ var doc = `{ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "获取JSON", + "consumes": [ + "application/json" + ], + "tags": [ + "角色/Role" + ], + "summary": "创建角色", + "parameters": [ + { + "description": "data", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SysRoleControl" + } + } + ], + "responses": { + "200": { + "description": "{\"code\": -1, \"message\": \"添加失败\"}", + "schema": { + "type": "string" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "description": "删除数据", + "tags": [ + "角色/Role" + ], + "summary": "删除用户角色", + "parameters": [ + { + "description": "body", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SysRoleById" + } + } + ], + "responses": { + "200": { + "description": "{\"code\": -1, \"message\": \"删除失败\"}", + "schema": { + "type": "string" } } } } }, - "/api/v1/rolemenu": { + "/api/v1/role/{id}": { "get": { "security": [ { @@ -1862,15 +1304,15 @@ var doc = `{ ], "description": "获取JSON", "tags": [ - "角色菜单" + "角色/Role" ], - "summary": "RoleMenu列表数据", + "summary": "获取Role数据", "parameters": [ { "type": "string", - "description": "RoleId", - "name": "RoleId", - "in": "query" + "description": "roleId", + "name": "roleId", + "in": "path" } ], "responses": { @@ -1881,33 +1323,35 @@ var doc = `{ } } } - } - }, - "/api/v1/rolemenu/{id}": { - "delete": { - "description": "删除数据", - "tags": [ - "角色菜单" + }, + "put": { + "security": [ + { + "Bearer": [] + } ], - "summary": "删除用户菜单数据", + "description": "获取JSON", + "consumes": [ + "application/json" + ], + "tags": [ + "角色/Role" + ], + "summary": "修改用户角色", "parameters": [ { - "type": "string", - "description": "id", - "name": "id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "menu_id", - "name": "menu_id", - "in": "query" + "description": "body", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SysRoleControl" + } } ], "responses": { "200": { - "description": "{\"code\": -1, \"message\": \"删除失败\"}", + "description": "{\"code\": -1, \"message\": \"修改失败\"}", "schema": { "type": "string" } @@ -1943,7 +1387,7 @@ var doc = `{ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" } } } @@ -1971,7 +1415,6 @@ var doc = `{ "in": "body", "required": true, "schema": { - "type": "object", "$ref": "#/definitions/tools.SysTables" } } @@ -2042,7 +1485,7 @@ var doc = `{ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" } } } @@ -2103,7 +1546,7 @@ var doc = `{ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" } } } @@ -2120,12 +1563,20 @@ var doc = `{ "tags": [ "用户" ], - "summary": "获取用户角色和职位", + "summary": "列表用户信息数据", + "parameters": [ + { + "type": "string", + "description": "username", + "name": "username", + "in": "query" + } + ], "responses": { "200": { - "description": "{\"code\": 200, \"data\": [...]}", + "description": "{\"code\": -1, \"message\": \"抱歉未找到相关信息\"}", "schema": { - "$ref": "#/definitions/app.Response" + "type": "string" } } } @@ -2146,8 +1597,7 @@ var doc = `{ "in": "body", "required": true, "schema": { - "type": "object", - "$ref": "#/definitions/models.SysUser" + "$ref": "#/definitions/dto.SysUserControl" } } ], @@ -2186,133 +1636,7 @@ var doc = `{ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" - } - } - } - } - }, - "/api/v1/sysUserList": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "用户" - ], - "summary": "列表用户信息数据", - "parameters": [ - { - "type": "string", - "description": "username", - "name": "username", - "in": "query" - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"抱歉未找到相关信息\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/syscategory": { - "post": { - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "分类" - ], - "summary": "添加分类", - "parameters": [ - { - "description": "data", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.SysCategory" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/syscontent": { - "post": { - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "内容管理" - ], - "summary": "添加内容管理", - "parameters": [ - { - "description": "data", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.SysContent" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/sysfiledir": { - "post": { - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "SysFileDir" - ], - "summary": "添加SysFileDir", - "parameters": [ - { - "description": "data", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.SysFileDir" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", - "schema": { - "type": "string" + "$ref": "#/definitions/response.Response" } } } @@ -2332,8 +1656,7 @@ var doc = `{ "in": "body", "required": true, "schema": { - "type": "object", - "$ref": "#/definitions/models.SysUser" + "$ref": "#/definitions/dto.SysSettingControl" } } ], @@ -2364,8 +1687,7 @@ var doc = `{ "in": "body", "required": true, "schema": { - "type": "object", - "$ref": "#/definitions/models.SysUser" + "$ref": "#/definitions/dto.SysUserControl" } } ], @@ -2403,29 +1725,7 @@ var doc = `{ } } }, - "/api/v1/user/profile": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "个人中心" - ], - "summary": "获取个人中心用户", - "responses": { - "200": { - "description": "{\"code\": 200, \"data\": [...]}", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - } - } - }, - "/api/v1/user/profileAvatar": { + "/api/v1/user/avatar": { "post": { "description": "获取JSON", "consumes": [ @@ -2454,6 +1754,64 @@ var doc = `{ } } }, + "/api/v1/user/profile": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "获取JSON", + "tags": [ + "个人中心" + ], + "summary": "获取个人中心用户", + "responses": { + "200": { + "description": "{\"code\": 200, \"data\": [...]}", + "schema": { + "$ref": "#/definitions/response.Response" + } + } + } + } + }, + "/api/v1/user/pwd": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "获取JSON", + "consumes": [ + "application/json" + ], + "tags": [ + "用户" + ], + "summary": "重置密码", + "parameters": [ + { + "description": "body", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PassWord" + } + } + ], + "responses": { + "200": { + "description": "{\"code\": 200, \"data\": [...]}", + "schema": { + "$ref": "#/definitions/response.Response" + } + } + } + } + }, "/login": { "post": { "description": "获取token\nLoginHandler can be used by clients to get a jwt token.\nPayload needs to be json in the form of {\"username\": \"USERNAME\", \"password\": \"PASSWORD\"}.\nReply will be of the form {\"token\": \"TOKEN\"}.\ndev mode:It should be noted that all fields cannot be empty, and a value of 0 can be passed in addition to the account password\n注意:开发模式:需要注意全部字段不能为空,账号密码外可以传入0值", @@ -2468,8 +1826,7 @@ var doc = `{ "in": "body", "required": true, "schema": { - "type": "object", - "$ref": "#/definitions/models.Login" + "$ref": "#/definitions/handler.Login" } } ], @@ -2504,638 +1861,43 @@ var doc = `{ } } } - }, - "/sd/cpu": { - "get": { - "description": "CPU 使用量 DiskCheck checks the disk usage.", - "consumes": [ - "text/html" - ], - "produces": [ - "text/html" - ], - "summary": "CPU 使用量", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/sd/disk": { - "get": { - "description": "服务器硬盘使用量 DiskCheck checks the disk usage.", - "consumes": [ - "text/html" - ], - "produces": [ - "text/html" - ], - "summary": "服务器硬盘使用量", - "responses": { - "200": { - "description": "OK - Free space: 16321MB (15GB) / 51200MB (50GB) | Used: 31%", - "schema": { - "type": "string" - } - }, - "429": { - "description": "WARNING", - "schema": { - "type": "string" - } - }, - "500": { - "description": "CRITICAL", - "schema": { - "type": "string" - } - } - } - } - }, - "/sd/health": { - "get": { - "description": "健康状况", - "consumes": [ - "text/html" - ], - "produces": [ - "text/html" - ], - "summary": "健康状况 HealthCheck shows OK as the ping-pong result.", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/sd/os": { - "get": { - "description": "Os", - "consumes": [ - "text/html" - ], - "produces": [ - "text/html" - ], - "summary": "OS", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/sd/ram": { - "get": { - "description": "内存使用量 RAMCheck checks the disk usage.", - "consumes": [ - "text/html" - ], - "produces": [ - "text/html" - ], - "summary": "内存使用量", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } } }, "definitions": { - "app.Page": { - "type": "object", - "properties": { - "count": { - "type": "integer" - }, - "list": { - "type": "object" - }, - "pageIndex": { - "type": "integer" - }, - "pageSize": { - "type": "integer" - } - } - }, - "app.PageResponse": { - "type": "object", - "properties": { - "code": { - "description": "代码", - "type": "integer", - "example": 200 - }, - "data": { - "description": "数据集", - "type": "object", - "$ref": "#/definitions/app.Page" - }, - "msg": { - "description": "消息", - "type": "string" - } - } - }, - "app.Response": { - "type": "object", - "properties": { - "code": { - "description": "代码", - "type": "integer", - "example": 200 - }, - "data": { - "description": "数据集", - "type": "object" - }, - "msg": { - "description": "消息", - "type": "string" - } - } - }, - "models.DictType": { - "type": "object", - "properties": { - "createBy": { - "description": "创建者", - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "dataScope": { - "type": "string" - }, - "deletedAt": { - "type": "string" - }, - "dictId": { - "type": "integer" - }, - "dictName": { - "description": "字典名称", - "type": "string" - }, - "dictType": { - "description": "字典类型", - "type": "string" - }, - "params": { - "type": "string" - }, - "remark": { - "description": "备注", - "type": "string" - }, - "status": { - "description": "状态", - "type": "string" - }, - "updateBy": { - "description": "更新者", - "type": "string" - }, - "updatedAt": { - "type": "string" - } - } - }, - "models.Login": { + "dto.PassWord": { "type": "object", "required": [ - "code", - "password", - "username", - "uuid" + "newPassword", + "oldPassword" ], "properties": { - "code": { + "newPassword": { "type": "string" }, - "password": { - "type": "string" - }, - "username": { - "type": "string" - }, - "uuid": { + "oldPassword": { "type": "string" } } }, - "models.LoginLog": { + "dto.SysDeptById": { "type": "object", "properties": { - "browser": { - "description": "浏览器", - "type": "string" - }, - "createBy": { - "description": "创建人", - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "dataScope": { - "description": "数据", - "type": "string" - }, - "deletedAt": { - "type": "string" - }, - "infoId": { - "description": "主键", + "id": { "type": "integer" }, - "ipaddr": { - "description": "ip地址", - "type": "string" - }, - "loginLocation": { - "description": "归属地", - "type": "string" - }, - "loginTime": { - "description": "登录时间", - "type": "string" - }, - "msg": { - "type": "string" - }, - "os": { - "description": "系统", - "type": "string" - }, - "params": { - "type": "string" - }, - "platform": { - "description": "固件", - "type": "string" - }, - "remark": { - "description": "备注", - "type": "string" - }, - "status": { - "description": "状态", - "type": "string" - }, - "updateBy": { - "description": "更新者", - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "username": { - "description": "用户名", - "type": "string" - } - } - }, - "models.Menu": { - "type": "object", - "properties": { - "action": { - "type": "string" - }, - "breadcrumb": { - "type": "string" - }, - "children": { + "ids": { "type": "array", "items": { - "$ref": "#/definitions/models.Menu" + "type": "integer" } - }, - "component": { - "type": "string" - }, - "createBy": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "dataScope": { - "type": "string" - }, - "deletedAt": { - "type": "string" - }, - "icon": { - "type": "string" - }, - "isFrame": { - "type": "string" - }, - "is_select": { - "type": "boolean" - }, - "menuId": { - "type": "integer" - }, - "menuName": { - "type": "string" - }, - "menuType": { - "type": "string" - }, - "noCache": { - "type": "boolean" - }, - "params": { - "type": "string" - }, - "parentId": { - "type": "integer" - }, - "path": { - "type": "string" - }, - "paths": { - "type": "string" - }, - "permission": { - "type": "string" - }, - "roleId": { - "type": "integer" - }, - "sort": { - "type": "integer" - }, - "title": { - "type": "string" - }, - "updateBy": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "visible": { - "type": "string" } } }, - "models.Post": { + "dto.SysDeptControl": { "type": "object", "properties": { - "createBy": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "dataScope": { - "type": "string" - }, - "deletedAt": { - "type": "string" - }, - "params": { - "type": "string" - }, - "postCode": { - "description": "岗位代码", - "type": "string" - }, - "postId": { - "description": "岗位编号", - "type": "integer" - }, - "postName": { - "description": "岗位名称", - "type": "string" - }, - "remark": { - "description": "描述", - "type": "string" - }, - "sort": { - "description": "岗位排序", - "type": "integer" - }, - "status": { - "description": "状态", - "type": "string" - }, - "updateBy": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - } - }, - "models.SysCategory": { - "type": "object", - "properties": { - "createBy": { - "description": "创建者", - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "dataScope": { - "type": "string" - }, - "deletedAt": { - "type": "string" - }, - "id": { - "description": "分类Id", - "type": "integer" - }, - "img": { - "description": "图片", - "type": "string" - }, - "name": { - "description": "名称", - "type": "string" - }, - "params": { - "type": "string" - }, - "remark": { - "description": "备注", - "type": "string" - }, - "sort": { - "description": "排序", - "type": "string" - }, - "status": { - "description": "状态", - "type": "string" - }, - "updateBy": { - "description": "更新者", - "type": "string" - }, - "updatedAt": { - "type": "string" - } - } - }, - "models.SysConfig": { - "type": "object", - "properties": { - "configId": { - "description": "编码", - "type": "integer" - }, - "configKey": { - "description": "参数键名", - "type": "string" - }, - "configName": { - "description": "参数名称", - "type": "string" - }, - "configType": { - "description": "是否系统内置", - "type": "string" - }, - "configValue": { - "description": "参数键值", - "type": "string" - }, - "createBy": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "dataScope": { - "type": "string" - }, - "deletedAt": { - "type": "string" - }, - "params": { - "type": "string" - }, - "remark": { - "description": "备注", - "type": "string" - }, - "updateBy": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - } - }, - "models.SysContent": { - "type": "object", - "properties": { - "cateId": { - "description": "分类id", - "type": "string" - }, - "content": { - "description": "内容", - "type": "string" - }, - "createBy": { - "description": "创建者", - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "dataScope": { - "type": "string" - }, - "deletedAt": { - "type": "string" - }, - "id": { - "description": "id", - "type": "integer" - }, - "img": { - "description": "图片", - "type": "string" - }, - "name": { - "description": "名称", - "type": "string" - }, - "params": { - "type": "string" - }, - "remark": { - "description": "备注", - "type": "string" - }, - "sort": { - "description": "排序", - "type": "string" - }, - "status": { - "description": "状态", - "type": "string" - }, - "updateBy": { - "description": "更新者", - "type": "string" - }, - "updatedAt": { - "type": "string" - } - } - }, - "models.SysDept": { - "type": "object", - "properties": { - "children": { - "type": "array", - "items": { - "$ref": "#/definitions/models.SysDept" - } - }, - "createBy": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "dataScope": { - "type": "string" - }, - "deletedAt": { - "type": "string" - }, "deptId": { - "description": "部门编码", + "description": "编码", "type": "integer" }, "deptName": { @@ -3143,6 +1905,7 @@ var doc = `{ "type": "string" }, "deptPath": { + "description": "路径", "type": "string" }, "email": { @@ -3153,9 +1916,6 @@ var doc = `{ "description": "负责人", "type": "string" }, - "params": { - "type": "string" - }, "parentId": { "description": "上级部门", "type": "integer" @@ -3171,197 +1931,204 @@ var doc = `{ "status": { "description": "状态", "type": "string" - }, - "updateBy": { - "type": "string" - }, - "updatedAt": { - "type": "string" } } }, - "models.SysFileDir": { + "dto.SysDictDataControl": { "type": "object", "properties": { - "children": { - "type": "array", - "items": { - "$ref": "#/definitions/models.SysFileDir" - } - }, - "createBy": { - "description": "创建人", + "cssClass": { "type": "string" }, - "createdAt": { + "default": { "type": "string" }, - "dataScope": { + "dictLabel": { "type": "string" }, - "deletedAt": { + "dictSort": { + "type": "integer" + }, + "dictType": { + "type": "string" + }, + "dictValue": { "type": "string" }, "id": { "type": "integer" }, - "label": { - "description": "名称", + "isDefault": { "type": "string" }, - "pId": { - "description": "父id", + "listClass": { + "type": "string" + }, + "remark": { + "type": "string" + }, + "status": { + "type": "string" + } + } + }, + "dto.SysDictTypeControl": { + "type": "object", + "properties": { + "dictName": { + "type": "string" + }, + "dictType": { + "type": "string" + }, + "id": { "type": "integer" }, - "params": { + "remark": { "type": "string" }, + "status": { + "type": "string" + } + } + }, + "dto.SysMenuById": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "ids": { + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "dto.SysMenuControl": { + "type": "object", + "properties": { + "action": { + "description": "请求方式", + "type": "string" + }, + "breadcrumb": { + "description": "是否面包屑", + "type": "string" + }, + "component": { + "description": "组件", + "type": "string" + }, + "icon": { + "description": "图标", + "type": "string" + }, + "isFrame": { + "description": "是否frame", + "type": "string" + }, + "menuId": { + "description": "编码", + "type": "integer" + }, + "menuName": { + "description": "菜单name", + "type": "string" + }, + "menuType": { + "description": "菜单类型", + "type": "string" + }, + "noCache": { + "description": "是否缓存", + "type": "boolean" + }, + "parentId": { + "description": "上级菜单", + "type": "integer" + }, "path": { + "description": "路径", + "type": "string" + }, + "paths": { + "description": "id路径", + "type": "string" + }, + "permission": { + "description": "权限编码", "type": "string" }, "sort": { "description": "排序", "type": "integer" }, - "updateBy": { - "description": "编辑人", + "title": { + "description": "显示名称", "type": "string" }, - "updatedAt": { + "visible": { + "description": "是否显示", "type": "string" } } }, - "models.SysOperLog": { + "dto.SysPostControl": { "type": "object", "properties": { - "businessType": { - "description": "操作类型", + "postCode": { + "description": "编码", "type": "string" }, - "businessTypes": { - "type": "string" - }, - "createBy": { - "description": "创建人", - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "dataScope": { - "description": "数据", - "type": "string" - }, - "deletedAt": { - "type": "string" - }, - "deptName": { - "description": "部门名称", - "type": "string" - }, - "jsonResult": { - "description": "返回数据", - "type": "string" - }, - "latencyime": { - "description": "耗时", - "type": "string" - }, - "method": { - "description": "函数", - "type": "string" - }, - "operId": { - "description": "日志编码", + "postId": { + "description": "id", "type": "integer" }, - "operIp": { - "description": "客户端ip", - "type": "string" - }, - "operLocation": { - "description": "访问位置", - "type": "string" - }, - "operName": { - "description": "操作者", - "type": "string" - }, - "operParam": { - "description": "请求参数", - "type": "string" - }, - "operTime": { - "description": "操作时间", - "type": "string" - }, - "operUrl": { - "description": "访问地址", - "type": "string" - }, - "operatorType": { - "description": "操作类型", - "type": "string" - }, - "params": { - "description": "参数", + "postName": { + "description": "名称", "type": "string" }, "remark": { "description": "备注", "type": "string" }, - "requestMethod": { - "description": "请求方式", - "type": "string" + "sort": { + "description": "排序", + "type": "integer" }, "status": { - "description": "操作状态", - "type": "string" - }, - "title": { - "description": "操作模块", - "type": "string" - }, - "updateBy": { - "description": "更新者", - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "userAgent": { - "description": "ua", - "type": "string" + "description": "状态", + "type": "integer" } } }, - "models.SysRole": { + "dto.SysRoleById": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "ids": { + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "dto.SysRoleControl": { "type": "object", "properties": { "admin": { "type": "boolean" }, - "createBy": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, "dataScope": { "type": "string" }, - "deletedAt": { - "type": "string" - }, - "deptIds": { - "type": "array", - "items": { - "type": "integer" - } - }, "flag": { + "description": "标记", "type": "string" }, "menuIds": { @@ -3370,9 +2137,6 @@ var doc = `{ "type": "integer" } }, - "params": { - "type": "string" - }, "remark": { "description": "备注", "type": "string" @@ -3394,89 +2158,71 @@ var doc = `{ "type": "integer" }, "status": { - "type": "string" - }, - "updateBy": { - "type": "string" - }, - "updatedAt": { + "description": "状态", "type": "string" } } }, - "models.SysUser": { + "dto.SysSettingControl": { "type": "object", + "required": [ + "logo", + "name", + "settings_id" + ], "properties": { - "avatar": { + "logo": { "description": "头像", "type": "string" }, - "createBy": { + "name": { + "description": "名称", "type": "string" }, - "createdAt": { - "type": "string" - }, - "dataScope": { - "type": "string" - }, - "deletedAt": { + "settings_id": { + "description": "头像", + "type": "integer" + } + } + }, + "dto.SysUserControl": { + "type": "object", + "properties": { + "avatar": { "type": "string" }, "deptId": { - "description": "部门编码", "type": "integer" }, "email": { - "description": "邮箱", "type": "string" }, "nickName": { - "description": "昵称", - "type": "string" - }, - "params": { "type": "string" }, "password": { - "description": "密码", "type": "string" }, "phone": { - "description": "手机号", "type": "string" }, "postId": { - "description": "职位编码", "type": "integer" }, "remark": { - "description": "备注", "type": "string" }, "roleId": { - "description": "角色编码", "type": "integer" }, - "salt": { - "description": "盐", - "type": "string" - }, "sex": { - "description": "性别", "type": "string" }, "status": { "type": "string" }, - "updateBy": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, "userId": { - "description": "编码", + "description": "用户ID", "type": "integer" }, "username": { @@ -3484,6 +2230,46 @@ var doc = `{ } } }, + "handler.Login": { + "type": "object", + "required": [ + "code", + "password", + "username", + "uuid" + ], + "properties": { + "code": { + "type": "string" + }, + "password": { + "type": "string" + }, + "username": { + "type": "string" + }, + "uuid": { + "type": "string" + } + } + }, + "response.Response": { + "type": "object", + "properties": { + "code": { + "type": "integer" + }, + "msg": { + "type": "string" + }, + "requestId": { + "type": "string" + }, + "status": { + "type": "string" + } + } + }, "tools.Params": { "type": "object", "properties": { @@ -3665,6 +2451,15 @@ var doc = `{ "description": "功能名称", "type": "string" }, + "isActions": { + "type": "integer" + }, + "isAuth": { + "type": "integer" + }, + "isDataScope": { + "type": "integer" + }, "isLogicalDelete": { "type": "string" }, @@ -3686,7 +2481,6 @@ var doc = `{ "type": "string" }, "params": { - "type": "object", "$ref": "#/definitions/tools.Params" }, "pkColumn": { @@ -3757,7 +2551,7 @@ type swaggerInfo struct { // SwaggerInfo holds exported Swagger Info so clients can modify it var SwaggerInfo = swaggerInfo{ - Version: "1.0.1", + Version: "1.3.1", Host: "", BasePath: "", Schemes: []string{}, diff --git a/docs/swagger.json b/docs/swagger.json index f2bfe3fb..7d371bf0 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -6,188 +6,11 @@ "contact": {}, "license": { "name": "MIT", - "url": "https://github.com/wenjianzhang/go-admin/blob/master/LICENSE.md" + "url": "https://github.com/go-admin-team/go-admin/blob/master/LICENSE.md" }, - "version": "1.0.1" + "version": "1.3.1" }, "paths": { - "/api/v1/config": { - "put": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "配置" - ], - "summary": "修改配置", - "parameters": [ - { - "description": "body", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.SysConfig" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/config/{configId}": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "配置" - ], - "summary": "获取配置", - "parameters": [ - { - "type": "integer", - "description": "配置编码", - "name": "configId", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"code\": 200, \"data\": [...]}", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - } - }, - "delete": { - "description": "删除数据", - "tags": [ - "配置" - ], - "summary": "删除配置", - "parameters": [ - { - "type": "integer", - "description": "configId", - "name": "configId", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"删除失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/configKey/{configKey}": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "配置" - ], - "summary": "获取配置", - "parameters": [ - { - "type": "integer", - "description": "configKey", - "name": "configKey", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"code\": 200, \"data\": [...]}", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - } - } - }, - "/api/v1/configList": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "配置" - ], - "summary": "配置列表数据", - "parameters": [ - { - "type": "string", - "description": "configKey", - "name": "configKey", - "in": "query" - }, - { - "type": "string", - "description": "configName", - "name": "configName", - "in": "query" - }, - { - "type": "string", - "description": "configType", - "name": "configType", - "in": "query" - }, - { - "type": "integer", - "description": "页条数", - "name": "pageSize", - "in": "query" - }, - { - "type": "integer", - "description": "页码", - "name": "pageIndex", - "in": "query" - } - ], - "responses": { - "200": { - "description": "{\"code\": 200, \"data\": [...]}", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - } - } - }, "/api/v1/db/columns/page": { "get": { "description": "数据库表列分页列表 / database table column page list", @@ -219,7 +42,7 @@ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" } } } @@ -256,51 +79,49 @@ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" } } } } }, "/api/v1/dept": { - "put": { + "get": { "security": [ { "Bearer": [] } ], - "description": "获取JSON", - "consumes": [ - "application/json" - ], + "description": "分页列表", "tags": [ "部门" ], - "summary": "修改部门", + "summary": "分页部门列表数据", "parameters": [ { - "type": "integer", - "description": "id", - "name": "id", - "in": "path", - "required": true + "type": "string", + "description": "name", + "name": "name", + "in": "query" }, { - "description": "body", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.SysDept" - } + "type": "string", + "description": "id", + "name": "id", + "in": "query" + }, + { + "type": "string", + "description": "position", + "name": "position", + "in": "query" } ], "responses": { "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", + "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "type": "string" + "$ref": "#/definitions/response.Response" } } } @@ -326,8 +147,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "$ref": "#/definitions/models.SysDept" + "$ref": "#/definitions/dto.SysDeptControl" } } ], @@ -339,6 +159,32 @@ } } } + }, + "delete": { + "description": "删除数据", + "tags": [ + "部门" + ], + "summary": "删除部门", + "parameters": [ + { + "description": "body", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SysDeptById" + } + } + ], + "responses": { + "200": { + "description": "{\"code\": -1, \"message\": \"删除失败\"}", + "schema": { + "type": "string" + } + } + } } }, "/api/v1/dept/{deptId}": { @@ -371,81 +217,11 @@ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" } } } - } - }, - "/api/v1/dept/{id}": { - "delete": { - "description": "删除数据", - "tags": [ - "部门" - ], - "summary": "删除部门", - "parameters": [ - { - "type": "integer", - "description": "id", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"删除失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/deptList": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "分页列表", - "tags": [ - "部门" - ], - "summary": "分页部门列表数据", - "parameters": [ - { - "type": "string", - "description": "name", - "name": "name", - "in": "query" - }, - { - "type": "string", - "description": "id", - "name": "id", - "in": "query" - }, - { - "type": "string", - "description": "position", - "name": "position", - "in": "query" - } - ], - "responses": { - "200": { - "description": "{\"code\": 200, \"data\": [...]}", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - } - } - }, - "/api/v1/dict/data": { + }, "put": { "security": [ { @@ -457,53 +233,24 @@ "application/json" ], "tags": [ - "字典数据" + "部门" ], - "summary": "修改字典数据", + "summary": "修改部门", "parameters": [ + { + "type": "integer", + "description": "id", + "name": "id", + "in": "path", + "required": true + }, { "description": "body", "name": "data", "in": "body", "required": true, "schema": { - "type": "object", - "$ref": "#/definitions/models.DictType" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", - "schema": { - "type": "string" - } - } - } - }, - "post": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "字典数据" - ], - "summary": "添加字典数据", - "parameters": [ - { - "description": "data", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.DictType" + "$ref": "#/definitions/dto.SysDeptControl" } } ], @@ -517,7 +264,7 @@ } } }, - "/api/v1/dict/data/list": { + "/api/v1/dict/data": { "get": { "security": [ { @@ -565,7 +312,41 @@ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "获取JSON", + "consumes": [ + "application/json" + ], + "tags": [ + "字典数据" + ], + "summary": "添加字典数据", + "parameters": [ + { + "description": "data", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SysDictDataControl" + } + } + ], + "responses": { + "200": { + "description": "{\"code\": -1, \"message\": \"添加失败\"}", + "schema": { + "type": "string" } } } @@ -596,7 +377,41 @@ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "description": "获取JSON", + "consumes": [ + "application/json" + ], + "tags": [ + "字典数据" + ], + "summary": "修改字典数据", + "parameters": [ + { + "description": "body", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SysDictDataControl" + } + } + ], + "responses": { + "200": { + "description": "{\"code\": -1, \"message\": \"添加失败\"}", + "schema": { + "type": "string" } } } @@ -626,110 +441,7 @@ } } }, - "/api/v1/dict/databyType/{dictType}": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "字典数据" - ], - "summary": "通过字典类型获取字典数据", - "parameters": [ - { - "type": "integer", - "description": "dictType", - "name": "dictType", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"code\": 200, \"data\": [...]}", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - } - } - }, "/api/v1/dict/type": { - "put": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "字典类型" - ], - "summary": "修改字典类型", - "parameters": [ - { - "description": "body", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.DictType" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", - "schema": { - "type": "string" - } - } - } - }, - "post": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "字典类型" - ], - "summary": "添加字典类型", - "parameters": [ - { - "description": "data", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.DictType" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/dict/type/list": { "get": { "security": [ { @@ -777,7 +489,83 @@ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.PageResponse" + "$ref": "#/definitions/response.Response" + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "获取JSON", + "consumes": [ + "application/json" + ], + "tags": [ + "字典类型" + ], + "summary": "添加字典类型", + "parameters": [ + { + "description": "data", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SysDictTypeControl" + } + } + ], + "responses": { + "200": { + "description": "{\"code\": -1, \"message\": \"添加失败\"}", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/dict/type-option-select": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "获取JSON", + "tags": [ + "字典类型" + ], + "summary": "字典类型全部数据", + "parameters": [ + { + "type": "string", + "description": "dictName", + "name": "dictName", + "in": "query" + }, + { + "type": "string", + "description": "dictId", + "name": "dictId", + "in": "query" + }, + { + "type": "string", + "description": "dictType", + "name": "dictType", + "in": "query" + } + ], + "responses": { + "200": { + "description": "{\"code\": 200, \"data\": [...]}", + "schema": { + "$ref": "#/definitions/response.Response" } } } @@ -808,7 +596,41 @@ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "description": "获取JSON", + "consumes": [ + "application/json" + ], + "tags": [ + "字典类型" + ], + "summary": "修改字典类型", + "parameters": [ + { + "description": "body", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SysDictTypeControl" + } + } + ], + "responses": { + "200": { + "description": "{\"code\": -1, \"message\": \"添加失败\"}", + "schema": { + "type": "string" } } } @@ -838,216 +660,7 @@ } } }, - "/api/v1/loginlog": { - "put": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "登录日志" - ], - "summary": "修改登录日志", - "parameters": [ - { - "description": "body", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.LoginLog" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", - "schema": { - "type": "string" - } - } - } - }, - "post": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "登录日志" - ], - "summary": "添加登录日志", - "parameters": [ - { - "description": "data", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.LoginLog" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/loginlog/{infoId}": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "登录日志" - ], - "summary": "通过编码获取登录日志", - "parameters": [ - { - "type": "integer", - "description": "infoId", - "name": "infoId", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"code\": 200, \"data\": [...]}", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - } - }, - "delete": { - "description": "删除数据", - "tags": [ - "登录日志" - ], - "summary": "批量删除登录日志", - "parameters": [ - { - "type": "string", - "description": "以逗号(,)分割的infoId", - "name": "infoId", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"删除失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/loginloglist": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "登录日志" - ], - "summary": "登录日志列表", - "parameters": [ - { - "type": "string", - "description": "status", - "name": "status", - "in": "query" - }, - { - "type": "string", - "description": "dictCode", - "name": "dictCode", - "in": "query" - }, - { - "type": "string", - "description": "dictType", - "name": "dictType", - "in": "query" - }, - { - "type": "integer", - "description": "页条数", - "name": "pageSize", - "in": "query" - }, - { - "type": "integer", - "description": "页码", - "name": "pageIndex", - "in": "query" - } - ], - "responses": { - "200": { - "description": "{\"code\": 200, \"data\": [...]}", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - } - } - }, "/api/v1/menu": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "菜单" - ], - "summary": "Menu列表数据", - "parameters": [ - { - "type": "string", - "description": "menuName", - "name": "menuName", - "in": "query" - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"抱歉未找到相关信息\"}", - "schema": { - "type": "string" - } - } - } - }, "post": { "security": [ { @@ -1115,7 +728,63 @@ } } }, + "/api/v1/menu/": { + "delete": { + "description": "删除数据", + "tags": [ + "菜单" + ], + "summary": "删除菜单", + "parameters": [ + { + "description": "body", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SysMenuById" + } + } + ], + "responses": { + "200": { + "description": "{\"code\": -1, \"message\": \"删除失败\"}", + "schema": { + "type": "string" + } + } + } + } + }, "/api/v1/menu/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "获取JSON", + "tags": [ + "菜单" + ], + "summary": "Menu详情数据", + "parameters": [ + { + "type": "string", + "description": "menuName", + "name": "menuName", + "in": "query" + } + ], + "responses": { + "200": { + "description": "{\"code\": -1, \"message\": \"抱歉未找到相关信息\"}", + "schema": { + "type": "string" + } + } + } + }, "put": { "security": [ { @@ -1144,8 +813,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "$ref": "#/definitions/models.Menu" + "$ref": "#/definitions/dto.SysMenuControl" } } ], @@ -1157,30 +825,6 @@ } } } - }, - "delete": { - "description": "删除数据", - "tags": [ - "菜单" - ], - "summary": "删除菜单", - "parameters": [ - { - "type": "integer", - "description": "id", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"删除失败\"}", - "schema": { - "type": "string" - } - } - } } }, "/api/v1/menuTreeselect": { @@ -1300,154 +944,6 @@ } } }, - "/api/v1/operlog": { - "post": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "操作日志" - ], - "summary": "添加操作日志", - "parameters": [ - { - "description": "data", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.SysOperLog" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/operlog/{infoId}": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "登录日志" - ], - "summary": "通过编码获取登录日志", - "parameters": [ - { - "type": "integer", - "description": "infoId", - "name": "infoId", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"code\": 200, \"data\": [...]}", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - } - } - }, - "/api/v1/operlog/{operId}": { - "delete": { - "description": "删除数据", - "tags": [ - "操作日志" - ], - "summary": "批量删除操作日志", - "parameters": [ - { - "type": "string", - "description": "以逗号(,)分割的operId", - "name": "operId", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"删除失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/operloglist": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "登录日志" - ], - "summary": "登录日志列表", - "parameters": [ - { - "type": "string", - "description": "status", - "name": "status", - "in": "query" - }, - { - "type": "string", - "description": "dictCode", - "name": "dictCode", - "in": "query" - }, - { - "type": "string", - "description": "dictType", - "name": "dictType", - "in": "query" - }, - { - "type": "integer", - "description": "页条数", - "name": "pageSize", - "in": "query" - }, - { - "type": "integer", - "description": "页码", - "name": "pageIndex", - "in": "query" - } - ], - "responses": { - "200": { - "description": "{\"code\": 200, \"data\": [...]}", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - } - } - }, "/api/v1/post": { "get": { "security": [ @@ -1490,7 +986,7 @@ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" } } } @@ -1516,8 +1012,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "$ref": "#/definitions/models.Post" + "$ref": "#/definitions/dto.SysPostControl" } } ], @@ -1553,8 +1048,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "$ref": "#/definitions/models.Post" + "$ref": "#/definitions/dto.SysPostControl" } } ], @@ -1593,7 +1087,7 @@ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" } } } @@ -1666,122 +1160,6 @@ } }, "/api/v1/role": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "角色/Role" - ], - "summary": "获取Role数据", - "parameters": [ - { - "type": "string", - "description": "roleId", - "name": "roleId", - "in": "path" - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"抱歉未找到相关信息\"}", - "schema": { - "type": "string" - } - } - } - }, - "put": { - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "角色/Role" - ], - "summary": "修改用户角色", - "parameters": [ - { - "description": "body", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.SysRole" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"修改失败\"}", - "schema": { - "type": "string" - } - } - } - }, - "post": { - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "角色/Role" - ], - "summary": "创建角色", - "parameters": [ - { - "description": "data", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.SysRole" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/role/{roleId}": { - "delete": { - "description": "删除数据", - "tags": [ - "角色/Role" - ], - "summary": "删除用户角色", - "parameters": [ - { - "type": "integer", - "description": "roleId", - "name": "roleId", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"删除失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/rolelist": { "get": { "security": [ { @@ -1829,13 +1207,78 @@ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "获取JSON", + "consumes": [ + "application/json" + ], + "tags": [ + "角色/Role" + ], + "summary": "创建角色", + "parameters": [ + { + "description": "data", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SysRoleControl" + } + } + ], + "responses": { + "200": { + "description": "{\"code\": -1, \"message\": \"添加失败\"}", + "schema": { + "type": "string" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "description": "删除数据", + "tags": [ + "角色/Role" + ], + "summary": "删除用户角色", + "parameters": [ + { + "description": "body", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SysRoleById" + } + } + ], + "responses": { + "200": { + "description": "{\"code\": -1, \"message\": \"删除失败\"}", + "schema": { + "type": "string" } } } } }, - "/api/v1/rolemenu": { + "/api/v1/role/{id}": { "get": { "security": [ { @@ -1844,15 +1287,15 @@ ], "description": "获取JSON", "tags": [ - "角色菜单" + "角色/Role" ], - "summary": "RoleMenu列表数据", + "summary": "获取Role数据", "parameters": [ { "type": "string", - "description": "RoleId", - "name": "RoleId", - "in": "query" + "description": "roleId", + "name": "roleId", + "in": "path" } ], "responses": { @@ -1863,33 +1306,35 @@ } } } - } - }, - "/api/v1/rolemenu/{id}": { - "delete": { - "description": "删除数据", - "tags": [ - "角色菜单" + }, + "put": { + "security": [ + { + "Bearer": [] + } ], - "summary": "删除用户菜单数据", + "description": "获取JSON", + "consumes": [ + "application/json" + ], + "tags": [ + "角色/Role" + ], + "summary": "修改用户角色", "parameters": [ { - "type": "string", - "description": "id", - "name": "id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "menu_id", - "name": "menu_id", - "in": "query" + "description": "body", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.SysRoleControl" + } } ], "responses": { "200": { - "description": "{\"code\": -1, \"message\": \"删除失败\"}", + "description": "{\"code\": -1, \"message\": \"修改失败\"}", "schema": { "type": "string" } @@ -1925,7 +1370,7 @@ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" } } } @@ -1953,7 +1398,6 @@ "in": "body", "required": true, "schema": { - "type": "object", "$ref": "#/definitions/tools.SysTables" } } @@ -2024,7 +1468,7 @@ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" } } } @@ -2085,7 +1529,7 @@ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" + "$ref": "#/definitions/response.Response" } } } @@ -2102,12 +1546,20 @@ "tags": [ "用户" ], - "summary": "获取用户角色和职位", + "summary": "列表用户信息数据", + "parameters": [ + { + "type": "string", + "description": "username", + "name": "username", + "in": "query" + } + ], "responses": { "200": { - "description": "{\"code\": 200, \"data\": [...]}", + "description": "{\"code\": -1, \"message\": \"抱歉未找到相关信息\"}", "schema": { - "$ref": "#/definitions/app.Response" + "type": "string" } } } @@ -2128,8 +1580,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "$ref": "#/definitions/models.SysUser" + "$ref": "#/definitions/dto.SysUserControl" } } ], @@ -2168,133 +1619,7 @@ "200": { "description": "{\"code\": 200, \"data\": [...]}", "schema": { - "$ref": "#/definitions/app.Response" - } - } - } - } - }, - "/api/v1/sysUserList": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "用户" - ], - "summary": "列表用户信息数据", - "parameters": [ - { - "type": "string", - "description": "username", - "name": "username", - "in": "query" - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"抱歉未找到相关信息\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/syscategory": { - "post": { - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "分类" - ], - "summary": "添加分类", - "parameters": [ - { - "description": "data", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.SysCategory" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/syscontent": { - "post": { - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "内容管理" - ], - "summary": "添加内容管理", - "parameters": [ - { - "description": "data", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.SysContent" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/sysfiledir": { - "post": { - "description": "获取JSON", - "consumes": [ - "application/json" - ], - "tags": [ - "SysFileDir" - ], - "summary": "添加SysFileDir", - "parameters": [ - { - "description": "data", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "object", - "$ref": "#/definitions/models.SysFileDir" - } - } - ], - "responses": { - "200": { - "description": "{\"code\": -1, \"message\": \"添加失败\"}", - "schema": { - "type": "string" + "$ref": "#/definitions/response.Response" } } } @@ -2314,8 +1639,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "$ref": "#/definitions/models.SysUser" + "$ref": "#/definitions/dto.SysSettingControl" } } ], @@ -2346,8 +1670,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "$ref": "#/definitions/models.SysUser" + "$ref": "#/definitions/dto.SysUserControl" } } ], @@ -2385,29 +1708,7 @@ } } }, - "/api/v1/user/profile": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "获取JSON", - "tags": [ - "个人中心" - ], - "summary": "获取个人中心用户", - "responses": { - "200": { - "description": "{\"code\": 200, \"data\": [...]}", - "schema": { - "$ref": "#/definitions/app.Response" - } - } - } - } - }, - "/api/v1/user/profileAvatar": { + "/api/v1/user/avatar": { "post": { "description": "获取JSON", "consumes": [ @@ -2436,6 +1737,64 @@ } } }, + "/api/v1/user/profile": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "获取JSON", + "tags": [ + "个人中心" + ], + "summary": "获取个人中心用户", + "responses": { + "200": { + "description": "{\"code\": 200, \"data\": [...]}", + "schema": { + "$ref": "#/definitions/response.Response" + } + } + } + } + }, + "/api/v1/user/pwd": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "获取JSON", + "consumes": [ + "application/json" + ], + "tags": [ + "用户" + ], + "summary": "重置密码", + "parameters": [ + { + "description": "body", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.PassWord" + } + } + ], + "responses": { + "200": { + "description": "{\"code\": 200, \"data\": [...]}", + "schema": { + "$ref": "#/definitions/response.Response" + } + } + } + } + }, "/login": { "post": { "description": "获取token\nLoginHandler can be used by clients to get a jwt token.\nPayload needs to be json in the form of {\"username\": \"USERNAME\", \"password\": \"PASSWORD\"}.\nReply will be of the form {\"token\": \"TOKEN\"}.\ndev mode:It should be noted that all fields cannot be empty, and a value of 0 can be passed in addition to the account password\n注意:开发模式:需要注意全部字段不能为空,账号密码外可以传入0值", @@ -2450,8 +1809,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "$ref": "#/definitions/models.Login" + "$ref": "#/definitions/handler.Login" } } ], @@ -2486,638 +1844,43 @@ } } } - }, - "/sd/cpu": { - "get": { - "description": "CPU 使用量 DiskCheck checks the disk usage.", - "consumes": [ - "text/html" - ], - "produces": [ - "text/html" - ], - "summary": "CPU 使用量", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/sd/disk": { - "get": { - "description": "服务器硬盘使用量 DiskCheck checks the disk usage.", - "consumes": [ - "text/html" - ], - "produces": [ - "text/html" - ], - "summary": "服务器硬盘使用量", - "responses": { - "200": { - "description": "OK - Free space: 16321MB (15GB) / 51200MB (50GB) | Used: 31%", - "schema": { - "type": "string" - } - }, - "429": { - "description": "WARNING", - "schema": { - "type": "string" - } - }, - "500": { - "description": "CRITICAL", - "schema": { - "type": "string" - } - } - } - } - }, - "/sd/health": { - "get": { - "description": "健康状况", - "consumes": [ - "text/html" - ], - "produces": [ - "text/html" - ], - "summary": "健康状况 HealthCheck shows OK as the ping-pong result.", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/sd/os": { - "get": { - "description": "Os", - "consumes": [ - "text/html" - ], - "produces": [ - "text/html" - ], - "summary": "OS", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/sd/ram": { - "get": { - "description": "内存使用量 RAMCheck checks the disk usage.", - "consumes": [ - "text/html" - ], - "produces": [ - "text/html" - ], - "summary": "内存使用量", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } } }, "definitions": { - "app.Page": { - "type": "object", - "properties": { - "count": { - "type": "integer" - }, - "list": { - "type": "object" - }, - "pageIndex": { - "type": "integer" - }, - "pageSize": { - "type": "integer" - } - } - }, - "app.PageResponse": { - "type": "object", - "properties": { - "code": { - "description": "代码", - "type": "integer", - "example": 200 - }, - "data": { - "description": "数据集", - "type": "object", - "$ref": "#/definitions/app.Page" - }, - "msg": { - "description": "消息", - "type": "string" - } - } - }, - "app.Response": { - "type": "object", - "properties": { - "code": { - "description": "代码", - "type": "integer", - "example": 200 - }, - "data": { - "description": "数据集", - "type": "object" - }, - "msg": { - "description": "消息", - "type": "string" - } - } - }, - "models.DictType": { - "type": "object", - "properties": { - "createBy": { - "description": "创建者", - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "dataScope": { - "type": "string" - }, - "deletedAt": { - "type": "string" - }, - "dictId": { - "type": "integer" - }, - "dictName": { - "description": "字典名称", - "type": "string" - }, - "dictType": { - "description": "字典类型", - "type": "string" - }, - "params": { - "type": "string" - }, - "remark": { - "description": "备注", - "type": "string" - }, - "status": { - "description": "状态", - "type": "string" - }, - "updateBy": { - "description": "更新者", - "type": "string" - }, - "updatedAt": { - "type": "string" - } - } - }, - "models.Login": { + "dto.PassWord": { "type": "object", "required": [ - "code", - "password", - "username", - "uuid" + "newPassword", + "oldPassword" ], "properties": { - "code": { + "newPassword": { "type": "string" }, - "password": { - "type": "string" - }, - "username": { - "type": "string" - }, - "uuid": { + "oldPassword": { "type": "string" } } }, - "models.LoginLog": { + "dto.SysDeptById": { "type": "object", "properties": { - "browser": { - "description": "浏览器", - "type": "string" - }, - "createBy": { - "description": "创建人", - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "dataScope": { - "description": "数据", - "type": "string" - }, - "deletedAt": { - "type": "string" - }, - "infoId": { - "description": "主键", + "id": { "type": "integer" }, - "ipaddr": { - "description": "ip地址", - "type": "string" - }, - "loginLocation": { - "description": "归属地", - "type": "string" - }, - "loginTime": { - "description": "登录时间", - "type": "string" - }, - "msg": { - "type": "string" - }, - "os": { - "description": "系统", - "type": "string" - }, - "params": { - "type": "string" - }, - "platform": { - "description": "固件", - "type": "string" - }, - "remark": { - "description": "备注", - "type": "string" - }, - "status": { - "description": "状态", - "type": "string" - }, - "updateBy": { - "description": "更新者", - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "username": { - "description": "用户名", - "type": "string" - } - } - }, - "models.Menu": { - "type": "object", - "properties": { - "action": { - "type": "string" - }, - "breadcrumb": { - "type": "string" - }, - "children": { + "ids": { "type": "array", "items": { - "$ref": "#/definitions/models.Menu" + "type": "integer" } - }, - "component": { - "type": "string" - }, - "createBy": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "dataScope": { - "type": "string" - }, - "deletedAt": { - "type": "string" - }, - "icon": { - "type": "string" - }, - "isFrame": { - "type": "string" - }, - "is_select": { - "type": "boolean" - }, - "menuId": { - "type": "integer" - }, - "menuName": { - "type": "string" - }, - "menuType": { - "type": "string" - }, - "noCache": { - "type": "boolean" - }, - "params": { - "type": "string" - }, - "parentId": { - "type": "integer" - }, - "path": { - "type": "string" - }, - "paths": { - "type": "string" - }, - "permission": { - "type": "string" - }, - "roleId": { - "type": "integer" - }, - "sort": { - "type": "integer" - }, - "title": { - "type": "string" - }, - "updateBy": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "visible": { - "type": "string" } } }, - "models.Post": { + "dto.SysDeptControl": { "type": "object", "properties": { - "createBy": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "dataScope": { - "type": "string" - }, - "deletedAt": { - "type": "string" - }, - "params": { - "type": "string" - }, - "postCode": { - "description": "岗位代码", - "type": "string" - }, - "postId": { - "description": "岗位编号", - "type": "integer" - }, - "postName": { - "description": "岗位名称", - "type": "string" - }, - "remark": { - "description": "描述", - "type": "string" - }, - "sort": { - "description": "岗位排序", - "type": "integer" - }, - "status": { - "description": "状态", - "type": "string" - }, - "updateBy": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - } - }, - "models.SysCategory": { - "type": "object", - "properties": { - "createBy": { - "description": "创建者", - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "dataScope": { - "type": "string" - }, - "deletedAt": { - "type": "string" - }, - "id": { - "description": "分类Id", - "type": "integer" - }, - "img": { - "description": "图片", - "type": "string" - }, - "name": { - "description": "名称", - "type": "string" - }, - "params": { - "type": "string" - }, - "remark": { - "description": "备注", - "type": "string" - }, - "sort": { - "description": "排序", - "type": "string" - }, - "status": { - "description": "状态", - "type": "string" - }, - "updateBy": { - "description": "更新者", - "type": "string" - }, - "updatedAt": { - "type": "string" - } - } - }, - "models.SysConfig": { - "type": "object", - "properties": { - "configId": { - "description": "编码", - "type": "integer" - }, - "configKey": { - "description": "参数键名", - "type": "string" - }, - "configName": { - "description": "参数名称", - "type": "string" - }, - "configType": { - "description": "是否系统内置", - "type": "string" - }, - "configValue": { - "description": "参数键值", - "type": "string" - }, - "createBy": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "dataScope": { - "type": "string" - }, - "deletedAt": { - "type": "string" - }, - "params": { - "type": "string" - }, - "remark": { - "description": "备注", - "type": "string" - }, - "updateBy": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - } - }, - "models.SysContent": { - "type": "object", - "properties": { - "cateId": { - "description": "分类id", - "type": "string" - }, - "content": { - "description": "内容", - "type": "string" - }, - "createBy": { - "description": "创建者", - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "dataScope": { - "type": "string" - }, - "deletedAt": { - "type": "string" - }, - "id": { - "description": "id", - "type": "integer" - }, - "img": { - "description": "图片", - "type": "string" - }, - "name": { - "description": "名称", - "type": "string" - }, - "params": { - "type": "string" - }, - "remark": { - "description": "备注", - "type": "string" - }, - "sort": { - "description": "排序", - "type": "string" - }, - "status": { - "description": "状态", - "type": "string" - }, - "updateBy": { - "description": "更新者", - "type": "string" - }, - "updatedAt": { - "type": "string" - } - } - }, - "models.SysDept": { - "type": "object", - "properties": { - "children": { - "type": "array", - "items": { - "$ref": "#/definitions/models.SysDept" - } - }, - "createBy": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "dataScope": { - "type": "string" - }, - "deletedAt": { - "type": "string" - }, "deptId": { - "description": "部门编码", + "description": "编码", "type": "integer" }, "deptName": { @@ -3125,6 +1888,7 @@ "type": "string" }, "deptPath": { + "description": "路径", "type": "string" }, "email": { @@ -3135,9 +1899,6 @@ "description": "负责人", "type": "string" }, - "params": { - "type": "string" - }, "parentId": { "description": "上级部门", "type": "integer" @@ -3153,197 +1914,204 @@ "status": { "description": "状态", "type": "string" - }, - "updateBy": { - "type": "string" - }, - "updatedAt": { - "type": "string" } } }, - "models.SysFileDir": { + "dto.SysDictDataControl": { "type": "object", "properties": { - "children": { - "type": "array", - "items": { - "$ref": "#/definitions/models.SysFileDir" - } - }, - "createBy": { - "description": "创建人", + "cssClass": { "type": "string" }, - "createdAt": { + "default": { "type": "string" }, - "dataScope": { + "dictLabel": { "type": "string" }, - "deletedAt": { + "dictSort": { + "type": "integer" + }, + "dictType": { + "type": "string" + }, + "dictValue": { "type": "string" }, "id": { "type": "integer" }, - "label": { - "description": "名称", + "isDefault": { "type": "string" }, - "pId": { - "description": "父id", + "listClass": { + "type": "string" + }, + "remark": { + "type": "string" + }, + "status": { + "type": "string" + } + } + }, + "dto.SysDictTypeControl": { + "type": "object", + "properties": { + "dictName": { + "type": "string" + }, + "dictType": { + "type": "string" + }, + "id": { "type": "integer" }, - "params": { + "remark": { "type": "string" }, + "status": { + "type": "string" + } + } + }, + "dto.SysMenuById": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "ids": { + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "dto.SysMenuControl": { + "type": "object", + "properties": { + "action": { + "description": "请求方式", + "type": "string" + }, + "breadcrumb": { + "description": "是否面包屑", + "type": "string" + }, + "component": { + "description": "组件", + "type": "string" + }, + "icon": { + "description": "图标", + "type": "string" + }, + "isFrame": { + "description": "是否frame", + "type": "string" + }, + "menuId": { + "description": "编码", + "type": "integer" + }, + "menuName": { + "description": "菜单name", + "type": "string" + }, + "menuType": { + "description": "菜单类型", + "type": "string" + }, + "noCache": { + "description": "是否缓存", + "type": "boolean" + }, + "parentId": { + "description": "上级菜单", + "type": "integer" + }, "path": { + "description": "路径", + "type": "string" + }, + "paths": { + "description": "id路径", + "type": "string" + }, + "permission": { + "description": "权限编码", "type": "string" }, "sort": { "description": "排序", "type": "integer" }, - "updateBy": { - "description": "编辑人", + "title": { + "description": "显示名称", "type": "string" }, - "updatedAt": { + "visible": { + "description": "是否显示", "type": "string" } } }, - "models.SysOperLog": { + "dto.SysPostControl": { "type": "object", "properties": { - "businessType": { - "description": "操作类型", + "postCode": { + "description": "编码", "type": "string" }, - "businessTypes": { - "type": "string" - }, - "createBy": { - "description": "创建人", - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "dataScope": { - "description": "数据", - "type": "string" - }, - "deletedAt": { - "type": "string" - }, - "deptName": { - "description": "部门名称", - "type": "string" - }, - "jsonResult": { - "description": "返回数据", - "type": "string" - }, - "latencyime": { - "description": "耗时", - "type": "string" - }, - "method": { - "description": "函数", - "type": "string" - }, - "operId": { - "description": "日志编码", + "postId": { + "description": "id", "type": "integer" }, - "operIp": { - "description": "客户端ip", - "type": "string" - }, - "operLocation": { - "description": "访问位置", - "type": "string" - }, - "operName": { - "description": "操作者", - "type": "string" - }, - "operParam": { - "description": "请求参数", - "type": "string" - }, - "operTime": { - "description": "操作时间", - "type": "string" - }, - "operUrl": { - "description": "访问地址", - "type": "string" - }, - "operatorType": { - "description": "操作类型", - "type": "string" - }, - "params": { - "description": "参数", + "postName": { + "description": "名称", "type": "string" }, "remark": { "description": "备注", "type": "string" }, - "requestMethod": { - "description": "请求方式", - "type": "string" + "sort": { + "description": "排序", + "type": "integer" }, "status": { - "description": "操作状态", - "type": "string" - }, - "title": { - "description": "操作模块", - "type": "string" - }, - "updateBy": { - "description": "更新者", - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "userAgent": { - "description": "ua", - "type": "string" + "description": "状态", + "type": "integer" } } }, - "models.SysRole": { + "dto.SysRoleById": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "ids": { + "type": "array", + "items": { + "type": "integer" + } + } + } + }, + "dto.SysRoleControl": { "type": "object", "properties": { "admin": { "type": "boolean" }, - "createBy": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, "dataScope": { "type": "string" }, - "deletedAt": { - "type": "string" - }, - "deptIds": { - "type": "array", - "items": { - "type": "integer" - } - }, "flag": { + "description": "标记", "type": "string" }, "menuIds": { @@ -3352,9 +2120,6 @@ "type": "integer" } }, - "params": { - "type": "string" - }, "remark": { "description": "备注", "type": "string" @@ -3376,89 +2141,71 @@ "type": "integer" }, "status": { - "type": "string" - }, - "updateBy": { - "type": "string" - }, - "updatedAt": { + "description": "状态", "type": "string" } } }, - "models.SysUser": { + "dto.SysSettingControl": { "type": "object", + "required": [ + "logo", + "name", + "settings_id" + ], "properties": { - "avatar": { + "logo": { "description": "头像", "type": "string" }, - "createBy": { + "name": { + "description": "名称", "type": "string" }, - "createdAt": { - "type": "string" - }, - "dataScope": { - "type": "string" - }, - "deletedAt": { + "settings_id": { + "description": "头像", + "type": "integer" + } + } + }, + "dto.SysUserControl": { + "type": "object", + "properties": { + "avatar": { "type": "string" }, "deptId": { - "description": "部门编码", "type": "integer" }, "email": { - "description": "邮箱", "type": "string" }, "nickName": { - "description": "昵称", - "type": "string" - }, - "params": { "type": "string" }, "password": { - "description": "密码", "type": "string" }, "phone": { - "description": "手机号", "type": "string" }, "postId": { - "description": "职位编码", "type": "integer" }, "remark": { - "description": "备注", "type": "string" }, "roleId": { - "description": "角色编码", "type": "integer" }, - "salt": { - "description": "盐", - "type": "string" - }, "sex": { - "description": "性别", "type": "string" }, "status": { "type": "string" }, - "updateBy": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, "userId": { - "description": "编码", + "description": "用户ID", "type": "integer" }, "username": { @@ -3466,6 +2213,46 @@ } } }, + "handler.Login": { + "type": "object", + "required": [ + "code", + "password", + "username", + "uuid" + ], + "properties": { + "code": { + "type": "string" + }, + "password": { + "type": "string" + }, + "username": { + "type": "string" + }, + "uuid": { + "type": "string" + } + } + }, + "response.Response": { + "type": "object", + "properties": { + "code": { + "type": "integer" + }, + "msg": { + "type": "string" + }, + "requestId": { + "type": "string" + }, + "status": { + "type": "string" + } + } + }, "tools.Params": { "type": "object", "properties": { @@ -3647,6 +2434,15 @@ "description": "功能名称", "type": "string" }, + "isActions": { + "type": "integer" + }, + "isAuth": { + "type": "integer" + }, + "isDataScope": { + "type": "integer" + }, "isLogicalDelete": { "type": "string" }, @@ -3668,7 +2464,6 @@ "type": "string" }, "params": { - "type": "object", "$ref": "#/definitions/tools.Params" }, "pkColumn": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index f1d0542e..b8cbf283 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1,371 +1,33 @@ definitions: - app.Page: + dto.PassWord: properties: - count: - type: integer - list: - type: object - pageIndex: - type: integer - pageSize: - type: integer - type: object - app.PageResponse: - properties: - code: - description: 代码 - example: 200 - type: integer - data: - $ref: '#/definitions/app.Page' - description: 数据集 - type: object - msg: - description: 消息 + newPassword: type: string - type: object - app.Response: - properties: - code: - description: 代码 - example: 200 - type: integer - data: - description: 数据集 - type: object - msg: - description: 消息 - type: string - type: object - models.DictType: - properties: - createBy: - description: 创建者 - type: string - createdAt: - type: string - dataScope: - type: string - deletedAt: - type: string - dictId: - type: integer - dictName: - description: 字典名称 - type: string - dictType: - description: 字典类型 - type: string - params: - type: string - remark: - description: 备注 - type: string - status: - description: 状态 - type: string - updateBy: - description: 更新者 - type: string - updatedAt: - type: string - type: object - models.Login: - properties: - code: - type: string - password: - type: string - username: - type: string - uuid: + oldPassword: type: string required: - - code - - password - - username - - uuid + - newPassword + - oldPassword type: object - models.LoginLog: + dto.SysDeptById: properties: - browser: - description: 浏览器 - type: string - createBy: - description: 创建人 - type: string - createdAt: - type: string - dataScope: - description: 数据 - type: string - deletedAt: - type: string - infoId: - description: 主键 - type: integer - ipaddr: - description: ip地址 - type: string - loginLocation: - description: 归属地 - type: string - loginTime: - description: 登录时间 - type: string - msg: - type: string - os: - description: 系统 - type: string - params: - type: string - platform: - description: 固件 - type: string - remark: - description: 备注 - type: string - status: - description: 状态 - type: string - updateBy: - description: 更新者 - type: string - updatedAt: - type: string - username: - description: 用户名 - type: string - type: object - models.Menu: - properties: - action: - type: string - breadcrumb: - type: string - children: - items: - $ref: '#/definitions/models.Menu' - type: array - component: - type: string - createBy: - type: string - createdAt: - type: string - dataScope: - type: string - deletedAt: - type: string - icon: - type: string - is_select: - type: boolean - isFrame: - type: string - menuId: - type: integer - menuName: - type: string - menuType: - type: string - noCache: - type: boolean - params: - type: string - parentId: - type: integer - path: - type: string - paths: - type: string - permission: - type: string - roleId: - type: integer - sort: - type: integer - title: - type: string - updateBy: - type: string - updatedAt: - type: string - visible: - type: string - type: object - models.Post: - properties: - createBy: - type: string - createdAt: - type: string - dataScope: - type: string - deletedAt: - type: string - params: - type: string - postCode: - description: 岗位代码 - type: string - postId: - description: 岗位编号 - type: integer - postName: - description: 岗位名称 - type: string - remark: - description: 描述 - type: string - sort: - description: 岗位排序 - type: integer - status: - description: 状态 - type: string - updateBy: - type: string - updatedAt: - type: string - type: object - models.SysCategory: - properties: - createBy: - description: 创建者 - type: string - createdAt: - type: string - dataScope: - type: string - deletedAt: - type: string id: - description: 分类Id type: integer - img: - description: 图片 - type: string - name: - description: 名称 - type: string - params: - type: string - remark: - description: 备注 - type: string - sort: - description: 排序 - type: string - status: - description: 状态 - type: string - updateBy: - description: 更新者 - type: string - updatedAt: - type: string - type: object - models.SysConfig: - properties: - configId: - description: 编码 - type: integer - configKey: - description: 参数键名 - type: string - configName: - description: 参数名称 - type: string - configType: - description: 是否系统内置 - type: string - configValue: - description: 参数键值 - type: string - createBy: - type: string - createdAt: - type: string - dataScope: - type: string - deletedAt: - type: string - params: - type: string - remark: - description: 备注 - type: string - updateBy: - type: string - updatedAt: - type: string - type: object - models.SysContent: - properties: - cateId: - description: 分类id - type: string - content: - description: 内容 - type: string - createBy: - description: 创建者 - type: string - createdAt: - type: string - dataScope: - type: string - deletedAt: - type: string - id: - description: id - type: integer - img: - description: 图片 - type: string - name: - description: 名称 - type: string - params: - type: string - remark: - description: 备注 - type: string - sort: - description: 排序 - type: string - status: - description: 状态 - type: string - updateBy: - description: 更新者 - type: string - updatedAt: - type: string - type: object - models.SysDept: - properties: - children: + ids: items: - $ref: '#/definitions/models.SysDept' + type: integer type: array - createBy: - type: string - createdAt: - type: string - dataScope: - type: string - deletedAt: - type: string + type: object + dto.SysDeptControl: + properties: deptId: - description: 部门编码 + description: 编码 type: integer deptName: description: 部门名称 type: string deptPath: + description: 路径 type: string email: description: 邮箱 @@ -373,8 +35,6 @@ definitions: leader: description: 负责人 type: string - params: - type: string parentId: description: 上级部门 type: integer @@ -387,148 +47,148 @@ definitions: status: description: 状态 type: string - updateBy: - type: string - updatedAt: - type: string type: object - models.SysFileDir: + dto.SysDictDataControl: properties: - children: - items: - $ref: '#/definitions/models.SysFileDir' - type: array - createBy: - description: 创建人 + cssClass: type: string - createdAt: + default: type: string - dataScope: + dictLabel: type: string - deletedAt: + dictSort: + type: integer + dictType: + type: string + dictValue: type: string id: type: integer - label: - description: 名称 + isDefault: type: string - pId: - description: 父id + listClass: + type: string + remark: + type: string + status: + type: string + type: object + dto.SysDictTypeControl: + properties: + dictName: + type: string + dictType: + type: string + id: type: integer - params: + remark: type: string + status: + type: string + type: object + dto.SysMenuById: + properties: + id: + type: integer + ids: + items: + type: integer + type: array + type: object + dto.SysMenuControl: + properties: + action: + description: 请求方式 + type: string + breadcrumb: + description: 是否面包屑 + type: string + component: + description: 组件 + type: string + icon: + description: 图标 + type: string + isFrame: + description: 是否frame + type: string + menuId: + description: 编码 + type: integer + menuName: + description: 菜单name + type: string + menuType: + description: 菜单类型 + type: string + noCache: + description: 是否缓存 + type: boolean + parentId: + description: 上级菜单 + type: integer path: + description: 路径 + type: string + paths: + description: id路径 + type: string + permission: + description: 权限编码 type: string sort: description: 排序 type: integer - updateBy: - description: 编辑人 + title: + description: 显示名称 type: string - updatedAt: + visible: + description: 是否显示 type: string type: object - models.SysOperLog: + dto.SysPostControl: properties: - businessType: - description: 操作类型 + postCode: + description: 编码 type: string - businessTypes: - type: string - createBy: - description: 创建人 - type: string - createdAt: - type: string - dataScope: - description: 数据 - type: string - deletedAt: - type: string - deptName: - description: 部门名称 - type: string - jsonResult: - description: 返回数据 - type: string - latencyime: - description: 耗时 - type: string - method: - description: 函数 - type: string - operId: - description: 日志编码 + postId: + description: id type: integer - operIp: - description: 客户端ip - type: string - operLocation: - description: 访问位置 - type: string - operName: - description: 操作者 - type: string - operParam: - description: 请求参数 - type: string - operTime: - description: 操作时间 - type: string - operUrl: - description: 访问地址 - type: string - operatorType: - description: 操作类型 - type: string - params: - description: 参数 + postName: + description: 名称 type: string remark: description: 备注 type: string - requestMethod: - description: 请求方式 - type: string + sort: + description: 排序 + type: integer status: - description: 操作状态 - type: string - title: - description: 操作模块 - type: string - updateBy: - description: 更新者 - type: string - updatedAt: - type: string - userAgent: - description: ua - type: string + description: 状态 + type: integer type: object - models.SysRole: + dto.SysRoleById: properties: - admin: - type: boolean - createBy: - type: string - createdAt: - type: string - dataScope: - type: string - deletedAt: - type: string - deptIds: + id: + type: integer + ids: items: type: integer type: array + type: object + dto.SysRoleControl: + properties: + admin: + type: boolean + dataScope: + type: string flag: + description: 标记 type: string menuIds: items: type: integer type: array - params: - type: string remark: description: 备注 type: string @@ -545,69 +205,82 @@ definitions: description: 角色排序 type: integer status: - type: string - updateBy: - type: string - updatedAt: + description: 状态 type: string type: object - models.SysUser: + dto.SysSettingControl: properties: - avatar: + logo: description: 头像 type: string - createBy: + name: + description: 名称 type: string - createdAt: - type: string - dataScope: - type: string - deletedAt: + settings_id: + description: 头像 + type: integer + required: + - logo + - name + - settings_id + type: object + dto.SysUserControl: + properties: + avatar: type: string deptId: - description: 部门编码 type: integer email: - description: 邮箱 type: string nickName: - description: 昵称 - type: string - params: type: string password: - description: 密码 type: string phone: - description: 手机号 type: string postId: - description: 职位编码 type: integer remark: - description: 备注 type: string roleId: - description: 角色编码 type: integer - salt: - description: 盐 - type: string sex: - description: 性别 type: string status: type: string - updateBy: - type: string - updatedAt: - type: string userId: - description: 编码 + description: 用户ID type: integer username: type: string type: object + handler.Login: + properties: + code: + type: string + password: + type: string + username: + type: string + uuid: + type: string + required: + - code + - password + - username + - uuid + type: object + response.Response: + properties: + code: + type: integer + msg: + type: string + requestId: + type: string + status: + type: string + type: object tools.Params: properties: treeCode: @@ -729,6 +402,12 @@ definitions: functionName: description: 功能名称 type: string + isActions: + type: integer + isAuth: + type: integer + isDataScope: + type: integer isLogicalDelete: type: string logicalDelete: @@ -745,7 +424,6 @@ definitions: type: string params: $ref: '#/definitions/tools.Params' - type: object pkColumn: type: string pkGoField: @@ -785,121 +463,10 @@ info: 添加qq群: 74520518 进入技术交流群 请备注,谢谢! license: name: MIT - url: https://github.com/wenjianzhang/go-admin/blob/master/LICENSE.md + url: https://github.com/go-admin-team/go-admin/blob/master/LICENSE.md title: go-admin API - version: 1.0.1 + version: 1.3.1 paths: - /api/v1/config: - put: - consumes: - - application/json - description: 获取JSON - parameters: - - description: body - in: body - name: data - required: true - schema: - $ref: '#/definitions/models.SysConfig' - type: object - responses: - "200": - description: '{"code": -1, "message": "添加失败"}' - schema: - type: string - security: - - Bearer: [] - summary: 修改配置 - tags: - - 配置 - /api/v1/config/{configId}: - delete: - description: 删除数据 - parameters: - - description: configId - in: path - name: configId - required: true - type: integer - responses: - "200": - description: '{"code": -1, "message": "删除失败"}' - schema: - type: string - summary: 删除配置 - tags: - - 配置 - get: - description: 获取JSON - parameters: - - description: 配置编码 - in: path - name: configId - required: true - type: integer - responses: - "200": - description: '{"code": 200, "data": [...]}' - schema: - $ref: '#/definitions/app.Response' - security: - - Bearer: [] - summary: 获取配置 - tags: - - 配置 - /api/v1/configKey/{configKey}: - get: - description: 获取JSON - parameters: - - description: configKey - in: path - name: configKey - required: true - type: integer - responses: - "200": - description: '{"code": 200, "data": [...]}' - schema: - $ref: '#/definitions/app.Response' - security: - - Bearer: [] - summary: 获取配置 - tags: - - 配置 - /api/v1/configList: - get: - description: 获取JSON - parameters: - - description: configKey - in: query - name: configKey - type: string - - description: configName - in: query - name: configName - type: string - - description: configType - in: query - name: configType - type: string - - description: 页条数 - in: query - name: pageSize - type: integer - - description: 页码 - in: query - name: pageIndex - type: integer - responses: - "200": - description: '{"code": 200, "data": [...]}' - schema: - $ref: '#/definitions/app.Response' - security: - - Bearer: [] - summary: 配置列表数据 - tags: - - 配置 /api/v1/db/columns/page: get: description: 数据库表列分页列表 / database table column page list @@ -920,7 +487,7 @@ paths: "200": description: '{"code": 200, "data": [...]}' schema: - $ref: '#/definitions/app.Response' + $ref: '#/definitions/response.Response' summary: 分页列表数据 / page list data tags: - 工具 / Tools @@ -944,91 +511,20 @@ paths: "200": description: '{"code": 200, "data": [...]}' schema: - $ref: '#/definitions/app.Response' + $ref: '#/definitions/response.Response' summary: 分页列表数据 / page list data tags: - 工具 / Tools /api/v1/dept: - post: - consumes: - - application/json - description: 获取JSON + delete: + description: 删除数据 parameters: - - description: data - in: body - name: data - required: true - schema: - $ref: '#/definitions/models.SysDept' - type: object - responses: - "200": - description: '{"code": -1, "message": "添加失败"}' - schema: - type: string - security: - - Bearer: [] - summary: 添加部门 - tags: - - 部门 - put: - consumes: - - application/json - description: 获取JSON - parameters: - - description: id - in: path - name: id - required: true - type: integer - description: body in: body name: data required: true schema: - $ref: '#/definitions/models.SysDept' - type: object - responses: - "200": - description: '{"code": -1, "message": "添加失败"}' - schema: - type: string - security: - - Bearer: [] - summary: 修改部门 - tags: - - 部门 - /api/v1/dept/{deptId}: - get: - description: 获取JSON - parameters: - - description: deptId - in: path - name: deptId - type: string - - description: position - in: query - name: position - type: string - responses: - "200": - description: '{"code": 200, "data": [...]}' - schema: - $ref: '#/definitions/app.Response' - security: - - Bearer: [] - summary: 部门列表数据 - tags: - - 部门 - /api/v1/dept/{id}: - delete: - description: 删除数据 - parameters: - - description: id - in: path - name: id - required: true - type: integer + $ref: '#/definitions/dto.SysDeptById' responses: "200": description: '{"code": -1, "message": "删除失败"}' @@ -1037,7 +533,6 @@ paths: summary: 删除部门 tags: - 部门 - /api/v1/deptList: get: description: 分页列表 parameters: @@ -1057,13 +552,12 @@ paths: "200": description: '{"code": 200, "data": [...]}' schema: - $ref: '#/definitions/app.Response' + $ref: '#/definitions/response.Response' security: - Bearer: [] summary: 分页部门列表数据 tags: - 部门 - /api/v1/dict/data: post: consumes: - application/json @@ -1074,8 +568,110 @@ paths: name: data required: true schema: - $ref: '#/definitions/models.DictType' - type: object + $ref: '#/definitions/dto.SysDeptControl' + responses: + "200": + description: '{"code": -1, "message": "添加失败"}' + schema: + type: string + security: + - Bearer: [] + summary: 添加部门 + tags: + - 部门 + /api/v1/dept/{deptId}: + get: + description: 获取JSON + parameters: + - description: deptId + in: path + name: deptId + type: string + - description: position + in: query + name: position + type: string + responses: + "200": + description: '{"code": 200, "data": [...]}' + schema: + $ref: '#/definitions/response.Response' + security: + - Bearer: [] + summary: 部门列表数据 + tags: + - 部门 + put: + consumes: + - application/json + description: 获取JSON + parameters: + - description: id + in: path + name: id + required: true + type: integer + - description: body + in: body + name: data + required: true + schema: + $ref: '#/definitions/dto.SysDeptControl' + responses: + "200": + description: '{"code": -1, "message": "添加失败"}' + schema: + type: string + security: + - Bearer: [] + summary: 修改部门 + tags: + - 部门 + /api/v1/dict/data: + get: + description: 获取JSON + parameters: + - description: status + in: query + name: status + type: string + - description: dictCode + in: query + name: dictCode + type: string + - description: dictType + in: query + name: dictType + type: string + - description: 页条数 + in: query + name: pageSize + type: integer + - description: 页码 + in: query + name: pageIndex + type: integer + responses: + "200": + description: '{"code": 200, "data": [...]}' + schema: + $ref: '#/definitions/response.Response' + security: + - Bearer: [] + summary: 字典数据列表 + tags: + - 字典数据 + post: + consumes: + - application/json + description: 获取JSON + parameters: + - description: data + in: body + name: data + required: true + schema: + $ref: '#/definitions/dto.SysDictDataControl' responses: "200": description: '{"code": -1, "message": "添加失败"}' @@ -1086,28 +682,6 @@ paths: summary: 添加字典数据 tags: - 字典数据 - put: - consumes: - - application/json - description: 获取JSON - parameters: - - description: body - in: body - name: data - required: true - schema: - $ref: '#/definitions/models.DictType' - type: object - responses: - "200": - description: '{"code": -1, "message": "添加失败"}' - schema: - type: string - security: - - Bearer: [] - summary: 修改字典数据 - tags: - - 字典数据 /api/v1/dict/data/{dictCode}: delete: description: 删除数据 @@ -1137,23 +711,44 @@ paths: "200": description: '{"code": 200, "data": [...]}' schema: - $ref: '#/definitions/app.Response' + $ref: '#/definitions/response.Response' security: - Bearer: [] summary: 通过编码获取字典数据 tags: - 字典数据 - /api/v1/dict/data/list: + put: + consumes: + - application/json + description: 获取JSON + parameters: + - description: body + in: body + name: data + required: true + schema: + $ref: '#/definitions/dto.SysDictDataControl' + responses: + "200": + description: '{"code": -1, "message": "添加失败"}' + schema: + type: string + security: + - Bearer: [] + summary: 修改字典数据 + tags: + - 字典数据 + /api/v1/dict/type: get: description: 获取JSON parameters: - - description: status + - description: dictName in: query - name: status + name: dictName type: string - - description: dictCode + - description: dictId in: query - name: dictCode + name: dictId type: string - description: dictType in: query @@ -1171,32 +766,12 @@ paths: "200": description: '{"code": 200, "data": [...]}' schema: - $ref: '#/definitions/app.Response' + $ref: '#/definitions/response.Response' security: - Bearer: [] - summary: 字典数据列表 + summary: 字典类型列表数据 tags: - - 字典数据 - /api/v1/dict/databyType/{dictType}: - get: - description: 获取JSON - parameters: - - description: dictType - in: path - name: dictType - required: true - type: integer - responses: - "200": - description: '{"code": 200, "data": [...]}' - schema: - $ref: '#/definitions/app.Response' - security: - - Bearer: [] - summary: 通过字典类型获取字典数据 - tags: - - 字典数据 - /api/v1/dict/type: + - 字典类型 post: consumes: - application/json @@ -1207,8 +782,7 @@ paths: name: data required: true schema: - $ref: '#/definitions/models.DictType' - type: object + $ref: '#/definitions/dto.SysDictTypeControl' responses: "200": description: '{"code": -1, "message": "添加失败"}' @@ -1219,26 +793,30 @@ paths: summary: 添加字典类型 tags: - 字典类型 - put: - consumes: - - application/json + /api/v1/dict/type-option-select: + get: description: 获取JSON parameters: - - description: body - in: body - name: data - required: true - schema: - $ref: '#/definitions/models.DictType' - type: object + - description: dictName + in: query + name: dictName + type: string + - description: dictId + in: query + name: dictId + type: string + - description: dictType + in: query + name: dictType + type: string responses: "200": - description: '{"code": -1, "message": "添加失败"}' + description: '{"code": 200, "data": [...]}' schema: - type: string + $ref: '#/definitions/response.Response' security: - Bearer: [] - summary: 修改字典类型 + summary: 字典类型全部数据 tags: - 字典类型 /api/v1/dict/type/{dictId}: @@ -1270,69 +848,12 @@ paths: "200": description: '{"code": 200, "data": [...]}' schema: - $ref: '#/definitions/app.Response' + $ref: '#/definitions/response.Response' security: - Bearer: [] summary: 通过字典id获取字典类型 tags: - 字典类型 - /api/v1/dict/type/list: - get: - description: 获取JSON - parameters: - - description: dictName - in: query - name: dictName - type: string - - description: dictId - in: query - name: dictId - type: string - - description: dictType - in: query - name: dictType - type: string - - description: 页条数 - in: query - name: pageSize - type: integer - - description: 页码 - in: query - name: pageIndex - type: integer - responses: - "200": - description: '{"code": 200, "data": [...]}' - schema: - $ref: '#/definitions/app.PageResponse' - security: - - Bearer: [] - summary: 字典类型列表数据 - tags: - - 字典类型 - /api/v1/loginlog: - post: - consumes: - - application/json - description: 获取JSON - parameters: - - description: data - in: body - name: data - required: true - schema: - $ref: '#/definitions/models.LoginLog' - type: object - responses: - "200": - description: '{"code": -1, "message": "添加失败"}' - schema: - type: string - security: - - Bearer: [] - summary: 添加登录日志 - tags: - - 登录日志 put: consumes: - application/json @@ -1343,8 +864,7 @@ paths: name: data required: true schema: - $ref: '#/definitions/models.LoginLog' - type: object + $ref: '#/definitions/dto.SysDictTypeControl' responses: "200": description: '{"code": -1, "message": "添加失败"}' @@ -1352,96 +872,10 @@ paths: type: string security: - Bearer: [] - summary: 修改登录日志 + summary: 修改字典类型 tags: - - 登录日志 - /api/v1/loginlog/{infoId}: - delete: - description: 删除数据 - parameters: - - description: 以逗号(,)分割的infoId - in: path - name: infoId - required: true - type: string - responses: - "200": - description: '{"code": -1, "message": "删除失败"}' - schema: - type: string - summary: 批量删除登录日志 - tags: - - 登录日志 - get: - description: 获取JSON - parameters: - - description: infoId - in: path - name: infoId - required: true - type: integer - responses: - "200": - description: '{"code": 200, "data": [...]}' - schema: - $ref: '#/definitions/app.Response' - security: - - Bearer: [] - summary: 通过编码获取登录日志 - tags: - - 登录日志 - /api/v1/loginloglist: - get: - description: 获取JSON - parameters: - - description: status - in: query - name: status - type: string - - description: dictCode - in: query - name: dictCode - type: string - - description: dictType - in: query - name: dictType - type: string - - description: 页条数 - in: query - name: pageSize - type: integer - - description: 页码 - in: query - name: pageIndex - type: integer - responses: - "200": - description: '{"code": 200, "data": [...]}' - schema: - $ref: '#/definitions/app.Response' - security: - - Bearer: [] - summary: 登录日志列表 - tags: - - 登录日志 + - 字典类型 /api/v1/menu: - get: - description: 获取JSON - parameters: - - description: menuName - in: query - name: menuName - type: string - responses: - "200": - description: '{"code": -1, "message": "抱歉未找到相关信息"}' - schema: - type: string - security: - - Bearer: [] - summary: Menu列表数据 - tags: - - 菜单 post: consumes: - application/x-www-form-urlencoded @@ -1486,15 +920,16 @@ paths: summary: 创建菜单 tags: - 菜单 - /api/v1/menu/{id}: + /api/v1/menu/: delete: description: 删除数据 parameters: - - description: id - in: path - name: id + - description: body + in: body + name: data required: true - type: integer + schema: + $ref: '#/definitions/dto.SysMenuById' responses: "200": description: '{"code": -1, "message": "删除失败"}' @@ -1503,6 +938,24 @@ paths: summary: 删除菜单 tags: - 菜单 + /api/v1/menu/{id}: + get: + description: 获取JSON + parameters: + - description: menuName + in: query + name: menuName + type: string + responses: + "200": + description: '{"code": -1, "message": "抱歉未找到相关信息"}' + schema: + type: string + security: + - Bearer: [] + summary: Menu详情数据 + tags: + - 菜单 put: consumes: - application/x-www-form-urlencoded @@ -1518,8 +971,7 @@ paths: name: data required: true schema: - $ref: '#/definitions/models.Menu' - type: object + $ref: '#/definitions/dto.SysMenuControl' responses: "200": description: '{"code": -1, "message": "修改失败"}' @@ -1601,99 +1053,6 @@ paths: summary: 根据角色名称获取菜单列表数据(左菜单使用) tags: - 菜单 - /api/v1/operlog: - post: - consumes: - - application/json - description: 获取JSON - parameters: - - description: data - in: body - name: data - required: true - schema: - $ref: '#/definitions/models.SysOperLog' - type: object - responses: - "200": - description: '{"code": -1, "message": "添加失败"}' - schema: - type: string - security: - - Bearer: [] - summary: 添加操作日志 - tags: - - 操作日志 - /api/v1/operlog/{infoId}: - get: - description: 获取JSON - parameters: - - description: infoId - in: path - name: infoId - required: true - type: integer - responses: - "200": - description: '{"code": 200, "data": [...]}' - schema: - $ref: '#/definitions/app.Response' - security: - - Bearer: [] - summary: 通过编码获取登录日志 - tags: - - 登录日志 - /api/v1/operlog/{operId}: - delete: - description: 删除数据 - parameters: - - description: 以逗号(,)分割的operId - in: path - name: operId - required: true - type: string - responses: - "200": - description: '{"code": -1, "message": "删除失败"}' - schema: - type: string - summary: 批量删除操作日志 - tags: - - 操作日志 - /api/v1/operloglist: - get: - description: 获取JSON - parameters: - - description: status - in: query - name: status - type: string - - description: dictCode - in: query - name: dictCode - type: string - - description: dictType - in: query - name: dictType - type: string - - description: 页条数 - in: query - name: pageSize - type: integer - - description: 页码 - in: query - name: pageIndex - type: integer - responses: - "200": - description: '{"code": 200, "data": [...]}' - schema: - $ref: '#/definitions/app.Response' - security: - - Bearer: [] - summary: 登录日志列表 - tags: - - 登录日志 /api/v1/post: get: description: 获取JSON @@ -1718,7 +1077,7 @@ paths: "200": description: '{"code": 200, "data": [...]}' schema: - $ref: '#/definitions/app.Response' + $ref: '#/definitions/response.Response' security: - Bearer: [] summary: 岗位列表数据 @@ -1734,8 +1093,7 @@ paths: name: data required: true schema: - $ref: '#/definitions/models.Post' - type: object + $ref: '#/definitions/dto.SysPostControl' responses: "200": description: '{"code": -1, "message": "添加失败"}' @@ -1757,8 +1115,7 @@ paths: name: data required: true schema: - $ref: '#/definitions/models.Post' - type: object + $ref: '#/definitions/dto.SysPostControl' responses: "200": description: '{"code": -1, "message": "添加失败"}' @@ -1802,7 +1159,7 @@ paths: "200": description: '{"code": 200, "data": [...]}' schema: - $ref: '#/definitions/app.Response' + $ref: '#/definitions/response.Response' security: - Bearer: [] summary: 获取岗位信息 @@ -1833,81 +1190,25 @@ paths: tags: - 公共接口 /api/v1/role: - get: - description: 获取JSON - parameters: - - description: roleId - in: path - name: roleId - type: string - responses: - "200": - description: '{"code": -1, "message": "抱歉未找到相关信息"}' - schema: - type: string - security: - - Bearer: [] - summary: 获取Role数据 - tags: - - 角色/Role - post: - consumes: - - application/json - description: 获取JSON - parameters: - - description: data - in: body - name: data - required: true - schema: - $ref: '#/definitions/models.SysRole' - type: object - responses: - "200": - description: '{"code": -1, "message": "添加失败"}' - schema: - type: string - summary: 创建角色 - tags: - - 角色/Role - put: - consumes: - - application/json - description: 获取JSON + delete: + description: 删除数据 parameters: - description: body in: body name: data required: true schema: - $ref: '#/definitions/models.SysRole' - type: object - responses: - "200": - description: '{"code": -1, "message": "修改失败"}' - schema: - type: string - summary: 修改用户角色 - tags: - - 角色/Role - /api/v1/role/{roleId}: - delete: - description: 删除数据 - parameters: - - description: roleId - in: path - name: roleId - required: true - type: integer + $ref: '#/definitions/dto.SysRoleById' responses: "200": description: '{"code": -1, "message": "删除失败"}' schema: type: string + security: + - Bearer: [] summary: 删除用户角色 tags: - 角色/Role - /api/v1/rolelist: get: description: Get JSON parameters: @@ -1935,19 +1236,40 @@ paths: "200": description: '{"code": 200, "data": [...]}' schema: - $ref: '#/definitions/app.Response' + $ref: '#/definitions/response.Response' security: - Bearer: [] summary: 角色列表数据 tags: - 角色/Role - /api/v1/rolemenu: + post: + consumes: + - application/json + description: 获取JSON + parameters: + - description: data + in: body + name: data + required: true + schema: + $ref: '#/definitions/dto.SysRoleControl' + responses: + "200": + description: '{"code": -1, "message": "添加失败"}' + schema: + type: string + security: + - Bearer: [] + summary: 创建角色 + tags: + - 角色/Role + /api/v1/role/{id}: get: description: 获取JSON parameters: - - description: RoleId - in: query - name: RoleId + - description: roleId + in: path + name: roleId type: string responses: "200": @@ -1956,30 +1278,30 @@ paths: type: string security: - Bearer: [] - summary: RoleMenu列表数据 + summary: 获取Role数据 tags: - - 角色菜单 - /api/v1/rolemenu/{id}: - delete: - description: 删除数据 + - 角色/Role + put: + consumes: + - application/json + description: 获取JSON parameters: - - description: id - in: path - name: id + - description: body + in: body + name: data required: true - type: string - - description: menu_id - in: query - name: menu_id - type: string + schema: + $ref: '#/definitions/dto.SysRoleControl' responses: "200": - description: '{"code": -1, "message": "删除失败"}' + description: '{"code": -1, "message": "修改失败"}' schema: type: string - summary: 删除用户菜单数据 + security: + - Bearer: [] + summary: 修改用户角色 tags: - - 角色菜单 + - 角色/Role /api/v1/setting: get: description: 获取JSON @@ -1998,7 +1320,7 @@ paths: "200": description: '{"code": 200, "data": [...]}' schema: - $ref: '#/definitions/app.Response' + $ref: '#/definitions/response.Response' summary: 系统信息 tags: - 系统信息 @@ -2033,7 +1355,6 @@ paths: required: true schema: $ref: '#/definitions/tools.SysTables' - type: object responses: "200": description: '{"code": -1, "message": "添加失败"}' @@ -2073,7 +1394,7 @@ paths: "200": description: '{"code": 200, "data": [...]}' schema: - $ref: '#/definitions/app.Response' + $ref: '#/definitions/response.Response' security: - Bearer: [] summary: 获取配置 @@ -2099,21 +1420,26 @@ paths: "200": description: '{"code": 200, "data": [...]}' schema: - $ref: '#/definitions/app.Response' + $ref: '#/definitions/response.Response' summary: 分页列表数据 tags: - 工具 - 生成表 /api/v1/sysUser: get: description: 获取JSON + parameters: + - description: username + in: query + name: username + type: string responses: "200": - description: '{"code": 200, "data": [...]}' + description: '{"code": -1, "message": "抱歉未找到相关信息"}' schema: - $ref: '#/definitions/app.Response' + type: string security: - Bearer: [] - summary: 获取用户角色和职位 + summary: 列表用户信息数据 tags: - 用户 post: @@ -2126,8 +1452,7 @@ paths: name: data required: true schema: - $ref: '#/definitions/models.SysUser' - type: object + $ref: '#/definitions/dto.SysUserControl' responses: "200": description: '{"code": -1, "message": "添加失败"}' @@ -2149,93 +1474,12 @@ paths: "200": description: '{"code": 200, "data": [...]}' schema: - $ref: '#/definitions/app.Response' + $ref: '#/definitions/response.Response' security: - Bearer: [] summary: 获取用户 tags: - 用户 - /api/v1/sysUserList: - get: - description: 获取JSON - parameters: - - description: username - in: query - name: username - type: string - responses: - "200": - description: '{"code": -1, "message": "抱歉未找到相关信息"}' - schema: - type: string - security: - - Bearer: [] - summary: 列表用户信息数据 - tags: - - 用户 - /api/v1/syscategory: - post: - consumes: - - application/json - description: 获取JSON - parameters: - - description: data - in: body - name: data - required: true - schema: - $ref: '#/definitions/models.SysCategory' - type: object - responses: - "200": - description: '{"code": -1, "message": "添加失败"}' - schema: - type: string - summary: 添加分类 - tags: - - 分类 - /api/v1/syscontent: - post: - consumes: - - application/json - description: 获取JSON - parameters: - - description: data - in: body - name: data - required: true - schema: - $ref: '#/definitions/models.SysContent' - type: object - responses: - "200": - description: '{"code": -1, "message": "添加失败"}' - schema: - type: string - summary: 添加内容管理 - tags: - - 内容管理 - /api/v1/sysfiledir: - post: - consumes: - - application/json - description: 获取JSON - parameters: - - description: data - in: body - name: data - required: true - schema: - $ref: '#/definitions/models.SysFileDir' - type: object - responses: - "200": - description: '{"code": -1, "message": "添加失败"}' - schema: - type: string - summary: 添加SysFileDir - tags: - - SysFileDir /api/v1/system/setting: post: description: 获取JSON @@ -2245,8 +1489,7 @@ paths: name: data required: true schema: - $ref: '#/definitions/models.SysUser' - type: object + $ref: '#/definitions/dto.SysSettingControl' responses: "200": description: '{"code": -1, "message": "添加失败"}' @@ -2282,8 +1525,7 @@ paths: name: data required: true schema: - $ref: '#/definitions/models.SysUser' - type: object + $ref: '#/definitions/dto.SysUserControl' responses: "200": description: '{"code": -1, "message": "修改失败"}' @@ -2292,20 +1534,7 @@ paths: summary: 修改用户数据 tags: - 用户 - /api/v1/user/profile: - get: - description: 获取JSON - responses: - "200": - description: '{"code": 200, "data": [...]}' - schema: - $ref: '#/definitions/app.Response' - security: - - Bearer: [] - summary: 获取个人中心用户 - tags: - - 个人中心 - /api/v1/user/profileAvatar: + /api/v1/user/avatar: post: consumes: - multipart/form-data @@ -2324,6 +1553,41 @@ paths: summary: 修改头像 tags: - 用户 + /api/v1/user/profile: + get: + description: 获取JSON + responses: + "200": + description: '{"code": 200, "data": [...]}' + schema: + $ref: '#/definitions/response.Response' + security: + - Bearer: [] + summary: 获取个人中心用户 + tags: + - 个人中心 + /api/v1/user/pwd: + post: + consumes: + - application/json + description: 获取JSON + parameters: + - description: body + in: body + name: data + required: true + schema: + $ref: '#/definitions/dto.PassWord' + responses: + "200": + description: '{"code": 200, "data": [...]}' + schema: + $ref: '#/definitions/response.Response' + security: + - Bearer: [] + summary: 重置密码 + tags: + - 用户 /login: post: consumes: @@ -2341,8 +1605,7 @@ paths: name: account required: true schema: - $ref: '#/definitions/models.Login' - type: object + $ref: '#/definitions/handler.Login' responses: "200": description: '{"code": 200, "expire": "2019-08-07T12:45:48+08:00", "token": @@ -2364,79 +1627,6 @@ paths: security: - Bearer: [] summary: 退出登录 - /sd/cpu: - get: - consumes: - - text/html - description: CPU 使用量 DiskCheck checks the disk usage. - produces: - - text/html - responses: - "200": - description: OK - schema: - type: string - summary: CPU 使用量 - /sd/disk: - get: - consumes: - - text/html - description: 服务器硬盘使用量 DiskCheck checks the disk usage. - produces: - - text/html - responses: - "200": - description: 'OK - Free space: 16321MB (15GB) / 51200MB (50GB) | Used: 31%' - schema: - type: string - "429": - description: WARNING - schema: - type: string - "500": - description: CRITICAL - schema: - type: string - summary: 服务器硬盘使用量 - /sd/health: - get: - consumes: - - text/html - description: 健康状况 - produces: - - text/html - responses: - "200": - description: OK - schema: - type: string - summary: 健康状况 HealthCheck shows OK as the ping-pong result. - /sd/os: - get: - consumes: - - text/html - description: Os - produces: - - text/html - responses: - "200": - description: OK - schema: - type: string - summary: OS - /sd/ram: - get: - consumes: - - text/html - description: 内存使用量 RAMCheck checks the disk usage. - produces: - - text/html - responses: - "200": - description: OK - schema: - type: string - summary: 内存使用量 securityDefinitions: Bearer: in: header diff --git a/examples/run.go b/examples/run.go index 625d3277..2bb61e26 100644 --- a/examples/run.go +++ b/examples/run.go @@ -1,26 +1,28 @@ +// +build examples + package main import ( + "github.com/go-admin-team/go-admin-core/sdk" "log" "github.com/gin-gonic/gin" - "gorm.io/driver/mysql" "gorm.io/gorm" - "go-admin/common/global" - mycasbin "go-admin/pkg/casbin" - "go-admin/pkg/logger" + myCasbin "github.com/go-admin-team/go-admin-core/sdk/pkg/casbin" + "gorm.io/driver/mysql" ) func main() { - var err error - global.Eloquent, err = gorm.Open(mysql.Open("root:123456@tcp/inmg?charset=utf8&parseTime=True&loc=Local"), &gorm.Config{}) + db, err := gorm.Open(mysql.Open("root:123456@tcp/inmg?charset=utf8&parseTime=True&loc=Local"), &gorm.Config{}) if err != nil { panic(err) } - mycasbin.Setup() - logger.Setup() - global.GinEngine = gin.Default() - //router.InitRouter() - log.Fatal(global.GinEngine.Run(":8000")) + syncEnforce := myCasbin.Setup(db, "sys_") + sdk.Runtime.SetDb("*", db) + sdk.Runtime.SetCasbin("*", syncEnforce) + + e := gin.Default() + sdk.Runtime.SetEngine(e) + log.Fatal(e.Run(":8000")) } diff --git a/go.mod b/go.mod index caa3eb7a..0e3eb80b 100644 --- a/go.mod +++ b/go.mod @@ -1,41 +1,31 @@ module go-admin -go 1.14 +go 1.15 require ( - github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 - github.com/casbin/casbin/v2 v2.11.2 - github.com/casbin/gorm-adapter/v3 v3.0.2 - github.com/dgrijalva/jwt-go v3.2.0+incompatible + github.com/alibaba/sentinel-golang v0.6.1 + github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5 + github.com/bytedance/go-tagexpr/v2 v2.7.10 + github.com/casbin/casbin/v2 v2.25.1 github.com/gin-gonic/gin v1.6.3 - github.com/go-ole/go-ole v1.2.4 // indirect - github.com/go-redis/redis/v7 v7.4.0 - github.com/go-sql-driver/mysql v1.5.0 - github.com/gogf/gf v1.13.4 - github.com/google/uuid v1.1.1 - github.com/gorilla/websocket v1.4.2 - github.com/matchstalk/go-admin-core v1.2.0 - github.com/matchstalk/redisqueue v1.0.3 - github.com/mojocn/base64Captcha v1.3.1 + github.com/go-admin-team/go-admin-core v1.3.5-rc.1 + github.com/go-admin-team/go-admin-core/sdk v1.3.5-rc.1 + github.com/google/uuid v1.2.0 github.com/mssola/user_agent v0.5.2 - github.com/pkg/errors v0.9.1 + github.com/opentracing/opentracing-go v1.1.0 + github.com/prometheus/client_golang v1.1.0 github.com/robfig/cron/v3 v3.0.1 - github.com/satori/go.uuid v1.2.0 - github.com/shamsher31/goimgext v1.0.0 // indirect - github.com/shamsher31/goimgtype v1.0.0 github.com/shirou/gopsutil v2.20.7+incompatible github.com/spf13/cast v1.3.1 github.com/spf13/cobra v1.0.0 - github.com/spf13/viper v1.7.1 github.com/swaggo/gin-swagger v1.2.0 github.com/swaggo/swag v1.6.7 github.com/unrolled/secure v1.0.8 - go.uber.org/multierr v1.5.0 // indirect - golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a - gopkg.in/ffmt.v1 v1.5.6 - gorm.io/driver/mysql v0.3.2 - gorm.io/driver/postgres v0.2.9 - gorm.io/driver/sqlite v1.0.9 - gorm.io/gorm v1.20.1 + golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 + golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect + gorm.io/driver/mysql v1.0.4-0.20201206014609-ae5fd10184f6 + gorm.io/driver/postgres v1.0.6-0.20201208020313-1ed927cfab53 + gorm.io/driver/sqlite v1.1.5-0.20201206014648-c84401fbe3ba + gorm.io/gorm v1.21.6 ) diff --git a/go.sum b/go.sum deleted file mode 100644 index 3f614562..00000000 --- a/go.sum +++ /dev/null @@ -1,656 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AlecAivazis/survey/v2 v2.0.5/go.mod h1:WYBhg6f0y/fNYUuesWQc0PKbJcEliGcYHB9sNT3Bg74= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= -github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= -github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= -github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bsm/redislock v0.5.0 h1:ODM11/cbuUXQqLgZWK6XQnufaTjsBE2UcwBc2EAFNDA= -github.com/bsm/redislock v0.5.0/go.mod h1:qagqKlV+xiLy26iV34Y3zRPxRcJjQYbV7pZfWFeSZ8M= -github.com/casbin/casbin/v2 v2.2.2/go.mod h1:XXtYGrs/0zlOsJMeRteEdVi/FsB0ph7KgNfjoCoJUD8= -github.com/casbin/casbin/v2 v2.11.2 h1:kdJ3ZMfPtz6uzKwAaW4G4NIld0U2KeHrgFcEhi40evc= -github.com/casbin/casbin/v2 v2.11.2/go.mod h1:XXtYGrs/0zlOsJMeRteEdVi/FsB0ph7KgNfjoCoJUD8= -github.com/casbin/gorm-adapter/v3 v3.0.2 h1:4F2VFElwPyFzvHfgwizD2JQxk2OFLwvRFZct1np0yBg= -github.com/casbin/gorm-adapter/v3 v3.0.2/go.mod h1:mQI09sqvXfy5p6kZB5HBzZrgKWwxaJ4xMWpd5OGfHRY= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/clbanning/mxj v1.8.5-0.20200714211355-ff02cfb8ea28/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc h1:VRRKCwnzqk8QCaRC4os14xoKDdbHqqlJtJA0oc1ZAjg= -github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/gzip v0.0.1/go.mod h1:fGBJBCdt6qCZuCAOwWuFhBB4OOq9EFqlo5dEaFhhu5w= -github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/git-chglog/git-chglog v0.0.0-20190923122001-6050f20bcdb0/go.mod h1:Dcsy1kii/xFyNad5JqY/d0GO5mu91sungp5xotbm3Yk= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/spec v0.19.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.19.4 h1:ixzUSnHTd6hCemgtAJgluaTSGYpLNpJY4mA2DIkdOAo= -github.com/go-openapi/spec v0.19.4/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-redis/redis v6.15.7+incompatible h1:3skhDh95XQMpnqeqNftPkQD9jL9e5e36z/1SUm6dy1U= -github.com/go-redis/redis v6.15.7+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= -github.com/go-redis/redis/v7 v7.2.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= -github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4= -github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= -github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogf/gf v1.13.4 h1:+IWX/L/SNYjwp9C0tXABZ8vJfYaFKyx0cTAb2DE2a1Y= -github.com/gogf/gf v1.13.4/go.mod h1:dGX0/BElXDBYbdJGascqfrWScj8IMeOietDjVD6/5Fc= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gqcn/structs v1.1.1 h1:cyzGRwfmn3d1d54fwW3KUNyG9QxR0ldIeqwFGeBt638= -github.com/gqcn/structs v1.1.1/go.mod h1:/aBhTBSsKQ2Ec9pbnYdGphtdWXHFn4KrCL0fXM/Adok= -github.com/grokify/html-strip-tags-go v0.0.0-20190921062105-daaa06bf1aaf/go.mod h1:2Su6romC5/1VXOQMaWL2yb618ARB8iVo6/DR99A6d78= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= -github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= -github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= -github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= -github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= -github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= -github.com/jackc/pgconn v1.4.0/go.mod h1:Y2O3ZDF0q4mMacyWV3AstPJpeHXWGEetiFttmq5lahk= -github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= -github.com/jackc/pgconn v1.5.1-0.20200601181101-fa742c524853/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= -github.com/jackc/pgconn v1.6.1 h1:lwofaXKPbIx6qEaK8mNm7uZuOwxHw+PnAFGDsDFpkRI= -github.com/jackc/pgconn v1.6.1/go.mod h1:g8mKMqmSUO6AzAvha7vy07g1rbGOlc7iF0nU0ei83hc= -github.com/jackc/pgconn v1.6.4 h1:S7T6cx5o2OqmxdHaXLH1ZeD1SbI8jBznyYE9Ec0RCQ8= -github.com/jackc/pgconn v1.6.4/go.mod h1:w2pne1C2tZgP+TvjqLpOigGzNqjBgQW9dUw/4Chex78= -github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= -github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= -github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= -github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= -github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= -github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= -github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.0.2 h1:q1Hsy66zh4vuNsajBUF2PNqfAMMfxU5mk594lPE9vjY= -github.com/jackc/pgproto3/v2 v2.0.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8 h1:Q3tB+ExeflWUW7AFcAhXqk40s9mnNYLk1nOkKNZ5GnU= -github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= -github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= -github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= -github.com/jackc/pgtype v1.2.0/go.mod h1:5m2OfMh1wTK7x+Fk952IDmI4nw3nPrvtQdM0ZT4WpC0= -github.com/jackc/pgtype v1.3.1-0.20200510190516-8cd94a14c75a/go.mod h1:vaogEUkALtxZMCH411K+tKzNpwzCKU+AnPzBKZ+I+Po= -github.com/jackc/pgtype v1.3.1-0.20200606141011-f6355165a91c/go.mod h1:cvk9Bgu/VzJ9/lxTO5R5sf80p0DiucVtN7ZxvaC4GmQ= -github.com/jackc/pgtype v1.4.0 h1:pHQfb4jh9iKqHyxPthq1fr+0HwSNIl3btYPbw2m2lbM= -github.com/jackc/pgtype v1.4.0/go.mod h1:JCULISAZBFGrHaOXIIFiyfzW5VY0GRitRr8NeJsrdig= -github.com/jackc/pgtype v1.4.2 h1:t+6LWm5eWPLX1H5Se702JSBcirq6uWa4jiG4wV1rAWY= -github.com/jackc/pgtype v1.4.2/go.mod h1:JCULISAZBFGrHaOXIIFiyfzW5VY0GRitRr8NeJsrdig= -github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= -github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= -github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= -github.com/jackc/pgx/v4 v4.5.0/go.mod h1:EpAKPLdnTorwmPUUsqrPxy5fphV18j9q3wrfRXgo+kA= -github.com/jackc/pgx/v4 v4.6.1-0.20200510190926-94ba730bb1e9/go.mod h1:t3/cdRQl6fOLDxqtlyhe9UWgfIi9R8+8v8GKV5TRA/o= -github.com/jackc/pgx/v4 v4.6.1-0.20200606145419-4e5062306904/go.mod h1:ZDaNWkt9sW1JMiNn0kdYBaLelIhw7Pg4qd+Vk6tw7Hg= -github.com/jackc/pgx/v4 v4.7.1 h1:aqUSOcStk6fik+lSE+tqfFhvt/EwT8q/oMtJbP9CjXI= -github.com/jackc/pgx/v4 v4.7.1/go.mod h1:nu42q3aPjuC1M0Nak4bnoprKlXPINqopEKqbq5AZSC4= -github.com/jackc/pgx/v4 v4.8.1 h1:SUbCLP2pXvf/Sr/25KsuI4aTxiFYIvpfk4l6aTSdyCw= -github.com/jackc/pgx/v4 v4.8.1/go.mod h1:4HOLxrl8wToZJReD04/yB20GDwf4KBYETvlHciCnwW0= -github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= -github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.1 h1:g39TucaRWyV3dwDO++eEc6qf8TVIQ/Da48WmqjZ3i7E= -github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/matchstalk/go-admin-core v1.2.0 h1:yk8bnH7dVGDgyEliG2MchSyupdh24wc0sDUrxnu8sGY= -github.com/matchstalk/go-admin-core v1.2.0/go.mod h1:iCxDnmPHR3+d/5Q+yrdt+QBXhmWhbj7+GeHcUjD9Rn8= -github.com/matchstalk/redisqueue v1.0.3 h1:ZRrEhnvA6/YxLu2EbzdZYeQHQQYT8yZBAi1qv/USEQA= -github.com/matchstalk/redisqueue v1.0.3/go.mod h1:5DZ3X4w9t+6Wv9vz9wmUt/i15gsOorGXRnqzGhBP6zI= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= -github.com/mattn/goveralls v0.0.5/go.mod h1:Xg2LHi51faXLyKXwsndxiW6uxEEQT9+3sjGzzwU4xy0= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/mojocn/base64Captcha v1.3.1 h1:2Wbkt8Oc8qjmNJ5GyOfSo4tgVQPsbKMftqASnq8GlT0= -github.com/mojocn/base64Captcha v1.3.1/go.mod h1:wAQCKEc5bDujxKRmbT6/vTnTt5CjStQ8bRfPWUuz/iY= -github.com/mssola/user_agent v0.5.2 h1:CZkTUahjL1+OcZ5zv3kZr8QiJ8jy2H08vZIEkBeRbxo= -github.com/mssola/user_agent v0.5.2/go.mod h1:TTPno8LPY3wAIEKRpAtkdMT0f8SE24pLRGPahjCH4uw= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= -github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= -github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shamsher31/goimgext v1.0.0 h1:wFKf9GeeE0Xr6UQtliaPgYYgTju2izobM7XpCEgUCC8= -github.com/shamsher31/goimgext v1.0.0/go.mod h1:rYLKgXuTGBIaH49z+jUVSWz7gUWIZmqvYUsdvJbNNOc= -github.com/shamsher31/goimgtype v1.0.0 h1:7nmPz5GEb01sjFUojCbZJcBI68A8tmLXoCFbb5I34u4= -github.com/shamsher31/goimgtype v1.0.0/go.mod h1:OZm3NZQDbK0ezlk9IV5oq3cWQwjF1oVSxKNx19bkf64= -github.com/shirou/gopsutil v2.20.7+incompatible h1:Ymv4OD12d6zm+2yONe39VSmp2XooJe8za7ngOLW/o/w= -github.com/shirou/gopsutil v2.20.7+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= -github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14/go.mod h1:gxQT6pBGRuIGunNf/+tSOB5OHvguWi8Tbt82WOkf35E= -github.com/swaggo/gin-swagger v1.2.0 h1:YskZXEiv51fjOMTsXrOetAjrMDfFaXD79PEoQBOe2W0= -github.com/swaggo/gin-swagger v1.2.0/go.mod h1:qlH2+W7zXGZkczuL+r2nEBR2JTT+/lX05Nn6vPhc7OI= -github.com/swaggo/swag v1.5.1/go.mod h1:1Bl9F/ZBpVWh22nY0zmYyASPO1lI/zIwRDrpZU+tv8Y= -github.com/swaggo/swag v1.6.7 h1:e8GC2xDllJZr3omJkm9YfmK0Y56+rMO3cg0JBKNz09s= -github.com/swaggo/swag v1.6.7/go.mod h1:xDhTyuFIujYiN3DKWC/H/83xcfHp+UE/IzWWampG7Zc= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tsuyoshiwada/go-gitcmd v0.0.0-20180205145712-5f1f5f9475df/go.mod h1:pnyouUty/nBr/zm3GYwTIt+qFTLWbdjeLjZmJdzJOu8= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.5-pre/go.mod h1:FwP/aQVg39TXzItUBMwnWp9T9gPQnXw4Poh4/oBQZ/0= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181022190402-e5e69e061d4f/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.5-pre/go.mod h1:tULtS6Gy1AE1yCENaw4Vb//HLH5njI2tfCQDUqRd8fI= -github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/unrolled/secure v1.0.8 h1:JaMvKbe4CRt8oyxVXn+xY+6jlqd7pyJNSVkmsBxxQsM= -github.com/unrolled/secure v1.0.8/go.mod h1:fO+mEan+FLB0CdEnHf6Q4ZZVNqG+5fuLFnP8p0BXDPI= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.3/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190501045829-6d32002ffd75/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190530182044-ad28b68e88f1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae h1:Ih9Yo4hSPImZOpfGuA4bR/ORKTAbhZo2AbWNRCnevdo= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606050223-4d9ae51c2468/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190611222205-d73e1c7e250b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200113040837-eac381796e91 h1:OOkytthzFBKHY5EfEgLUabprb0LtJVkQtNxAQ02+UE4= -golang.org/x/tools v0.0.0-20200113040837-eac381796e91/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -gopkg.in/AlecAivazis/survey.v1 v1.8.8/go.mod h1:CaHjv79TCgAvXMSFJSVgonHXYWxnhzI3eoHtnX5UgUo= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/ffmt.v1 v1.5.6 h1:4Bu3riZp5sAIXW2T/18JM9BkwJLodurXFR0f7PXp+cw= -gopkg.in/ffmt.v1 v1.5.6/go.mod h1:LssvGOZFiBGoBcobkTqnyh+uN1VzIRoibW+c0JI/Ha4= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/kyokomi/emoji.v1 v1.5.1/go.mod h1:N9AZ6hi1jHOPn34PsbpufQZUcKftSD7WgS2pgpmH4Lg= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/driver/mysql v0.3.0 h1:LPEy7sEsoZHSPiUk9ySGJLEmWQfbj7MWqE4sTwG7nx4= -gorm.io/driver/mysql v0.3.0/go.mod h1:A7H1JD9dKdcjeUTpTuWKEC+E1a74qzW7/zaXqKaTbfM= -gorm.io/driver/mysql v0.3.2 h1:Kaa0S+IHW+4qow6dRAdekNYaKeGBboIkh44pYdLWjIE= -gorm.io/driver/mysql v0.3.2/go.mod h1:jC/HyPAZJ0xqfGlOqYybd8oNPMtGrkNgvwjWuKDT7f0= -gorm.io/driver/postgres v0.2.6 h1:hoE6SzA5wKOo6AYxz2V7ooxnzD6S6ToLAHHDDawt+b0= -gorm.io/driver/postgres v0.2.6/go.mod h1:AsPyuhKFOplSmQwOPsycVKbe0dRxF8v18KZ7p9i8dIs= -gorm.io/driver/postgres v0.2.9 h1:oMY4f4tLEUVg3eapqHFzVEplWKy1Gj1cGBEe9wJ1yWM= -gorm.io/driver/postgres v0.2.9/go.mod h1:YATpayFLKALuiVXVRNbDfoEJwECHSMYzl1SmXJ2+CIg= -gorm.io/driver/sqlite v1.0.9/go.mod h1:xkm8/CEmA3yc4zRd0pdCqm43BjO8Hm6avfTpxWb/7c4= -gorm.io/driver/sqlserver v0.2.4 h1:AGofGL/TfzTZotzIHlaLISfxEKJpzj0ATbtXJW+ga1A= -gorm.io/driver/sqlserver v0.2.4/go.mod h1:TcPfkdce5b8qlCMgyUeUdm7HQa1ZzWUuxzI+odcueLA= -gorm.io/gorm v0.2.7/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= -gorm.io/gorm v0.2.19/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= -gorm.io/gorm v0.2.23/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= -gorm.io/gorm v0.2.36/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= -gorm.io/gorm v0.2.38 h1:zHrkh0Xckf78itpEmA4MdjgU9HcelE3gG5FeEb+MQYM= -gorm.io/gorm v0.2.38/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= -gorm.io/gorm v1.20.1 h1:+hOwlHDqvqmBIMflemMVPLJH7tZYK4RxFDBHEfJTup0= -gorm.io/gorm v1.20.1/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/logger/context.go b/logger/context.go deleted file mode 100644 index 6940122d..00000000 --- a/logger/context.go +++ /dev/null @@ -1,14 +0,0 @@ -package logger - -import "context" - -type loggerKey struct{} - -func FromContext(ctx context.Context) (Logger, bool) { - l, ok := ctx.Value(loggerKey{}).(Logger) - return l, ok -} - -func NewContext(ctx context.Context, l Logger) context.Context { - return context.WithValue(ctx, loggerKey{}, l) -} diff --git a/logger/default.go b/logger/default.go deleted file mode 100644 index 294c049f..00000000 --- a/logger/default.go +++ /dev/null @@ -1,185 +0,0 @@ -package logger - -import ( - "context" - "fmt" - "os" - "runtime" - "sort" - "strings" - "sync" - "time" - - dlog "go-admin/debug/log" -) - -func init() { - lvl, err := GetLevel(os.Getenv("GO_ADMIN_LOG_LEVEL")) - if err != nil { - lvl = InfoLevel - } - - DefaultLogger = NewHelper(NewLogger(WithLevel(lvl))) -} - -type defaultLogger struct { - sync.RWMutex - opts Options -} - -// Init(opts...) should only overwrite provided options -func (l *defaultLogger) Init(opts ...Option) error { - for _, o := range opts { - o(&l.opts) - } - return nil -} - -func (l *defaultLogger) String() string { - return "default" -} - -func (l *defaultLogger) Fields(fields map[string]interface{}) Logger { - l.Lock() - l.opts.Fields = copyFields(fields) - l.Unlock() - return l -} - -func copyFields(src map[string]interface{}) map[string]interface{} { - dst := make(map[string]interface{}, len(src)) - for k, v := range src { - dst[k] = v - } - return dst -} - -// logCallerfilePath returns a package/file:line description of the caller, -// preserving only the leaf directory name and file name. -func logCallerfilePath(loggingFilePath string) string { - // To make sure we trim the path correctly on Windows too, we - // counter-intuitively need to use '/' and *not* os.PathSeparator here, - // because the path given originates from Go stdlib, specifically - // runtime.Caller() which (as of Mar/17) returns forward slashes even on - // Windows. - // - // See https://github.com/golang/go/issues/3335 - // and https://github.com/golang/go/issues/18151 - // - // for discussion on the issue on Go side. - idx := strings.LastIndexByte(loggingFilePath, '/') - if idx == -1 { - return loggingFilePath - } - idx = strings.LastIndexByte(loggingFilePath[:idx], '/') - if idx == -1 { - return loggingFilePath - } - return loggingFilePath[idx+1:] -} - -func (l *defaultLogger) Log(level Level, v ...interface{}) { - // TODO decide does we need to write message if log level not used? - if !l.opts.Level.Enabled(level) { - return - } - - l.RLock() - fields := copyFields(l.opts.Fields) - l.RUnlock() - - fields["level"] = level.String() - - if _, file, line, ok := runtime.Caller(l.opts.CallerSkipCount); ok { - fields["file"] = fmt.Sprintf("%s:%d", logCallerfilePath(file), line) - } - - rec := dlog.Record{ - Timestamp: time.Now(), - Message: fmt.Sprint(v...), - Metadata: make(map[string]string, len(fields)), - } - - keys := make([]string, 0, len(fields)) - for k, v := range fields { - keys = append(keys, k) - rec.Metadata[k] = fmt.Sprintf("%v", v) - } - - sort.Strings(keys) - metadata := "" - - for _, k := range keys { - metadata += fmt.Sprintf(" %s=%v", k, fields[k]) - } - - t := rec.Timestamp.Format("2006-01-02 15:04:05") - fmt.Printf("%s %s %v\n", t, metadata, rec.Message) -} - -func (l *defaultLogger) Logf(level Level, format string, v ...interface{}) { - // TODO decide does we need to write message if log level not used? - if level < l.opts.Level { - return - } - - l.RLock() - fields := copyFields(l.opts.Fields) - l.RUnlock() - - fields["level"] = level.String() - - if _, file, line, ok := runtime.Caller(l.opts.CallerSkipCount); ok { - fields["file"] = fmt.Sprintf("%s:%d", logCallerfilePath(file), line) - } - - rec := dlog.Record{ - Timestamp: time.Now(), - Message: fmt.Sprintf(format, v...), - Metadata: make(map[string]string, len(fields)), - } - - keys := make([]string, 0, len(fields)) - for k, v := range fields { - keys = append(keys, k) - rec.Metadata[k] = fmt.Sprintf("%v", v) - } - - sort.Strings(keys) - metadata := "" - - for _, k := range keys { - metadata += fmt.Sprintf(" %s=%v", k, fields[k]) - } - - t := rec.Timestamp.Format("2006-01-02 15:04:05") - fmt.Printf("%s %s %v\n", t, metadata, rec.Message) -} - -func (l *defaultLogger) Options() Options { - // not guard against options Context values - l.RLock() - opts := l.opts - opts.Fields = copyFields(l.opts.Fields) - l.RUnlock() - return opts -} - -// NewLogger builds a new logger based on options -func NewLogger(opts ...Option) Logger { - // Default options - options := Options{ - Level: InfoLevel, - Fields: make(map[string]interface{}), - Out: os.Stderr, - CallerSkipCount: 2, - Context: context.Background(), - } - - l := &defaultLogger{opts: options} - if err := l.Init(opts...); err != nil { - l.Log(FatalLevel, err) - } - - return l -} diff --git a/logger/helper.go b/logger/helper.go deleted file mode 100644 index 94c2f364..00000000 --- a/logger/helper.go +++ /dev/null @@ -1,114 +0,0 @@ -package logger - -import ( - "os" -) - -type Helper struct { - Logger - fields map[string]interface{} -} - -func NewHelper(log Logger) *Helper { - return &Helper{Logger: log} -} - -func (h *Helper) Info(args ...interface{}) { - if !h.Logger.Options().Level.Enabled(InfoLevel) { - return - } - h.Logger.Fields(h.fields).Log(InfoLevel, args...) -} - -func (h *Helper) Infof(template string, args ...interface{}) { - if !h.Logger.Options().Level.Enabled(InfoLevel) { - return - } - h.Logger.Fields(h.fields).Logf(InfoLevel, template, args...) -} - -func (h *Helper) Trace(args ...interface{}) { - if !h.Logger.Options().Level.Enabled(TraceLevel) { - return - } - h.Logger.Fields(h.fields).Log(TraceLevel, args...) -} - -func (h *Helper) Tracef(template string, args ...interface{}) { - if !h.Logger.Options().Level.Enabled(TraceLevel) { - return - } - h.Logger.Fields(h.fields).Logf(TraceLevel, template, args...) -} - -func (h *Helper) Debug(args ...interface{}) { - if !h.Logger.Options().Level.Enabled(DebugLevel) { - return - } - h.Logger.Fields(h.fields).Log(DebugLevel, args...) -} - -func (h *Helper) Debugf(template string, args ...interface{}) { - if !h.Logger.Options().Level.Enabled(DebugLevel) { - return - } - h.Logger.Fields(h.fields).Logf(DebugLevel, template, args...) -} - -func (h *Helper) Warn(args ...interface{}) { - if !h.Logger.Options().Level.Enabled(WarnLevel) { - return - } - h.Logger.Fields(h.fields).Log(WarnLevel, args...) -} - -func (h *Helper) Warnf(template string, args ...interface{}) { - if !h.Logger.Options().Level.Enabled(WarnLevel) { - return - } - h.Logger.Fields(h.fields).Logf(WarnLevel, template, args...) -} - -func (h *Helper) Error(args ...interface{}) { - if !h.Logger.Options().Level.Enabled(ErrorLevel) { - return - } - h.Logger.Fields(h.fields).Log(ErrorLevel, args...) -} - -func (h *Helper) Errorf(template string, args ...interface{}) { - if !h.Logger.Options().Level.Enabled(ErrorLevel) { - return - } - h.Logger.Fields(h.fields).Logf(ErrorLevel, template, args...) -} - -func (h *Helper) Fatal(args ...interface{}) { - if !h.Logger.Options().Level.Enabled(FatalLevel) { - return - } - h.Logger.Fields(h.fields).Log(FatalLevel, args...) - os.Exit(1) -} - -func (h *Helper) Fatalf(template string, args ...interface{}) { - if !h.Logger.Options().Level.Enabled(FatalLevel) { - return - } - h.Logger.Fields(h.fields).Logf(FatalLevel, template, args...) - os.Exit(1) -} - -func (h *Helper) WithError(err error) *Helper { - fields := copyFields(h.fields) - fields["error"] = err - return &Helper{Logger: h.Logger, fields: fields} -} - -func (h *Helper) WithFields(fields map[string]interface{}) *Helper { - nfields := copyFields(fields) - for k, v := range h.fields { - nfields[k] = v - } - return &Helper{Logger: h.Logger, fields: nfields} -} diff --git a/logger/level.go b/logger/level.go deleted file mode 100644 index 915f0d47..00000000 --- a/logger/level.go +++ /dev/null @@ -1,126 +0,0 @@ -package logger - -import ( - "fmt" - "os" -) - -type Level int8 - -const ( - // TraceLevel level. Designates finer-grained informational events than the Debug. - TraceLevel Level = iota - 2 - // DebugLevel level. Usually only enabled when debugging. Very verbose logging. - DebugLevel - // InfoLevel is the default logging priority. - // General operational entries about what's going on inside the application. - InfoLevel - // WarnLevel level. Non-critical entries that deserve eyes. - WarnLevel - // ErrorLevel level. Logs. Used for errors that should definitely be noted. - ErrorLevel - // FatalLevel level. Logs and then calls `logger.Exit(1)`. highest level of severity. - FatalLevel -) - -func (l Level) String() string { - switch l { - case TraceLevel: - return "trace" - case DebugLevel: - return "debug" - case InfoLevel: - return "info" - case WarnLevel: - return "warn" - case ErrorLevel: - return "error" - case FatalLevel: - return "fatal" - } - return "" -} - -// Enabled returns true if the given level is at or above this level. -func (l Level) Enabled(lvl Level) bool { - return lvl >= l -} - -// GetLevel converts a level string into a logger Level value. -// returns an error if the input string does not match known values. -func GetLevel(levelStr string) (Level, error) { - switch levelStr { - case TraceLevel.String(): - return TraceLevel, nil - case DebugLevel.String(): - return DebugLevel, nil - case InfoLevel.String(): - return InfoLevel, nil - case WarnLevel.String(): - return WarnLevel, nil - case ErrorLevel.String(): - return ErrorLevel, nil - case FatalLevel.String(): - return FatalLevel, nil - } - return InfoLevel, fmt.Errorf("Unknown Level String: '%s', defaulting to InfoLevel", levelStr) -} - -func Info(args ...interface{}) { - DefaultLogger.Log(InfoLevel, args...) -} - -func Infof(template string, args ...interface{}) { - DefaultLogger.Logf(InfoLevel, template, args...) -} - -func Trace(args ...interface{}) { - DefaultLogger.Log(TraceLevel, args...) -} - -func Tracef(template string, args ...interface{}) { - DefaultLogger.Logf(TraceLevel, template, args...) -} - -func Debug(args ...interface{}) { - DefaultLogger.Log(DebugLevel, args...) -} - -func Debugf(template string, args ...interface{}) { - DefaultLogger.Logf(DebugLevel, template, args...) -} - -func Warn(args ...interface{}) { - DefaultLogger.Log(WarnLevel, args...) -} - -func Warnf(template string, args ...interface{}) { - DefaultLogger.Logf(WarnLevel, template, args...) -} - -func Error(args ...interface{}) { - DefaultLogger.Log(ErrorLevel, args...) -} - -func Errorf(template string, args ...interface{}) { - DefaultLogger.Logf(ErrorLevel, template, args...) -} - -func Fatal(args ...interface{}) { - DefaultLogger.Log(FatalLevel, args...) - os.Exit(1) -} - -func Fatalf(template string, args ...interface{}) { - DefaultLogger.Logf(FatalLevel, template, args...) - os.Exit(1) -} - -// Returns true if the given level is at or lower the current logger level -func V(lvl Level, log Logger) bool { - l := DefaultLogger - if log != nil { - l = log - } - return l.Options().Level <= lvl -} diff --git a/logger/logger.go b/logger/logger.go deleted file mode 100644 index ad3b41a1..00000000 --- a/logger/logger.go +++ /dev/null @@ -1,43 +0,0 @@ -// Package log provides a log interface -package logger - -var ( - // Default logger - DefaultLogger Logger = NewHelper(NewLogger()) -) - -// Logger is a generic logging interface -type Logger interface { - // Init initialises options - Init(options ...Option) error - // The Logger options - Options() Options - // Fields set fields to always be logged - Fields(fields map[string]interface{}) Logger - // Log writes a log entry - Log(level Level, v ...interface{}) - // Logf writes a formatted log entry - Logf(level Level, format string, v ...interface{}) - // String returns the name of logger - String() string -} - -func Init(opts ...Option) error { - return DefaultLogger.Init(opts...) -} - -func Fields(fields map[string]interface{}) Logger { - return DefaultLogger.Fields(fields) -} - -func Log(level Level, v ...interface{}) { - DefaultLogger.Log(level, v...) -} - -func Logf(level Level, format string, v ...interface{}) { - DefaultLogger.Logf(level, format, v...) -} - -func String() string { - return DefaultLogger.String() -} diff --git a/logger/logger_test.go b/logger/logger_test.go deleted file mode 100644 index f36a3a3b..00000000 --- a/logger/logger_test.go +++ /dev/null @@ -1,18 +0,0 @@ -package logger - -import ( - "testing" -) - -func TestLogger(t *testing.T) { - l := NewLogger(WithLevel(TraceLevel)) - h1 := NewHelper(l).WithFields(map[string]interface{}{"key1": "val1"}) - h1.Trace("trace_msg1") - h1.Warn("warn_msg1") - - h2 := NewHelper(l).WithFields(map[string]interface{}{"key2": "val2"}) - h2.Trace("trace_msg2") - h2.Warn("warn_msg2") - - l.Fields(map[string]interface{}{"key3": "val4"}).Log(InfoLevel, "test_msg") -} diff --git a/logger/options.go b/logger/options.go deleted file mode 100644 index d0a03302..00000000 --- a/logger/options.go +++ /dev/null @@ -1,58 +0,0 @@ -package logger - -import ( - "context" - "io" -) - -type Option func(*Options) - -type Options struct { - // The logging level the logger should log at. default is `InfoLevel` - Level Level - // fields to always be logged - Fields map[string]interface{} - // It's common to set this to a file, or leave it default which is `os.Stderr` - Out io.Writer - // Caller skip frame count for file:line info - CallerSkipCount int - // Alternative options - Context context.Context -} - -// WithFields set default fields for the logger -func WithFields(fields map[string]interface{}) Option { - return func(args *Options) { - args.Fields = fields - } -} - -// WithLevel set default level for the logger -func WithLevel(level Level) Option { - return func(args *Options) { - args.Level = level - } -} - -// WithOutput set default output writer for the logger -func WithOutput(out io.Writer) Option { - return func(args *Options) { - args.Out = out - } -} - -// WithCallerSkipCount set frame count to skip -func WithCallerSkipCount(c int) Option { - return func(args *Options) { - args.CallerSkipCount = c - } -} - -func SetOption(k, v interface{}) Option { - return func(o *Options) { - if o.Context == nil { - o.Context = context.Background() - } - o.Context = context.WithValue(o.Context, k, v) - } -} diff --git a/main.go b/main.go index 1ce5f4fb..7e2c69f9 100644 --- a/main.go +++ b/main.go @@ -4,70 +4,18 @@ import ( "go-admin/cmd" ) +//go:generate swag init --parseDependency --parseDepth=6 + // @title go-admin API -// @version 1.0.1 +// @version 1.3.1 // @description 基于Gin + Vue + Element UI的前后端分离权限管理系统的接口文档 // @description 添加qq群: 74520518 进入技术交流群 请备注,谢谢! // @license.name MIT -// @license.url https://github.com/wenjianzhang/go-admin/blob/master/LICENSE.md +// @license.url https://github.com/go-admin-team/go-admin/blob/master/LICENSE.md // @securityDefinitions.apikey Bearer // @in header // @name Authorization - -//func main() { -// configName := "settings" -// -// -// config.InitConfig(configName) -// -// gin.SetMode(gin.DebugMode) -// log.Println(config.DatabaseConfig.Port) -// -// err := gorm.AutoMigrate(orm.Eloquent) -// if err != nil { -// log.Fatalln("数据库初始化失败 err: %v", err) -// } -// -// if config.ApplicationConfig.IsInit { -// if err := models.InitDb(); err != nil { -// log.Fatal("数据库基础数据初始化失败!") -// } else { -// config.SetApplicationIsInit() -// } -// } -// -// r := router.InitRouter() -// -// defer orm.Eloquent.Close() -// -// srv := &http.Server{ -// Addr: config.ApplicationConfig.Host + ":" + config.ApplicationConfig.Port, -// Handler: r, -// } -// -// go func() { -// // 服务连接 -// if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { -// log.Fatalf("listen: %s\n", err) -// } -// }() -// log.Println("Server Run ", config.ApplicationConfig.Host+":"+config.ApplicationConfig.Port) -// log.Println("Enter Control + C Shutdown Server") -// // 等待中断信号以优雅地关闭服务器(设置 5 秒的超时时间) -// quit := make(chan os.Signal) -// signal.Notify(quit, os.Interrupt) -// <-quit -// log.Println("Shutdown Server ...") -// -// ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) -// defer cancel() -// if err := srv.Shutdown(ctx); err != nil { -// log.Fatal("Server Shutdown:", err) -// } -// log.Println("Server exiting") -//} - func main() { cmd.Execute() } diff --git a/pkg/cache/doc.go b/pkg/cache/doc.go deleted file mode 100644 index d50e5b1a..00000000 --- a/pkg/cache/doc.go +++ /dev/null @@ -1,6 +0,0 @@ -package cache - -// 缓存+队列套件,redis队列使用时,请参考单元测试中的配置 -// 目前支持: -// - redis -// - memory diff --git a/pkg/cache/memory.go b/pkg/cache/memory.go deleted file mode 100644 index 747748b9..00000000 --- a/pkg/cache/memory.go +++ /dev/null @@ -1,15 +0,0 @@ -package cache - -import ( - "github.com/matchstalk/go-admin-core/cache" -) - -var MemoryAdapter Adapter - -func InitMemory() error { - MemoryAdapter = &cache.Memory{ - PoolNum: 100, - } - err := MemoryAdapter.Connect() - return err -} diff --git a/pkg/cache/memory_test.go b/pkg/cache/memory_test.go deleted file mode 100644 index 6db5bced..00000000 --- a/pkg/cache/memory_test.go +++ /dev/null @@ -1,46 +0,0 @@ -package cache - -import ( - "fmt" - "testing" - "time" - - "github.com/matchstalk/go-admin-core/cache" -) - -func TestInitMemory(t *testing.T) { - tests := []struct { - name string - wantErr bool - }{ - { - "test01", - false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if err := InitMemory(); (err != nil) != tt.wantErr { - t.Errorf("InitRedis() error = %v, wantErr %v", err, tt.wantErr) - } - MemoryAdapter.Set("test", "1", 100) - key, _ := MemoryAdapter.Get("test") - message := &cache.MemoryMessage{} - message.Stream = "queuetest" - message.Values = map[string]interface{}{ - "key": "value", - } - MemoryAdapter.Append("queuetest", message) - MemoryAdapter.Register("queuetest", func(message cache.Message) error { - fmt.Println(message.GetValues()) - return nil - }) - go func() { - MemoryAdapter.Run() - }() - time.Sleep(time.Second) - MemoryAdapter.Shutdown() - fmt.Println(key) - }) - } -} diff --git a/pkg/cache/redis.go b/pkg/cache/redis.go deleted file mode 100644 index 232ae275..00000000 --- a/pkg/cache/redis.go +++ /dev/null @@ -1,32 +0,0 @@ -package cache - -import ( - "time" - - "github.com/go-redis/redis/v7" - "github.com/matchstalk/go-admin-core/cache" - "github.com/matchstalk/redisqueue" -) - -var RedisAdapter Adapter - -func InitRedis() error { - RedisAdapter = &cache.Redis{ - ConnectOption: &redis.Options{ - Addr: "127.0.0.1:6379", - }, - ConsumerOptions: &redisqueue.ConsumerOptions{ - VisibilityTimeout: 60 * time.Second, - BlockingTimeout: 5 * time.Second, - ReclaimInterval: 1 * time.Second, - BufferSize: 100, - Concurrency: 10, - }, - ProducerOptions: &redisqueue.ProducerOptions{ - StreamMaxLength: 100, - ApproximateMaxLength: true, - }, - } - err := RedisAdapter.Connect() - return err -} diff --git a/pkg/cache/redis_test.go b/pkg/cache/redis_test.go deleted file mode 100644 index 9459daea..00000000 --- a/pkg/cache/redis_test.go +++ /dev/null @@ -1,46 +0,0 @@ -package cache - -import ( - "fmt" - "testing" - "time" - - "github.com/matchstalk/go-admin-core/cache" -) - -func TestInitRedis(t *testing.T) { - tests := []struct { - name string - wantErr bool - }{ - { - "test01", - false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if err := InitRedis(); (err != nil) != tt.wantErr { - t.Errorf("InitRedis() error = %v, wantErr %v", err, tt.wantErr) - } - RedisAdapter.Set("test", "1", 100) - key, _ := RedisAdapter.Get("test") - message := &cache.RedisMessage{} - message.Stream = "queuetest" - message.Values = map[string]interface{}{ - "key": "value", - } - RedisAdapter.Append("queuetest", message) - RedisAdapter.Register("queuetest", func(message cache.Message) error { - fmt.Println(message.GetValues()) - return nil - }) - go func() { - RedisAdapter.Run() - }() - time.Sleep(time.Second) - RedisAdapter.Shutdown() - fmt.Println(key) - }) - } -} diff --git a/pkg/cache/type.go b/pkg/cache/type.go deleted file mode 100644 index ffd00204..00000000 --- a/pkg/cache/type.go +++ /dev/null @@ -1,29 +0,0 @@ -package cache - -import ( - "time" - - "github.com/matchstalk/go-admin-core/cache" -) - -type Adapter interface { - Connect() error - Get(key string) (string, error) - Set(key string, val interface{}, expire int) error - Del(key string) error - HashGet(hk, key string) (string, error) - HashDel(hk, key string) error - Increase(key string) error - Decrease(key string) error - Expire(key string, dur time.Duration) error - cache.AdapterQueue -} - -type Message interface { - SetID(string) - SetStream(string) - SetValues(map[string]interface{}) - GetID() string - GetStream() string - GetValues() map[string]interface{} -} diff --git a/pkg/casbin/mycasbin.go b/pkg/casbin/mycasbin.go deleted file mode 100644 index 622a3e69..00000000 --- a/pkg/casbin/mycasbin.go +++ /dev/null @@ -1,60 +0,0 @@ -package mycasbin - -import ( - "log" - - "github.com/casbin/casbin/v2" - "github.com/casbin/casbin/v2/model" - gormAdapter "github.com/casbin/gorm-adapter/v3" - _ "github.com/go-sql-driver/mysql" - - "go-admin/common/global" -) - -// Initialize the model from a string. -var text = ` -[request_definition] -r = sub, obj, act - -[policy_definition] -p = sub, obj, act - -[policy_effect] -e = some(where (p.eft == allow)) - -[matchers] -m = r.sub == p.sub && (keyMatch2(r.obj, p.obj) || keyMatch(r.obj, p.obj)) && (r.act == p.act || p.act == "*") -` - -func Setup() { - Apter, err := gormAdapter.NewAdapterByDBUsePrefix(global.Eloquent, "sys_") - if err != nil { - panic(err) - } - m, err := model.NewModelFromString(text) - if err != nil { - panic(err) - } - e, err := casbin.NewSyncedEnforcer(m, Apter) - if err != nil { - panic(err) - } - err = e.LoadPolicy() - if err != nil { - panic(err) - } - global.CasbinEnforcer = e -} - -func Casbin() *casbin.SyncedEnforcer { - return global.CasbinEnforcer -} - -func LoadPolicy() (*casbin.SyncedEnforcer, error) { - if err := global.CasbinEnforcer.LoadPolicy(); err == nil { - return global.CasbinEnforcer, err - } else { - log.Printf("casbin rbac_model or policy init error, message: %v \r\n", err.Error()) - return nil, err - } -} diff --git a/pkg/cronjob/gadmjob.go b/pkg/cronjob/gadmjob.go deleted file mode 100644 index 12b3875b..00000000 --- a/pkg/cronjob/gadmjob.go +++ /dev/null @@ -1,12 +0,0 @@ -package cronjob - -import ( - "github.com/robfig/cron/v3" -) - -// newWithSeconds returns a Cron with the seconds field enabled. -func NewWithSeconds() *cron.Cron { - secondParser := cron.NewParser(cron.Second | cron.Minute | - cron.Hour | cron.Dom | cron.Month | cron.DowOptional | cron.Descriptor) - return cron.New(cron.WithParser(secondParser), cron.WithChain()) -} diff --git a/pkg/http.go b/pkg/http.go deleted file mode 100644 index 62adadca..00000000 --- a/pkg/http.go +++ /dev/null @@ -1,52 +0,0 @@ -package pkg - -import ( - "bytes" - "encoding/json" - "io/ioutil" - "net/http" - "time" -) - -// 发送GET请求 -// url: 请求地址 -// response: 请求返回的内容 -func Get(url string) (string, error) { - - client := &http.Client{} - req, err := http.NewRequest("GET", url, nil) - req.Header.Set("Accept", "*/*") - req.Header.Set("Content-Type", "application/json") - if err != nil { - return "", err - } - - resp, err := client.Do(req) - if err != nil { - return "", err - } - defer resp.Body.Close() - result, _ := ioutil.ReadAll(resp.Body) - - return string(result), nil -} - -// 发送POST请求 -// url: 请求地址 -// data: POST请求提交的数据 -// contentType: 请求体格式,如:application/json -// content: 请求放回的内容 -func Post(url string, data interface{}, contentType string) string { - - // 超时时间:5秒 - client := &http.Client{Timeout: 5 * time.Second} - jsonStr, _ := json.Marshal(data) - resp, err := client.Post(url, contentType, bytes.NewBuffer(jsonStr)) - if err != nil { - panic(err) - } - defer resp.Body.Close() - - result, _ := ioutil.ReadAll(resp.Body) - return string(result) -} diff --git a/pkg/jwtauth/jwtauth.go b/pkg/jwtauth/jwtauth.go deleted file mode 100644 index 082e9b3a..00000000 --- a/pkg/jwtauth/jwtauth.go +++ /dev/null @@ -1,751 +0,0 @@ -package jwtauth - -import ( - "crypto/rsa" - "errors" - "github.com/dgrijalva/jwt-go" - "github.com/gin-gonic/gin" - config2 "go-admin/tools/config" - "io/ioutil" - "net/http" - "strings" - "time" -) - -const JwtPayloadKey = "JWT_PAYLOAD" - -type MapClaims map[string]interface{} - -// GinJWTMiddleware provides a Json-Web-Token authentication implementation. On failure, a 401 HTTP response -// is returned. On success, the wrapped middleware is called, and the userID is made available as -// c.Get("userID").(string). -// Users can get a token by posting a json request to LoginHandler. The token then needs to be passed in -// the Authentication header. Example: Authorization:Bearer XXX_TOKEN_XXX -type GinJWTMiddleware struct { - // Realm name to display to the user. Required. - Realm string - - // signing algorithm - possible values are HS256, HS384, HS512 - // Optional, default is HS256. - SigningAlgorithm string - - // Secret key used for signing. Required. - Key []byte - - // Duration that a jwt token is valid. Optional, defaults to one hour. - Timeout time.Duration - - // This field allows clients to refresh their token until MaxRefresh has passed. - // Note that clients can refresh their token in the last moment of MaxRefresh. - // This means that the maximum validity timespan for a token is TokenTime + MaxRefresh. - // Optional, defaults to 0 meaning not refreshable. - MaxRefresh time.Duration - - // Callback function that should perform the authentication of the user based on login info. - // Must return user data as user identifier, it will be stored in Claim Array. Required. - // Check error (e) to determine the appropriate error message. - Authenticator func(c *gin.Context) (interface{}, error) - - // Callback function that should perform the authorization of the authenticated user. Called - // only after an authentication success. Must return true on success, false on failure. - // Optional, default to success. - Authorizator func(data interface{}, c *gin.Context) bool - - // Callback function that will be called during login. - // Using this function it is possible to add additional payload data to the webtoken. - // The data is then made available during requests via c.Get("JWT_PAYLOAD"). - // Note that the payload is not encrypted. - // The attributes mentioned on jwt.io can't be used as keys for the map. - // Optional, by default no additional data will be set. - PayloadFunc func(data interface{}) MapClaims - - // User can define own Unauthorized func. - Unauthorized func(*gin.Context, int, string) - - // User can define own LoginResponse func. - LoginResponse func(*gin.Context, int, string, time.Time) - - // User can define own RefreshResponse func. - RefreshResponse func(*gin.Context, int, string, time.Time) - - // Set the identity handler function - IdentityHandler func(*gin.Context) interface{} - - // Set the identity key - IdentityKey string - - // username - NiceKey string - - DataScopeKey string - - // rolekey - RKey string - - // roleId - RoleIdKey string - - RoleKey string - - // roleName - RoleNameKey string - - // TokenLookup is a string in the form of ":" that is used - // to extract token from the request. - // Optional. Default value "header:Authorization". - // Possible values: - // - "header:" - // - "query:" - // - "cookie:" - TokenLookup string - - // TokenHeadName is a string in the header. Default value is "Bearer" - TokenHeadName string - - // TimeFunc provides the current time. You can override it to use another time value. This is useful for testing or if your server uses a different time zone than your tokens. - TimeFunc func() time.Time - - // HTTP Status messages for when something in the JWT middleware fails. - // Check error (e) to determine the appropriate error message. - HTTPStatusMessageFunc func(e error, c *gin.Context) string - - // Private key file for asymmetric algorithms - PrivKeyFile string - - // Public key file for asymmetric algorithms - PubKeyFile string - - // Private key - privKey *rsa.PrivateKey - - // Public key - pubKey *rsa.PublicKey - - // Optionally return the token as a cookie - SendCookie bool - - // Allow insecure cookies for development over http - SecureCookie bool - - // Allow cookies to be accessed client side for development - CookieHTTPOnly bool - - // Allow cookie domain change for development - CookieDomain string - - // SendAuthorization allow return authorization header for every request - SendAuthorization bool - - // Disable abort() of context. - DisabledAbort bool - - // CookieName allow cookie name change for development - CookieName string -} - -var ( - // ErrMissingSecretKey indicates Secret key is required - ErrMissingSecretKey = errors.New("secret key is required") - - // ErrForbidden when HTTP status 403 is given - ErrForbidden = errors.New("you don't have permission to access this resource") - - // ErrMissingAuthenticatorFunc indicates Authenticator is required - ErrMissingAuthenticatorFunc = errors.New("ginJWTMiddleware.Authenticator func is undefined") - - // ErrMissingLoginValues indicates a user tried to authenticate without username or password - ErrMissingLoginValues = errors.New("missing Username or Password or Code") - - // ErrFailedAuthentication indicates authentication failed, could be faulty username or password - ErrFailedAuthentication = errors.New("incorrect Username or Password") - - // ErrFailedTokenCreation indicates JWT Token failed to create, reason unknown - ErrFailedTokenCreation = errors.New("failed to create JWT Token") - - // ErrExpiredToken indicates JWT token has expired. Can't refresh. - ErrExpiredToken = errors.New("token is expired") - - // ErrEmptyAuthHeader can be thrown if authing with a HTTP header, the Auth header needs to be set - ErrEmptyAuthHeader = errors.New("auth header is empty") - - // ErrMissingExpField missing exp field in token - ErrMissingExpField = errors.New("missing exp field") - - // ErrWrongFormatOfExp field must be float64 format - ErrWrongFormatOfExp = errors.New("exp must be float64 format") - - // ErrInvalidAuthHeader indicates auth header is invalid, could for example have the wrong Realm name - ErrInvalidAuthHeader = errors.New("auth header is invalid") - - // ErrEmptyQueryToken can be thrown if authing with URL Query, the query token variable is empty - ErrEmptyQueryToken = errors.New("query token is empty") - - // ErrEmptyCookieToken can be thrown if authing with a cookie, the token cokie is empty - ErrEmptyCookieToken = errors.New("cookie token is empty") - - // ErrEmptyParamToken can be thrown if authing with parameter in path, the parameter in path is empty - ErrEmptyParamToken = errors.New("parameter token is empty") - - // ErrInvalidSigningAlgorithm indicates signing algorithm is invalid, needs to be HS256, HS384, HS512, RS256, RS384 or RS512 - ErrInvalidSigningAlgorithm = errors.New("invalid signing algorithm") - - ErrInvalidVerificationode = errors.New("验证码错误") - - // ErrNoPrivKeyFile indicates that the given private key is unreadable - ErrNoPrivKeyFile = errors.New("private key file unreadable") - - // ErrNoPubKeyFile indicates that the given public key is unreadable - ErrNoPubKeyFile = errors.New("public key file unreadable") - - // ErrInvalidPrivKey indicates that the given private key is invalid - ErrInvalidPrivKey = errors.New("private key invalid") - - // ErrInvalidPubKey indicates the the given public key is invalid - ErrInvalidPubKey = errors.New("public key invalid") - - // IdentityKey default identity key - IdentityKey = "identity" - - NiceKey = "nice" - - DataScopeKey = "datascope" - - RKey = "r" - RoleIdKey = "roleid" - - RoleKey = "rolekey" - - RoleNameKey = "rolename" -) - -// New for check error with GinJWTMiddleware -func New(m *GinJWTMiddleware) (*GinJWTMiddleware, error) { - if err := m.MiddlewareInit(); err != nil { - return nil, err - } - - return m, nil -} - -func (mw *GinJWTMiddleware) readKeys() error { - err := mw.privateKey() - if err != nil { - return err - } - err = mw.publicKey() - if err != nil { - return err - } - return nil -} - -func (mw *GinJWTMiddleware) privateKey() error { - keyData, err := ioutil.ReadFile(mw.PrivKeyFile) - if err != nil { - return ErrNoPrivKeyFile - } - key, err := jwt.ParseRSAPrivateKeyFromPEM(keyData) - if err != nil { - return ErrInvalidPrivKey - } - mw.privKey = key - return nil -} - -func (mw *GinJWTMiddleware) publicKey() error { - keyData, err := ioutil.ReadFile(mw.PubKeyFile) - if err != nil { - return ErrNoPubKeyFile - } - key, err := jwt.ParseRSAPublicKeyFromPEM(keyData) - if err != nil { - return ErrInvalidPubKey - } - mw.pubKey = key - return nil -} - -func (mw *GinJWTMiddleware) usingPublicKeyAlgo() bool { - switch mw.SigningAlgorithm { - case "RS256", "RS512", "RS384": - return true - } - return false -} - -// MiddlewareInit initialize jwt configs. -func (mw *GinJWTMiddleware) MiddlewareInit() error { - - if mw.TokenLookup == "" { - mw.TokenLookup = "header:Authorization" - } - - if mw.SigningAlgorithm == "" { - mw.SigningAlgorithm = "HS256" - } - - mw.Timeout = time.Hour - if config2.JwtConfig.Timeout != 0 { - // TODO: token过期时长 - mw.Timeout = time.Duration(config2.JwtConfig.Timeout) * time.Second - } - - if config2.ApplicationConfig.Mode == "dev" { - // TODO: dev mode token过期时长 为 10 年 - mw.Timeout = time.Duration(876010) * time.Hour - } - - if mw.TimeFunc == nil { - mw.TimeFunc = time.Now - } - - mw.TokenHeadName = strings.TrimSpace(mw.TokenHeadName) - if len(mw.TokenHeadName) == 0 { - mw.TokenHeadName = "Bearer" - } - - if mw.Authorizator == nil { - mw.Authorizator = func(data interface{}, c *gin.Context) bool { - return true - } - } - - if mw.Unauthorized == nil { - mw.Unauthorized = func(c *gin.Context, code int, message string) { - c.JSON(http.StatusOK, gin.H{ - "code": code, - "message": message, - }) - } - } - - if mw.LoginResponse == nil { - mw.LoginResponse = func(c *gin.Context, code int, token string, expire time.Time) { - c.JSON(http.StatusOK, gin.H{ - "code": http.StatusOK, - "token": token, - "expire": expire.Format(time.RFC3339), - }) - } - } - - if mw.RefreshResponse == nil { - mw.RefreshResponse = func(c *gin.Context, code int, token string, expire time.Time) { - c.JSON(http.StatusOK, gin.H{ - "code": http.StatusOK, - "token": token, - "expire": expire.Format(time.RFC3339), - }) - } - } - - if mw.IdentityKey == "" { - mw.IdentityKey = IdentityKey - } - - if mw.IdentityHandler == nil { - mw.IdentityHandler = func(c *gin.Context) interface{} { - claims := ExtractClaims(c) - return claims - } - } - - if mw.HTTPStatusMessageFunc == nil { - mw.HTTPStatusMessageFunc = func(e error, c *gin.Context) string { - return e.Error() - } - } - - if mw.Realm == "" { - mw.Realm = "gin jwt" - } - - if mw.CookieName == "" { - mw.CookieName = "jwt" - } - - if mw.usingPublicKeyAlgo() { - return mw.readKeys() - } - - if mw.Key == nil { - return ErrMissingSecretKey - } - return nil -} - -// MiddlewareFunc makes GinJWTMiddleware implement the Middleware interface. -func (mw *GinJWTMiddleware) MiddlewareFunc() gin.HandlerFunc { - return func(c *gin.Context) { - mw.middlewareImpl(c) - } -} - -func (mw *GinJWTMiddleware) middlewareImpl(c *gin.Context) { - claims, err := mw.GetClaimsFromJWT(c) - if err != nil { - mw.unauthorized(c, http.StatusUnauthorized, mw.HTTPStatusMessageFunc(err, c)) - return - } - - if claims["exp"] == nil { - mw.unauthorized(c, http.StatusBadRequest, mw.HTTPStatusMessageFunc(ErrMissingExpField, c)) - return - } - - if _, ok := claims["exp"].(float64); !ok { - mw.unauthorized(c, http.StatusBadRequest, mw.HTTPStatusMessageFunc(ErrWrongFormatOfExp, c)) - return - } - if int64(claims["exp"].(float64)) < mw.TimeFunc().Unix() { - mw.unauthorized(c, 6401, mw.HTTPStatusMessageFunc(ErrExpiredToken, c)) - return - } - - c.Set(JwtPayloadKey, claims) - identity := mw.IdentityHandler(c) - - if identity != nil { - c.Set(mw.IdentityKey, identity) - } - - if !mw.Authorizator(identity, c) { - mw.unauthorized(c, http.StatusForbidden, mw.HTTPStatusMessageFunc(ErrForbidden, c)) - return - } - - c.Next() -} - -// GetClaimsFromJWT get claims from JWT token -func (mw *GinJWTMiddleware) GetClaimsFromJWT(c *gin.Context) (MapClaims, error) { - token, err := mw.ParseToken(c) - - if err != nil { - return nil, err - } - - if mw.SendAuthorization { - if v, ok := c.Get("JWT_TOKEN"); ok { - c.Header("Authorization", mw.TokenHeadName+" "+v.(string)) - } - } - - claims := MapClaims{} - for key, value := range token.Claims.(jwt.MapClaims) { - claims[key] = value - } - - return claims, nil -} - -// LoginHandler can be used by clients to get a jwt token. -// Payload needs to be json in the form of {"username": "USERNAME", "password": "PASSWORD"}. -// Reply will be of the form {"token": "TOKEN"}. -func (mw *GinJWTMiddleware) LoginHandler(c *gin.Context) { - if mw.Authenticator == nil { - mw.unauthorized(c, http.StatusInternalServerError, mw.HTTPStatusMessageFunc(ErrMissingAuthenticatorFunc, c)) - return - } - - data, err := mw.Authenticator(c) - - if err != nil { - mw.unauthorized(c, 400, mw.HTTPStatusMessageFunc(err, c)) - return - } - - // Create the token - token := jwt.New(jwt.GetSigningMethod(mw.SigningAlgorithm)) - claims := token.Claims.(jwt.MapClaims) - - if mw.PayloadFunc != nil { - for key, value := range mw.PayloadFunc(data) { - claims[key] = value - } - } - - expire := mw.TimeFunc().Add(mw.Timeout) - claims["exp"] = expire.Unix() - claims["orig_iat"] = mw.TimeFunc().Unix() - tokenString, err := mw.signedString(token) - - if err != nil { - mw.unauthorized(c, http.StatusOK, mw.HTTPStatusMessageFunc(ErrFailedTokenCreation, c)) - return - } - - // set cookie - if mw.SendCookie { - maxage := int(expire.Unix() - time.Now().Unix()) - c.SetCookie( - mw.CookieName, - tokenString, - maxage, - "/", - mw.CookieDomain, - mw.SecureCookie, - mw.CookieHTTPOnly, - ) - } - - mw.LoginResponse(c, http.StatusOK, tokenString, expire) -} - -func (mw *GinJWTMiddleware) signedString(token *jwt.Token) (string, error) { - var tokenString string - var err error - if mw.usingPublicKeyAlgo() { - tokenString, err = token.SignedString(mw.privKey) - } else { - tokenString, err = token.SignedString(mw.Key) - } - return tokenString, err -} - -// RefreshHandler can be used to refresh a token. The token still needs to be valid on refresh. -// Shall be put under an endpoint that is using the GinJWTMiddleware. -// Reply will be of the form {"token": "TOKEN"}. -func (mw *GinJWTMiddleware) RefreshHandler(c *gin.Context) { - tokenString, expire, err := mw.RefreshToken(c) - if err != nil { - mw.unauthorized(c, http.StatusUnauthorized, mw.HTTPStatusMessageFunc(err, c)) - return - } - - mw.RefreshResponse(c, http.StatusOK, tokenString, expire) -} - -// RefreshToken refresh token and check if token is expired -func (mw *GinJWTMiddleware) RefreshToken(c *gin.Context) (string, time.Time, error) { - claims, err := mw.CheckIfTokenExpire(c) - if err != nil { - return "", time.Now(), err - } - - // Create the token - newToken := jwt.New(jwt.GetSigningMethod(mw.SigningAlgorithm)) - newClaims := newToken.Claims.(jwt.MapClaims) - - for key := range claims { - newClaims[key] = claims[key] - } - - expire := mw.TimeFunc().Add(mw.Timeout) - newClaims["exp"] = expire.Unix() - newClaims["orig_iat"] = mw.TimeFunc().Unix() - tokenString, err := mw.signedString(newToken) - - if err != nil { - return "", time.Now(), err - } - - // set cookie - if mw.SendCookie { - maxage := int(expire.Unix() - time.Now().Unix()) - c.SetCookie( - mw.CookieName, - tokenString, - maxage, - "/", - mw.CookieDomain, - mw.SecureCookie, - mw.CookieHTTPOnly, - ) - } - - return tokenString, expire, nil -} - -// CheckIfTokenExpire check if token expire -func (mw *GinJWTMiddleware) CheckIfTokenExpire(c *gin.Context) (jwt.MapClaims, error) { - token, err := mw.ParseToken(c) - - if err != nil { - // If we receive an error, and the error is anything other than a single - // ValidationErrorExpired, we want to return the error. - // If the error is just ValidationErrorExpired, we want to continue, as we can still - // refresh the token if it's within the MaxRefresh time. - // (see https://github.com/appleboy/gin-jwt/issues/176) - validationErr, ok := err.(*jwt.ValidationError) - if !ok || validationErr.Errors != jwt.ValidationErrorExpired { - return nil, err - } - } - - claims := token.Claims.(jwt.MapClaims) - - origIat := int64(claims["orig_iat"].(float64)) - - if origIat < mw.TimeFunc().Add(-mw.MaxRefresh).Unix() { - return nil, ErrExpiredToken - } - - return claims, nil -} - -// TokenGenerator method that clients can use to get a jwt token. -func (mw *GinJWTMiddleware) TokenGenerator(data interface{}) (string, time.Time, error) { - token := jwt.New(jwt.GetSigningMethod(mw.SigningAlgorithm)) - claims := token.Claims.(jwt.MapClaims) - - if mw.PayloadFunc != nil { - for key, value := range mw.PayloadFunc(data) { - claims[key] = value - } - } - - expire := mw.TimeFunc().UTC().Add(mw.Timeout) - claims["exp"] = expire.Unix() - claims["orig_iat"] = mw.TimeFunc().Unix() - tokenString, err := mw.signedString(token) - if err != nil { - return "", time.Time{}, err - } - - return tokenString, expire, nil -} - -func (mw *GinJWTMiddleware) jwtFromHeader(c *gin.Context, key string) (string, error) { - authHeader := c.Request.Header.Get(key) - - if authHeader == "" { - return "", ErrEmptyAuthHeader - } - - parts := strings.SplitN(authHeader, " ", 2) - if !(len(parts) == 2 && parts[0] == mw.TokenHeadName) { - return "", ErrInvalidAuthHeader - } - - return parts[1], nil -} - -func (mw *GinJWTMiddleware) jwtFromQuery(c *gin.Context, key string) (string, error) { - token := c.Query(key) - - if token == "" { - return "", ErrEmptyQueryToken - } - - return token, nil -} - -func (mw *GinJWTMiddleware) jwtFromCookie(c *gin.Context, key string) (string, error) { - cookie, _ := c.Cookie(key) - - if cookie == "" { - return "", ErrEmptyCookieToken - } - - return cookie, nil -} - -func (mw *GinJWTMiddleware) jwtFromParam(c *gin.Context, key string) (string, error) { - token := c.Param(key) - - if token == "" { - return "", ErrEmptyParamToken - } - - return token, nil -} - -// ParseToken parse jwt token from gin context -func (mw *GinJWTMiddleware) ParseToken(c *gin.Context) (*jwt.Token, error) { - var token string - var err error - - methods := strings.Split(mw.TokenLookup, ",") - for _, method := range methods { - if len(token) > 0 { - break - } - parts := strings.Split(strings.TrimSpace(method), ":") - k := strings.TrimSpace(parts[0]) - v := strings.TrimSpace(parts[1]) - switch k { - case "header": - token, err = mw.jwtFromHeader(c, v) - case "query": - token, err = mw.jwtFromQuery(c, v) - case "cookie": - token, err = mw.jwtFromCookie(c, v) - case "param": - token, err = mw.jwtFromParam(c, v) - } - } - - if err != nil { - return nil, err - } - - return jwt.Parse(token, func(t *jwt.Token) (interface{}, error) { - if jwt.GetSigningMethod(mw.SigningAlgorithm) != t.Method { - return nil, ErrInvalidSigningAlgorithm - } - if mw.usingPublicKeyAlgo() { - return mw.pubKey, nil - } - c.Set("JWT_TOKEN", token) - - return mw.Key, nil - }) -} - -// ParseTokenString parse jwt token string -func (mw *GinJWTMiddleware) ParseTokenString(token string) (*jwt.Token, error) { - return jwt.Parse(token, func(t *jwt.Token) (interface{}, error) { - if jwt.GetSigningMethod(mw.SigningAlgorithm) != t.Method { - return nil, ErrInvalidSigningAlgorithm - } - if mw.usingPublicKeyAlgo() { - return mw.pubKey, nil - } - - return mw.Key, nil - }) -} - -func (mw *GinJWTMiddleware) unauthorized(c *gin.Context, code int, message string) { - c.Header("WWW-Authenticate", "JWT realm="+mw.Realm) - if !mw.DisabledAbort { - c.Abort() - } - - mw.Unauthorized(c, code, message) -} - -// ExtractClaims help to extract the JWT claims -func ExtractClaims(c *gin.Context) MapClaims { - claims, exists := c.Get(JwtPayloadKey) - if !exists { - return make(MapClaims) - } - - return claims.(MapClaims) -} - -// ExtractClaimsFromToken help to extract the JWT claims from token -func ExtractClaimsFromToken(token *jwt.Token) MapClaims { - if token == nil { - return make(MapClaims) - } - - claims := MapClaims{} - for key, value := range token.Claims.(jwt.MapClaims) { - claims[key] = value - } - - return claims -} - -// GetToken help to get the JWT token string -func GetToken(c *gin.Context) string { - token, exists := c.Get("JWT_TOKEN") - if !exists { - return "" - } - - return token.(string) -} diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go deleted file mode 100644 index 7c958b7a..00000000 --- a/pkg/logger/logger.go +++ /dev/null @@ -1,38 +0,0 @@ -package logger - -import ( - "github.com/gogf/gf/os/glog" - "go-admin/common/global" - "go-admin/tools" - "go-admin/tools/config" -) - -var Logger *glog.Logger -var JobLogger *glog.Logger -var RequestLogger *glog.Logger - -func Setup() { - Logger = glog.New() - _ = Logger.SetPath(config.LoggerConfig.Path + "/bus") - Logger.SetStdoutPrint(config.LoggerConfig.EnabledBUS && config.LoggerConfig.Stdout) - Logger.SetFile("bus-{Ymd}.log") - _ = Logger.SetLevelStr(config.LoggerConfig.Level) - - JobLogger = glog.New() - _ = JobLogger.SetPath(config.LoggerConfig.Path + "/job") - JobLogger.SetStdoutPrint(false) - JobLogger.SetFile("db-{Ymd}.log") - _ = JobLogger.SetLevelStr(config.LoggerConfig.Level) - - RequestLogger = glog.New() - _ = RequestLogger.SetPath(config.LoggerConfig.Path + "/request") - RequestLogger.SetStdoutPrint(false) - RequestLogger.SetFile("access-{Ymd}.log") - _ = RequestLogger.SetLevelStr(config.LoggerConfig.Level) - - Logger.Info(tools.Green("Logger init success!")) - - global.Logger = Logger.Line() - global.JobLogger = JobLogger.Line() - global.RequestLogger = RequestLogger.Line() -} diff --git a/pkg/security.go b/pkg/security.go deleted file mode 100644 index dcb030e3..00000000 --- a/pkg/security.go +++ /dev/null @@ -1,67 +0,0 @@ -package pkg - -import ( - "encoding/hex" - "math/rand" - - "golang.org/x/crypto/scrypt" -) - -const ( - symbol = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+,.?/:;{}[]`~" - letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" -) - -func generateRandString(length int, s string) string { - var chars = []byte(s) - clen := len(chars) - if clen < 2 || clen > 256 { - panic("Wrong charset length for NewLenChars()") - } - maxrb := 255 - (256 % clen) - b := make([]byte, length) - r := make([]byte, length+(length/4)) // storage for random bytes. - i := 0 - for { - if _, err := rand.Read(r); err != nil { - panic("Error reading random bytes: " + err.Error()) - } - for _, rb := range r { - c := int(rb) - if c > maxrb { - continue // Skip this number to avoid modulo bias. - } - b[i] = chars[c%clen] - i++ - if i == length { - return string(b) - } - } - } -} - -// GenerateRandomKey20 生成20位随机字符串 -func GenerateRandomKey20() string { - return generateRandString(20, symbol) -} - -// GenerateRandomKey16 生成16为随机字符串 -func GenerateRandomKey16() string { - return generateRandString(16, symbol) -} - -// GenerateRandomKey6 生成6为随机字符串 -func GenerateRandomKey6() string { - return generateRandString(6, letter) -} - -// SetPassword 根据明文密码和加盐值生成密码 -func SetPassword(password string, salt string) (verify string, err error) { - var rb []byte - rb, err = scrypt.Key([]byte(password), []byte(salt), 16384, 8, 1, 32) - if err != nil { - return - } - verify = hex.EncodeToString(rb) - return -} diff --git a/pkg/table/analysis.go b/pkg/table/analysis.go deleted file mode 100644 index 2813e628..00000000 --- a/pkg/table/analysis.go +++ /dev/null @@ -1,24 +0,0 @@ -package table - -import ( - "hash/crc32" - "strconv" -) - -// Crc32Hash 用于32张分表 -func Crc32Hash(src string) string { - sum := crc32.ChecksumIEEE([]byte(src)) % 32 - return strconv.Itoa(int(sum)) -} - -// Crc16Hash 用于16张分表 -func Crc16Hash(src string) string { - sum := crc32.ChecksumIEEE([]byte(src)) % 16 - return strconv.Itoa(int(sum)) -} - -// Crc8Hash 用于8张分表 -func Crc8Hash(src string) string { - sum := crc32.ChecksumIEEE([]byte(src)) % 8 - return strconv.Itoa(int(sum)) -} diff --git a/pkg/utils/file.go b/pkg/utils/file.go deleted file mode 100644 index 47c87ce6..00000000 --- a/pkg/utils/file.go +++ /dev/null @@ -1,65 +0,0 @@ -package utils - -import ( - "io/ioutil" - "mime/multipart" - "os" - "path" -) - -// 获取文件大小 -func GetSize(f multipart.File) (int, error) { - content, err := ioutil.ReadAll(f) - - return len(content), err -} - -// 获取文件后缀 -func GetExt(fileName string) string { - return path.Ext(fileName) -} - -//检查文件是否存在 -func CheckExist(src string) bool { - _, err := os.Stat(src) - - return os.IsNotExist(err) -} - -// 检查文件权限 -func CheckPermission(src string) bool { - _, err := os.Stat(src) - - return os.IsPermission(err) -} - -//如果不存在则新建文件夹 -func IsNotExistMkDir(src string) error { - if exist := CheckExist(src); exist == false { - if err := MkDir(src); err != nil { - return err - } - } - - return nil -} - -//新建文件夹 -func MkDir(src string) error { - err := os.MkdirAll(src, os.ModePerm) - if err != nil { - return err - } - - return nil -} - -// 打开文件 -func Open(name string, flag int, perm os.FileMode) (*os.File, error) { - f, err := os.OpenFile(name, flag, perm) - if err != nil { - return nil, err - } - - return f, nil -} diff --git a/pkg/utils/json_time.go b/pkg/utils/json_time.go deleted file mode 100644 index 8eb8df15..00000000 --- a/pkg/utils/json_time.go +++ /dev/null @@ -1,42 +0,0 @@ -package utils - -import ( - "database/sql/driver" - "fmt" - "time" -) - -// JSONTime format json time field by myself -type JSONTime struct { - time.Time -} - -// MarshalJSON on JSONTime format Time field with %Y-%m-%d %H:%M:%S -func (t JSONTime) MarshalJSON() ([]byte, error) { - if (t == JSONTime{}) { - formatted := fmt.Sprintf("\"%s\"", "") - return []byte(formatted), nil - } else { - formatted := fmt.Sprintf("\"%s\"", t.Format("2006-01-02 15:04:05")) - return []byte(formatted), nil - } -} - -// Value insert timestamp into mysql need this function. -func (t JSONTime) Value() (driver.Value, error) { - var zeroTime time.Time - if t.Time.UnixNano() == zeroTime.UnixNano() { - return nil, nil - } - return t.Time, nil -} - -// Scan valueof time.Time -func (t *JSONTime) Scan(v interface{}) error { - value, ok := v.(time.Time) - if ok { - *t = JSONTime{Time: value} - return nil - } - return fmt.Errorf("can not convert %v to timestamp", v) -} diff --git a/pkg/utils/response.go b/pkg/utils/response.go deleted file mode 100644 index 9288b35c..00000000 --- a/pkg/utils/response.go +++ /dev/null @@ -1,60 +0,0 @@ -package utils - -import ( - "net/http" - "time" -) - -// api结构体 -type APIException struct { - Code int `json:"code"` - Success bool `json:"success"` - Msg string `json:"msg"` - Timestamp int64 `json:"timestamp"` - Result interface{} `json:"result"` -} - -// 实现接口 -func (e *APIException) Error() string { - return e.Msg -} - -func newAPIException(code int, msg string, data interface{}, success bool) *APIException { - return &APIException{ - Code: code, - Success: success, - Msg: msg, - Timestamp: time.Now().Unix(), - Result: data, - } -} - -// 500 错误处理 -func ServerError() *APIException { - return newAPIException(http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError), nil, false) -} - -// 404 错误 -func NotFound() *APIException { - return newAPIException(http.StatusNotFound, http.StatusText(http.StatusNotFound), nil, false) -} - -// 未知错误 -func UnknownError(message string) *APIException { - return newAPIException(http.StatusForbidden, message, nil, false) -} - -// 参数错误 -func ParameterError(message string) *APIException { - return newAPIException(http.StatusBadRequest, message, nil, false) -} - -// 授权错误 -func AuthError(message string) *APIException { - return newAPIException(http.StatusBadRequest, message, nil, false) -} - -// 200 -func ResponseJson(message string, data interface{}, success bool) *APIException { - return newAPIException(http.StatusOK, message, data, success) -} diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go deleted file mode 100644 index fde5af75..00000000 --- a/pkg/utils/utils.go +++ /dev/null @@ -1,91 +0,0 @@ -package utils - -import ( - "crypto/md5" - "encoding/base64" - "encoding/hex" - uuid "github.com/satori/go.uuid" - "io/ioutil" - "os" - "strings" - "time" -) - -func Hmac(data string) string { - h := md5.New() - h.Write([]byte(data)) - return hex.EncodeToString(h.Sum(nil)) -} - -func IsStringEmpty(str string) bool { - return strings.Trim(str, " ") == "" -} - -func GetUUID() string { - u := uuid.NewV4() - return strings.ReplaceAll(u.String(), "-", "") -} - -func PathExists(path string) bool { - _, err := os.Stat(path) - if err == nil { - return true - } - - if os.IsNotExist(err) { - return false - } - - return false -} - -func Base64ToImage(imageBase64 string) ([]byte, error) { - image, err := base64.StdEncoding.DecodeString(imageBase64) - if err != nil { - return nil, err - } - - return image, nil -} - -func GetDirFiles(dir string) ([]string, error) { - dirList, err := ioutil.ReadDir(dir) - if err != nil { - return nil, err - } - - filesRet := make([]string, 0) - - for _, file := range dirList { - if file.IsDir() { - files, err := GetDirFiles(dir + string(os.PathSeparator) + file.Name()) - if err != nil { - return nil, err - } - - filesRet = append(filesRet, files...) - } else { - filesRet = append(filesRet, dir+string(os.PathSeparator)+file.Name()) - } - } - - return filesRet, nil -} - -func GetCurrentTimeStamp() int64 { - return time.Now().UnixNano() / 1e6 -} - -//slice去重 -func RemoveRepByMap(slc []string) []string { - result := []string{} - tempMap := map[string]byte{} - for _, e := range slc { - l := len(tempMap) - tempMap[e] = 0 - if len(tempMap) != l { - result = append(result, e) - } - } - return result -} diff --git a/pkg/ws/ws.go b/pkg/ws/ws.go deleted file mode 100644 index 071e71ef..00000000 --- a/pkg/ws/ws.go +++ /dev/null @@ -1,336 +0,0 @@ -package ws - -import ( - "context" - "fmt" - "github.com/gin-gonic/gin" - "github.com/gorilla/websocket" - "go-admin/tools" - "go-admin/tools/app" - "log" - "net/http" - "sync" - "time" -) - -// Manager 所有 websocket 信息 -type Manager struct { - Group map[string]map[string]*Client - groupCount, clientCount uint - Lock sync.Mutex - Register, UnRegister chan *Client - Message chan *MessageData - GroupMessage chan *GroupMessageData - BroadCastMessage chan *BroadCastMessageData -} - -// Client 单个 websocket 信息 -type Client struct { - Id, Group string - Context context.Context - CancelFunc context.CancelFunc - Socket *websocket.Conn - Message chan []byte -} - -// messageData 单个发送数据信息 -type MessageData struct { - Id, Group string - Context context.Context - Message []byte -} - -// groupMessageData 组广播数据信息 -type GroupMessageData struct { - Group string - Message []byte -} - -// 广播发送数据信息 -type BroadCastMessageData struct { - Message []byte -} - -// 读信息,从 websocket 连接直接读取数据 -func (c *Client) Read(cxt context.Context) { - defer func(cxt context.Context) { - WebsocketManager.UnRegister <- c - log.Printf("client [%s] disconnect", c.Id) - if err := c.Socket.Close(); err != nil { - log.Printf("client [%s] disconnect err: %s", c.Id, err) - } - }(cxt) - - for { - if cxt.Err() != nil { - break - } - messageType, message, err := c.Socket.ReadMessage() - if err != nil || messageType == websocket.CloseMessage { - break - } - log.Printf("client [%s] receive message: %s", c.Id, string(message)) - c.Message <- message - } -} - -// 写信息,从 channel 变量 Send 中读取数据写入 websocket 连接 -func (c *Client) Write(cxt context.Context) { - defer func(cxt context.Context) { - log.Printf("client [%s] disconnect", c.Id) - if err := c.Socket.Close(); err != nil { - log.Printf("client [%s] disconnect err: %s", c.Id, err) - } - }(cxt) - - for { - if cxt.Err() != nil { - break - } - select { - case message, ok := <-c.Message: - if !ok { - _ = c.Socket.WriteMessage(websocket.CloseMessage, []byte{}) - return - } - log.Printf("client [%s] write message: %s", c.Id, string(message)) - err := c.Socket.WriteMessage(websocket.TextMessage, message) - if err != nil { - log.Printf("client [%s] writemessage err: %s", c.Id, err) - } - case _ = <-c.Context.Done(): - break - } - } -} - -// 启动 websocket 管理器 -func (manager *Manager) Start() { - log.Printf("websocket manage start") - for { - select { - // 注册 - case client := <-manager.Register: - log.Printf("client [%s] connect", client.Id) - log.Printf("register client [%s] to group [%s]", client.Id, client.Group) - - manager.Lock.Lock() - if manager.Group[client.Group] == nil { - manager.Group[client.Group] = make(map[string]*Client) - manager.groupCount += 1 - } - manager.Group[client.Group][client.Id] = client - manager.clientCount += 1 - manager.Lock.Unlock() - - // 注销 - case client := <-manager.UnRegister: - log.Printf("unregister client [%s] from group [%s]", client.Id, client.Group) - manager.Lock.Lock() - if mGroup, ok := manager.Group[client.Group]; ok { - if mClient, ok := mGroup[client.Id]; ok { - close(mClient.Message) - delete(mGroup, client.Id) - manager.clientCount -= 1 - if len(mGroup) == 0 { - //log.Printf("delete empty group [%s]", client.Group) - delete(manager.Group, client.Group) - manager.groupCount -= 1 - } - mClient.CancelFunc() - } - } - manager.Lock.Unlock() - - // 发送广播数据到某个组的 channel 变量 Send 中 - //case data := <-manager.boardCast: - // if groupMap, ok := manager.wsGroup[data.GroupId]; ok { - // for _, conn := range groupMap { - // conn.Send <- data.Data - // } - // } - } - } -} - -// 处理单个 client 发送数据 -func (manager *Manager) SendService() { - for { - select { - case data := <-manager.Message: - if groupMap, ok := manager.Group[data.Group]; ok { - if conn, ok := groupMap[data.Id]; ok { - conn.Message <- data.Message - } - } - } - } -} - -// 处理 group 广播数据 -func (manager *Manager) SendGroupService() { - for { - select { - // 发送广播数据到某个组的 channel 变量 Send 中 - case data := <-manager.GroupMessage: - if groupMap, ok := manager.Group[data.Group]; ok { - for _, conn := range groupMap { - conn.Message <- data.Message - } - } - } - } -} - -// 处理广播数据 -func (manager *Manager) SendAllService() { - for { - select { - case data := <-manager.BroadCastMessage: - for _, v := range manager.Group { - for _, conn := range v { - conn.Message <- data.Message - } - } - } - } -} - -// 向指定的 client 发送数据 -func (manager *Manager) Send(cxt context.Context, id string, group string, message []byte) { - data := &MessageData{ - Id: id, - Context: cxt, - Group: group, - Message: message, - } - manager.Message <- data -} - -// 向指定的 Group 广播 -func (manager *Manager) SendGroup(group string, message []byte) { - data := &GroupMessageData{ - Group: group, - Message: message, - } - manager.GroupMessage <- data -} - -// 广播 -func (manager *Manager) SendAll(message []byte) { - data := &BroadCastMessageData{ - Message: message, - } - manager.BroadCastMessage <- data -} - -// 注册 -func (manager *Manager) RegisterClient(client *Client) { - manager.Register <- client -} - -// 注销 -func (manager *Manager) UnRegisterClient(client *Client) { - manager.UnRegister <- client -} - -// 当前组个数 -func (manager *Manager) LenGroup() uint { - return manager.groupCount -} - -// 当前连接个数 -func (manager *Manager) LenClient() uint { - return manager.clientCount -} - -// 获取 wsManager 管理器信息 -func (manager *Manager) Info() map[string]interface{} { - managerInfo := make(map[string]interface{}) - managerInfo["groupLen"] = manager.LenGroup() - managerInfo["clientLen"] = manager.LenClient() - managerInfo["chanRegisterLen"] = len(manager.Register) - managerInfo["chanUnregisterLen"] = len(manager.UnRegister) - managerInfo["chanMessageLen"] = len(manager.Message) - managerInfo["chanGroupMessageLen"] = len(manager.GroupMessage) - managerInfo["chanBroadCastMessageLen"] = len(manager.BroadCastMessage) - return managerInfo -} - -// 初始化 wsManager 管理器 -var WebsocketManager = Manager{ - Group: make(map[string]map[string]*Client), - Register: make(chan *Client, 128), - UnRegister: make(chan *Client, 128), - GroupMessage: make(chan *GroupMessageData, 128), - Message: make(chan *MessageData, 128), - BroadCastMessage: make(chan *BroadCastMessageData, 128), - groupCount: 0, - clientCount: 0, -} - -// gin 处理 websocket handler -func (manager *Manager) WsClient(c *gin.Context) { - - ctx, cancel := context.WithCancel(context.Background()) - - upGrader := websocket.Upgrader{ - // cross origin domain - CheckOrigin: func(r *http.Request) bool { - return true - }, - // 处理 Sec-WebSocket-Protocol Header - Subprotocols: []string{c.GetHeader("Sec-WebSocket-Protocol")}, - } - - conn, err := upGrader.Upgrade(c.Writer, c.Request, nil) - if err != nil { - log.Printf("websocket connect error: %s", c.Param("channel")) - return - } - - fmt.Println("token: ", c.Query("token")) - - client := &Client{ - Id: c.Param("id"), - Group: c.Param("channel"), - Context: ctx, - CancelFunc: cancel, - Socket: conn, - Message: make(chan []byte, 1024), - } - - manager.RegisterClient(client) - go client.Read(ctx) - go client.Write(ctx) - time.Sleep(time.Second * 15) - - tools.FileMonitoringById(ctx, "temp/logs/job/db-20200820.log", c.Param("id"), c.Param("channel"), SendOne) -} - -func (manager *Manager) UnWsClient(c *gin.Context) { - id := c.Param("id") - group := c.Param("channel") - WsLogout(id, group) - app.OK(c, "ws close success", "success") -} - -func SendGroup(msg []byte) { - WebsocketManager.SendGroup("leffss", []byte("{\"code\":200,\"data\":"+string(msg)+"}")) - fmt.Println(WebsocketManager.Info()) -} - -func SendAll(msg []byte) { - WebsocketManager.SendAll([]byte("{\"code\":200,\"data\":" + string(msg) + "}")) - fmt.Println(WebsocketManager.Info()) -} - -func SendOne(ctx context.Context, id string, group string, msg []byte) { - WebsocketManager.Send(ctx, id, group, []byte("{\"code\":200,\"data\":"+string(msg)+"}")) - fmt.Println(WebsocketManager.Info()) -} - -func WsLogout(id string, group string) { - WebsocketManager.UnRegisterClient(&Client{Id: id, Group: group}) - fmt.Println(WebsocketManager.Info()) -} diff --git a/scripts/Dockerfile b/scripts/Dockerfile new file mode 100644 index 00000000..01bdeb84 --- /dev/null +++ b/scripts/Dockerfile @@ -0,0 +1,6 @@ +FROM alpine + +COPY ./go-admin / +EXPOSE 8000 + +CMD ["/go-admin","server","-c", "/config/settings.yml"] diff --git a/scripts/k8s/deploy.yml b/scripts/k8s/deploy.yml new file mode 100644 index 00000000..44792278 --- /dev/null +++ b/scripts/k8s/deploy.yml @@ -0,0 +1,57 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: go-admin + labels: + app: go-admin + service: go-admin +spec: + ports: + - port: 8000 + name: http + protocol: TCP + selector: + app: go-admin +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: go-admin-v1 + labels: + app: go-admin + version: v1 +spec: + replicas: 1 + selector: + matchLabels: + app: go-admin + version: v1 + template: + metadata: + labels: + app: go-admin + version: v1 + spec: + containers: + - name: go-admin + image: registry.cn-shanghai.aliyuncs.com/go-admin-team/go-admin + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8000 + volumeMounts: + - name: go-admin + mountPath: /temp + - name: go-admin + mountPath: /static + - name: go-admin-config + mountPath: /config/ + readOnly: true + volumes: + - name: go-admin + persistentVolumeClaim: + claimName: go-admin + - name: go-admin-config + configMap: + name: settings-admin +--- diff --git a/scripts/k8s/prerun.sh b/scripts/k8s/prerun.sh new file mode 100644 index 00000000..f7bb046e --- /dev/null +++ b/scripts/k8s/prerun.sh @@ -0,0 +1,3 @@ +#!/bin/bash +kubectl create ns go-admin +kubectl create configmap settings-admin --from-file=../../config/settings.yml -n go-admin diff --git a/scripts/k8s/storage.yml b/scripts/k8s/storage.yml new file mode 100644 index 00000000..2866a90e --- /dev/null +++ b/scripts/k8s/storage.yml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: go-admin + namespace: go-admin +spec: + accessModes: + - ReadWriteMany + resources: + requests: + storage: "1Mi" + volumeName: + storageClassName: nfs-csi \ No newline at end of file diff --git a/sqlite.db b/sqlite.db deleted file mode 100644 index f250f704..00000000 Binary files a/sqlite.db and /dev/null differ diff --git a/sqlite3.db b/sqlite3.db index 029ba3bf..65124d04 100644 Binary files a/sqlite3.db and b/sqlite3.db differ diff --git a/static/go-admin.txt b/static/go-admin.txt deleted file mode 100644 index 2353fcaf..00000000 --- a/static/go-admin.txt +++ /dev/null @@ -1,15 +0,0 @@ - - ____ - ,---, ,' , `. ,--, - ,---. ,---,. ,---.'| ,-+-,.' _ |,--.'| ,---, - ,----._,. ' ,'\ ,' .' | | | : ,-+-. ; , ||| |, ,-+-. / | - / / ' / / / |,---.' , ,--.--. | | | ,--.'|' | ||`--'_ ,--.'|' | -| : |. ; ,. :| | |/ \ ,--.__| || | ,', | |,,' ,'| | | ,"' | -| | .\ .' | |: :: : .'.--. .-. | / ,' || | / | |--' ' | | | | / | | -. ; '; |' | .; :: |.' \__\/: . .. ' / || : | | , | | : | | | | | -' . . || : |`---' ," .--.; |' ; |: || : | |/ ' : |__ | | | |/ - `---`-'| | \ \ / / / ,. || | '/ '| | |`-' | | '.'|| | |--' - .'__/\_: | `----' ; : .' \ : :|| ;/ ; : ;| |/ - | : : | , .-./\ \ / '---' | , / '---' - \ \ / `--`---' `----' ---`-' - `--`-' diff --git a/template/api_migrate.template b/template/api_migrate.template new file mode 100644 index 00000000..6f391640 --- /dev/null +++ b/template/api_migrate.template @@ -0,0 +1,326 @@ +package version + +import ( + "gorm.io/gorm" + "runtime" + "time" + + "github.com/go-admin-team/go-admin-core/sdk/pkg" + + "go-admin/cmd/migrate/migration" + common "go-admin/common/models" +) + +type Menu struct { + MenuId int `json:"menuId" gorm:"primaryKey;autoIncrement"` + MenuName string `json:"menuName" gorm:"size:128;"` + Title string `json:"title" gorm:"size:128;"` + Icon string `json:"icon" gorm:"size:128;"` + Path string `json:"path" gorm:"size:128;"` + Paths string `json:"paths" gorm:"size:128;"` + MenuType string `json:"menuType" gorm:"size:1;"` + Action string `json:"action" gorm:"size:16;"` + Permission string `json:"permission" gorm:"size:255;"` + ParentId int `json:"parentId" gorm:"size:11;"` + NoCache bool `json:"noCache" gorm:"size:8;"` + Breadcrumb string `json:"breadcrumb" gorm:"size:255;"` + Component string `json:"component" gorm:"size:255;"` + Sort int `json:"sort" gorm:"size:4;"` + Visible string `json:"visible" gorm:"size:1;"` + CreateBy string `json:"createBy" gorm:"size:128;"` + UpdateBy string `json:"updateBy" gorm:"size:128;"` + IsFrame string `json:"isFrame" gorm:"size:1;DEFAULT:0;"` + CreatedAt time.Time `json:"createdAt"` + UpdatedAt time.Time `json:"updatedAt"` + DeletedAt *time.Time `json:"deletedAt"` +} + +func (Menu) TableName() string { + return "sys_menu" +} + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _{{.GenerateTime}}Test) +} + +func _{{.GenerateTime}}Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + + timeNow := pkg.GetCurrentTime() + Mmenu := Menu{} + Mmenu.MenuName = "{{.TBName}}Manage" + Mmenu.Title = "{{.TableComment}}" + Mmenu.Icon = "pass" + Mmenu.Path = "/{{.TBName}}" + Mmenu.MenuType = "M" + Mmenu.Action = "无" + Mmenu.ParentId = 0 + Mmenu.NoCache = false + Mmenu.Component = "Layout" + Mmenu.Sort = 0 + Mmenu.Visible = "0" + Mmenu.IsFrame = "0" + Mmenu.CreateBy = "1" + Mmenu.UpdateBy = "1" + Mmenu.CreatedAt = timeNow + Mmenu.UpdatedAt = timeNow + // Mmenu.MenuId, err = Mmenu.Create(db) + err := tx.Create(&Mmenu).Error + if err != nil { + return err + } + Cmenu := Menu{} + Cmenu.MenuName = "{{.TBName}}" + Cmenu.Title = "{{.TableComment}}" + Cmenu.Icon = "pass" + Cmenu.Path = "{{.TBName}}" + Cmenu.MenuType = "C" + Cmenu.Action = "无" + Cmenu.Permission = "{{.PackageName}}:{{.BusinessName}}:list" + Cmenu.ParentId = Mmenu.MenuId + Cmenu.NoCache = false + Cmenu.Component = "/{{.BusinessName}}/index" + Cmenu.Sort = 0 + Cmenu.Visible = "0" + Cmenu.IsFrame = "0" + Cmenu.CreateBy = "1" + Cmenu.UpdateBy = "1" + Cmenu.CreatedAt = timeNow + Cmenu.UpdatedAt = timeNow + // Cmenu.MenuId, err = Cmenu.Create(db) + err = tx.Create(&Cmenu).Error + if err != nil { + return err + } + + MList := Menu{} + MList.MenuName = "" + MList.Title = "分页获取{{.TableComment}}" + MList.Icon = "" + MList.Path = "{{.TBName}}" + MList.MenuType = "F" + MList.Action = "无" + MList.Permission = "{{.PackageName}}:{{.BusinessName}}:query" + MList.ParentId = Cmenu.MenuId + MList.NoCache = false + MList.Sort = 0 + MList.Visible = "0" + MList.IsFrame = "0" + MList.CreateBy = "1" + MList.UpdateBy = "1" + MList.CreatedAt = timeNow + MList.UpdatedAt = timeNow + // MList.MenuId, err = MList.Create(db) + err = tx.Create(&MList).Error + if err != nil { + return err + } + + MCreate := Menu{} + MCreate.MenuName = "" + MCreate.Title = "创建{{.TableComment}}" + MCreate.Icon = "" + MCreate.Path = "{{.TBName}}" + MCreate.MenuType = "F" + MCreate.Action = "无" + MCreate.Permission = "{{.PackageName}}:{{.BusinessName}}:add" + MCreate.ParentId = Cmenu.MenuId + MCreate.NoCache = false + MCreate.Sort = 0 + MCreate.Visible = "0" + MCreate.IsFrame = "0" + MCreate.CreateBy = "1" + MCreate.UpdateBy = "1" + MCreate.CreatedAt = timeNow + MCreate.UpdatedAt = timeNow + // MCreate.MenuId, err = MCreate.Create(db) + err = tx.Create(&MCreate).Error + if err != nil { + return err + } + + MUpdate := Menu{} + MUpdate.MenuName = "" + MUpdate.Title = "修改{{.TableComment}}" + MUpdate.Icon = "" + MUpdate.Path = "{{.TBName}}" + MUpdate.MenuType = "F" + MUpdate.Action = "无" + MUpdate.Permission ="{{.PackageName}}:{{.BusinessName}}:edit" + MUpdate.ParentId = Cmenu.MenuId + MUpdate.NoCache = false + MUpdate.Sort = 0 + MUpdate.Visible = "0" + MUpdate.IsFrame = "0" + MUpdate.CreateBy = "1" + MUpdate.UpdateBy = "1" + MUpdate.CreatedAt = timeNow + MUpdate.UpdatedAt = timeNow + // MUpdate.MenuId, err = MUpdate.Create(db) + err = tx.Create(&MUpdate).Error + if err != nil { + return err + } + + MDelete := Menu{} + MDelete.MenuName = "" + MDelete.Title = "删除{{.TableComment}}" + MDelete.Icon = "" + MDelete.Path = "{{.TBName}}" + MDelete.MenuType = "F" + MDelete.Action = "无" + MDelete.Permission = "{{.PackageName}}:{{.BusinessName}}:remove" + MDelete.ParentId = Cmenu.MenuId + MDelete.NoCache = false + MDelete.Sort = 0 + MDelete.Visible = "0" + MDelete.IsFrame = "0" + MDelete.CreateBy = "1" + MDelete.UpdateBy = "1" + MDelete.CreatedAt = timeNow + MDelete.UpdatedAt = timeNow + // MDelete.MenuId, err = MDelete.Create(db) + err = tx.Create(&MDelete).Error + if err != nil { + return err + } + + var InterfaceId = 63 + Amenu := Menu{} + Amenu.MenuName = "{{.TBName}}" + Amenu.Title = "{{.TableComment}}" + Amenu.Icon = "bug" + Amenu.Path = "{{.TBName}}" + Amenu.MenuType = "M" + Amenu.Action = "无" + Amenu.ParentId = InterfaceId + Amenu.NoCache = false + Amenu.Sort = 0 + Amenu.Visible = "1" + Amenu.IsFrame = "0" + Amenu.CreateBy = "1" + Amenu.UpdateBy = "1" + Amenu.CreatedAt = timeNow + Amenu.UpdatedAt = timeNow + // Amenu.MenuId, err = Amenu.Create(db) + err = tx.Create(&Amenu).Error + if err != nil { + return err + } + + AList := Menu{} + AList.MenuName = "" + AList.Title = "分页获取{{.TableComment}}" + AList.Icon = "bug" + AList.Path = "/api/v1/{{.ModuleName}}" + AList.MenuType = "A" + AList.Action = "GET" + AList.ParentId = Amenu.MenuId + AList.NoCache = false + AList.Sort = 0 + AList.Visible = "1" + AList.IsFrame = "0" + AList.CreateBy = "1" + AList.UpdateBy = "1" + AList.CreatedAt = timeNow + AList.UpdatedAt = timeNow + // AList.MenuId, err = AList.Create(db) + err = tx.Create(&AList).Error + if err != nil { + return err + } + + AGet := Menu{} + AGet.MenuName = "" + AGet.Title = "根据id获取{{.TableComment}}" + AGet.Icon = "bug" + AGet.Path = "/api/v1/{{.ModuleName}}/:id" + AGet.MenuType = "A" + AGet.Action = "GET" + AGet.ParentId = Amenu.MenuId + AGet.NoCache = false + AGet.Sort = 0 + AGet.Visible = "1" + AGet.IsFrame = "0" + AGet.CreateBy = "1" + AGet.UpdateBy = "1" + AGet.CreatedAt = timeNow + AGet.UpdatedAt = timeNow + // AGet.MenuId, err = AGet.Create(db) + err = tx.Create(&AGet).Error + if err != nil { + return err + } + + ACreate := Menu{} + ACreate.MenuName = "" + ACreate.Title = "创建{{.TableComment}}" + ACreate.Icon = "bug" + ACreate.Path = "/api/v1/{{.ModuleName}}" + ACreate.MenuType = "A" + ACreate.Action = "POST" + ACreate.ParentId = Amenu.MenuId + ACreate.NoCache = false + ACreate.Sort = 0 + ACreate.Visible = "1" + ACreate.IsFrame = "0" + ACreate.CreateBy = "1" + ACreate.UpdateBy = "1" + ACreate.CreatedAt = timeNow + ACreate.UpdatedAt = timeNow + // ACreate.MenuId, err = ACreate.Create(db) + err = tx.Create(&ACreate).Error + if err != nil { + return err + } + + AUpdate := Menu{} + AUpdate.MenuName = "" + AUpdate.Title = "修改{{.TableComment}}" + AUpdate.Icon = "bug" + AUpdate.Path = "/api/v1/{{.ModuleName}}/:id" + AUpdate.MenuType = "A" + AUpdate.Action = "PUT" + AUpdate.ParentId = Amenu.MenuId + AUpdate.NoCache = false + AUpdate.Sort = 0 + AUpdate.Visible = "1" + AUpdate.IsFrame = "0" + AUpdate.CreateBy = "1" + AUpdate.UpdateBy = "1" + AUpdate.CreatedAt = timeNow + AUpdate.UpdatedAt = timeNow + // AUpdate.MenuId, err = AUpdate.Create(db) + err = tx.Create(&AUpdate).Error + if err != nil { + return err + } + + ADelete := Menu{} + ADelete.MenuName = "" + ADelete.Title = "删除{{.TableComment}}" + ADelete.Icon = "bug" + ADelete.Path = "/api/v1/{{.ModuleName}}" + ADelete.MenuType = "A" + ADelete.Action = "DELETE" + ADelete.ParentId = Amenu.MenuId + ADelete.NoCache = false + ADelete.Sort = 0 + ADelete.Visible = "1" + ADelete.IsFrame = "0" + ADelete.CreateBy = "1" + ADelete.UpdateBy = "1" + ADelete.CreatedAt = timeNow + ADelete.UpdatedAt = timeNow + //ADelete.MenuId, err = ADelete.Create(db) + err = tx.Create(&ADelete).Error + if err != nil { + return err + } + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} \ No newline at end of file diff --git a/template/migrate.template b/template/migrate.template new file mode 100644 index 00000000..f30de78a --- /dev/null +++ b/template/migrate.template @@ -0,0 +1,40 @@ +package {{.Package}} + +import ( + "gorm.io/gorm" + "runtime" + + "go-admin/cmd/migrate/migration" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _{{.GenerateTime}}Test) +} + +func _{{.GenerateTime}}Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + + // TODO: 这里开始写入要变更的内容 + + // TODO: 例如 修改表字段 使用过程中请删除此段代码 + //err := tx.Migrator().RenameColumn(&models.SysConfig{}, "config_id", "id") + //if err != nil { + // return err + //} + + // TODO: 例如 新增表结构 使用过程中请删除此段代码 + //err = tx.Debug().Migrator().AutoMigrate( + // new(models.CasbinRule), + // ) + //if err != nil { + // return err + //} + + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/template/v3/no_actions/apis.go.template b/template/v3/no_actions/apis.go.template deleted file mode 100644 index 3966ab35..00000000 --- a/template/v3/no_actions/apis.go.template +++ /dev/null @@ -1,204 +0,0 @@ -package {{.ModuleName}} - -import ( - "github.com/gin-gonic/gin" - "go-admin/app/admin/service" - common "go-admin/common/models" - "net/http" - - "go-admin/app/admin/models" - "go-admin/app/admin/service/dto" - "go-admin/common/actions" - "go-admin/common/apis" - "go-admin/common/log" - "go-admin/tools" -) - -type {{.ClassName}} struct { - apis.Api -} - -func (e *{{.ClassName}}) Get{{.ClassName}}List(c *gin.Context) { - msgID := tools.GenerateMsgIDFromContext(c) - d := new(dto.{{.ClassName}}Search) - db, err := tools.GetOrm(c) - if err != nil { - log.Error(err) - return - } - - req := d.Generate() - - //查询列表 - err = req.Bind(c) - if err != nil { - e.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") - return - } - - //数据权限检查 - p := actions.GetPermissionFromContext(c) - - list := make([]models.{{.ClassName}}, 0) - var count int64 - serviceStudent := service.{{.ClassName}}{} - serviceStudent.MsgID = msgID - serviceStudent.Orm = db - err = serviceStudent.Get{{.ClassName}}Page(req, p, &list, &count) - if err != nil { - e.Error(c, http.StatusUnprocessableEntity, err, "查询失败") - return - } - - e.PageOK(c, list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") -} - -func (e *{{.ClassName}}) Get{{.ClassName}}(c *gin.Context) { - control := new(dto.{{.ClassName}}ById) - db, err := tools.GetOrm(c) - if err != nil { - log.Error(err) - return - } - - msgID := tools.GenerateMsgIDFromContext(c) - //查看详情 - req := control.Generate() - err = req.Bind(c) - if err != nil { - e.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") - return - } - var object models.{{.ClassName}} - - //数据权限检查 - p := actions.GetPermissionFromContext(c) - - service{{.ClassName}} := service.{{.ClassName}}{} - service{{.ClassName}}.MsgID = msgID - service{{.ClassName}}.Orm = db - err = service{{.ClassName}}.Get{{.ClassName}}(req, p, &object) - if err != nil { - e.Error(c, http.StatusUnprocessableEntity, err, "查询失败") - return - } - - e.OK(c, object, "查看成功") -} - -func (e *{{.ClassName}}) Insert{{.ClassName}}(c *gin.Context) { - control := new(dto.{{.ClassName}}Control) - db, err := tools.GetOrm(c) - if err != nil { - log.Error(err) - return - } - - msgID := tools.GenerateMsgIDFromContext(c) - //新增操作 - req := control.Generate() - err = req.Bind(c) - if err != nil { - e.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") - return - } - var object common.ActiveRecord - object, err = req.GenerateM() - if err != nil { - e.Error(c, http.StatusInternalServerError, err, "模型生成失败") - return - } - // 设置创建人 - object.SetCreateBy(tools.GetUserIdUint(c)) - - service{{.ClassName}} := service.{{.ClassName}}{} - service{{.ClassName}}.Orm = db - service{{.ClassName}}.MsgID = msgID - err = service{{.ClassName}}.Insert{{.ClassName}}(object) - if err != nil { - log.Error(err) - e.Error(c, http.StatusInternalServerError, err, "创建失败") - return - } - - e.OK(c, object.GetId(), "创建成功") -} - -func (e *{{.ClassName}}) Update{{.ClassName}}(c *gin.Context) { - control := new(dto.{{.ClassName}}Control) - db, err := tools.GetOrm(c) - if err != nil { - log.Error(err) - return - } - - msgID := tools.GenerateMsgIDFromContext(c) - req := control.Generate() - //更新操作 - err = req.Bind(c) - if err != nil { - e.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") - return - } - var object common.ActiveRecord - object, err = req.GenerateM() - if err != nil { - e.Error(c, http.StatusInternalServerError, err, "模型生成失败") - return - } - object.SetUpdateBy(tools.GetUserIdUint(c)) - - //数据权限检查 - p := actions.GetPermissionFromContext(c) - - service{{.ClassName}} := service.{{.ClassName}}{} - service{{.ClassName}}.Orm = db - service{{.ClassName}}.MsgID = msgID - err = service{{.ClassName}}.Update{{.ClassName}}(object, p) - if err != nil { - log.Error(err) - return - } - e.OK(c, object.GetId(), "更新成功") -} - -func (e *{{.ClassName}}) Delete{{.ClassName}}(c *gin.Context) { - control := new(dto.{{.ClassName}}ById) - db, err := tools.GetOrm(c) - if err != nil { - log.Error(err) - return - } - - msgID := tools.GenerateMsgIDFromContext(c) - //删除操作 - req := control.Generate() - err = req.Bind(c) - if err != nil { - log.Errorf("MsgID[%s] Bind error: %s", msgID, err) - e.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") - return - } - var object common.ActiveRecord - object, err = req.GenerateM() - if err != nil { - e.Error(c, http.StatusInternalServerError, err, "模型生成失败") - return - } - - // 设置编辑人 - object.SetUpdateBy(tools.GetUserIdUint(c)) - - // 数据权限检查 - p := actions.GetPermissionFromContext(c) - - service{{.ClassName}} := service.{{.ClassName}}{} - service{{.ClassName}}.Orm = db - service{{.ClassName}}.MsgID = msgID - err = service{{.ClassName}}.Remove{{.ClassName}}(req, object, p) - if err != nil { - log.Error(err) - return - } - e.OK(c, object.GetId(), "删除成功") -} diff --git a/template/v3/no_actions/service.go.template b/template/v3/no_actions/service.go.template deleted file mode 100644 index 0b7faf54..00000000 --- a/template/v3/no_actions/service.go.template +++ /dev/null @@ -1,119 +0,0 @@ -package service - -import ( - "errors" - "go-admin/app/admin/models" - "go-admin/common/actions" - cDto "go-admin/common/dto" - "go-admin/common/log" - common "go-admin/common/models" - "go-admin/common/service" - "gorm.io/gorm" -) - -type {{.ClassName}} struct { - service.Service -} - -// Get{{.ClassName}}Page 获取{{.ClassName}}列表 -func (e *{{.ClassName}}) Get{{.ClassName}}Page(c cDto.Index, p *actions.DataPermission, list *[]models.{{.ClassName}}, count *int64) error { - var err error - var data models.{{.ClassName}} - msgID := e.MsgID - - err = e.Orm.Model(&data). - Scopes( - cDto.MakeCondition(c.GetNeedSearch()), - cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), - actions.Permission(data.TableName(), p), - ). - Find(list).Limit(-1).Offset(-1). - Count(count).Error - if err != nil { - log.Errorf("msgID[%s] db error:%s", msgID, err) - return err - } - return nil -} - -// Get{{.ClassName}} 获取{{.ClassName}}对象 -func (e *{{.ClassName}}) Get{{.ClassName}}(d cDto.Control, p *actions.DataPermission, model *models.{{.ClassName}}) error { - var err error - var data models.{{.ClassName}} - msgID := e.MsgID - - db := e.Orm.Model(&data). - Scopes( - actions.Permission(data.TableName(), p), - ). - First(model, d.GetId()) - err = db.Error - if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { - err = errors.New("查看对象不存在或无权查看") - log.Errorf("msgID[%s] db error:%s", msgID, err) - return err - } - if db.Error != nil { - log.Errorf("msgID[%s] db error:%s", msgID, err) - return err - } - return nil -} - -// Insert{{.ClassName}} 创建{{.ClassName}}对象 -func (e *{{.ClassName}}) Insert{{.ClassName}}(model common.ActiveRecord) error { - var err error - var data models.{{.ClassName}} - msgID := e.MsgID - - err = e.Orm.Model(&data). - Create(model).Error - if err != nil { - log.Errorf("msgID[%s] db error:%s", msgID, err) - return err - } - return nil -} - -// Update{{.ClassName}} 修改{{.ClassName}}对象 -func (e *{{.ClassName}}) Update{{.ClassName}}(c common.ActiveRecord, p *actions.DataPermission) error { - var err error - var data models.{{.ClassName}} - msgID := e.MsgID - - db := e.Orm.Model(&data). - Scopes( - actions.Permission(data.TableName(), p), - ).Where(c.GetId()).Updates(c) - if db.Error != nil { - log.Errorf("msgID[%s] db error:%s", msgID, err) - return err - } - if db.RowsAffected == 0 { - return errors.New("无权更新该数据") - - } - return nil -} - -// Remove{{.ClassName}} 删除{{.ClassName}} -func (e *{{.ClassName}}) Remove{{.ClassName}}(d cDto.Control, c common.ActiveRecord, p *actions.DataPermission) error { - var err error - var data models.{{.ClassName}} - msgID := e.MsgID - - db := e.Orm.Model(&data). - Scopes( - actions.Permission(data.TableName(), p), - ).Where(d.GetId()).Delete(c) - if db.Error != nil { - err = db.Error - log.Errorf("MsgID[%s] Delete error: %s", msgID, err) - return err - } - if db.RowsAffected == 0 { - err = errors.New("无权删除该数据") - return err - } - return nil -} \ No newline at end of file diff --git a/template/v3/actions/router_check_role.go.template b/template/v4/actions/router_check_role.go.template similarity index 84% rename from template/v3/actions/router_check_role.go.template rename to template/v4/actions/router_check_role.go.template index 88451bd2..3c3c069f 100644 --- a/template/v3/actions/router_check_role.go.template +++ b/template/v4/actions/router_check_role.go.template @@ -2,12 +2,12 @@ package router import ( "github.com/gin-gonic/gin" + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" - "go-admin/app/admin/middleware" - "go-admin/app/admin/models" - "go-admin/app/admin/service/dto" + "go-admin/app/{{.PackageName}}/models" + "go-admin/app/{{.PackageName}}/service/dto" "go-admin/common/actions" - jwt "go-admin/pkg/jwtauth" + "go-admin/common/middleware" ) func init() { diff --git a/template/v3/actions/router_no_check_role.go.template b/template/v4/actions/router_no_check_role.go.template similarity index 86% rename from template/v3/actions/router_no_check_role.go.template rename to template/v4/actions/router_no_check_role.go.template index c647266e..01545572 100644 --- a/template/v3/actions/router_no_check_role.go.template +++ b/template/v4/actions/router_no_check_role.go.template @@ -3,9 +3,9 @@ package router import ( "github.com/gin-gonic/gin" - "go-admin/app/admin/middleware" - "go-admin/app/admin/models" - "go-admin/app/admin/service/dto" + "go-admin/app/{{.PackageName}}/middleware" + "go-admin/app/{{.PackageName}}/models" + "go-admin/app/{{.PackageName}}/service/dto" "go-admin/common/actions" ) diff --git a/template/v3/dto.go.template b/template/v4/dto.go.template similarity index 52% rename from template/v3/dto.go.template rename to template/v4/dto.go.template index 33b2c54b..dc594e3d 100644 --- a/template/v3/dto.go.template +++ b/template/v4/dto.go.template @@ -1,25 +1,23 @@ package dto import ( + "errors" "github.com/gin-gonic/gin" - "gorm.io/gorm" + "github.com/go-admin-team/go-admin-core/sdk/api" - "go-admin/app/admin/models" + "go-admin/app/{{.PackageName}}/models" "go-admin/common/dto" - "go-admin/common/log" common "go-admin/common/models" - "go-admin/tools" ) type {{.ClassName}}Search struct { dto.Pagination `search:"-"` - {{ $tablename := .TBName -}} - {{ range .Columns -}} + {{- $tablename := .TBName -}} + {{- range .Columns -}} {{$z := .IsQuery}} - {{- if ($z) -}} - {{.GoField}} {{.GoType}} `form:"{{.JsonField}}" search:"type:{{if eq .QueryType "EQ"}}exact{{ else if eq .QueryType "NE"}}iexact{{ else if eq .QueryType "LIKE"}}contains{{ else if eq .QueryType "GT"}}gt{{ else if eq .QueryType "GTE"}}gte{{ else if eq .QueryType "LT"}}lt{{ else if eq .QueryType "LTE"}}lte{{- end }};column:{{.ColumnName}};table:{{$tablename}}" comment:"{{.ColumnComment}}"` - - {{ end -}} + {{- if ($z) }} + {{.GoField}} {{.GoType}} `form:"{{.JsonField}}" search:"type:{{if eq .QueryType "EQ"}}exact{{ else if eq .QueryType "NE"}}iexact{{ else if eq .QueryType "LIKE"}}contains{{ else if eq .QueryType "GT"}}gt{{ else if eq .QueryType "GTE"}}gte{{ else if eq .QueryType "LT"}}lt{{ else if eq .QueryType "LTE"}}lte{{- end }};column:{{.ColumnName}};table:{{$tablename}}" comment:"{{.ColumnComment}}"` + {{- end }} {{- end }} } @@ -27,73 +25,70 @@ func (m *{{.ClassName}}Search) GetNeedSearch() interface{} { return *m } -func (m *{{.ClassName}}Search) Bind(ctx *gin.Context) error { - msgID := tools.GenerateMsgIDFromContext(ctx) - err := ctx.ShouldBind(m) - if err != nil { - log.Debugf("MsgID[%s] ShouldBind error: %s", msgID, err.Error()) - } - return err -} - func (m *{{.ClassName}}Search) Generate() dto.Index { o := *m return &o } +func (m *{{.ClassName}}Search) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBind(m) + if err != nil { + log.Errorf("ShouldBind error: %s", err.Error()) + } + return err +} + type {{.ClassName}}Control struct { - {{ range .Columns -}} + {{- range .Columns -}} {{$x := .Pk}} {{- if ($x) }} - {{.GoField}} uint `uri:"{{.JsonField}}" comment:"{{.ColumnComment}}"` // {{.ColumnComment}} + {{.GoField}} {{.GoType}} `uri:"{{.JsonField}}" comment:"{{.ColumnComment}}"` // {{.ColumnComment}} {{- else if eq .GoField "CreatedAt" -}} {{- else if eq .GoField "UpdatedAt" -}} {{- else if eq .GoField "DeletedAt" -}} {{- else if eq .GoField "CreateBy" -}} {{- else if eq .GoField "UpdateBy" -}} - {{- else }} - {{.GoField}} {{.GoType}} `json:"{{.JsonField}}" comment:"{{.ColumnComment}}"` - {{end -}} + {{- end -}} {{- end }} } +func (s *{{.ClassName}}Control) Generate() dto.Control { + o := *s + return &o +} + func (s *{{.ClassName}}Control) Bind(ctx *gin.Context) error { - msgID := tools.GenerateMsgIDFromContext(ctx) + log := api.GetRequestLogger(ctx) err := ctx.ShouldBindUri(s) if err != nil { - log.Debugf("MsgID[%s] ShouldBindUri error: %s", msgID, err.Error()) - return err + log.Errorf("ShouldBindUri error: %s", err.Error()) + return errors.New("数据绑定出错") } err = ctx.ShouldBind(s) if err != nil { - log.Debugf("MsgID[%s] ShouldBind error: %#v", msgID, err.Error()) + log.Errorf("ShouldBind error: %s", err.Error()) + err = errors.New("数据绑定出错") } return err } -func (s *{{.ClassName}}Control) Generate() dto.Control { - cp := *s - return &cp -} - func (s *{{.ClassName}}Control) GenerateM() (common.ActiveRecord, error) { return &models.{{.ClassName}}{ - {{ range .Columns -}} + {{- range .Columns -}} {{$x := .Pk}} {{- if ($x) }} - Model: gorm.Model{ID: s.ID}, + Model: common.Model{ {{.GoField}}: s.{{.GoField}} }, {{- else if eq .GoField "CreatedAt" -}} {{- else if eq .GoField "UpdatedAt" -}} {{- else if eq .GoField "DeletedAt" -}} {{- else if eq .GoField "CreateBy" -}} - - {{- else if eq .GoField "UpdateBy" -}} {{- else }} {{.GoField}}: s.{{.GoField}}, - {{- end }} + {{- end -}} {{- end }} }, nil } @@ -106,11 +101,38 @@ type {{.ClassName}}ById struct { dto.ObjectById } +func (s *{{.ClassName}}ById) GetId() interface{} { + if len(s.Ids) > 0 { + s.Ids = append(s.Ids, s.Id) + return s.Ids + } + return s.Id +} + +func (s *{{.ClassName}}ById) Bind(ctx *gin.Context) error { + log := api.GetRequestLogger(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Errorf("ShouldBindUri error: %s", err.Error()) + return errors.New("数据绑定出错") + } + err = ctx.ShouldBind(s) + if err != nil { + log.Errorf("ShouldBind error: %s", err.Error()) + err = errors.New("数据绑定出错") + } + return err +} + +func (s *{{.ClassName}}ById) SetUpdateBy(id int) { + +} + func (s *{{.ClassName}}ById) Generate() dto.Control { - cp := *s - return &cp + o := *s + return &o } func (s *{{.ClassName}}ById) GenerateM() (common.ActiveRecord, error) { return &models.{{.ClassName}}{}, nil -} +} \ No newline at end of file diff --git a/template/v3/js.go.template b/template/v4/js.go.template similarity index 100% rename from template/v3/js.go.template rename to template/v4/js.go.template diff --git a/template/v3/model.go.template b/template/v4/model.go.template similarity index 87% rename from template/v3/model.go.template rename to template/v4/model.go.template index 80d5f8c9..1862b033 100644 --- a/template/v3/model.go.template +++ b/template/v4/model.go.template @@ -1,26 +1,26 @@ package models import ( - "gorm.io/gorm" + // "gorm.io/gorm" "go-admin/common/models" ) type {{.ClassName}} struct { - gorm.Model - models.ControlBy + models.Model {{ range .Columns -}} {{$x := .Pk}} {{- if ($x) }} - {{- else if eq .GoField "CreatedAt" -}} {{- else if eq .GoField "UpdatedAt" -}} {{- else if eq .GoField "DeletedAt" -}} {{- else if eq .GoField "CreateBy" -}} {{- else if eq .GoField "UpdateBy" -}} {{- else }} - {{.GoField}} {{.GoType}} `json:"{{.JsonField}}" gorm:"type:{{.ColumnType}};comment:{{- if eq .ColumnComment "" -}}{{.GoField}}{{- else -}}{{.ColumnComment}}{{end -}}"` // {{end -}} + {{.GoField}} {{.GoType}} `json:"{{.JsonField}}" gorm:"type:{{.ColumnType}};comment:{{- if eq .ColumnComment "" -}}{{.GoField}}{{- else -}}{{.ColumnComment}}{{end -}}"` {{end -}} {{- end }} + models.ModelTime + models.ControlBy } func ({{.ClassName}}) TableName() string { @@ -34,4 +34,4 @@ func (e *{{.ClassName}}) Generate() models.ActiveRecord { func (e *{{.ClassName}}) GetId() interface{} { return e.{{.PkGoField}} -} +} \ No newline at end of file diff --git a/template/v4/no_actions/apis.go.template b/template/v4/no_actions/apis.go.template new file mode 100644 index 00000000..47b69f4c --- /dev/null +++ b/template/v4/no_actions/apis.go.template @@ -0,0 +1,261 @@ +package {{.ModuleName}} + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" + _ "github.com/go-admin-team/go-admin-core/sdk/pkg/response" + + "go-admin/app/{{.PackageName}}/models" + "go-admin/app/{{.PackageName}}/service" + "go-admin/app/{{.PackageName}}/service/dto" + "go-admin/common/actions" + "go-admin/common/apis" +) + +type {{.ClassName}} struct { + apis.Api +} + +// Get{{.ClassName}}List 获取{{.TableComment}}列表 +// @Summary 获取{{.TableComment}}列表 +// @Description 获取{{.TableComment}}列表 +// @Tags {{.TableComment}} +{{- $tablename := .TBName -}} +{{- range .Columns -}} +{{$z := .IsQuery}} +{{- if ($z) }} +// @Param {{.JsonField}} query {{.GoType}} false "{{.ColumnComment}}" +{{- end -}} +{{- end }} +// @Param pageSize query int false "页条数" +// @Param pageIndex query int false "页码" +// @Success 200 {object} response.Response{data=response.Page{list=[]models.{{.ClassName}}}} "{"code": 200, "data": [...]}" +// @Router /api/v1/{{.ModuleName}} [get] +// @Security Bearer +func (e {{.ClassName}}) Get{{.ClassName}}List(c *gin.Context) { + e.SetContext(c) + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + d := new(dto.{{.ClassName}}Search) + //查询列表 + err = d.Bind(c) + if err != nil { + log.Warnf("request body bind error, %s", err.Error()) + e.Error( http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + //数据权限检查 + p := actions.GetPermissionFromContext(c) + + list := make([]models.{{.ClassName}}, 0) + var count int64 + service{{.ClassName}} := service.{{.ClassName}}{} + service{{.ClassName}}.Log = log + service{{.ClassName}}.Orm = db + err = service{{.ClassName}}.Get{{.ClassName}}Page(d, p, &list, &count) + if err != nil { + log.Errorf("Get {{.ClassName}} Page error, %s", err.Error()) + e.Error( http.StatusInternalServerError, err, "查询失败") + return + } + + e.PageOK( list, int(count), d.GetPageIndex(), d.GetPageSize(), "查询成功") +} + +// Get{{.ClassName}} 获取{{.TableComment}} +// @Summary 获取{{.TableComment}} +// @Description 获取{{.TableComment}} +// @Tags {{.TableComment}} +// @Param id path string false "id" +// @Success 200 {object} response.Response{data=models.{{.ClassName}}} "{"code": 200, "data": [...]}" +// @Router /api/v1/{{.ModuleName}}/{id} [get] +// @Security Bearer +func (e {{.ClassName}}) Get{{.ClassName}}(c *gin.Context) { + e.SetContext(c) + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + control := new(dto.{{.ClassName}}ById) + + //查看详情 + err = control.Bind(c) + if err != nil { + log.Warnf("request body bind error, %s", err.Error()) + e.Error( http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object models.{{.ClassName}} + + //数据权限检查 + p := actions.GetPermissionFromContext(c) + + service{{.ClassName}} := service.{{.ClassName}}{} + service{{.ClassName}}.Log = log + service{{.ClassName}}.Orm = db + err = service{{.ClassName}}.Get{{.ClassName}}(control, p, &object) + if err != nil { + log.Errorf("Get {{.ClassName}} error, %s", err.Error()) + e.Error( http.StatusInternalServerError, err, "查询失败") + return + } + + e.OK( object, "查看成功") +} + +// Insert{{.ClassName}} 创建{{.TableComment}} +// @Summary 创建{{.TableComment}} +// @Description 创建{{.TableComment}} +// @Tags {{.TableComment}} +// @Accept application/json +// @Product application/json +// @Param data body dto.{{.ClassName}}Control true "data" +// @Success 200 {object} response.Response "{"code": 200, "message": "添加成功"}" +// @Router /api/v1/{{.ModuleName}} [post] +// @Security Bearer +func (e {{.ClassName}}) Insert{{.ClassName}}(c *gin.Context) { + e.SetContext(c) + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + control := new(dto.{{.ClassName}}Control) + + //新增操作 + err = control.Bind(c) + if err != nil { + log.Warnf("request body bind error, %s", err.Error()) + e.Error( http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + object, err := control.GenerateM() + if err != nil { + log.Errorf("generate {{.ClassName}} model error, %s", err.Error()) + e.Error( http.StatusInternalServerError, err, "模型生成失败") + return + } + // 设置创建人 + object.SetCreateBy(user.GetUserId(c)) + + service{{.ClassName}} := service.{{.ClassName}}{} + service{{.ClassName}}.Orm = db + service{{.ClassName}}.Log = log + err = service{{.ClassName}}.Insert{{.ClassName}}(object.(*models.{{.ClassName}})) + if err != nil { + log.Errorf("Insert {{.ClassName}} error, %s", err.Error()) + e.Error( http.StatusInternalServerError, err, "创建失败") + return + } + + e.OK( object.GetId(), "创建成功") +} + +// Update{{.ClassName}} 修改{{.TableComment}} +// @Summary 修改{{.TableComment}} +// @Description 修改{{.TableComment}} +// @Tags {{.TableComment}} +// @Accept application/json +// @Product application/json +// @Param data body dto.{{.ClassName}}Control true "body" +// @Success 200 {object} response.Response "{"code": 200, "message": "修改成功"}" +// @Router /api/v1/{{.ModuleName}}/{id} [put] +// @Security Bearer +func (e {{.ClassName}}) Update{{.ClassName}}(c *gin.Context) { + e.SetContext(c) + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + control := new(dto.{{.ClassName}}Control) + + //更新操作 + err = control.Bind(c) + if err != nil { + log.Warnf("request body bind error, %s", err.Error()) + e.Error( http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + object, err := control.GenerateM() + if err != nil { + log.Errorf("generate {{.ClassName}} model error, %s", err.Error()) + e.Error( http.StatusInternalServerError, err, "模型生成失败") + return + } + object.SetUpdateBy(user.GetUserId(c)) + + //数据权限检查 + p := actions.GetPermissionFromContext(c) + + service{{.ClassName}} := service.{{.ClassName}}{} + service{{.ClassName}}.Orm = db + service{{.ClassName}}.Log = log + err = service{{.ClassName}}.Update{{.ClassName}}(object.(*models.{{.ClassName}}), p) + if err != nil { + log.Errorf("Update {{.ClassName}} error, %s", err.Error()) + e.Error( http.StatusInternalServerError, err, "更新失败") + return + } + e.OK( object.GetId(), "更新成功") +} + +// Delete{{.ClassName}} 删除{{.TableComment}} +// @Summary 删除{{.TableComment}} +// @Description 删除{{.TableComment}} +// @Tags {{.TableComment}} +// @Param ids body []int false "ids" +// @Success 200 {object} response.Response "{"code": 200, "message": "删除成功"}" +// @Router /api/v1/{{.ModuleName}} [delete] +// @Security Bearer +func (e {{.ClassName}}) Delete{{.ClassName}}(c *gin.Context) { + e.SetContext(c) + log := e.GetLogger() + db, err := e.GetOrm() + if err != nil { + log.Error(err) + return + } + + control := new(dto.{{.ClassName}}ById) + + //删除操作 + err = control.Bind(c) + if err != nil { + log.Warnf("request body bind error, %s", err.Error()) + e.Error( http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + // 设置编辑人 + control.SetUpdateBy(user.GetUserId(c)) + + // 数据权限检查 + p := actions.GetPermissionFromContext(c) + + service{{.ClassName}} := service.{{.ClassName}}{} + service{{.ClassName}}.Orm = db + service{{.ClassName}}.Log = log + err = service{{.ClassName}}.Remove{{.ClassName}}(control, p) + if err != nil { + log.Errorf("Remove {{.ClassName}} error, %s", err.Error()) + e.Error( http.StatusInternalServerError, err, "删除失败") + return + } + e.OK( control.GetId(), "删除成功") +} \ No newline at end of file diff --git a/template/v3/no_actions/router_check_role.go.template b/template/v4/no_actions/router_check_role.go.template similarity index 76% rename from template/v3/no_actions/router_check_role.go.template rename to template/v4/no_actions/router_check_role.go.template index 6caf11cc..0aeb43e8 100644 --- a/template/v3/no_actions/router_check_role.go.template +++ b/template/v4/no_actions/router_check_role.go.template @@ -2,16 +2,17 @@ package router import ( "github.com/gin-gonic/gin" - "go-admin/app/admin/apis/{{.ModuleName}}" - "go-admin/app/admin/middleware" - jwt "go-admin/pkg/jwtauth" + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + + "go-admin/app/{{.PackageName}}/apis/{{.ModuleName}}" + "go-admin/common/middleware" ) func init() { routerCheckRole = append(routerCheckRole, register{{.ClassName}}Router) } -// 需认证的路由代码 +// register{{.ClassName}}Router func register{{.ClassName}}Router(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { api := &{{.ModuleName}}.{{.ClassName}}{} r := v1.Group("/{{.ModuleName}}").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) @@ -22,4 +23,4 @@ func register{{.ClassName}}Router(v1 *gin.RouterGroup, authMiddleware *jwt.GinJW r.PUT("/:id", api.Update{{.ClassName}}) r.DELETE("", api.Delete{{.ClassName}}) } -} +} \ No newline at end of file diff --git a/template/v3/no_actions/router_no_check_role.go.template b/template/v4/no_actions/router_no_check_role.go.template similarity index 73% rename from template/v3/no_actions/router_no_check_role.go.template rename to template/v4/no_actions/router_no_check_role.go.template index c74691e0..d079678a 100644 --- a/template/v3/no_actions/router_no_check_role.go.template +++ b/template/v4/no_actions/router_no_check_role.go.template @@ -2,23 +2,24 @@ package router import ( "github.com/gin-gonic/gin" - "go-admin/app/admin/apis/{{.ModuleName}}" - jwt "go-admin/pkg/jwtauth" + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + + "go-admin/app/{{.PackageName}}/apis/{{.ModuleName}}" ) func init() { routerCheckRole = append(routerCheckRole, register{{.ClassName}}Router) } -// 需认证的路由代码 +// register{{.ClassName}}Router func register{{.ClassName}}Router(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { api := &{{.ModuleName}}.{{.ClassName}}{} r := v1.Group("/{{.ModuleName}}").Use(authMiddleware.MiddlewareFunc()) { - r.GET("", api.Get{{.ClassName}}List) + r.GET("", api.Get{{.ClassName}}) r.GET("/:id", api.Get{{.ClassName}}) r.POST("", api.Insert{{.ClassName}}) r.PUT("/:id", api.Update{{.ClassName}}) r.DELETE("", api.Delete{{.ClassName}}) } -} +} \ No newline at end of file diff --git a/template/v4/no_actions/service.go.template b/template/v4/no_actions/service.go.template new file mode 100644 index 00000000..aaa60a80 --- /dev/null +++ b/template/v4/no_actions/service.go.template @@ -0,0 +1,102 @@ +package service + +import ( + "errors" + + "gorm.io/gorm" + + "go-admin/app/{{.PackageName}}/models" + "go-admin/common/actions" + cDto "go-admin/common/dto" + "go-admin/app/{{.PackageName}}/service/dto" + "go-admin/common/service" +) + +type {{.ClassName}} struct { + service.Service +} + +// Get{{.ClassName}}Page 获取{{.ClassName}}列表 +func (e *{{.ClassName}}) Get{{.ClassName}}Page(c *dto.{{.ClassName}}Search, p *actions.DataPermission, list *[]models.{{.ClassName}}, count *int64) error { + var err error + var data models.{{.ClassName}} + + err = e.Orm.Model(&data). + Scopes( + cDto.MakeCondition(c.GetNeedSearch()), + cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), + actions.Permission(data.TableName(), p), + ). + Find(list).Limit(-1).Offset(-1). + Count(count).Error + if err != nil { + e.Log.Errorf("Service Get{{.ClassName}}Page error:%s", err) + return err + } + return nil +} + +// Get{{.ClassName}} 获取{{.ClassName}}对象 +func (e *{{.ClassName}}) Get{{.ClassName}}(d *dto.{{.ClassName}}ById, p *actions.DataPermission, model *models.{{.ClassName}}) error { + var data models.{{.ClassName}} + + err := e.Orm.Model(&data). + Scopes( + actions.Permission(data.TableName(), p), + ). + First(model, d.GetId()).Error + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + err = errors.New("查看对象不存在或无权查看") + e.Log.Errorf("Service Get{{.ClassName}} error:%s", err) + return err + } + if err != nil { + e.Log.Errorf("db error:%s", err) + return err + } + return nil +} + +// Insert{{.ClassName}} 创建{{.ClassName}}对象 +func (e *{{.ClassName}}) Insert{{.ClassName}}(c *models.{{.ClassName}}) error { + err := e.Orm.Create(c).Error + if err != nil { + e.Log.Errorf("Service Insert{{.ClassName}} error:%s", err) + return err + } + return nil +} + +// Update{{.ClassName}} 修改{{.ClassName}}对象 +func (e *{{.ClassName}}) Update{{.ClassName}}(c *models.{{.ClassName}}, p *actions.DataPermission) error { + db := e.Orm.Model(c). + Scopes( + actions.Permission(c.TableName(), p), + ).Where(c.GetId()).Updates(c) + if err := db.Error; err != nil { + e.Log.Errorf("Service Update{{.ClassName}} error:%s", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权更新该数据") + } + return nil +} + +// Remove{{.ClassName}} 删除{{.ClassName}} +func (e *{{.ClassName}}) Remove{{.ClassName}}(d *dto.{{.ClassName}}ById, p *actions.DataPermission) error { + var data models.{{.ClassName}} + + db := e.Orm.Model(&data). + Scopes( + actions.Permission(data.TableName(), p), + ).Delete(&data, d.GetId()) + if err := db.Error; err != nil { + e.Log.Errorf("Service Remove{{.ClassName}} error:%s", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权删除该数据") + } + return nil +} \ No newline at end of file diff --git a/template/v3/vue.go.template b/template/v4/vue.go.template similarity index 97% rename from template/v3/vue.go.template rename to template/v4/vue.go.template index b479b09a..0e7f050a 100644 --- a/template/v3/vue.go.template +++ b/template/v4/vue.go.template @@ -46,7 +46,7 @@