1、初始化项目
This commit is contained in:
		
							
								
								
									
										23
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | .idea | ||||||
|  | .vscode | ||||||
|  | */.DS_Store | ||||||
|  | static/uploadfile | ||||||
|  | main.exe | ||||||
|  | *.exe | ||||||
|  | go-admin | ||||||
|  | go-admin.exe | ||||||
|  | temp/ | ||||||
|  | !temp | ||||||
|  | vendor | ||||||
|  | config/settings.dev.yml | ||||||
|  | config/settings.dev.*.yml | ||||||
|  | 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/doc.go | ||||||
|  |  | ||||||
|  | # go sum | ||||||
|  | go.sum | ||||||
|  | config/settings.deva.yml | ||||||
							
								
								
									
										18
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | |||||||
|  | FROM alpine | ||||||
|  |  | ||||||
|  | # ENV GOPROXY https://goproxy.cn/ | ||||||
|  |  | ||||||
|  | RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories | ||||||
|  |  | ||||||
|  | RUN apk update --no-cache | ||||||
|  | RUN apk add --update gcc g++ libc6-compat | ||||||
|  | RUN apk add --no-cache ca-certificates | ||||||
|  | RUN apk add --no-cache tzdata | ||||||
|  | ENV TZ Asia/Shanghai | ||||||
|  |  | ||||||
|  | COPY ./main /main | ||||||
|  | COPY ./config/settings.demo.yml /config/settings.yml | ||||||
|  | COPY ./go-admin-db.db /go-admin-db.db | ||||||
|  | EXPOSE 8000 | ||||||
|  | RUN  chmod +x /main | ||||||
|  | CMD ["/main","server","-c", "/config/settings.yml"] | ||||||
							
								
								
									
										28
									
								
								Dockerfilebak
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								Dockerfilebak
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | |||||||
|  | FROM golang:alpine as builder | ||||||
|  |  | ||||||
|  | MAINTAINER lwnmengjing | ||||||
|  |  | ||||||
|  | ENV GOPROXY https://goproxy.cn/ | ||||||
|  |  | ||||||
|  | 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 | ||||||
|  | RUN go mod tidy | ||||||
|  | COPY . . | ||||||
|  | RUN pwd && ls | ||||||
|  |  | ||||||
|  | RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -a -installsuffix cgo -o go-admin . | ||||||
|  |  | ||||||
|  | FROM alpine | ||||||
|  |  | ||||||
|  | COPY --from=builder /go/release/go-admin / | ||||||
|  |  | ||||||
|  | COPY --from=builder /go/release/config/settings.yml /config/settings.yml | ||||||
|  |  | ||||||
|  | COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /etc/localtime | ||||||
|  |  | ||||||
|  | EXPOSE 8000 | ||||||
|  |  | ||||||
|  | CMD ["/go-admin","server","-c", "/config/settings.yml"] | ||||||
							
								
								
									
										21
									
								
								LICENSE.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								LICENSE.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | |||||||
|  | MIT License | ||||||
|  |  | ||||||
|  | Copyright (c) 2020 go-admin-team | ||||||
|  |  | ||||||
|  | Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  | of this software and associated documentation files (the "Software"), to deal | ||||||
|  | in the Software without restriction, including without limitation the rights | ||||||
|  | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  | copies of the Software, and to permit persons to whom the Software is | ||||||
|  | furnished to do so, subject to the following conditions: | ||||||
|  |  | ||||||
|  | The above copyright notice and this permission notice shall be included in all | ||||||
|  | copies or substantial portions of the Software. | ||||||
|  |  | ||||||
|  | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | SOFTWARE. | ||||||
							
								
								
									
										54
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | |||||||
|  | PROJECT:=go-admin | ||||||
|  |  | ||||||
|  | .PHONY: build | ||||||
|  | build: | ||||||
|  | 	CGO_ENABLED=0 go build -ldflags="-w -s" -a -installsuffix "" -o go-admin . | ||||||
|  |  | ||||||
|  | # make build-linux | ||||||
|  | build-linux: | ||||||
|  | 	@docker build -t go-admin:latest . | ||||||
|  | 	@echo "build successful" | ||||||
|  |  | ||||||
|  | build-sqlite: | ||||||
|  | 	go build -tags sqlite3 -ldflags="-w -s" -a -installsuffix -o go-admin . | ||||||
|  |  | ||||||
|  | # make run | ||||||
|  | run: | ||||||
|  |     # delete go-admin-api container | ||||||
|  | 	@if [ $(shell docker ps -aq --filter name=go-admin --filter publish=8000) ]; then docker rm -f go-admin; fi | ||||||
|  |  | ||||||
|  |     # 启动方法一 run go-admin-api container  docker-compose 启动方式 | ||||||
|  |     # 进入到项目根目录 执行 make run 命令 | ||||||
|  | 	@docker-compose up -d | ||||||
|  |  | ||||||
|  | 	# 启动方式二 docker run  这里注意-v挂载的宿主机的地址改为部署时的实际决对路径 | ||||||
|  |     #@docker run --name=go-admin -p 8000:8000 -v /home/code/go/src/go-admin/go-admin/config:/go-admin-api/config  -v /home/code/go/src/go-admin/go-admin-api/static:/go-admin/static -v /home/code/go/src/go-admin/go-admin/temp:/go-admin-api/temp -d --restart=always go-admin:latest | ||||||
|  |  | ||||||
|  | 	@echo "go-admin service is running..." | ||||||
|  |  | ||||||
|  | 	# delete Tag=<none> 的镜像 | ||||||
|  | 	@docker image prune -f | ||||||
|  | 	@docker ps -a | grep "go-admin" | ||||||
|  |  | ||||||
|  | stop: | ||||||
|  |     # delete go-admin-api container | ||||||
|  | 	@if [ $(shell docker ps -aq --filter name=go-admin --filter publish=8000) ]; then docker-compose down; fi | ||||||
|  | 	#@if [ $(shell docker ps -aq --filter name=go-admin --filter publish=8000) ]; then docker rm -f go-admin; fi | ||||||
|  | 	#@echo "go-admin stop success" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #.PHONY: test | ||||||
|  | #test: | ||||||
|  | #	go test -v ./... -cover | ||||||
|  |  | ||||||
|  | #.PHONY: docker | ||||||
|  | #docker: | ||||||
|  | #	docker build . -t go-admin:latest | ||||||
|  |  | ||||||
|  | # make deploy | ||||||
|  | deploy: | ||||||
|  |  | ||||||
|  | 	#@git checkout master | ||||||
|  | 	#@git pull origin master | ||||||
|  | 	make build-linux | ||||||
|  | 	make run | ||||||
							
								
								
									
										353
									
								
								README.Zh-cn.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										353
									
								
								README.Zh-cn.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,353 @@ | |||||||
|  | # go-admin | ||||||
|  |  | ||||||
|  |   <img align="right" width="320" src="https://doc-image.zhangwj.com/img/go-admin.svg"> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | [](https://github.com/go-admin-team/go-admin) | ||||||
|  | [](https://github.com/go-admin-team/go-admin/releases) | ||||||
|  | [](https://github.com/go-admin-team/go-admin) | ||||||
|  |  | ||||||
|  | [English](https://github.com/go-admin-team/go-admin/blob/master/README.md) | 简体中文 | ||||||
|  |  | ||||||
|  | 基于Gin + Vue + Element UI OR Arco Design OR Ant Design的前后端分离权限管理系统,系统初始化极度简单,只需要配置文件中,修改数据库连接,系统支持多指令操作,迁移指令可以让初始化数据库信息变得更简单,服务指令可以很简单的启动api服务 | ||||||
|  |  | ||||||
|  | [在线文档](https://www.go-admin.pro) | ||||||
|  |  | ||||||
|  | [前端项目](https://github.com/go-admin-team/go-admin-ui) | ||||||
|  |  | ||||||
|  | [视频教程](https://space.bilibili.com/565616721/channel/detail?cid=125737) | ||||||
|  |  | ||||||
|  | ## 🎬 在线体验 | ||||||
|  |  | ||||||
|  | Element UI vue体验:[https://vue2.go-admin.dev](https://vue2.go-admin.dev/#/login) | ||||||
|  | > ⚠️⚠️⚠️ 账号 / 密码: admin / 123456 | ||||||
|  |  | ||||||
|  | Arco Design vue3 demo:[https://vue3.go-admin.dev](https://vue3.go-admin.dev/#/login) | ||||||
|  | > ⚠️⚠️⚠️ 账号 / 密码: admin / 123456 | ||||||
|  |  | ||||||
|  | antd体验:[https://antd.go-admin.pro](https://antd.go-admin.pro/) | ||||||
|  | > ⚠️⚠️⚠️ 账号 / 密码: admin / 123456 | ||||||
|  |  | ||||||
|  | ## ✨ 特性 | ||||||
|  |  | ||||||
|  | - 遵循 RESTful API 设计规范 | ||||||
|  |  | ||||||
|  | - 基于 GIN WEB API 框架,提供了丰富的中间件支持(用户认证、跨域、访问日志、追踪ID等) | ||||||
|  |  | ||||||
|  | - 基于Casbin的 RBAC 访问控制模型 | ||||||
|  |  | ||||||
|  | - JWT 认证 | ||||||
|  |  | ||||||
|  | - 支持 Swagger 文档(基于swaggo) | ||||||
|  |  | ||||||
|  | - 基于 GORM 的数据库存储,可扩展多种类型数据库 | ||||||
|  |  | ||||||
|  | - 配置文件简单的模型映射,快速能够得到想要的配置 | ||||||
|  |  | ||||||
|  | - 代码生成工具 | ||||||
|  |  | ||||||
|  | - 表单构建工具 | ||||||
|  |  | ||||||
|  | - 多指令模式 | ||||||
|  |  | ||||||
|  | - 多租户的支持 | ||||||
|  |  | ||||||
|  | - TODO: 单元测试 | ||||||
|  |  | ||||||
|  | ## 🎁 内置 | ||||||
|  |  | ||||||
|  | 1. 多租户:系统默认支持多租户,按库分离,一个库一个租户。 | ||||||
|  | 1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 | ||||||
|  | 2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 | ||||||
|  | 3. 岗位管理:配置系统用户所属担任职务。 | ||||||
|  | 4. 菜单管理:配置系统菜单,操作权限,按钮权限标识,接口权限等。 | ||||||
|  | 5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 | ||||||
|  | 6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。 | ||||||
|  | 7. 参数管理:对系统动态配置常用参数。 | ||||||
|  | 8. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 | ||||||
|  | 9. 登录日志:系统登录日志记录查询包含登录异常。 | ||||||
|  | 1. 接口文档:根据业务代码自动生成相关的api接口文档。 | ||||||
|  | 1. 代码生成:根据数据表结构生成对应的增删改查相对应业务,全程可视化操作,让基本业务可以零代码实现。 | ||||||
|  | 1. 表单构建:自定义页面样式,拖拉拽实现页面布局。 | ||||||
|  | 1. 服务监控:查看一些服务器的基本信息。 | ||||||
|  | 1. 内容管理:demo功能,下设分类管理、内容管理。可以参考使用方便快速入门。 | ||||||
|  | 1. 定时任务:自动化任务,目前支持接口调用和函数调用。 | ||||||
|  |  | ||||||
|  | ## 准备工作 | ||||||
|  |  | ||||||
|  | 你需要在本地安装 [go] [gin] [node](http://nodejs.org/) 和 [git](https://git-scm.com/)  | ||||||
|  |  | ||||||
|  | 同时配套了系列教程包含视频和文档,如何从下载完成到熟练使用,强烈建议大家先看完这些教程再来实践本项目!!! | ||||||
|  |  | ||||||
|  | ### 轻松实现go-admin写出第一个应用 - 文档教程 | ||||||
|  |  | ||||||
|  | [步骤一 - 基础内容介绍](https://doc.zhangwj.com/guide/intro/tutorial01.html) | ||||||
|  |  | ||||||
|  | [步骤二 - 实际应用 - 编写增删改查](https://doc.zhangwj.com/guide/intro/tutorial02.html) | ||||||
|  |  | ||||||
|  | ### 手把手教你从入门到放弃 - 视频教程 | ||||||
|  |  | ||||||
|  | [如何启动go-admin](https://www.bilibili.com/video/BV1z5411x7JG) | ||||||
|  |  | ||||||
|  | [使用生成工具轻松实现业务](https://www.bilibili.com/video/BV1Dg4y1i79D) | ||||||
|  |  | ||||||
|  | [v1.1.0版本代码生成工具-释放双手](https://www.bilibili.com/video/BV1N54y1i71P) [进阶] | ||||||
|  |  | ||||||
|  | [多命令启动方式讲解以及IDE配置](https://www.bilibili.com/video/BV1Fg4y1q7ph) | ||||||
|  |  | ||||||
|  | [go-admin菜单的配置说明](https://www.bilibili.com/video/BV1Wp4y1D715) [必看] | ||||||
|  |  | ||||||
|  | [如何配置菜单信息以及接口信息](https://www.bilibili.com/video/BV1zv411B7nG) [必看] | ||||||
|  |  | ||||||
|  | [go-admin权限配置使用说明](https://www.bilibili.com/video/BV1rt4y197d3) [必看] | ||||||
|  |  | ||||||
|  | [go-admin数据权限使用说明](https://www.bilibili.com/video/BV1LK4y1s71e) [必看] | ||||||
|  |  | ||||||
|  | **如有问题请先看上述使用文档和文章,若不能满足,欢迎 issue 和 pr ,视频教程和文档持续更新中** | ||||||
|  |  | ||||||
|  | ## 📦 本地开发 | ||||||
|  |  | ||||||
|  | ### 环境要求 | ||||||
|  |  | ||||||
|  | go 1.18 | ||||||
|  |  | ||||||
|  | node版本: v14.16.0 | ||||||
|  |  | ||||||
|  | npm版本: 6.14.11 | ||||||
|  |  | ||||||
|  | ### 开发目录创建 | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  |  | ||||||
|  | # 创建开发目录 | ||||||
|  | mkdir goadmin | ||||||
|  | cd goadmin | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### 获取代码 | ||||||
|  |  | ||||||
|  | > 重点注意:两个项目必须放在同一文件夹下; | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | # 获取后端代码 | ||||||
|  | git clone https://github.com/go-admin-team/go-admin.git | ||||||
|  |  | ||||||
|  | # 获取前端代码 | ||||||
|  | git clone https://github.com/go-admin-team/go-admin-ui.git | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### 启动说明 | ||||||
|  |  | ||||||
|  | #### 服务端启动说明 | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | # 进入 go-admin 后端项目 | ||||||
|  | cd ./go-admin | ||||||
|  |  | ||||||
|  | # 更新整理依赖 | ||||||
|  | go mod tidy | ||||||
|  |  | ||||||
|  | # 编译项目 | ||||||
|  | go build | ||||||
|  |  | ||||||
|  | # 修改配置  | ||||||
|  | # 文件路径  go-admin/config/settings.yml | ||||||
|  | vi ./config/settings.yml | ||||||
|  |  | ||||||
|  | # 1. 配置文件中修改数据库信息  | ||||||
|  | # 注意: settings.database 下对应的配置数据 | ||||||
|  | # 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/zh-CN/guide/faq#cgo-%E7%9A%84%E9%97%AE%E9%A2%98) | ||||||
|  |  | ||||||
|  | ::: | ||||||
|  |  | ||||||
|  | #### 初始化数据库,以及服务启动 | ||||||
|  |  | ||||||
|  | ``` bash | ||||||
|  | # 首次配置需要初始化数据库资源信息 | ||||||
|  | # macOS or linux 下使用 | ||||||
|  | $ ./go-admin migrate -c config/settings.dev.yml | ||||||
|  |  | ||||||
|  | # ⚠️注意:windows 下使用 | ||||||
|  | $ go-admin.exe migrate -c config/settings.dev.yml | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # 启动项目,也可以用IDE进行调试 | ||||||
|  | # macOS or linux 下使用 | ||||||
|  | $ ./go-admin server -c config/settings.yml | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # ⚠️注意:windows 下使用 | ||||||
|  | $ go-admin.exe server -c config/settings.yml | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | #### sys_api 表的数据如何添加 | ||||||
|  |  | ||||||
|  | 在项目启动时,使用`-a true` 系统会自动添加缺少的接口数据 | ||||||
|  | ```bash | ||||||
|  | ./go-admin server -c config/settings.yml -a true | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | #### 使用docker 编译启动 | ||||||
|  |  | ||||||
|  | ```shell | ||||||
|  | # 编译镜像 | ||||||
|  | docker build -t go-admin . | ||||||
|  |  | ||||||
|  | # 启动容器,第一个go-admin是容器名字,第二个go-admin是镜像名称 | ||||||
|  | # -v 映射配置文件 本地路径:容器路径 | ||||||
|  | docker run --name go-admin -p 8000:8000 -v /config/settings.yml:/config/settings.yml -d go-admin-server | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | #### 文档生成 | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | go generate | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | #### 交叉编译 | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | # windows | ||||||
|  | env GOOS=windows GOARCH=amd64 go build main.go | ||||||
|  |  | ||||||
|  | # or | ||||||
|  | # linux | ||||||
|  | env GOOS=linux GOARCH=amd64 go build main.go | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### UI交互端启动说明 | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | # 安装依赖 | ||||||
|  | npm install | ||||||
|  |  | ||||||
|  | # 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题 | ||||||
|  | npm install --registry=https://registry.npmmirror.com | ||||||
|  |  | ||||||
|  | # 启动服务 | ||||||
|  | npm run dev | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ## 📨 互动 | ||||||
|  |  | ||||||
|  | <table> | ||||||
|  |    <tr> | ||||||
|  |     <td><img src="https://raw.githubusercontent.com/wenjianzhang/image/master/img/wx.png" width="180px"></td> | ||||||
|  |     <td><img src="https://doc-image.zhangwj.com/img/qrcode_for_gh_b798dc7db30c_258.jpg" width="180px"></td> | ||||||
|  |     <td><img src="https://raw.githubusercontent.com/wenjianzhang/image/master/img/qq2.png" width="200px"></td> | ||||||
|  |     <td><a href="https://space.bilibili.com/565616721">wenjianzhang</a></td> | ||||||
|  |   </tr> | ||||||
|  |   <tr> | ||||||
|  |     <td>微信</td> | ||||||
|  |     <td>公众号🔥🔥🔥</td> | ||||||
|  |     <td><a target="_blank" href="https://shang.qq.com/wpa/qunwpa?idkey=0f2bf59f5f2edec6a4550c364242c0641f870aa328e468c4ee4b7dbfb392627b"><img border="0" src="https://pub.idqqimg.com/wpa/images/group.png" alt="go-admin技术交流乙号" title="go-admin技术交流乙号"></a></td> | ||||||
|  |     <td>哔哩哔哩🔥🔥🔥</td> | ||||||
|  |   </tr> | ||||||
|  | </table> | ||||||
|  |  | ||||||
|  | ## 💎 贡献者 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/wenjianzhang" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/3890175?v=4&h=60&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/G-Akiraka" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/45746659?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/lwnmengjing" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/12806223?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/bing127" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/31166183?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/chengxiao" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/1379545?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/NightFire0307" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/19854086?v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/appleboy" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/21979?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/ninstein" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/580303?v=4&h=60&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/kikiyou" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/17959053?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/horizonzy" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/22524871?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/Cassuis" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/48005724?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/hqcchina" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/5179057?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/nodece" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/16235121?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/stephenzhang0713" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/18169290?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/zhouxixi-dev" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/100399679?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/Jalins" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/31172582?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/wkf928592" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/6063351?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/wxxiong6" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/6983441?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/Silicon-He" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/52478309?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/GizmoOAO" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/20385106?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/bestgopher" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/36840497?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/wxb1207" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/20775558?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/misakichan" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/16569274?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/zhuxuyang" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/19301024?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/mss-boot" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/109259065?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/AuroraV" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/37330199?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/Vingurzhou" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/57127283?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/haimait" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/40926384?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/zyd" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/3446278?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/infnan" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/38274826?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/d1y" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/45585937?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/qlijin" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/515900?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/logtous | ||||||
|  | " ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/88697234?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/stepway | ||||||
|  | " ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/9927079?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/NaturalGao | ||||||
|  | " ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/43291304?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/DemoLiang | ||||||
|  | " ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/23476007?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/jfcg | ||||||
|  | " ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/1410597?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/Nicole0724 | ||||||
|  | " ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/10487328?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  |  | ||||||
|  | ## JetBrains 开源证书支持 | ||||||
|  |  | ||||||
|  | `go-admin` 项目一直以来都是在 JetBrains 公司旗下的 GoLand 集成开发环境中进行开发,基于 **free JetBrains Open Source license(s)** 正版免费授权,在此表达我的谢意。 | ||||||
|  |  | ||||||
|  | <a href="https://www.jetbrains.com/?from=kubeadm-ha" target="_blank"><img src="https://raw.githubusercontent.com/panjf2000/illustrations/master/jetbrains/jetbrains-variant-4.png" width="250" align="middle"/></a> | ||||||
|  |  | ||||||
|  | ## 🤝 特别感谢 | ||||||
|  |  | ||||||
|  | 1. [ant-design](https://github.com/ant-design/ant-design) | ||||||
|  | 2. [ant-design-pro](https://github.com/ant-design/ant-design-pro) | ||||||
|  | 2. [arco-design](https://github.com/arco-design/arco-design) | ||||||
|  | 2. [arco-design-pro](https://github.com/arco-design/arco-design-pro) | ||||||
|  | 4. [gin](https://github.com/gin-gonic/gin) | ||||||
|  | 5. [casbin](https://github.com/casbin/casbin) | ||||||
|  | 6. [spf13/viper](https://github.com/spf13/viper) | ||||||
|  | 7. [gorm](https://github.com/jinzhu/gorm) | ||||||
|  | 8. [gin-swagger](https://github.com/swaggo/gin-swagger) | ||||||
|  | 9. [jwt-go](https://github.com/dgrijalva/jwt-go) | ||||||
|  | 10. [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin) | ||||||
|  | 11. [ruoyi-vue](https://gitee.com/y_project/RuoYi-Vue) | ||||||
|  | 12. [form-generator](https://github.com/JakHuang/form-generator) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## 🤟 打赏 | ||||||
|  |  | ||||||
|  | > 如果你觉得这个项目帮助到了你,你可以帮作者买一杯果汁表示鼓励 :tropical_drink: | ||||||
|  |  | ||||||
|  | <img class="no-margin" src="https://raw.githubusercontent.com/wenjianzhang/image/master/img/pay.png"  height="200px" > | ||||||
|  |  | ||||||
|  | ## 🤝 链接 | ||||||
|  |  | ||||||
|  | [Go开发者成长线路图](http://www.golangroadmap.com/) | ||||||
|  |  | ||||||
|  | ## 🔑 License | ||||||
|  |  | ||||||
|  | [MIT](https://github.com/go-admin-team/go-admin/blob/master/LICENSE.md) | ||||||
|  |  | ||||||
|  | Copyright (c) 2022 wenjianzhang | ||||||
							
								
								
									
										342
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										342
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,342 @@ | |||||||
|  |  | ||||||
|  | # go-admin | ||||||
|  |  | ||||||
|  | <img align="right" width="320" src="https://doc-image.zhangwj.com/img/go-admin.svg"> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | [](https://github.com/go-admin-team/go-admin) | ||||||
|  | [](https://github.com/go-admin-team/go-admin/releases) | ||||||
|  | [](https://github.com/go-admin-team/go-admin) | ||||||
|  |  | ||||||
|  | English | [简体中文](https://github.com/go-admin-team/go-admin/blob/master/README.Zh-cn.md) | ||||||
|  |  | ||||||
|  | The front-end and back-end separation authority management system based on Gin + Vue + Element UI OR Arco Design is extremely simple to initialize the system. You only need to modify the database connection in the configuration file. The system supports multi-instruction operations. Migration instructions can make it easier to initialize database information. Service instructions It's easy to start the api service. | ||||||
|  |  | ||||||
|  | [documentation](https://www.go-admin.dev) | ||||||
|  |  | ||||||
|  | [Front-end project](https://github.com/go-admin-team/go-admin-ui) | ||||||
|  |  | ||||||
|  | [Video tutorial](https://space.bilibili.com/565616721/channel/detail?cid=125737) | ||||||
|  |  | ||||||
|  | ## 🎬 Online Demo | ||||||
|  |  | ||||||
|  | Element UI vue demo:[https://vue2.go-admin.dev](https://vue2.go-admin.dev/#/login) | ||||||
|  | > 账号 / 密码: admin / 123456 | ||||||
|  |  | ||||||
|  | Arco Design vue3 demo:[https://vue3.go-admin.dev](https://vue3.go-admin.dev/#/login) | ||||||
|  | > 账号 / 密码: admin / 123456 | ||||||
|  |  | ||||||
|  | antd demo:[https://antd.go-admin.pro](https://antd.go-admin.pro/) | ||||||
|  | > 账号 / 密码: admin / 123456 | ||||||
|  | >  | ||||||
|  | ## ✨ Feature | ||||||
|  |  | ||||||
|  | - Follow RESTful API design specifications | ||||||
|  |  | ||||||
|  | - Based on the GIN WEB API framework, it provides rich middleware support (user authentication, cross-domain, access log, tracking ID, etc.) | ||||||
|  |  | ||||||
|  | - RBAC access control model based on Casbin | ||||||
|  |  | ||||||
|  | - JWT authentication | ||||||
|  |  | ||||||
|  | - Support Swagger documents (based on swaggo) | ||||||
|  |  | ||||||
|  | - Database storage based on GORM, which can expand multiple types of databases | ||||||
|  |  | ||||||
|  | - Simple model mapping of configuration files to quickly get the desired configuration | ||||||
|  |  | ||||||
|  | - Code generation tool | ||||||
|  |  | ||||||
|  | - Form builder | ||||||
|  |  | ||||||
|  | - Multi-command mode | ||||||
|  |  | ||||||
|  | - TODO: unit test | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## 🎁 Internal | ||||||
|  |  | ||||||
|  | 1. User management: The user is the system operator, this function mainly completes the system user configuration. | ||||||
|  | 2. Department management: configure the system organization (company, department, group), and display the tree structure to support data permissions. | ||||||
|  | 3. Position management: configure the positions of system users. | ||||||
|  | 4. Menu management: configure the system menu, operation authority, button authority identification, interface authority, etc. | ||||||
|  | 5. Role management: Role menu permission assignment and role setting are divided into data scope permissions by organization. | ||||||
|  | 6. Dictionary management: Maintain some relatively fixed data frequently used in the system. | ||||||
|  | 7. Parameter management: dynamically configure common parameters for the system. | ||||||
|  | 8. Operation log: system normal operation log record and query; system abnormal information log record and query. | ||||||
|  | 9. Login log: The system login log record query contains login exceptions. | ||||||
|  | 1. Interface documentation: Automatically generate related api interface documents according to the business code. | ||||||
|  | 1. Code generation: According to the data table structure, generate the corresponding addition, deletion, modification, and check corresponding business, and the whole process of visual operation, so that the basic business can be implemented with zero code. | ||||||
|  | 1. Form construction: Customize the page style, drag and drop to realize the page layout. | ||||||
|  | 1. Service monitoring: View the basic information of some servers. | ||||||
|  | 1. Content management: demo function, including classification management and content management. You can refer to the easy to use quick start. | ||||||
|  |  | ||||||
|  | ## Ready to work | ||||||
|  |  | ||||||
|  | You need to install locally [go] [gin] [node](http://nodejs.org/) 和 [git](https://git-scm.com/) | ||||||
|  |  | ||||||
|  | At the same time, a series of tutorials including videos and documents are provided. How to complete the downloading to the proficient use, it is strongly recommended that you read these tutorials before you practice this project! ! ! | ||||||
|  |  | ||||||
|  | ### Easily implement go-admin to write the first application-documentation tutorial | ||||||
|  |  | ||||||
|  | [Step 1 - basic content introduction](https://doc.zhangwj.com/guide/intro/tutorial01.html) | ||||||
|  |  | ||||||
|  | [Step 2 - Practical application - writing database operations](https://doc.zhangwj.com/guide/intro/tutorial02.html) | ||||||
|  |  | ||||||
|  | ### Teach you from getting started to giving up-video tutorial | ||||||
|  |  | ||||||
|  | [How to start go-admin](https://www.bilibili.com/video/BV1z5411x7JG) | ||||||
|  |  | ||||||
|  | [Easily implement business using build tools](https://www.bilibili.com/video/BV1Dg4y1i79D) | ||||||
|  |  | ||||||
|  | [v1.1.0 version code generation tool-free your hands](https://www.bilibili.com/video/BV1N54y1i71P) [Advanced] | ||||||
|  |  | ||||||
|  | [Explanation of multi-command startup mode and IDE configuration](https://www.bilibili.com/video/BV1Fg4y1q7ph) | ||||||
|  |  | ||||||
|  | [Configuration instructions for go-admin menu](https://www.bilibili.com/video/BV1Wp4y1D715) [Must see] | ||||||
|  |  | ||||||
|  | [How to configure menu information and interface information](https://www.bilibili.com/video/BV1zv411B7nG) [Must see] | ||||||
|  |  | ||||||
|  | [go-admin permission configuration instructions](https://www.bilibili.com/video/BV1rt4y197d3) [Must see] | ||||||
|  |  | ||||||
|  | [Instructions for use of go-admin data permissions](https://www.bilibili.com/video/BV1LK4y1s71e) [Must see] | ||||||
|  |  | ||||||
|  | **If you have any questions, please read the above-mentioned usage documents and articles first. If you are not satisfied, welcome to issue and pr. Video tutorials and documents are being updated continuously.** | ||||||
|  |  | ||||||
|  | ## 📦 Local development | ||||||
|  |  | ||||||
|  | ### Environmental requirements | ||||||
|  |  | ||||||
|  | go 1.18 | ||||||
|  |  | ||||||
|  | nodejs: v14.16.0 | ||||||
|  |  | ||||||
|  | npm: 6.14.11 | ||||||
|  |  | ||||||
|  | ### Development directory creation | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  |  | ||||||
|  | # Create a development directory | ||||||
|  | mkdir goadmin | ||||||
|  | cd goadmin | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### Get the code | ||||||
|  |  | ||||||
|  | > Important note: the 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 the front-end code | ||||||
|  | git clone https://github.com/go-admin-team/go-admin-ui.git | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### Startup instructions | ||||||
|  |  | ||||||
|  | #### Server startup instructions | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | # Enter the go-admin backend project | ||||||
|  | cd ./go-admin | ||||||
|  |  | ||||||
|  | # Update dependencies | ||||||
|  | go mod tidy | ||||||
|  |  | ||||||
|  | # Compile the project | ||||||
|  | go build | ||||||
|  |  | ||||||
|  | # Change setting  | ||||||
|  | # File path go-admin/config/settings.yml | ||||||
|  | vi ./config/settings.yml | ||||||
|  |  | ||||||
|  | # 1. Modify the database information in the configuration file | ||||||
|  | # Note: The corresponding configuration data under settings.database | ||||||
|  | # 2. Confirm the log path | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | :::tip ⚠️Note that this problem will occur if CGO is not installed in the windows10+ environment; | ||||||
|  |  | ||||||
|  | ```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% | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | [Solve the cgo problem and enter](https://doc.go-admin.dev/guide/faq#cgo-%E7%9A%84%E9%97%AE%E9%A2%98) | ||||||
|  |  | ||||||
|  | ::: | ||||||
|  |  | ||||||
|  | #### Initialize the database, and start the service | ||||||
|  |  | ||||||
|  | ``` bash | ||||||
|  | # The first configuration needs to initialize the database resource information | ||||||
|  | # Use under macOS or linux | ||||||
|  | $ ./go-admin migrate -c config/settings.dev.yml | ||||||
|  |  | ||||||
|  | # ⚠️Note: Use under windows | ||||||
|  | $ go-admin.exe migrate -c config/settings.dev.yml | ||||||
|  |  | ||||||
|  | # Start the project, you can also use the IDE for debugging | ||||||
|  | # Use under macOS or linux | ||||||
|  | $ ./go-admin server -c config/settings.yml | ||||||
|  |  | ||||||
|  | # ⚠️Note: Use under windows | ||||||
|  | $ go-admin.exe server -c config/settings.yml | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | #### Use docker to compile and start | ||||||
|  |  | ||||||
|  | ```shell | ||||||
|  | # Compile the 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 | ||||||
|  | # -v Mapping configuration file Local path: container path | ||||||
|  | docker run --name go-admin -p 8000:8000 -v /config/settings.yml:/config/settings.yml -d go-admin-server | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #### Generation Document | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | go generate | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | #### Cross compile | ||||||
|  | ```bash | ||||||
|  | # windows | ||||||
|  | env GOOS=windows GOARCH=amd64 go build main.go | ||||||
|  |  | ||||||
|  | # or | ||||||
|  | # linux | ||||||
|  | env GOOS=linux GOARCH=amd64 go build main.go | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### UI interactive terminal startup instructions | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | # Installation dependencies | ||||||
|  | npm install   # or cnpm install | ||||||
|  |  | ||||||
|  | # Start service | ||||||
|  | npm run dev | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ## 📨 Interactive | ||||||
|  |  | ||||||
|  | <table> | ||||||
|  |   <tr> | ||||||
|  |     <td><img src="https://raw.githubusercontent.com/wenjianzhang/image/master/img/wx.png" width="180px"></td> | ||||||
|  |     <td><img src="https://doc-image.zhangwj.com/img/qrcode_for_gh_b798dc7db30c_258.jpg" width="180px"></td> | ||||||
|  |     <td><img src="https://raw.githubusercontent.com/wenjianzhang/image/master/img/qq2.png" width="200px"></td> | ||||||
|  |     <td><a href="https://space.bilibili.com/565616721">wenjianzhang</a></td> | ||||||
|  |   </tr> | ||||||
|  |   <tr> | ||||||
|  |     <td>Wechat</td> | ||||||
|  |     <td>Wechat公众号🔥🔥🔥</td> | ||||||
|  |     <td><a target="_blank" href="https://shang.qq.com/wpa/qunwpa?idkey=0f2bf59f5f2edec6a4550c364242c0641f870aa328e468c4ee4b7dbfb392627b"><img border="0" src="https://pub.idqqimg.com/wpa/images/group.png" alt="go-admin技术交流乙号" title="go-admin技术交流乙号"></a></td> | ||||||
|  |     <td>bilibili🔥🔥🔥</td> | ||||||
|  |   </tr> | ||||||
|  | </table> | ||||||
|  |  | ||||||
|  | ## 💎 Contributors | ||||||
|  |  | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/wenjianzhang" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/3890175?v=4&h=60&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/G-Akiraka" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/45746659?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/lwnmengjing" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/12806223?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/bing127" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/31166183?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/chengxiao" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/1379545?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/NightFire0307" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/19854086?v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/appleboy" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/21979?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/ninstein" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/580303?v=4&h=60&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/kikiyou" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/17959053?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/horizonzy" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/22524871?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/Cassuis" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/48005724?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/hqcchina" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/5179057?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/nodece" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/16235121?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/stephenzhang0713" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/18169290?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/zhouxixi-dev" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/100399679?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/Jalins" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/31172582?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/wkf928592" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/6063351?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/wxxiong6" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/6983441?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/Silicon-He" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/52478309?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/GizmoOAO" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/20385106?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/bestgopher" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/36840497?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/wxb1207" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/20775558?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/misakichan" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/16569274?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/zhuxuyang" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/19301024?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/mss-boot" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/109259065?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/AuroraV" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/37330199?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/Vingurzhou" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/57127283?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/haimait" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/40926384?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/zyd" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/3446278?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/infnan" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/38274826?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/d1y" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/45585937?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/qlijin" ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/515900?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/logtous | ||||||
|  | " ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/88697234?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/stepway | ||||||
|  | " ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/9927079?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/NaturalGao | ||||||
|  | " ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/43291304?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/DemoLiang | ||||||
|  | " ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/23476007?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/jfcg | ||||||
|  | " ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/1410597?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  | <span style="margin: 0 5px;" ><a href="https://github.com/Nicole0724 | ||||||
|  | " ><img src="https://images.weserv.nl/?url=avatars.githubusercontent.com/u/10487328?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d" /></a></span> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## JetBrains open source certificate support | ||||||
|  |  | ||||||
|  | The `go-admin` project has always been developed in the GoLand integrated development environment under JetBrains, based on the **free JetBrains Open Source license(s)** genuine free license. I would like to express my gratitude. | ||||||
|  |  | ||||||
|  | <a href="https://www.jetbrains.com/?from=kubeadm-ha" target="_blank"><img src="https://raw.githubusercontent.com/panjf2000/illustrations/master/jetbrains/jetbrains-variant-4.png" width="250" align="middle"/></a> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## 🤝 Thanks | ||||||
|  |  | ||||||
|  | 1. [ant-design](https://github.com/ant-design/ant-design) | ||||||
|  | 2. [ant-design-pro](https://github.com/ant-design/ant-design-pro) | ||||||
|  | 2. [arco-design](https://github.com/arco-design/arco-design) | ||||||
|  | 2. [arco-design-pro](https://github.com/arco-design/arco-design-pro) | ||||||
|  | 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) | ||||||
|  | 2. [form-generator](https://github.com/JakHuang/form-generator) | ||||||
|  |  | ||||||
|  | ## 🤟 Sponsor Us | ||||||
|  |  | ||||||
|  | > If you think this project helped you, you can buy a glass of juice for the author to show encouragement :tropical_drink: | ||||||
|  |  | ||||||
|  | <img class="no-margin" src="https://raw.githubusercontent.com/wenjianzhang/image/master/img/pay.png"  height="200px" > | ||||||
|  |  | ||||||
|  | ## 🤝 Link | ||||||
|  | [Go developer growth roadmap](http://www.golangroadmap.com/) | ||||||
|  | [mss-boot-io](https://docs.mss-boot-io.top/) | ||||||
|  |  | ||||||
|  | ## 🔑 License | ||||||
|  |  | ||||||
|  | [MIT](https://github.com/go-admin-team/go-admin/blob/master/LICENSE.md) | ||||||
|  |  | ||||||
|  | Copyright (c) 2022 wenjianzhang | ||||||
							
								
								
									
										1
									
								
								_config.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								_config.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | theme: jekyll-theme-cayman | ||||||
							
								
								
									
										37
									
								
								app/admin/apis/captcha.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								app/admin/apis/captcha.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,37 @@ | |||||||
|  | package apis | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"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/captcha" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type System struct { | ||||||
|  | 	api.Api | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GenerateCaptchaHandler 获取验证码 | ||||||
|  | // @Summary 获取验证码 | ||||||
|  | // @Description 获取验证码 | ||||||
|  | // @Tags 登陆 | ||||||
|  | // @Success 200 {object} response.Response{data=string,id=string,msg=string} "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/captcha [get] | ||||||
|  | func (e System) GenerateCaptchaHandler(c *gin.Context) { | ||||||
|  | 	err := e.MakeContext(c).Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "服务初始化失败!") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	id, b64s, err := captcha.DriverDigitFunc() | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Errorf("DriverDigitFunc error, %s", err.Error()) | ||||||
|  | 		e.Error(500, err, "验证码获取失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.Custom(gin.H{ | ||||||
|  | 		"code": 200, | ||||||
|  | 		"data": b64s, | ||||||
|  | 		"id":   id, | ||||||
|  | 		"msg":  "success", | ||||||
|  | 	}) | ||||||
|  | } | ||||||
							
								
								
									
										39
									
								
								app/admin/apis/go_admin.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								app/admin/apis/go_admin.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | |||||||
|  | package apis | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | const INDEX = ` | ||||||
|  | <!DOCTYPE html> | ||||||
|  | <html> | ||||||
|  | <head> | ||||||
|  | <meta charset="utf-8"> | ||||||
|  | <title>GO-ADMIN欢迎您</title> | ||||||
|  | <style> | ||||||
|  | body{ | ||||||
|  |   margin:0;  | ||||||
|  |   padding:0;  | ||||||
|  |   overflow-y:hidden | ||||||
|  | } | ||||||
|  | </style> | ||||||
|  | <script src="https://libs.baidu.com/jquery/1.9.0/jquery.js"></script> | ||||||
|  | <script type="text/javascript">  | ||||||
|  | window.onerror=function(){return true;}  | ||||||
|  | $(function(){  | ||||||
|  |   headerH = 0;   | ||||||
|  |   var h=$(window).height(); | ||||||
|  |   $("#iframe").height((h-headerH)+"px");  | ||||||
|  | }); | ||||||
|  | </script> | ||||||
|  | </head> | ||||||
|  | <body> | ||||||
|  | <iframe id="iframe" frameborder="0" src="https://doc.go-admin.dev" style="width:100%;"></iframe> | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
|  | ` | ||||||
|  |  | ||||||
|  | func GoAdmin(c *gin.Context) { | ||||||
|  | 	c.Header("Content-Type", "text/html; charset=utf-8") | ||||||
|  | 	c.String(200, INDEX) | ||||||
|  | } | ||||||
							
								
								
									
										148
									
								
								app/admin/apis/sys_api.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								app/admin/apis/sys_api.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,148 @@ | |||||||
|  | package apis | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"github.com/gin-gonic/gin/binding" | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/api" | ||||||
|  | 	"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" | ||||||
|  | 	"go-admin/app/admin/service" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
|  | 	"go-admin/common/actions" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysApi struct { | ||||||
|  | 	api.Api | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage 获取接口管理列表 | ||||||
|  | // @Summary 获取接口管理列表 | ||||||
|  | // @Description 获取接口管理列表 | ||||||
|  | // @Tags 接口管理 | ||||||
|  | // @Param name query string false "名称" | ||||||
|  | // @Param title query string false "标题" | ||||||
|  | // @Param path query string false "地址" | ||||||
|  | // @Param action query string false "类型" | ||||||
|  | // @Param pageSize query int false "页条数" | ||||||
|  | // @Param pageIndex query int false "页码" | ||||||
|  | // @Success 200 {object} response.Response{data=response.Page{list=[]models.SysApi}} "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/sys-api [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysApi) GetPage(c *gin.Context) { | ||||||
|  | 	s := service.SysApi{} | ||||||
|  | 	req := dto.SysApiGetPageReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.Form). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	//数据权限检查 | ||||||
|  | 	p := actions.GetPermissionFromContext(c) | ||||||
|  | 	list := make([]models.SysApi, 0) | ||||||
|  | 	var count int64 | ||||||
|  | 	err = s.GetPage(&req, p, &list, &count) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get 获取接口管理 | ||||||
|  | // @Summary 获取接口管理 | ||||||
|  | // @Description 获取接口管理 | ||||||
|  | // @Tags 接口管理 | ||||||
|  | // @Param id path string false "id" | ||||||
|  | // @Success 200 {object} response.Response{data=models.SysApi} "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/sys-api/{id} [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysApi) Get(c *gin.Context) { | ||||||
|  | 	req := dto.SysApiGetReq{} | ||||||
|  | 	s := service.SysApi{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	p := actions.GetPermissionFromContext(c) | ||||||
|  | 	var object models.SysApi | ||||||
|  | 	err = s.Get(&req, p, &object).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(object, "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update 修改接口管理 | ||||||
|  | // @Summary 修改接口管理 | ||||||
|  | // @Description 修改接口管理 | ||||||
|  | // @Tags 接口管理 | ||||||
|  | // @Accept application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param data body dto.SysApiUpdateReq true "body" | ||||||
|  | // @Success 200 {object} response.Response	"{"code": 200, "message": "修改成功"}" | ||||||
|  | // @Router /api/v1/sys-api/{id} [put] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysApi) Update(c *gin.Context) { | ||||||
|  | 	req := dto.SysApiUpdateReq{} | ||||||
|  | 	s := service.SysApi{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	req.SetUpdateBy(user.GetUserId(c)) | ||||||
|  | 	p := actions.GetPermissionFromContext(c) | ||||||
|  | 	err = s.Update(&req, p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "更新失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "更新成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // DeleteSysApi 删除接口管理 | ||||||
|  | // @Summary 删除接口管理 | ||||||
|  | // @Description 删除接口管理 | ||||||
|  | // @Tags 接口管理 | ||||||
|  | // @Param data body dto.SysApiDeleteReq true "body" | ||||||
|  | // @Success 200 {object} response.Response	"{"code": 200, "message": "删除成功"}" | ||||||
|  | // @Router /api/v1/sys-api [delete] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysApi) DeleteSysApi(c *gin.Context) { | ||||||
|  | 	req := dto.SysApiDeleteReq{} | ||||||
|  | 	s := service.SysApi{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	p := actions.GetPermissionFromContext(c) | ||||||
|  | 	err = s.Remove(&req, p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "删除失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "删除成功") | ||||||
|  | } | ||||||
							
								
								
									
										313
									
								
								app/admin/apis/sys_config.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										313
									
								
								app/admin/apis/sys_config.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,313 @@ | |||||||
|  | package apis | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"github.com/gin-gonic/gin/binding" | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/api" | ||||||
|  | 	"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" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysConfig struct { | ||||||
|  | 	api.Api | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage 获取配置管理列表 | ||||||
|  | // @Summary 获取配置管理列表 | ||||||
|  | // @Description 获取配置管理列表 | ||||||
|  | // @Tags 配置管理 | ||||||
|  | // @Param configName query string false "名称" | ||||||
|  | // @Param configKey query string false "key" | ||||||
|  | // @Param configType query string false "类型" | ||||||
|  | // @Param isFrontend query int false "是否前端" | ||||||
|  | // @Param pageSize query int false "页条数" | ||||||
|  | // @Param pageIndex query int false "页码" | ||||||
|  | // @Success 200 {object} response.Response{data=response.Page{list=[]models.SysApi}} "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/sys-config [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysConfig) GetPage(c *gin.Context) { | ||||||
|  | 	s := service.SysConfig{} | ||||||
|  | 	req := dto.SysConfigGetPageReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.Form). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	list := make([]models.SysConfig, 0) | ||||||
|  | 	var count int64 | ||||||
|  | 	err = s.GetPage(&req, &list, &count) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get 获取配置管理 | ||||||
|  | // @Summary 获取配置管理 | ||||||
|  | // @Description 获取配置管理 | ||||||
|  | // @Tags 配置管理 | ||||||
|  | // @Param id path string false "id" | ||||||
|  | // @Success 200 {object} response.Response{data=models.SysConfig} "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/sys-config/{id} [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysConfig) Get(c *gin.Context) { | ||||||
|  | 	req := dto.SysConfigGetReq{} | ||||||
|  | 	s := service.SysConfig{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	var object models.SysConfig | ||||||
|  |  | ||||||
|  | 	err = s.Get(&req, &object) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK(object, "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Insert 创建配置管理 | ||||||
|  | // @Summary 创建配置管理 | ||||||
|  | // @Description 创建配置管理 | ||||||
|  | // @Tags 配置管理 | ||||||
|  | // @Accept application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param data body dto.SysConfigControl true "body" | ||||||
|  | // @Success 200 {object} response.Response	"{"code": 200, "message": "创建成功"}" | ||||||
|  | // @Router /api/v1/sys-config [post] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysConfig) Insert(c *gin.Context) { | ||||||
|  | 	s := service.SysConfig{} | ||||||
|  | 	req := dto.SysConfigControl{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	req.SetCreateBy(user.GetUserId(c)) | ||||||
|  |  | ||||||
|  | 	err = s.Insert(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "创建失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "创建成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update 修改配置管理 | ||||||
|  | // @Summary 修改配置管理 | ||||||
|  | // @Description 修改配置管理 | ||||||
|  | // @Tags 配置管理 | ||||||
|  | // @Accept application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param data body dto.SysConfigControl true "body" | ||||||
|  | // @Success 200 {object} response.Response	"{"code": 200, "message": "修改成功"}" | ||||||
|  | // @Router /api/v1/sys-config/{id} [put] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysConfig) Update(c *gin.Context) { | ||||||
|  | 	s := service.SysConfig{} | ||||||
|  | 	req := dto.SysConfigControl{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	req.SetUpdateBy(user.GetUserId(c)) | ||||||
|  | 	err = s.Update(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "更新失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "更新成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Delete 删除配置管理 | ||||||
|  | // @Summary 删除配置管理 | ||||||
|  | // @Description 删除配置管理 | ||||||
|  | // @Tags 配置管理 | ||||||
|  | // @Param ids body []int false "ids" | ||||||
|  | // @Success 200 {object} response.Response	"{"code": 200, "message": "删除成功"}" | ||||||
|  | // @Router /api/v1/sys-config [delete] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysConfig) Delete(c *gin.Context) { | ||||||
|  | 	s := service.SysConfig{} | ||||||
|  | 	req := dto.SysConfigDeleteReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	req.SetUpdateBy(user.GetUserId(c)) | ||||||
|  |  | ||||||
|  | 	err = s.Remove(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "删除失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "删除成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get2SysApp 获取系统配置信息 | ||||||
|  | // @Summary 获取系统前台配置信息,主要注意这里不在验证权限 | ||||||
|  | // @Description 获取系统配置信息,主要注意这里不在验证权限 | ||||||
|  | // @Tags 配置管理 | ||||||
|  | // @Success 200 {object} response.Response{data=map[string]string} "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/app-config [get] | ||||||
|  | func (e SysConfig) Get2SysApp(c *gin.Context) { | ||||||
|  | 	req := dto.SysConfigGetToSysAppReq{} | ||||||
|  | 	s := service.SysConfig{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.Form). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	// 控制只读前台的数据 | ||||||
|  | 	req.IsFrontend = "1" | ||||||
|  | 	list := make([]models.SysConfig, 0) | ||||||
|  | 	err = s.GetWithKeyList(&req, &list) | ||||||
|  | 	if err != nil { | ||||||
|  | 		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, "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get2Set 获取配置 | ||||||
|  | // @Summary 获取配置 | ||||||
|  | // @Description 界面操作设置配置值的获取 | ||||||
|  | // @Tags 配置管理 | ||||||
|  | // @Accept application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Success 200 {object} response.Response{data=map[string]interface{}}	"{"code": 200, "message": "修改成功"}" | ||||||
|  | // @Router /api/v1/set-config [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysConfig) Get2Set(c *gin.Context) { | ||||||
|  | 	s := service.SysConfig{} | ||||||
|  | 	req := make([]dto.GetSetSysConfigReq, 0) | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	err = s.GetForSet(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	m := make(map[string]interface{}, 0) | ||||||
|  | 	for _, v := range req { | ||||||
|  | 		m[v.ConfigKey] = v.ConfigValue | ||||||
|  | 	} | ||||||
|  | 	e.OK(m, "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update2Set 设置配置 | ||||||
|  | // @Summary 设置配置 | ||||||
|  | // @Description 界面操作设置配置值 | ||||||
|  | // @Tags 配置管理 | ||||||
|  | // @Accept application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param data body []dto.GetSetSysConfigReq true "body" | ||||||
|  | // @Success 200 {object} response.Response	"{"code": 200, "message": "修改成功"}" | ||||||
|  | // @Router /api/v1/set-config [put] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysConfig) Update2Set(c *gin.Context) { | ||||||
|  | 	s := service.SysConfig{} | ||||||
|  | 	req := make([]dto.GetSetSysConfigReq, 0) | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	err = s.UpdateForSet(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK("", "更新成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetSysConfigByKEYForService 根据Key获取SysConfig的Service | ||||||
|  | // @Summary 根据Key获取SysConfig的Service | ||||||
|  | // @Description 根据Key获取SysConfig的Service | ||||||
|  | // @Tags 配置管理 | ||||||
|  | // @Param configKey path string false "configKey" | ||||||
|  | // @Success 200 {object} response.Response{data=dto.SysConfigByKeyReq} "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/sys-config/{id} [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysConfig) GetSysConfigByKEYForService(c *gin.Context) { | ||||||
|  | 	var s = new(service.SysConfig) | ||||||
|  | 	var req = new(dto.SysConfigByKeyReq) | ||||||
|  | 	var resp = new(dto.GetSysConfigByKEYForServiceResp) | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(req, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	err = s.GetWithKey(req, resp) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(resp, s.Msg) | ||||||
|  | } | ||||||
							
								
								
									
										238
									
								
								app/admin/apis/sys_dept.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										238
									
								
								app/admin/apis/sys_dept.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,238 @@ | |||||||
|  | package apis | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"github.com/gin-gonic/gin/binding" | ||||||
|  | 	"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/app/admin/models" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/admin/service" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysDept struct { | ||||||
|  | 	api.Api | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage | ||||||
|  | // @Summary 分页部门列表数据 | ||||||
|  | // @Description 分页列表 | ||||||
|  | // @Tags 部门 | ||||||
|  | // @Param deptName query string false "deptName" | ||||||
|  | // @Param deptId query string false "deptId" | ||||||
|  | // @Param position query string false "position" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/dept [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysDept) GetPage(c *gin.Context) { | ||||||
|  | 	s := service.SysDept{} | ||||||
|  | 	req := dto.SysDeptGetPageReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	list := make([]models.SysDept, 0) | ||||||
|  | 	list, err = s.SetDeptPage(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(list, "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get | ||||||
|  | // @Summary 获取部门数据 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 部门 | ||||||
|  | // @Param deptId path string false "deptId" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/dept/{deptId} [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysDept) Get(c *gin.Context) { | ||||||
|  | 	s := service.SysDept{} | ||||||
|  | 	req := dto.SysDeptGetReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	var object models.SysDept | ||||||
|  |  | ||||||
|  | 	err = s.Get(&req, &object) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK(object, "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Insert 添加部门 | ||||||
|  | // @Summary 添加部门 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 部门 | ||||||
|  | // @Accept  application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param data body dto.SysDeptInsertReq 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) Insert(c *gin.Context) { | ||||||
|  | 	s := service.SysDept{} | ||||||
|  | 	req := dto.SysDeptInsertReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// 设置创建人 | ||||||
|  | 	req.SetCreateBy(user.GetUserId(c)) | ||||||
|  | 	err = s.Insert(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "创建失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "创建成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update | ||||||
|  | // @Summary 修改部门 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 部门 | ||||||
|  | // @Accept  application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param id path int true "id" | ||||||
|  | // @Param data body dto.SysDeptUpdateReq 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) Update(c *gin.Context) { | ||||||
|  | 	s := service.SysDept{} | ||||||
|  | 	req := dto.SysDeptUpdateReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	req.SetUpdateBy(user.GetUserId(c)) | ||||||
|  | 	err = s.Update(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "更新成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Delete | ||||||
|  | // @Summary 删除部门 | ||||||
|  | // @Description 删除数据 | ||||||
|  | // @Tags 部门 | ||||||
|  | // @Param data body dto.SysDeptDeleteReq true "body" | ||||||
|  | // @Success 200 {string} string	"{"code": 200, "message": "删除成功"}" | ||||||
|  | // @Success 200 {string} string	"{"code": -1, "message": "删除失败"}" | ||||||
|  | // @Router /api/v1/dept [delete] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysDept) Delete(c *gin.Context) { | ||||||
|  | 	s := service.SysDept{} | ||||||
|  | 	req := dto.SysDeptDeleteReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	err = s.Remove(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "删除失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "删除成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get2Tree 用户管理 左侧部门树 | ||||||
|  | func (e SysDept) Get2Tree(c *gin.Context) { | ||||||
|  | 	s := service.SysDept{} | ||||||
|  | 	req := dto.SysDeptGetPageReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req,binding.Form). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	list := make([]dto.DeptLabel, 0) | ||||||
|  | 	list, err = s.SetDeptTree(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(list, "") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetDeptTreeRoleSelect TODO: 此接口需要调整不应该将list和选中放在一起 | ||||||
|  | func (e SysDept) GetDeptTreeRoleSelect(c *gin.Context) { | ||||||
|  | 	s := service.SysDept{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	id, err := pkg.StringToInt(c.Param("roleId")) | ||||||
|  | 	result, err := s.SetDeptLabel() | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	menuIds := make([]int, 0) | ||||||
|  | 	if id != 0 { | ||||||
|  | 		menuIds, err = s.GetWithRoleId(id) | ||||||
|  | 		if err != nil { | ||||||
|  | 			e.Error(500, err, err.Error()) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	e.OK(gin.H{ | ||||||
|  | 		"depts":       result, | ||||||
|  | 		"checkedKeys": menuIds, | ||||||
|  | 	}, "") | ||||||
|  | } | ||||||
							
								
								
									
										220
									
								
								app/admin/apis/sys_dict_data.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										220
									
								
								app/admin/apis/sys_dict_data.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,220 @@ | |||||||
|  | package apis | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"github.com/gin-gonic/gin/binding" | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/api" | ||||||
|  | 	"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" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/admin/service" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysDictData struct { | ||||||
|  | 	api.Api | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage | ||||||
|  | // @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) GetPage(c *gin.Context) { | ||||||
|  | 	s := service.SysDictData{} | ||||||
|  | 	req := dto.SysDictDataGetPageReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.Form). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	list := make([]models.SysDictData, 0) | ||||||
|  | 	var count int64 | ||||||
|  | 	err = s.GetPage(&req, &list, &count) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get | ||||||
|  | // @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) Get(c *gin.Context) { | ||||||
|  | 	s := service.SysDictData{} | ||||||
|  | 	req := dto.SysDictDataGetReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var object models.SysDictData | ||||||
|  |  | ||||||
|  | 	err = s.Get(&req, &object) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Warnf("Get error: %s", err.Error()) | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK(object, "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Insert | ||||||
|  | // @Summary 添加字典数据 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 字典数据 | ||||||
|  | // @Accept  application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param data body dto.SysDictDataInsertReq true "data" | ||||||
|  | // @Success 200 {object} response.Response	"{"code": 200, "message": "添加成功"}" | ||||||
|  | // @Router /api/v1/dict/data [post] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysDictData) Insert(c *gin.Context) { | ||||||
|  | 	s := service.SysDictData{} | ||||||
|  | 	req := dto.SysDictDataInsertReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	req.SetCreateBy(user.GetUserId(c)) | ||||||
|  | 	err = s.Insert(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "创建失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK(req.GetId(), "创建成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update | ||||||
|  | // @Summary 修改字典数据 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 字典数据 | ||||||
|  | // @Accept  application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param data body dto.SysDictDataUpdateReq true "body" | ||||||
|  | // @Success 200 {object} response.Response	"{"code": 200, "message": "修改成功"}" | ||||||
|  | // @Router /api/v1/dict/data/{dictCode} [put] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysDictData) Update(c *gin.Context) { | ||||||
|  | 	s := service.SysDictData{} | ||||||
|  | 	req := dto.SysDictDataUpdateReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	req.SetUpdateBy(user.GetUserId(c)) | ||||||
|  | 	err = s.Update(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "更新失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "更新成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Delete | ||||||
|  | // @Summary 删除字典数据 | ||||||
|  | // @Description 删除数据 | ||||||
|  | // @Tags 字典数据 | ||||||
|  | // @Param dictCode body dto.SysDictDataDeleteReq true "body" | ||||||
|  | // @Success 200 {object} response.Response	"{"code": 200, "message": "删除成功"}" | ||||||
|  | // @Router /api/v1/dict/data [delete] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysDictData) Delete(c *gin.Context) { | ||||||
|  | 	s := service.SysDictData{} | ||||||
|  | 	req := dto.SysDictDataDeleteReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	req.SetUpdateBy(user.GetUserId(c)) | ||||||
|  | 	err = s.Remove(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "删除失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "删除成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetAll 数据字典根据key获取 业务页面使用 | ||||||
|  | // @Summary 数据字典根据key获取 | ||||||
|  | // @Description 数据字典根据key获取 | ||||||
|  | // @Tags 字典数据 | ||||||
|  | // @Param dictType query int true "dictType" | ||||||
|  | // @Success 200 {object} response.Response{data=[]dto.SysDictDataGetAllResp}  "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/dict-data/option-select [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysDictData) GetAll(c *gin.Context) { | ||||||
|  | 	s := service.SysDictData{} | ||||||
|  | 	req := dto.SysDictDataGetPageReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	list := make([]models.SysDictData, 0) | ||||||
|  | 	err = s.GetAll(&req, &list) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	l := make([]dto.SysDictDataGetAllResp, 0) | ||||||
|  | 	for _, i := range list { | ||||||
|  | 		d := dto.SysDictDataGetAllResp{} | ||||||
|  | 		e.Translate(i, &d) | ||||||
|  | 		l = append(l, d) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK(l,"查询成功") | ||||||
|  | } | ||||||
							
								
								
									
										210
									
								
								app/admin/apis/sys_dict_type.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								app/admin/apis/sys_dict_type.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,210 @@ | |||||||
|  | package apis | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"github.com/gin-gonic/gin/binding" | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/api" | ||||||
|  | 	"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" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/admin/service" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysDictType struct { | ||||||
|  | 	api.Api | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage 字典类型列表数据 | ||||||
|  | // @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) GetPage(c *gin.Context) { | ||||||
|  | 	s := service.SysDictType{} | ||||||
|  | 	req :=dto.SysDictTypeGetPageReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.Form). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	list := make([]models.SysDictType, 0) | ||||||
|  | 	var count int64 | ||||||
|  | 	err = s.GetPage(&req, &list, &count) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get 字典类型通过字典id获取 | ||||||
|  | // @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) Get(c *gin.Context) { | ||||||
|  | 	s := service.SysDictType{} | ||||||
|  | 	req :=dto.SysDictTypeGetReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	var object models.SysDictType | ||||||
|  | 	err = s.Get(&req, &object) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(object, "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //Insert 字典类型创建 | ||||||
|  | // @Summary 添加字典类型 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 字典类型 | ||||||
|  | // @Accept  application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param data body dto.SysDictTypeInsertReq true "data" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/dict/type [post] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysDictType) Insert(c *gin.Context) { | ||||||
|  | 	s := service.SysDictType{} | ||||||
|  | 	req :=dto.SysDictTypeInsertReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	req.SetCreateBy(user.GetUserId(c)) | ||||||
|  | 	err = s.Insert(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err,fmt.Sprintf(" 创建字典类型失败,详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "创建成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update | ||||||
|  | // @Summary 修改字典类型 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 字典类型 | ||||||
|  | // @Accept  application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param data body dto.SysDictTypeUpdateReq true "body" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/dict/type/{dictId} [put] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysDictType) Update(c *gin.Context) { | ||||||
|  | 	s := service.SysDictType{} | ||||||
|  | 	req :=dto.SysDictTypeUpdateReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	req.SetUpdateBy(user.GetUserId(c)) | ||||||
|  | 	err = s.Update(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "更新成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Delete | ||||||
|  | // @Summary 删除字典类型 | ||||||
|  | // @Description 删除数据 | ||||||
|  | // @Tags 字典类型 | ||||||
|  | // @Param dictCode body dto.SysDictTypeDeleteReq true "body" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/dict/type [delete] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysDictType) Delete(c *gin.Context) { | ||||||
|  | 	s := service.SysDictType{} | ||||||
|  | 	req :=dto.SysDictTypeDeleteReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	req.SetUpdateBy(user.GetUserId(c)) | ||||||
|  | 	err = s.Remove(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "删除成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetAll | ||||||
|  | // @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) GetAll(c *gin.Context) { | ||||||
|  | 	s := service.SysDictType{} | ||||||
|  | 	req :=dto.SysDictTypeGetPageReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.Form). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	list := make([]models.SysDictType, 0) | ||||||
|  | 	err = s.GetAll(&req, &list) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(list, "查询成功") | ||||||
|  | } | ||||||
							
								
								
									
										110
									
								
								app/admin/apis/sys_login_log.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								app/admin/apis/sys_login_log.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,110 @@ | |||||||
|  | package apis | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"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" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/admin/service" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysLoginLog struct { | ||||||
|  | 	api.Api | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage 登录日志列表 | ||||||
|  | // @Summary 登录日志列表 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 登录日志 | ||||||
|  | // @Param username query string false "用户名" | ||||||
|  | // @Param ipaddr query string false "ip地址" | ||||||
|  | // @Param loginLocation  query string false "归属地" | ||||||
|  | // @Param status query string false "状态" | ||||||
|  | // @Param beginTime query string false "开始时间" | ||||||
|  | // @Param endTime query string false "结束时间" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/sys-login-log [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysLoginLog) GetPage(c *gin.Context) { | ||||||
|  | 	s := service.SysLoginLog{} | ||||||
|  | 	req :=dto.SysLoginLogGetPageReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.Form). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	list := make([]models.SysLoginLog, 0) | ||||||
|  | 	var count int64 | ||||||
|  | 	err = s.GetPage(&req, &list, &count) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get 登录日志通过id获取 | ||||||
|  | // @Summary 登录日志通过id获取 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 登录日志 | ||||||
|  | // @Param id path string false "id" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/sys-login-log/{id} [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysLoginLog) Get(c *gin.Context) { | ||||||
|  | 	s := service.SysLoginLog{} | ||||||
|  | 	req :=dto.SysLoginLogGetReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	var object models.SysLoginLog | ||||||
|  | 	err = s.Get(&req, &object) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(object, "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Delete 登录日志删除 | ||||||
|  | // @Summary 登录日志删除 | ||||||
|  | // @Description 登录日志删除 | ||||||
|  | // @Tags 登录日志 | ||||||
|  | // @Param data body dto.SysLoginLogDeleteReq true "body" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/sys-login-log [delete] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysLoginLog) Delete(c *gin.Context) { | ||||||
|  | 	s := service.SysLoginLog{} | ||||||
|  | 	req :=dto.SysLoginLogDeleteReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	err = s.Remove(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "删除失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "删除成功") | ||||||
|  | } | ||||||
							
								
								
									
										287
									
								
								app/admin/apis/sys_menu.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										287
									
								
								app/admin/apis/sys_menu.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,287 @@ | |||||||
|  | package apis | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"github.com/gin-gonic/gin/binding" | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/api" | ||||||
|  | 	"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" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysMenu struct { | ||||||
|  | 	api.Api | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage Menu列表数据 | ||||||
|  | // @Summary Menu列表数据 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 菜单 | ||||||
|  | // @Param menuName query string false "menuName" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/menu [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysMenu) GetPage(c *gin.Context) { | ||||||
|  | 	s := service.SysMenu{} | ||||||
|  | 	req := dto.SysMenuGetPageReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.Form). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	var list = make([]models.SysMenu, 0) | ||||||
|  | 	err = s.GetPage(&req, &list).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(list, "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get 获取菜单详情 | ||||||
|  | // @Summary Menu详情数据 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 菜单 | ||||||
|  | // @Param id path string false "id" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/menu/{id} [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysMenu) Get(c *gin.Context) { | ||||||
|  | 	req := dto.SysMenuGetReq{} | ||||||
|  | 	s := new(service.SysMenu) | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	var object = models.SysMenu{} | ||||||
|  |  | ||||||
|  | 	err = s.Get(&req, &object).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(object, "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Insert 创建菜单 | ||||||
|  | // @Summary 创建菜单 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 菜单 | ||||||
|  | // @Accept  application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param data body dto.SysMenuInsertReq true "data" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/menu [post] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysMenu) Insert(c *gin.Context) { | ||||||
|  | 	req := dto.SysMenuInsertReq{} | ||||||
|  | 	s := new(service.SysMenu) | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	// 设置创建人 | ||||||
|  | 	req.SetCreateBy(user.GetUserId(c)) | ||||||
|  | 	err = s.Insert(&req).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "创建失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "创建成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update 修改菜单 | ||||||
|  | // @Summary 修改菜单 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 菜单 | ||||||
|  | // @Accept  application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param id path int true "id" | ||||||
|  | // @Param data body dto.SysMenuUpdateReq true "body" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/menu/{id} [put] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysMenu) Update(c *gin.Context) { | ||||||
|  | 	req := dto.SysMenuUpdateReq{} | ||||||
|  | 	s := new(service.SysMenu) | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req.SetUpdateBy(user.GetUserId(c)) | ||||||
|  | 	err = s.Update(&req).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "更新失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "更新成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Delete 删除菜单 | ||||||
|  | // @Summary 删除菜单 | ||||||
|  | // @Description 删除数据 | ||||||
|  | // @Tags 菜单 | ||||||
|  | // @Param data body dto.SysMenuDeleteReq true "body" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/menu [delete] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysMenu) Delete(c *gin.Context) { | ||||||
|  | 	control := new(dto.SysMenuDeleteReq) | ||||||
|  | 	s := new(service.SysMenu) | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(control, binding.JSON). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	err = s.Remove(control).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Errorf("RemoveSysMenu error, %s", err) | ||||||
|  | 		e.Error(500, err, "删除失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(control.GetId(), "删除成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetMenuRole 根据登录角色名称获取菜单列表数据(左菜单使用) | ||||||
|  | // @Summary 根据登录角色名称获取菜单列表数据(左菜单使用) | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 菜单 | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/menurole [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysMenu) GetMenuRole(c *gin.Context) { | ||||||
|  | 	s := new(service.SysMenu) | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	result, err := s.SetMenuRole(user.GetRoleName(c)) | ||||||
|  |  | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK(result, "") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //// GetMenuIDS 获取角色对应的菜单id数组 | ||||||
|  | //// @Summary 获取角色对应的菜单id数组,设置角色权限使用 | ||||||
|  | //// @Description 获取JSON | ||||||
|  | //// @Tags 菜单 | ||||||
|  | //// @Param id path int true "id" | ||||||
|  | //// @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | //// @Router /api/v1/menuids/{id} [get] | ||||||
|  | //// @Security Bearer | ||||||
|  | //func (e SysMenu) GetMenuIDS(c *gin.Context) { | ||||||
|  | //	s := new(service.SysMenu) | ||||||
|  | //	r := service.SysRole{} | ||||||
|  | //	m := dto.SysRoleByName{} | ||||||
|  | //	err := e.MakeContext(c). | ||||||
|  | //		MakeOrm(). | ||||||
|  | //		Bind(&m, binding.JSON). | ||||||
|  | //		MakeService(&s.Service). | ||||||
|  | //		MakeService(&r.Service). | ||||||
|  | //		Errors | ||||||
|  | //	if err != nil { | ||||||
|  | //		e.Logger.Error(err) | ||||||
|  | //		e.Error(500, err, err.Error()) | ||||||
|  | //		return | ||||||
|  | //	} | ||||||
|  | //	var data models.SysRole | ||||||
|  | //	err = r.GetWithName(&m, &data).Error | ||||||
|  | // | ||||||
|  | //	//data.RoleName = c.GetString("role") | ||||||
|  | //	//data.UpdateBy = user.GetUserId(c) | ||||||
|  | //	//result, err := data.GetIDS(s.Orm) | ||||||
|  | // | ||||||
|  | //	if err != nil { | ||||||
|  | //		e.Logger.Errorf("GetIDS error, %s", err.Error()) | ||||||
|  | //		e.Error(500, err, "获取失败") | ||||||
|  | //		return | ||||||
|  | //	} | ||||||
|  | //	e.OK(result, "") | ||||||
|  | //} | ||||||
|  |  | ||||||
|  | // GetMenuTreeSelect 根据角色ID查询菜单下拉树结构 | ||||||
|  | // @Summary 角色修改使用的菜单列表 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 菜单 | ||||||
|  | // @Accept  application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param roleId path int true "roleId" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/menuTreeselect/{roleId} [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysMenu) GetMenuTreeSelect(c *gin.Context) { | ||||||
|  | 	m := service.SysMenu{} | ||||||
|  | 	r := service.SysRole{} | ||||||
|  | 	req :=dto.SelectRole{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		MakeService(&m.Service). | ||||||
|  | 		MakeService(&r.Service). | ||||||
|  | 		Bind(&req, nil). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	result, err := m.SetLabel() | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	menuIds := make([]int, 0) | ||||||
|  | 	if req.RoleId != 0 { | ||||||
|  | 		menuIds, err = r.GetRoleMenuId(req.RoleId) | ||||||
|  | 		if err != nil { | ||||||
|  | 			e.Error(500, err, "") | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	e.OK(gin.H{ | ||||||
|  | 		"menus":       result, | ||||||
|  | 		"checkedKeys": menuIds, | ||||||
|  | 	}, "获取成功") | ||||||
|  | } | ||||||
							
								
								
									
										118
									
								
								app/admin/apis/sys_opera_log.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								app/admin/apis/sys_opera_log.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,118 @@ | |||||||
|  | package apis | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"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" | ||||||
|  | 	"go-admin/app/admin/service" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysOperaLog struct { | ||||||
|  | 	api.Api | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage 操作日志列表 | ||||||
|  | // @Summary 操作日志列表 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 操作日志 | ||||||
|  | // @Param title query string false "title" | ||||||
|  | // @Param method query string false "method" | ||||||
|  | // @Param requestMethod  query string false "requestMethod" | ||||||
|  | // @Param operUrl query string false "operUrl" | ||||||
|  | // @Param operIp query string false "operIp" | ||||||
|  | // @Param status query string false "status" | ||||||
|  | // @Param beginTime query string false "beginTime" | ||||||
|  | // @Param endTime query string false "endTime" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/sys-opera-log [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysOperaLog) GetPage(c *gin.Context) { | ||||||
|  | 	s := service.SysOperaLog{} | ||||||
|  | 	req := new(dto.SysOperaLogGetPageReq) | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(req, binding.Form). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	list := make([]models.SysOperaLog, 0) | ||||||
|  | 	var count int64 | ||||||
|  |  | ||||||
|  | 	err = s.GetPage(req, &list, &count) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get 操作日志通过id获取 | ||||||
|  | // @Summary 操作日志通过id获取 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 操作日志 | ||||||
|  | // @Param id path string false "id" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/sys-opera-log/{id} [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysOperaLog) Get(c *gin.Context) { | ||||||
|  | 	s := new(service.SysOperaLog) | ||||||
|  | 	req :=dto.SysOperaLogGetReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	var object models.SysOperaLog | ||||||
|  | 	err = s.Get(&req, &object) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(object, "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Delete 操作日志删除 | ||||||
|  | // DeleteSysMenu 操作日志删除 | ||||||
|  | // @Summary 删除操作日志 | ||||||
|  | // @Description 删除数据 | ||||||
|  | // @Tags 操作日志 | ||||||
|  | // @Param data body dto.SysOperaLogDeleteReq true "body" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/sys-opera-log [delete] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysOperaLog) Delete(c *gin.Context) { | ||||||
|  | 	s := new(service.SysOperaLog) | ||||||
|  | 	req :=dto.SysOperaLogDeleteReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	err = s.Remove(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500,err, fmt.Sprintf("删除失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "删除成功") | ||||||
|  | } | ||||||
							
								
								
									
										184
									
								
								app/admin/apis/sys_post.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										184
									
								
								app/admin/apis/sys_post.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,184 @@ | |||||||
|  | package apis | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	 | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"github.com/gin-gonic/gin/binding" | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/api" | ||||||
|  | 	"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" | ||||||
|  | 	"go-admin/app/admin/service" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysPost struct { | ||||||
|  | 	api.Api | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage | ||||||
|  | // @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) GetPage(c *gin.Context) { | ||||||
|  | 	s := service.SysPost{} | ||||||
|  | 	req :=dto.SysPostPageReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.Form). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	list := make([]models.SysPost, 0) | ||||||
|  | 	var count int64 | ||||||
|  |  | ||||||
|  | 	err = s.GetPage(&req, &list, &count) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get | ||||||
|  | // @Summary 获取岗位信息 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 岗位 | ||||||
|  | // @Param id path int true "编码" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/post/{postId} [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysPost) Get(c *gin.Context) { | ||||||
|  | 	s := service.SysPost{} | ||||||
|  | 	req :=dto.SysPostGetReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	var object models.SysPost | ||||||
|  |  | ||||||
|  | 	err = s.Get(&req, &object) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("岗位信息获取失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK(object, "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Insert | ||||||
|  | // @Summary 添加岗位 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 岗位 | ||||||
|  | // @Accept  application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param data body dto.SysPostInsertReq true "data" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/post [post] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysPost) Insert(c *gin.Context) { | ||||||
|  | 	s := service.SysPost{} | ||||||
|  | 	req :=dto.SysPostInsertReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	req.SetCreateBy(user.GetUserId(c)) | ||||||
|  | 	err = s.Insert(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("新建岗位失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "创建成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update | ||||||
|  | // @Summary 修改岗位 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 岗位 | ||||||
|  | // @Accept  application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param data body dto.SysPostUpdateReq true "body" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/post/{id} [put] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysPost) Update(c *gin.Context) { | ||||||
|  | 	s := service.SysPost{} | ||||||
|  | 	req :=dto.SysPostUpdateReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req.SetUpdateBy(user.GetUserId(c)) | ||||||
|  |  | ||||||
|  | 	err = s.Update(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("岗位更新失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "更新成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Delete | ||||||
|  | // @Summary 删除岗位 | ||||||
|  | // @Description 删除数据 | ||||||
|  | // @Tags 岗位 | ||||||
|  | // @Param id body dto.SysPostDeleteReq true "请求参数" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/post [delete] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysPost) Delete(c *gin.Context) { | ||||||
|  | 	s := service.SysPost{} | ||||||
|  | 	req :=dto.SysPostDeleteReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	req.SetUpdateBy(user.GetUserId(c)) | ||||||
|  | 	err = s.Remove(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("岗位删除失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "删除成功") | ||||||
|  | } | ||||||
							
								
								
									
										284
									
								
								app/admin/apis/sys_role.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										284
									
								
								app/admin/apis/sys_role.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,284 @@ | |||||||
|  | package apis | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"go-admin/common/global" | ||||||
|  | 	"net/http" | ||||||
|  |  | ||||||
|  | 	"github.com/gin-gonic/gin/binding" | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk" | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  |  | ||||||
|  | 	"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/jwtauth/user" | ||||||
|  | 	_ "github.com/go-admin-team/go-admin-core/sdk/pkg/response" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/admin/service" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysRole struct { | ||||||
|  | 	api.Api | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage | ||||||
|  | // @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) GetPage(c *gin.Context) { | ||||||
|  | 	s := service.SysRole{} | ||||||
|  | 	req := dto.SysRoleGetPageReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.Form). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	list := make([]models.SysRole, 0) | ||||||
|  | 	var count int64 | ||||||
|  |  | ||||||
|  | 	err = s.GetPage(&req, &list, &count) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get | ||||||
|  | // @Summary 获取Role数据 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 角色/Role | ||||||
|  | // @Param roleId path string false "roleId" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/role/{id} [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysRole) Get(c *gin.Context) { | ||||||
|  | 	s := service.SysRole{} | ||||||
|  | 	req := dto.SysRoleGetReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf(" %s ", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var object models.SysRole | ||||||
|  |  | ||||||
|  | 	err = s.Get(&req, &object) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(http.StatusUnprocessableEntity, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK(object, "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Insert | ||||||
|  | // @Summary 创建角色 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 角色/Role | ||||||
|  | // @Accept  application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param data body dto.SysRoleInsertReq true "data" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/role [post] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysRole) Insert(c *gin.Context) { | ||||||
|  | 	s := service.SysRole{} | ||||||
|  | 	req := dto.SysRoleInsertReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// 设置创建人 | ||||||
|  | 	req.CreateBy = user.GetUserId(c) | ||||||
|  | 	if req.Status == "" { | ||||||
|  | 		req.Status = "2" | ||||||
|  | 	} | ||||||
|  | 	cb := sdk.Runtime.GetCasbinKey(c.Request.Host) | ||||||
|  | 	err = s.Insert(&req, cb) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, "创建失败,"+err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	_, err = global.LoadPolicy(c) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, "创建失败,"+err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "创建成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update 修改用户角色 | ||||||
|  | // @Summary 修改用户角色 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 角色/Role | ||||||
|  | // @Accept  application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param data body dto.SysRoleUpdateReq true "body" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/role/{id} [put] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysRole) Update(c *gin.Context) { | ||||||
|  | 	s := service.SysRole{} | ||||||
|  | 	req := dto.SysRoleUpdateReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, nil, binding.JSON). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	cb := sdk.Runtime.GetCasbinKey(c.Request.Host) | ||||||
|  |  | ||||||
|  | 	req.SetUpdateBy(user.GetUserId(c)) | ||||||
|  |  | ||||||
|  | 	err = s.Update(&req, cb) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	_, err = global.LoadPolicy(c) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, "更新失败,"+err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK(req.GetId(), "更新成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Delete | ||||||
|  | // @Summary 删除用户角色 | ||||||
|  | // @Description 删除数据 | ||||||
|  | // @Tags 角色/Role | ||||||
|  | // @Param data body dto.SysRoleDeleteReq true "body" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/role [delete] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysRole) Delete(c *gin.Context) { | ||||||
|  | 	s := new(service.SysRole) | ||||||
|  | 	req := dto.SysRoleDeleteReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("删除角色 %v 失败,\r\n失败信息 %s", req.Ids, err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	cb := sdk.Runtime.GetCasbinKey(c.Request.Host) | ||||||
|  | 	err = s.Remove(&req, cb) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, "") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK(req.GetId(), fmt.Sprintf("删除角色角色 %v 状态成功!", req.GetId())) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update2Status 修改用户角色状态 | ||||||
|  | // @Summary 修改用户角色 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 角色/Role | ||||||
|  | // @Accept  application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param data body dto.UpdateStatusReq true "body" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/role-status/{id} [put] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysRole) Update2Status(c *gin.Context) { | ||||||
|  | 	s := service.SysRole{} | ||||||
|  | 	req := dto.UpdateStatusReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("更新角色状态失败,失败原因:%s ", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	req.SetUpdateBy(user.GetUserId(c)) | ||||||
|  | 	err = s.UpdateStatus(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("更新角色状态失败,失败原因:%s ", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), fmt.Sprintf("更新角色 %v 状态成功!", req.GetId())) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update2DataScope 更新角色数据权限 | ||||||
|  | // @Summary 更新角色数据权限 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 角色/Role | ||||||
|  | // @Accept  application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param data body dto.RoleDataScopeReq true "body" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/role-status/{id} [put] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysRole) Update2DataScope(c *gin.Context) { | ||||||
|  | 	s := service.SysRole{} | ||||||
|  | 	req := dto.RoleDataScopeReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	data := &models.SysRole{ | ||||||
|  | 		RoleId:    req.RoleId, | ||||||
|  | 		DataScope: req.DataScope, | ||||||
|  | 		DeptIds:   req.DeptIds, | ||||||
|  | 	} | ||||||
|  | 	data.UpdateBy = user.GetUserId(c) | ||||||
|  | 	err = s.UpdateDataScope(&req).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("更新角色数据权限失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(nil, "操作成功") | ||||||
|  | } | ||||||
							
								
								
									
										459
									
								
								app/admin/apis/sys_user.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										459
									
								
								app/admin/apis/sys_user.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,459 @@ | |||||||
|  | package apis | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"github.com/gin-gonic/gin/binding" | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | 	"golang.org/x/crypto/bcrypt" | ||||||
|  | 	"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/jwtauth/user" | ||||||
|  | 	_ "github.com/go-admin-team/go-admin-core/sdk/pkg/response" | ||||||
|  | 	"github.com/google/uuid" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/admin/service" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
|  | 	"go-admin/common/actions" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysUser struct { | ||||||
|  | 	api.Api | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage | ||||||
|  | // @Summary 列表用户信息数据 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 用户 | ||||||
|  | // @Param username query string false "username" | ||||||
|  | // @Success 200 {string} {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/sys-user [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysUser) GetPage(c *gin.Context) { | ||||||
|  | 	s := service.SysUser{} | ||||||
|  | 	req := dto.SysUserGetPageReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	//数据权限检查 | ||||||
|  | 	p := actions.GetPermissionFromContext(c) | ||||||
|  |  | ||||||
|  | 	list := make([]models.SysUser, 0) | ||||||
|  | 	var count int64 | ||||||
|  |  | ||||||
|  | 	err = s.GetPage(&req, p, &list, &count) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get | ||||||
|  | // @Summary 获取用户 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 用户 | ||||||
|  | // @Param userId path int true "用户编码" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/sys-user/{userId} [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysUser) Get(c *gin.Context) { | ||||||
|  | 	s := service.SysUser{} | ||||||
|  | 	req := dto.SysUserById{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	var object models.SysUser | ||||||
|  | 	//数据权限检查 | ||||||
|  | 	p := actions.GetPermissionFromContext(c) | ||||||
|  | 	err = s.Get(&req, p, &object) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(http.StatusUnprocessableEntity, err, "查询失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(object, "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Insert | ||||||
|  | // @Summary 创建用户 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 用户 | ||||||
|  | // @Accept  application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param data body dto.SysUserInsertReq true "用户数据" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/sys-user [post] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysUser) Insert(c *gin.Context) { | ||||||
|  | 	s := service.SysUser{} | ||||||
|  | 	req := dto.SysUserInsertReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	// 设置创建人 | ||||||
|  | 	req.SetCreateBy(user.GetUserId(c)) | ||||||
|  | 	err = s.Insert(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK(req.GetId(), "创建成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update | ||||||
|  | // @Summary 修改用户数据 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 用户 | ||||||
|  | // @Accept  application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param data body dto.SysUserUpdateReq true "body" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/sys-user/{userId} [put] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysUser) Update(c *gin.Context) { | ||||||
|  | 	s := service.SysUser{} | ||||||
|  | 	req := dto.SysUserUpdateReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req.SetUpdateBy(user.GetUserId(c)) | ||||||
|  |  | ||||||
|  | 	//数据权限检查 | ||||||
|  | 	p := actions.GetPermissionFromContext(c) | ||||||
|  |  | ||||||
|  | 	err = s.Update(&req, p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "更新成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Delete | ||||||
|  | // @Summary 删除用户数据 | ||||||
|  | // @Description 删除数据 | ||||||
|  | // @Tags 用户 | ||||||
|  | // @Param userId path int true "userId" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/sys-user/{userId} [delete] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysUser) Delete(c *gin.Context) { | ||||||
|  | 	s := service.SysUser{} | ||||||
|  | 	req := dto.SysUserById{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// 设置编辑人 | ||||||
|  | 	req.SetUpdateBy(user.GetUserId(c)) | ||||||
|  |  | ||||||
|  | 	// 数据权限检查 | ||||||
|  | 	p := actions.GetPermissionFromContext(c) | ||||||
|  |  | ||||||
|  | 	err = s.Remove(&req, p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "删除成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // InsetAvatar | ||||||
|  | // @Summary 修改头像 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 个人中心 | ||||||
|  | // @Accept multipart/form-data | ||||||
|  | // @Param file formData file true "file" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/user/avatar [post] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysUser) InsetAvatar(c *gin.Context) { | ||||||
|  | 	s := service.SysUser{} | ||||||
|  | 	req := dto.UpdateSysUserAvatarReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		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 { | ||||||
|  | 		e.Logger.Debugf("upload avatar file: %s", file.Filename) | ||||||
|  | 		// 上传文件至指定目录 | ||||||
|  | 		err = c.SaveUploadedFile(file, filPath) | ||||||
|  | 		if err != nil { | ||||||
|  | 			e.Logger.Errorf("save file error, %s", err.Error()) | ||||||
|  | 			e.Error(500, err, "") | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	req.UserId = p.UserId | ||||||
|  | 	req.Avatar = "/" + filPath | ||||||
|  |  | ||||||
|  | 	err = s.UpdateAvatar(&req, p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(filPath, "修改成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // UpdateStatus 修改用户状态 | ||||||
|  | // @Summary 修改用户状态 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 用户 | ||||||
|  | // @Accept  application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param data body dto.UpdateSysUserStatusReq true "body" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/user/status [put] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysUser) UpdateStatus(c *gin.Context) { | ||||||
|  | 	s := service.SysUser{} | ||||||
|  | 	req := dto.UpdateSysUserStatusReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON, nil). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req.SetUpdateBy(user.GetUserId(c)) | ||||||
|  |  | ||||||
|  | 	//数据权限检查 | ||||||
|  | 	p := actions.GetPermissionFromContext(c) | ||||||
|  |  | ||||||
|  | 	err = s.UpdateStatus(&req, p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "更新成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ResetPwd 重置用户密码 | ||||||
|  | // @Summary 重置用户密码 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 用户 | ||||||
|  | // @Accept  application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param data body dto.ResetSysUserPwdReq true "body" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/user/pwd/reset [put] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysUser) ResetPwd(c *gin.Context) { | ||||||
|  | 	s := service.SysUser{} | ||||||
|  | 	req := dto.ResetSysUserPwdReq{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req, binding.JSON). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req.SetUpdateBy(user.GetUserId(c)) | ||||||
|  |  | ||||||
|  | 	//数据权限检查 | ||||||
|  | 	p := actions.GetPermissionFromContext(c) | ||||||
|  |  | ||||||
|  | 	err = s.ResetPwd(&req, p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(req.GetId(), "更新成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // UpdatePwd | ||||||
|  | // @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/set [put] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysUser) UpdatePwd(c *gin.Context) { | ||||||
|  | 	s := service.SysUser{} | ||||||
|  | 	req := dto.PassWord{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// 数据权限检查 | ||||||
|  | 	p := actions.GetPermissionFromContext(c) | ||||||
|  | 	var hash []byte | ||||||
|  | 	if hash, err = bcrypt.GenerateFromPassword([]byte(req.NewPassword), bcrypt.DefaultCost); err != nil { | ||||||
|  | 		req.NewPassword = string(hash) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	err = s.UpdatePwd(user.GetUserId(c), req.OldPassword, req.NewPassword, p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(http.StatusForbidden, err, "密码修改失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK(nil, "密码修改成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetProfile | ||||||
|  | // @Summary 获取个人中心用户 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 个人中心 | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/user/profile [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysUser) GetProfile(c *gin.Context) { | ||||||
|  | 	s := service.SysUser{} | ||||||
|  | 	req := dto.SysUserById{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req.Id = user.GetUserId(c) | ||||||
|  |  | ||||||
|  | 	sysUser := models.SysUser{} | ||||||
|  | 	roles := make([]models.SysRole, 0) | ||||||
|  | 	posts := make([]models.SysPost, 0) | ||||||
|  | 	err = s.GetProfile(&req, &sysUser, &roles, &posts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Errorf("get user profile error, %s", err.Error()) | ||||||
|  | 		e.Error(500, err, "获取用户信息失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(gin.H{ | ||||||
|  | 		"user":  sysUser, | ||||||
|  | 		"roles": roles, | ||||||
|  | 		"posts": posts, | ||||||
|  | 	}, "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetInfo | ||||||
|  | // @Summary 获取个人信息 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 个人中心 | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/getinfo [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysUser) GetInfo(c *gin.Context) { | ||||||
|  | 	req := dto.SysUserById{} | ||||||
|  | 	s := service.SysUser{} | ||||||
|  | 	r := service.SysRole{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		MakeService(&r.Service). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		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] = "*:*:*" | ||||||
|  |  | ||||||
|  | 	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, _ := r.GetById(user.GetRoleId(c)) | ||||||
|  | 		mp["permissions"] = list | ||||||
|  | 		mp["buttons"] = list | ||||||
|  | 	} | ||||||
|  | 	sysUser := models.SysUser{} | ||||||
|  | 	req.Id = user.GetUserId(c) | ||||||
|  | 	err = s.Get(&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 | ||||||
|  | 	mp["code"] = 200 | ||||||
|  | 	e.OK(mp, "") | ||||||
|  | } | ||||||
							
								
								
									
										16
									
								
								app/admin/models/casbin_rule.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								app/admin/models/casbin_rule.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | |||||||
|  | package models | ||||||
|  |  | ||||||
|  | type CasbinRule struct { | ||||||
|  | 	ID    uint   `gorm:"primaryKey;autoIncrement"` | ||||||
|  | 	Ptype string `gorm:"size:512;uniqueIndex:unique_index"` | ||||||
|  | 	V0    string `gorm:"size:512;uniqueIndex:unique_index"` | ||||||
|  | 	V1    string `gorm:"size:512;uniqueIndex:unique_index"` | ||||||
|  | 	V2    string `gorm:"size:512;uniqueIndex:unique_index"` | ||||||
|  | 	V3    string `gorm:"size:512;uniqueIndex:unique_index"` | ||||||
|  | 	V4    string `gorm:"size:512;uniqueIndex:unique_index"` | ||||||
|  | 	V5    string `gorm:"size:512;uniqueIndex:unique_index"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (CasbinRule) TableName() string { | ||||||
|  | 	return "sys_casbin_rule" | ||||||
|  | } | ||||||
							
								
								
									
										81
									
								
								app/admin/models/datascope.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								app/admin/models/datascope.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,81 @@ | |||||||
|  | package models | ||||||
|  |  | ||||||
|  | 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 | ||||||
|  | //	} | ||||||
|  | //} | ||||||
							
								
								
									
										55
									
								
								app/admin/models/initdb.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								app/admin/models/initdb.go
									
									
									
									
									
										Normal file
									
								
							| @ -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", "", -1) | ||||||
|  | 		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 | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										11
									
								
								app/admin/models/model.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								app/admin/models/model.go
									
									
									
									
									
										Normal file
									
								
							| @ -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"` | ||||||
|  | } | ||||||
							
								
								
									
										91
									
								
								app/admin/models/sys_api.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								app/admin/models/sys_api.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,91 @@ | |||||||
|  | package models | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"encoding/json" | ||||||
|  | 	"fmt" | ||||||
|  | 	"io/ioutil" | ||||||
|  | 	"regexp" | ||||||
|  | 	"strings" | ||||||
|  |  | ||||||
|  | 	"github.com/bitly/go-simplejson" | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk" | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/runtime" | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/storage" | ||||||
|  |  | ||||||
|  | 	"go-admin/common/models" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysApi struct { | ||||||
|  | 	Id     int    `json:"id" gorm:"primaryKey;autoIncrement;comment:主键编码"` | ||||||
|  | 	Handle string `json:"handle" gorm:"size:128;comment:handle"` | ||||||
|  | 	Title  string `json:"title" gorm:"size:128;comment:标题"` | ||||||
|  | 	Path   string `json:"path" gorm:"size:128;comment:地址"` | ||||||
|  | 	Action string `json:"action" gorm:"size:16;comment:请求类型"` | ||||||
|  | 	Type   string `json:"type" gorm:"size:16;comment:接口类型"` | ||||||
|  | 	models.ModelTime | ||||||
|  | 	models.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (*SysApi) TableName() string { | ||||||
|  | 	return "sys_api" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e *SysApi) Generate() models.ActiveRecord { | ||||||
|  | 	o := *e | ||||||
|  | 	return &o | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e *SysApi) GetId() interface{} { | ||||||
|  | 	return e.Id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func SaveSysApi(message storage.Messager) (err error) { | ||||||
|  | 	var rb []byte | ||||||
|  | 	rb, err = json.Marshal(message.GetValues()) | ||||||
|  | 	if err != nil { | ||||||
|  | 		err = fmt.Errorf("json Marshal error, %v", err.Error()) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var l runtime.Routers | ||||||
|  | 	err = json.Unmarshal(rb, &l) | ||||||
|  | 	if err != nil { | ||||||
|  | 		err = fmt.Errorf("json Unmarshal error, %s", err.Error()) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	dbList := sdk.Runtime.GetDb() | ||||||
|  | 	for _, d := range dbList { | ||||||
|  | 		for _, v := range l.List { | ||||||
|  | 			if v.HttpMethod != "HEAD" || | ||||||
|  | 				strings.Contains(v.RelativePath, "/swagger/") || | ||||||
|  | 				strings.Contains(v.RelativePath, "/static/") || | ||||||
|  | 				strings.Contains(v.RelativePath, "/form-generator/") || | ||||||
|  | 				strings.Contains(v.RelativePath, "/sys/tables") { | ||||||
|  |  | ||||||
|  | 				// 根据接口方法注释里的@Summary填充接口名称,适用于代码生成器 | ||||||
|  | 				// 可在此处增加配置路径前缀的if判断,只对代码生成的自建应用进行定向的接口名称填充 | ||||||
|  | 				jsonFile, _ := ioutil.ReadFile("docs/swagger.json") | ||||||
|  | 				jsonData, _ := simplejson.NewFromReader(bytes.NewReader(jsonFile)) | ||||||
|  | 				urlPath := v.RelativePath | ||||||
|  | 				idPatten := "(.*)/:(\\w+)" // 正则替换,把:id换成{id} | ||||||
|  | 				reg, _ := regexp.Compile(idPatten) | ||||||
|  | 				if reg.MatchString(urlPath) { | ||||||
|  | 					urlPath = reg.ReplaceAllString(v.RelativePath, "${1}/{${2}}") // 把:id换成{id} | ||||||
|  | 				} | ||||||
|  | 				apiTitle, _ := jsonData.Get("paths").Get(urlPath).Get(strings.ToLower(v.HttpMethod)).Get("summary").String() | ||||||
|  |  | ||||||
|  | 				err := d.Debug().Where(SysApi{Path: v.RelativePath, Action: v.HttpMethod}). | ||||||
|  | 					Attrs(SysApi{Handle: v.Handler, Title: apiTitle}). | ||||||
|  | 					FirstOrCreate(&SysApi{}). | ||||||
|  | 					//Update("handle", v.Handler). | ||||||
|  | 					Error | ||||||
|  | 				if err != nil { | ||||||
|  | 					err := fmt.Errorf("Models SaveSysApi error: %s \r\n ", err.Error()) | ||||||
|  | 					return err | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
							
								
								
									
										30
									
								
								app/admin/models/sys_config.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								app/admin/models/sys_config.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | |||||||
|  | package models | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"go-admin/common/models" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysConfig struct { | ||||||
|  | 	models.Model | ||||||
|  | 	ConfigName  string `json:"configName" gorm:"size:128;comment:ConfigName"`   // | ||||||
|  | 	ConfigKey   string `json:"configKey" gorm:"size:128;comment:ConfigKey"`     // | ||||||
|  | 	ConfigValue string `json:"configValue" gorm:"size:255;comment:ConfigValue"` // | ||||||
|  | 	ConfigType  string `json:"configType" gorm:"size:64;comment:ConfigType"` | ||||||
|  | 	IsFrontend  string `json:"isFrontend" gorm:"size:64;comment:是否前台"` // | ||||||
|  | 	Remark      string `json:"remark" gorm:"size: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 | ||||||
|  | } | ||||||
							
								
								
									
										33
									
								
								app/admin/models/sys_dept.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								app/admin/models/sys_dept.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | |||||||
|  | package models | ||||||
|  |  | ||||||
|  | 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:"size:4;"`                     //排序 | ||||||
|  | 	Leader   string `json:"leader" gorm:"size:128;"`                 //负责人 | ||||||
|  | 	Phone    string `json:"phone" gorm:"size:11;"`                   //手机 | ||||||
|  | 	Email    string `json:"email" gorm:"size:64;"`                   //邮箱 | ||||||
|  | 	Status   int    `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 | ||||||
|  | } | ||||||
							
								
								
									
										34
									
								
								app/admin/models/sys_dict_data.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								app/admin/models/sys_dict_data.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | |||||||
|  | package models | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"go-admin/common/models" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysDictData struct { | ||||||
|  | 	DictCode  int    `json:"dictCode" gorm:"primaryKey;column:dict_code;autoIncrement;comment:主键编码"` | ||||||
|  | 	DictSort  int    `json:"dictSort" gorm:"size:20;comment:DictSort"` | ||||||
|  | 	DictLabel string `json:"dictLabel" gorm:"size:128;comment:DictLabel"` | ||||||
|  | 	DictValue string `json:"dictValue" gorm:"size:255;comment:DictValue"` | ||||||
|  | 	DictType  string `json:"dictType" gorm:"size:64;comment:DictType"` | ||||||
|  | 	CssClass  string `json:"cssClass" gorm:"size:128;comment:CssClass"` | ||||||
|  | 	ListClass string `json:"listClass" gorm:"size:128;comment:ListClass"` | ||||||
|  | 	IsDefault string `json:"isDefault" gorm:"size:8;comment:IsDefault"` | ||||||
|  | 	Status    int    `json:"status" gorm:"size:4;comment:Status"` | ||||||
|  | 	Default   string `json:"default" gorm:"size:8;comment:Default"` | ||||||
|  | 	Remark    string `json:"remark" gorm:"size:255;comment:Remark"` | ||||||
|  | 	models.ControlBy | ||||||
|  | 	models.ModelTime | ||||||
|  | } | ||||||
|  |  | ||||||
|  | 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 | ||||||
|  | } | ||||||
							
								
								
									
										28
									
								
								app/admin/models/sys_dict_type.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								app/admin/models/sys_dict_type.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | |||||||
|  | package models | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"go-admin/common/models" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysDictType struct { | ||||||
|  | 	ID       int    `json:"id" gorm:"primaryKey;column:dict_id;autoIncrement;comment:主键编码"` | ||||||
|  | 	DictName string `json:"dictName" gorm:"size:128;comment:DictName"` | ||||||
|  | 	DictType string `json:"dictType" gorm:"size:128;comment:DictType"` | ||||||
|  | 	Status   int    `json:"status" gorm:"size:4;comment:Status"` | ||||||
|  | 	Remark   string `json:"remark" gorm:"size:255;comment:Remark"` | ||||||
|  | 	models.ControlBy | ||||||
|  | 	models.ModelTime | ||||||
|  | } | ||||||
|  |  | ||||||
|  | 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 | ||||||
|  | } | ||||||
							
								
								
									
										72
									
								
								app/admin/models/sys_login_log.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								app/admin/models/sys_login_log.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,72 @@ | |||||||
|  | package models | ||||||
|  |  | ||||||
|  | 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:"size:128;comment:用户名"` | ||||||
|  | 	Status        string    `json:"status" gorm:"size:4;comment:状态"` | ||||||
|  | 	Ipaddr        string    `json:"ipaddr" gorm:"size:255;comment:ip地址"` | ||||||
|  | 	LoginLocation string    `json:"loginLocation" gorm:"size:255;comment:归属地"` | ||||||
|  | 	Browser       string    `json:"browser" gorm:"size:255;comment:浏览器"` | ||||||
|  | 	Os            string    `json:"os" gorm:"size:255;comment:系统"` | ||||||
|  | 	Platform      string    `json:"platform" gorm:"size:255;comment:固件"` | ||||||
|  | 	LoginTime     time.Time `json:"loginTime" gorm:"comment:登录时间"` | ||||||
|  | 	Remark        string    `json:"remark" gorm:"size:255;comment:备注"` | ||||||
|  | 	Msg           string    `json:"msg" gorm:"size: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 | ||||||
|  | } | ||||||
							
								
								
									
										50
									
								
								app/admin/models/sys_menu.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								app/admin/models/sys_menu.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,50 @@ | |||||||
|  | package models | ||||||
|  |  | ||||||
|  | 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;"` | ||||||
|  | 	SysApi     []SysApi  `json:"sysApi" gorm:"many2many:sys_menu_api_rule"` | ||||||
|  | 	Apis       []int     `json:"apis" gorm:"-"` | ||||||
|  | 	DataScope  string    `json:"dataScope" gorm:"-"` | ||||||
|  | 	Params     string    `json:"params" gorm:"-"` | ||||||
|  | 	RoleId     int       `gorm:"-"` | ||||||
|  | 	Children   []SysMenu `json:"children,omitempty" gorm:"-"` | ||||||
|  | 	IsSelect   bool      `json:"is_select" gorm:"-"` | ||||||
|  | 	models.ControlBy | ||||||
|  | 	models.ModelTime | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysMenuSlice []SysMenu | ||||||
|  |  | ||||||
|  | func (x SysMenuSlice) Len() int           { return len(x) } | ||||||
|  | func (x SysMenuSlice) Less(i, j int) bool { return x[i].Sort < x[j].Sort } | ||||||
|  | func (x SysMenuSlice) Swap(i, j int)      { x[i], x[j] = x[j], x[i] } | ||||||
|  |  | ||||||
|  | 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 | ||||||
|  | } | ||||||
							
								
								
									
										88
									
								
								app/admin/models/sys_opera_log.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								app/admin/models/sys_opera_log.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,88 @@ | |||||||
|  | package models | ||||||
|  |  | ||||||
|  | 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:"size:255;comment:操作模块"` | ||||||
|  | 	BusinessType  string    `json:"businessType" gorm:"size:128;comment:操作类型"` | ||||||
|  | 	BusinessTypes string    `json:"businessTypes" gorm:"size:128;comment:BusinessTypes"` | ||||||
|  | 	Method        string    `json:"method" gorm:"size:128;comment:函数"` | ||||||
|  | 	RequestMethod string    `json:"requestMethod" gorm:"size:128;comment:请求方式 GET POST PUT DELETE"` | ||||||
|  | 	OperatorType  string    `json:"operatorType" gorm:"size:128;comment:操作类型"` | ||||||
|  | 	OperName      string    `json:"operName" gorm:"size:128;comment:操作者"` | ||||||
|  | 	DeptName      string    `json:"deptName" gorm:"size:128;comment:部门名称"` | ||||||
|  | 	OperUrl       string    `json:"operUrl" gorm:"size:255;comment:访问地址"` | ||||||
|  | 	OperIp        string    `json:"operIp" gorm:"size:128;comment:客户端ip"` | ||||||
|  | 	OperLocation  string    `json:"operLocation" gorm:"size:128;comment:访问位置"` | ||||||
|  | 	OperParam     string    `json:"operParam" gorm:"text;comment:请求参数"` | ||||||
|  | 	Status        string    `json:"status" gorm:"size:4;comment:操作状态 1:正常 2:关闭"` | ||||||
|  | 	OperTime      time.Time `json:"operTime" gorm:"comment:操作时间"` | ||||||
|  | 	JsonResult    string    `json:"jsonResult" gorm:"size:255;comment:返回数据"` | ||||||
|  | 	Remark        string    `json:"remark" gorm:"size:255;comment:备注"` | ||||||
|  | 	LatencyTime   string    `json:"latencyTime" gorm:"size:128;comment:耗时"` | ||||||
|  | 	UserAgent     string    `json:"userAgent" gorm:"size: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()) | ||||||
|  | 		// Log writing to the database ignores error | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	var rb []byte | ||||||
|  | 	rb, err = json.Marshal(message.GetValues()) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Errorf("json Marshal error, %s", err.Error()) | ||||||
|  | 		// Log writing to the database ignores error | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	var l SysOperaLog | ||||||
|  | 	err = json.Unmarshal(rb, &l) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Errorf("json Unmarshal error, %s", err.Error()) | ||||||
|  | 		// Log writing to the database ignores error | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	// 超出100个字符返回值截断 | ||||||
|  | 	if len(l.JsonResult) > 100 { | ||||||
|  | 		l.JsonResult = l.JsonResult[:100] | ||||||
|  | 	} | ||||||
|  | 	err = db.Create(&l).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Errorf("db create error, %s", err.Error()) | ||||||
|  | 		// Log writing to the database ignores error | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
							
								
								
									
										30
									
								
								app/admin/models/sys_post.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								app/admin/models/sys_post.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | |||||||
|  | package models | ||||||
|  |  | ||||||
|  | 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:"size:4;" 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 | ||||||
|  | } | ||||||
							
								
								
									
										35
									
								
								app/admin/models/sys_role.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								app/admin/models/sys_role.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | |||||||
|  | package models | ||||||
|  |  | ||||||
|  | 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;"`                  // 状态 1禁用 2正常 | ||||||
|  | 	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:"-"` | ||||||
|  | 	SysDept   []SysDept  `json:"sysDept" gorm:"many2many:sys_role_dept;foreignKey:RoleId;joinForeignKey:role_id;references:DeptId;joinReferences:dept_id;"` | ||||||
|  | 	SysMenu   *[]SysMenu `json:"sysMenu" gorm:"many2many:sys_role_menu;foreignKey:RoleId;joinForeignKey:role_id;references:MenuId;joinReferences:menu_id;"` | ||||||
|  | 	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 | ||||||
|  | } | ||||||
							
								
								
									
										77
									
								
								app/admin/models/sys_user.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								app/admin/models/sys_user.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,77 @@ | |||||||
|  | package models | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"go-admin/common/models" | ||||||
|  | 	"golang.org/x/crypto/bcrypt" | ||||||
|  | 	"gorm.io/gorm" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysUser struct { | ||||||
|  | 	UserId   int      `gorm:"primaryKey;autoIncrement;comment:编码"  json:"userId"` | ||||||
|  | 	Username string   `json:"username" gorm:"size:64;comment:用户名"` | ||||||
|  | 	Password string   `json:"-" gorm:"size:128;comment:密码"` | ||||||
|  | 	NickName string   `json:"nickName" gorm:"size:128;comment:昵称"` | ||||||
|  | 	Phone    string   `json:"phone" gorm:"size:11;comment:手机号"` | ||||||
|  | 	RoleId   int      `json:"roleId" gorm:"size:20;comment:角色ID"` | ||||||
|  | 	Salt     string   `json:"-" gorm:"size:255;comment:加盐"` | ||||||
|  | 	Avatar   string   `json:"avatar" gorm:"size:255;comment:头像"` | ||||||
|  | 	Sex      string   `json:"sex" gorm:"size:255;comment:性别"` | ||||||
|  | 	Email    string   `json:"email" gorm:"size:128;comment:邮箱"` | ||||||
|  | 	DeptId   int      `json:"deptId" gorm:"size:20;comment:部门"` | ||||||
|  | 	PostId   int      `json:"postId" gorm:"size:20;comment:岗位"` | ||||||
|  | 	Remark   string   `json:"remark" gorm:"size:255;comment:备注"` | ||||||
|  | 	Status   string   `json:"status" gorm:"size:4;comment:状态"` | ||||||
|  | 	DeptIds  []int    `json:"deptIds" gorm:"-"` | ||||||
|  | 	PostIds  []int    `json:"postIds" gorm:"-"` | ||||||
|  | 	RoleIds  []int    `json:"roleIds" gorm:"-"` | ||||||
|  | 	Dept     *SysDept `json:"dept"` | ||||||
|  | 	models.ControlBy | ||||||
|  | 	models.ModelTime | ||||||
|  | } | ||||||
|  |  | ||||||
|  | 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 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Encrypt 加密 | ||||||
|  | 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 | ||||||
|  | } | ||||||
							
								
								
									
										40
									
								
								app/admin/router/init_router.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								app/admin/router/init_router.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,40 @@ | |||||||
|  | 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" | ||||||
|  | 	common "go-admin/common/middleware" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // InitRouter 路由初始化,不要怀疑,这里用到了 | ||||||
|  | func InitRouter() { | ||||||
|  | 	var r *gin.Engine | ||||||
|  | 	h := sdk.Runtime.GetEngine() | ||||||
|  | 	if h == nil { | ||||||
|  | 		log.Fatal("not found engine...") | ||||||
|  | 		os.Exit(-1) | ||||||
|  | 	} | ||||||
|  | 	switch h.(type) { | ||||||
|  | 	case *gin.Engine: | ||||||
|  | 		r = h.(*gin.Engine) | ||||||
|  | 	default: | ||||||
|  | 		log.Fatal("not support other engine") | ||||||
|  | 		os.Exit(-1) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// 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) | ||||||
|  | } | ||||||
							
								
								
									
										41
									
								
								app/admin/router/router.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								app/admin/router/router.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,41 @@ | |||||||
|  | package router | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	_ "github.com/gin-gonic/gin" | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" | ||||||
|  | 	jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | var ( | ||||||
|  | 	routerNoCheckRole = make([]func(*gin.RouterGroup), 0) | ||||||
|  | 	routerCheckRole   = make([]func(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware), 0) | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func InitExamplesRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) *gin.Engine { | ||||||
|  |  | ||||||
|  | 	// 无需认证的路由 | ||||||
|  | 	examplesNoCheckRoleRouter(r) | ||||||
|  | 	// 需要认证的路由 | ||||||
|  | 	examplesCheckRoleRouter(r, authMiddleware) | ||||||
|  |  | ||||||
|  | 	return r | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 无需认证的路由示例 | ||||||
|  | func examplesNoCheckRoleRouter(r *gin.Engine) { | ||||||
|  | 	// 可根据业务需求来设置接口版本 | ||||||
|  | 	v1 := r.Group("/api/v1") | ||||||
|  | 	for _, f := range routerNoCheckRole { | ||||||
|  | 		f(v1) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 需要认证的路由示例 | ||||||
|  | func examplesCheckRoleRouter(r *gin.Engine, authMiddleware *jwtauth.GinJWTMiddleware) { | ||||||
|  | 	// 可根据业务需求来设置接口版本 | ||||||
|  | 	v1 := r.Group("/api/v1") | ||||||
|  | 	for _, f := range routerCheckRole { | ||||||
|  | 		f(v1, authMiddleware) | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										24
									
								
								app/admin/router/sys_api.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								app/admin/router/sys_api.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | |||||||
|  | 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" | ||||||
|  | 	"go-admin/common/middleware" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func init() { | ||||||
|  | 	routerCheckRole = append(routerCheckRole, registerSysApiRouter) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // registerSysApiRouter | ||||||
|  | func registerSysApiRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { | ||||||
|  | 	api := apis.SysApi{} | ||||||
|  | 	r := v1.Group("/sys-api").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) | ||||||
|  | 	{ | ||||||
|  | 		r.GET("", api.GetPage) | ||||||
|  | 		r.GET("/:id", api.Get) | ||||||
|  | 		r.PUT("/:id", api.Update) | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										43
									
								
								app/admin/router/sys_config.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								app/admin/router/sys_config.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,43 @@ | |||||||
|  | package router | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"go-admin/app/admin/apis" | ||||||
|  | 	"go-admin/common/middleware" | ||||||
|  |  | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func init() { | ||||||
|  | 	routerCheckRole = append(routerCheckRole, registerSysConfigRouter) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 需认证的路由代码 | ||||||
|  | func registerSysConfigRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { | ||||||
|  | 	api := apis.SysConfig{} | ||||||
|  | 	r := v1.Group("/config").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) | ||||||
|  | 	{ | ||||||
|  | 		r.GET("", api.GetPage) | ||||||
|  | 		r.GET("/:id", api.Get) | ||||||
|  | 		r.POST("", api.Insert) | ||||||
|  | 		r.PUT("/:id", api.Update) | ||||||
|  | 		r.DELETE("", api.Delete) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	r1 := v1.Group("/configKey").Use(authMiddleware.MiddlewareFunc()) | ||||||
|  | 	{ | ||||||
|  | 		r1.GET("/:configKey", api.GetSysConfigByKEYForService) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	r2 := v1.Group("/app-config") | ||||||
|  | 	{ | ||||||
|  | 		r2.GET("", api.Get2SysApp) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	r3 := v1.Group("/set-config").Use(authMiddleware.MiddlewareFunc()) | ||||||
|  | 	{ | ||||||
|  | 		r3.PUT("", api.Update2Set) | ||||||
|  | 		r3.GET("", api.Get2Set) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | } | ||||||
							
								
								
									
										32
									
								
								app/admin/router/sys_dept.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								app/admin/router/sys_dept.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | |||||||
|  | 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" | ||||||
|  | 	"go-admin/common/middleware" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func init() { | ||||||
|  | 	routerCheckRole = append(routerCheckRole, registerSysDeptRouter) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 需认证的路由代码 | ||||||
|  | func registerSysDeptRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { | ||||||
|  | 	api := apis.SysDept{} | ||||||
|  |  | ||||||
|  | 	r := v1.Group("/dept").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) | ||||||
|  | 	{ | ||||||
|  | 		r.GET("", api.GetPage) | ||||||
|  | 		r.GET("/:id", api.Get) | ||||||
|  | 		r.POST("", api.Insert) | ||||||
|  | 		r.PUT("/:id", api.Update) | ||||||
|  | 		r.DELETE("", api.Delete) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	r1 := v1.Group("").Use(authMiddleware.MiddlewareFunc()) | ||||||
|  | 	{ | ||||||
|  | 		r1.GET("/deptTree", api.Get2Tree) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | } | ||||||
							
								
								
									
										37
									
								
								app/admin/router/sys_dict.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								app/admin/router/sys_dict.go
									
									
									
									
									
										Normal file
									
								
							| @ -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" | ||||||
|  | 	"go-admin/common/middleware" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func init() { | ||||||
|  | 	routerCheckRole = append(routerCheckRole, registerDictRouter) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func registerDictRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { | ||||||
|  | 	dictApi := apis.SysDictType{} | ||||||
|  | 	dataApi := apis.SysDictData{} | ||||||
|  | 	dicts := v1.Group("/dict").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) | ||||||
|  | 	{ | ||||||
|  |  | ||||||
|  | 		dicts.GET("/data", dataApi.GetPage) | ||||||
|  | 		dicts.GET("/data/:dictCode", dataApi.Get) | ||||||
|  | 		dicts.POST("/data", dataApi.Insert) | ||||||
|  | 		dicts.PUT("/data/:dictCode", dataApi.Update) | ||||||
|  | 		dicts.DELETE("/data", dataApi.Delete) | ||||||
|  |  | ||||||
|  | 		dicts.GET("/type-option-select", dictApi.GetAll) | ||||||
|  | 		dicts.GET("/type", dictApi.GetPage) | ||||||
|  | 		dicts.GET("/type/:id", dictApi.Get) | ||||||
|  | 		dicts.POST("/type", dictApi.Insert) | ||||||
|  | 		dicts.PUT("/type/:id", dictApi.Update) | ||||||
|  | 		dicts.DELETE("/type", dictApi.Delete) | ||||||
|  | 	} | ||||||
|  | 	opSelect := v1.Group("/dict-data").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) | ||||||
|  | 	{ | ||||||
|  | 		opSelect.GET("/option-select", dataApi.GetAll) | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										24
									
								
								app/admin/router/sys_login_log.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								app/admin/router/sys_login_log.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | |||||||
|  | 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" | ||||||
|  | 	"go-admin/common/middleware" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func init() { | ||||||
|  | 	routerCheckRole = append(routerCheckRole, registerSysLoginLogRouter) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 需认证的路由代码 | ||||||
|  | func registerSysLoginLogRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { | ||||||
|  | 	api := apis.SysLoginLog{} | ||||||
|  |  | ||||||
|  | 	r := v1.Group("/sys-login-log").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) | ||||||
|  | 	{ | ||||||
|  | 		r.GET("", api.GetPage) | ||||||
|  | 		r.GET("/:id", api.Get) | ||||||
|  | 		r.DELETE("", api.Delete) | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										33
									
								
								app/admin/router/sys_menu.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								app/admin/router/sys_menu.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | |||||||
|  | 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" | ||||||
|  | 	"go-admin/common/middleware" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func init() { | ||||||
|  | 	routerCheckRole = append(routerCheckRole, registerSysMenuRouter) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 需认证的路由代码 | ||||||
|  | func registerSysMenuRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { | ||||||
|  | 	api := apis.SysMenu{} | ||||||
|  |  | ||||||
|  | 	r := v1.Group("/menu").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) | ||||||
|  | 	{ | ||||||
|  | 		r.GET("", api.GetPage) | ||||||
|  | 		r.GET("/:id", api.Get) | ||||||
|  | 		r.POST("", api.Insert) | ||||||
|  | 		r.PUT("/:id", api.Update) | ||||||
|  | 		r.DELETE("", api.Delete) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	r1 := v1.Group("").Use(authMiddleware.MiddlewareFunc()) | ||||||
|  | 	{ | ||||||
|  | 		r1.GET("/menurole", api.GetMenuRole) | ||||||
|  | 		//r1.GET("/menuids", api.GetMenuIDS) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | } | ||||||
							
								
								
									
										23
									
								
								app/admin/router/sys_opera_log.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								app/admin/router/sys_opera_log.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | 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" | ||||||
|  | 	"go-admin/common/middleware" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func init() { | ||||||
|  | 	routerCheckRole = append(routerCheckRole, registerSysOperaLogRouter) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 需认证的路由代码 | ||||||
|  | func registerSysOperaLogRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { | ||||||
|  | 	api := apis.SysOperaLog{} | ||||||
|  | 	r := v1.Group("/sys-opera-log").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) | ||||||
|  | 	{ | ||||||
|  | 		r.GET("", api.GetPage) | ||||||
|  | 		r.GET("/:id", api.Get) | ||||||
|  | 		r.DELETE("", api.Delete) | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										25
									
								
								app/admin/router/sys_post.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								app/admin/router/sys_post.go
									
									
									
									
									
										Normal file
									
								
							| @ -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" | ||||||
|  | 	"go-admin/common/middleware" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func init() { | ||||||
|  | 	routerCheckRole = append(routerCheckRole, registerSyPostRouter) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 需认证的路由代码 | ||||||
|  | func registerSyPostRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { | ||||||
|  | 	api := apis.SysPost{} | ||||||
|  | 	r := v1.Group("/post").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) | ||||||
|  | 	{ | ||||||
|  | 		r.GET("", api.GetPage) | ||||||
|  | 		r.GET("/:id", api.Get) | ||||||
|  | 		r.POST("", api.Insert) | ||||||
|  | 		r.PUT("/:id", api.Update) | ||||||
|  | 		r.DELETE("", api.Delete) | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										31
									
								
								app/admin/router/sys_role.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								app/admin/router/sys_role.go
									
									
									
									
									
										Normal file
									
								
							| @ -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" | ||||||
|  | 	"go-admin/common/middleware" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func init() { | ||||||
|  | 	routerCheckRole = append(routerCheckRole, registerSysRoleRouter) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 需认证的路由代码 | ||||||
|  | func registerSysRoleRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { | ||||||
|  | 	api := apis.SysRole{} | ||||||
|  | 	r := v1.Group("/role").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) | ||||||
|  | 	{ | ||||||
|  | 		r.GET("", api.GetPage) | ||||||
|  | 		r.GET("/:id", api.Get) | ||||||
|  | 		r.POST("", api.Insert) | ||||||
|  | 		r.PUT("/:id", api.Update) | ||||||
|  | 		r.DELETE("", api.Delete) | ||||||
|  | 	} | ||||||
|  | 	r1 := v1.Group("").Use(authMiddleware.MiddlewareFunc()) | ||||||
|  | 	{ | ||||||
|  | 		r1.PUT("/role-status", api.Update2Status) | ||||||
|  | 		r1.PUT("/roledatascope", api.Update2DataScope) | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										88
									
								
								app/admin/router/sys_router.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								app/admin/router/sys_router.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,88 @@ | |||||||
|  | package router | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"go-admin/app/admin/apis" | ||||||
|  | 	"mime" | ||||||
|  |  | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/config" | ||||||
|  |  | ||||||
|  | 	"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" | ||||||
|  |  | ||||||
|  | 	swaggerfiles "github.com/swaggo/files" | ||||||
|  |  | ||||||
|  | 	"go-admin/common/middleware" | ||||||
|  | 	"go-admin/common/middleware/handler" | ||||||
|  | 	_ "go-admin/docs/admin" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func InitSysRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) *gin.RouterGroup { | ||||||
|  | 	g := r.Group("") | ||||||
|  | 	sysBaseRouter(g) | ||||||
|  | 	// 静态文件 | ||||||
|  | 	sysStaticFileRouter(g) | ||||||
|  | 	// swagger;注意:生产环境可以注释掉 | ||||||
|  | 	if config.ApplicationConfig.Mode != "prod" { | ||||||
|  | 		sysSwaggerRouter(g) | ||||||
|  | 	} | ||||||
|  | 	// 需要认证 | ||||||
|  | 	sysCheckRoleRouterInit(g, authMiddleware) | ||||||
|  | 	return g | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func sysBaseRouter(r *gin.RouterGroup) { | ||||||
|  |  | ||||||
|  | 	go ws.WebsocketManager.Start() | ||||||
|  | 	go ws.WebsocketManager.SendService() | ||||||
|  | 	go ws.WebsocketManager.SendAllService() | ||||||
|  |  | ||||||
|  | 	if config.ApplicationConfig.Mode != "prod" { | ||||||
|  | 		r.GET("/", apis.GoAdmin) | ||||||
|  | 	} | ||||||
|  | 	r.GET("/info", handler.Ping) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func sysStaticFileRouter(r *gin.RouterGroup) { | ||||||
|  | 	err := mime.AddExtensionType(".js", "application/javascript") | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	r.Static("/static", "./static") | ||||||
|  | 	if config.ApplicationConfig.Mode != "prod" { | ||||||
|  | 		r.Static("/form-generator", "./static/form-generator") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func sysSwaggerRouter(r *gin.RouterGroup) { | ||||||
|  | 	r.GET("/swagger/admin/*any", ginSwagger.WrapHandler(swaggerfiles.NewHandler(), ginSwagger.InstanceName("admin"))) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func sysCheckRoleRouterInit(r *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { | ||||||
|  | 	wss := r.Group("").Use(authMiddleware.MiddlewareFunc()) | ||||||
|  | 	{ | ||||||
|  | 		wss.GET("/ws/:id/:channel", ws.WebsocketManager.WsClient) | ||||||
|  | 		wss.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) | ||||||
|  | 	} | ||||||
|  | 	registerBaseRouter(v1, authMiddleware) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func registerBaseRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { | ||||||
|  | 	api := apis.SysMenu{} | ||||||
|  | 	api2 := apis.SysDept{} | ||||||
|  | 	v1auth := v1.Group("").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) | ||||||
|  | 	{ | ||||||
|  | 		v1auth.GET("/roleMenuTreeselect/:roleId", api.GetMenuTreeSelect) | ||||||
|  | 		//v1.GET("/menuTreeselect", api.GetMenuTreeSelect) | ||||||
|  | 		v1auth.GET("/roleDeptTreeselect/:roleId", api2.GetDeptTreeRoleSelect) | ||||||
|  | 		v1auth.POST("/logout", handler.LogOut) | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										39
									
								
								app/admin/router/sys_user.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								app/admin/router/sys_user.go
									
									
									
									
									
										Normal file
									
								
							| @ -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" | ||||||
|  | 	"go-admin/common/actions" | ||||||
|  | 	"go-admin/common/middleware" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func init() { | ||||||
|  | 	routerCheckRole = append(routerCheckRole, registerSysUserRouter) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 需认证的路由代码 | ||||||
|  | func registerSysUserRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { | ||||||
|  | 	api := apis.SysUser{} | ||||||
|  | 	r := v1.Group("/sys-user").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()).Use(actions.PermissionAction()) | ||||||
|  | 	{ | ||||||
|  | 		r.GET("", api.GetPage) | ||||||
|  | 		r.GET("/:id", api.Get) | ||||||
|  | 		r.POST("", api.Insert) | ||||||
|  | 		r.PUT("", api.Update) | ||||||
|  | 		r.DELETE("", api.Delete) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	user := v1.Group("/user").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()).Use(actions.PermissionAction()) | ||||||
|  | 	{ | ||||||
|  | 		user.GET("/profile", api.GetProfile) | ||||||
|  | 		user.POST("/avatar", api.InsetAvatar) | ||||||
|  | 		user.PUT("/pwd/set", api.UpdatePwd) | ||||||
|  | 		user.PUT("/pwd/reset", api.ResetPwd) | ||||||
|  | 		user.PUT("/status", api.UpdateStatus) | ||||||
|  | 	} | ||||||
|  | 	v1auth := v1.Group("").Use(authMiddleware.MiddlewareFunc()) | ||||||
|  | 	{ | ||||||
|  | 		v1auth.GET("/getinfo", api.GetInfo) | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										95
									
								
								app/admin/service/dto/sys_api.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								app/admin/service/dto/sys_api.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,95 @@ | |||||||
|  | package dto | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | 	"go-admin/common/dto" | ||||||
|  | 	common "go-admin/common/models" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // SysApiGetPageReq 功能列表请求参数 | ||||||
|  | type SysApiGetPageReq struct { | ||||||
|  | 	dto.Pagination `search:"-"` | ||||||
|  | 	Title          string `form:"title"  search:"type:contains;column:title;table:sys_api" comment:"标题"` | ||||||
|  | 	Path           string `form:"path"  search:"type:contains;column:path;table:sys_api" comment:"地址"` | ||||||
|  | 	Action         string `form:"action"  search:"type:exact;column:action;table:sys_api" comment:"请求方式"` | ||||||
|  | 	ParentId       string `form:"parentId"  search:"type:exact;column:parent_id;table:sys_api" comment:"按钮id"` | ||||||
|  | 	Type           string `form:"type" search:"-" comment:"类型"` | ||||||
|  | 	SysApiOrder | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysApiOrder struct { | ||||||
|  | 	TitleOrder     string `search:"type:order;column:title;table:sys_api" form:"titleOrder"` | ||||||
|  | 	PathOrder      string `search:"type:order;column:path;table:sys_api" form:"pathOrder"` | ||||||
|  | 	CreatedAtOrder string `search:"type:order;column:created_at;table:sys_api" form:"createdAtOrder"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (m *SysApiGetPageReq) GetNeedSearch() interface{} { | ||||||
|  | 	return *m | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // SysApiInsertReq 功能创建请求参数 | ||||||
|  | type SysApiInsertReq struct { | ||||||
|  | 	Id     int    `json:"-" comment:"编码"` // 编码 | ||||||
|  | 	Handle string `json:"handle" comment:"handle"` | ||||||
|  | 	Title  string `json:"title" comment:"标题"` | ||||||
|  | 	Path   string `json:"path" comment:"地址"` | ||||||
|  | 	Type   string `json:"type" comment:""` | ||||||
|  | 	Action string `json:"action" comment:"类型"` | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysApiInsertReq) Generate(model *models.SysApi) { | ||||||
|  | 	model.Handle = s.Handle | ||||||
|  | 	model.Title = s.Title | ||||||
|  | 	model.Path = s.Path | ||||||
|  | 	model.Type = s.Type | ||||||
|  | 	model.Action = s.Action | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysApiInsertReq) GetId() interface{} { | ||||||
|  | 	return s.Id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // SysApiUpdateReq 功能更新请求参数 | ||||||
|  | type SysApiUpdateReq struct { | ||||||
|  | 	Id     int    `uri:"id" comment:"编码"` // 编码 | ||||||
|  | 	Handle string `json:"handle" comment:"handle"` | ||||||
|  | 	Title  string `json:"title" comment:"标题"` | ||||||
|  | 	Path   string `json:"path" comment:"地址"` | ||||||
|  | 	Type   string `json:"type" comment:""` | ||||||
|  | 	Action string `json:"action" comment:"类型"` | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysApiUpdateReq) Generate(model *models.SysApi) { | ||||||
|  | 	if s.Id != 0 { | ||||||
|  | 		model.Id = s.Id | ||||||
|  | 	} | ||||||
|  | 	model.Handle = s.Handle | ||||||
|  | 	model.Title = s.Title | ||||||
|  | 	model.Path = s.Path | ||||||
|  | 	model.Type = s.Type | ||||||
|  | 	model.Action = s.Action | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysApiUpdateReq) GetId() interface{} { | ||||||
|  | 	return s.Id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // SysApiGetReq 功能获取请求参数 | ||||||
|  | type SysApiGetReq struct { | ||||||
|  | 	Id int `uri:"id"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysApiGetReq) GetId() interface{} { | ||||||
|  | 	return s.Id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // SysApiDeleteReq 功能删除请求参数 | ||||||
|  | type SysApiDeleteReq struct { | ||||||
|  | 	Ids []int `json:"ids"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysApiDeleteReq) GetId() interface{} { | ||||||
|  | 	return s.Ids | ||||||
|  | } | ||||||
							
								
								
									
										112
									
								
								app/admin/service/dto/sys_config.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								app/admin/service/dto/sys_config.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,112 @@ | |||||||
|  | package dto | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | 	"go-admin/common/dto" | ||||||
|  | 	common "go-admin/common/models" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // SysConfigGetPageReq 列表或者搜索使用结构体 | ||||||
|  | type SysConfigGetPageReq struct { | ||||||
|  | 	dto.Pagination `search:"-"` | ||||||
|  | 	ConfigName     string `form:"configName" search:"type:contains;column:config_name;table:sys_config"` | ||||||
|  | 	ConfigKey      string `form:"configKey" search:"type:contains;column:config_key;table:sys_config"` | ||||||
|  | 	ConfigType     string `form:"configType" search:"type:exact;column:config_type;table:sys_config"` | ||||||
|  | 	IsFrontend     string `form:"isFrontend" search:"type:exact;column:is_frontend;table:sys_config"` | ||||||
|  | 	SysConfigOrder | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysConfigOrder struct { | ||||||
|  | 	IdOrder         string `search:"type:order;column:id;table:sys_config" form:"idOrder"` | ||||||
|  | 	ConfigNameOrder string `search:"type:order;column:config_name;table:sys_config" form:"configNameOrder"` | ||||||
|  | 	ConfigKeyOrder  string `search:"type:order;column:config_key;table:sys_config" form:"configKeyOrder"` | ||||||
|  | 	ConfigTypeOrder string `search:"type:order;column:config_type;table:sys_config" form:"configTypeOrder"` | ||||||
|  | 	CreatedAtOrder  string `search:"type:order;column:created_at;table:sys_config" form:"createdAtOrder"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (m *SysConfigGetPageReq) GetNeedSearch() interface{} { | ||||||
|  | 	return *m | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysConfigGetToSysAppReq struct { | ||||||
|  | 	IsFrontend string `form:"isFrontend" search:"type:exact;column:is_frontend;table:sys_config"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (m *SysConfigGetToSysAppReq) GetNeedSearch() interface{} { | ||||||
|  | 	return *m | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 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  string `json:"isFrontend"` | ||||||
|  | 	Remark      string `json:"remark" comment:""` | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Generate 结构体数据转化 从 SysConfigControl 至 system.SysConfig 对应的模型 | ||||||
|  | func (s *SysConfigControl) Generate(model *models.SysConfig) { | ||||||
|  | 	if s.Id == 0 { | ||||||
|  | 		model.Model = common.Model{Id: s.Id} | ||||||
|  | 	} | ||||||
|  | 	model.ConfigName = s.ConfigName | ||||||
|  | 	model.ConfigKey = s.ConfigKey | ||||||
|  | 	model.ConfigValue = s.ConfigValue | ||||||
|  | 	model.ConfigType = s.ConfigType | ||||||
|  | 	model.IsFrontend = s.IsFrontend | ||||||
|  | 	model.Remark = s.Remark | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetId 获取数据对应的ID | ||||||
|  | func (s *SysConfigControl) GetId() interface{} { | ||||||
|  | 	return s.Id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetSetSysConfigReq 增、改使用的结构体 | ||||||
|  | type GetSetSysConfigReq struct { | ||||||
|  | 	ConfigKey   string `json:"configKey" comment:""` | ||||||
|  | 	ConfigValue string `json:"configValue" comment:""` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Generate 结构体数据转化 从 SysConfigControl 至 system.SysConfig 对应的模型 | ||||||
|  | func (s *GetSetSysConfigReq) Generate(model *models.SysConfig) { | ||||||
|  | 	model.ConfigValue = s.ConfigValue | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type UpdateSetSysConfigReq map[string]string | ||||||
|  |  | ||||||
|  | // SysConfigByKeyReq 根据Key获取配置 | ||||||
|  | type SysConfigByKeyReq struct { | ||||||
|  | 	ConfigKey string `uri:"configKey" search:"type:contains;column:config_key;table:sys_config"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (m *SysConfigByKeyReq) GetNeedSearch() interface{} { | ||||||
|  | 	return *m | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type GetSysConfigByKEYForServiceResp struct { | ||||||
|  | 	ConfigKey   string `json:"configKey" comment:""` | ||||||
|  | 	ConfigValue string `json:"configValue" comment:""` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysConfigGetReq struct { | ||||||
|  | 	Id int `uri:"id"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysConfigGetReq) GetId() interface{} { | ||||||
|  | 	return s.Id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysConfigDeleteReq struct { | ||||||
|  | 	Ids []int `json:"ids"` | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysConfigDeleteReq) GetId() interface{} { | ||||||
|  | 	return s.Ids | ||||||
|  | } | ||||||
							
								
								
									
										110
									
								
								app/admin/service/dto/sys_dept.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								app/admin/service/dto/sys_dept.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,110 @@ | |||||||
|  | package dto | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | 	common "go-admin/common/models" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // SysDeptGetPageReq 列表或者搜索使用结构体 | ||||||
|  | type SysDeptGetPageReq struct { | ||||||
|  | 	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 *SysDeptGetPageReq) GetNeedSearch() interface{} { | ||||||
|  | 	return *m | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysDeptInsertReq struct { | ||||||
|  | 	DeptId   int    `uri:"id" comment:"编码"`                                         // 编码 | ||||||
|  | 	ParentId int    `json:"parentId" comment:"上级部门" vd:"?"`                         //上级部门 | ||||||
|  | 	DeptPath string `json:"deptPath" comment:""`                                    //路径 | ||||||
|  | 	DeptName string `json:"deptName" comment:"部门名称" vd:"len($)>0"`                  //部门名称 | ||||||
|  | 	Sort     int    `json:"sort" comment:"排序" vd:"?"`                               //排序 | ||||||
|  | 	Leader   string `json:"leader" comment:"负责人" vd:"@:len($)>0; msg:'leader不能为空'"` //负责人 | ||||||
|  | 	Phone    string `json:"phone" comment:"手机" vd:"?"`                              //手机 | ||||||
|  | 	Email    string `json:"email" comment:"邮箱" vd:"?"`                              //邮箱 | ||||||
|  | 	Status   int    `json:"status" comment:"状态" vd:"$>0"`                           //状态 | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysDeptInsertReq) Generate(model *models.SysDept) { | ||||||
|  | 	if s.DeptId != 0 { | ||||||
|  | 		model.DeptId = s.DeptId | ||||||
|  | 	} | ||||||
|  | 	model.DeptName = s.DeptName | ||||||
|  | 	model.ParentId = s.ParentId | ||||||
|  | 	model.DeptPath = s.DeptPath | ||||||
|  | 	model.Sort = s.Sort | ||||||
|  | 	model.Leader = s.Leader | ||||||
|  | 	model.Phone = s.Phone | ||||||
|  | 	model.Email = s.Email | ||||||
|  | 	model.Status = s.Status | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetId 获取数据对应的ID | ||||||
|  | func (s *SysDeptInsertReq) GetId() interface{} { | ||||||
|  | 	return s.DeptId | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysDeptUpdateReq struct { | ||||||
|  | 	DeptId   int    `uri:"id" comment:"编码"`                                         // 编码 | ||||||
|  | 	ParentId int    `json:"parentId" comment:"上级部门" vd:"?"`                         //上级部门 | ||||||
|  | 	DeptPath string `json:"deptPath" comment:""`                                    //路径 | ||||||
|  | 	DeptName string `json:"deptName" comment:"部门名称" vd:"len($)>0"`                  //部门名称 | ||||||
|  | 	Sort     int    `json:"sort" comment:"排序" vd:"?"`                               //排序 | ||||||
|  | 	Leader   string `json:"leader" comment:"负责人" vd:"@:len($)>0; msg:'leader不能为空'"` //负责人 | ||||||
|  | 	Phone    string `json:"phone" comment:"手机" vd:"?"`                              //手机 | ||||||
|  | 	Email    string `json:"email" comment:"邮箱" vd:"?"`                              //邮箱 | ||||||
|  | 	Status   int    `json:"status" comment:"状态" vd:"$>0"`                           //状态 | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Generate 结构体数据转化 从 SysDeptControl 至 SysDept 对应的模型 | ||||||
|  | func (s *SysDeptUpdateReq) Generate(model *models.SysDept) { | ||||||
|  | 	if s.DeptId != 0 { | ||||||
|  | 		model.DeptId = s.DeptId | ||||||
|  | 	} | ||||||
|  | 	model.DeptName = s.DeptName | ||||||
|  | 	model.ParentId = s.ParentId | ||||||
|  | 	model.DeptPath = s.DeptPath | ||||||
|  | 	model.Sort = s.Sort | ||||||
|  | 	model.Leader = s.Leader | ||||||
|  | 	model.Phone = s.Phone | ||||||
|  | 	model.Email = s.Email | ||||||
|  | 	model.Status = s.Status | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetId 获取数据对应的ID | ||||||
|  | func (s *SysDeptUpdateReq) GetId() interface{} { | ||||||
|  | 	return s.DeptId | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysDeptGetReq struct { | ||||||
|  | 	Id int `uri:"id"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysDeptGetReq) GetId() interface{} { | ||||||
|  | 	return s.Id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysDeptDeleteReq struct { | ||||||
|  | 	Ids []int `json:"ids"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysDeptDeleteReq) GetId() interface{} { | ||||||
|  | 	return s.Ids | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type DeptLabel struct { | ||||||
|  | 	Id       int         `gorm:"-" json:"id"` | ||||||
|  | 	Label    string      `gorm:"-" json:"label"` | ||||||
|  | 	Children []DeptLabel `gorm:"-" json:"children"` | ||||||
|  | } | ||||||
							
								
								
									
										108
									
								
								app/admin/service/dto/sys_dict_data.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								app/admin/service/dto/sys_dict_data.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,108 @@ | |||||||
|  | package dto | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | 	"go-admin/common/dto" | ||||||
|  | 	common "go-admin/common/models" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysDictDataGetPageReq 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 *SysDictDataGetPageReq) GetNeedSearch() interface{} { | ||||||
|  | 	return *m | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysDictDataGetAllResp struct { | ||||||
|  | 	DictLabel string `json:"label"` | ||||||
|  | 	DictValue string `json:"value"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysDictDataInsertReq struct { | ||||||
|  | 	Id        int    `json:"-" 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    int    `json:"status" comment:""` | ||||||
|  | 	Default   string `json:"default" comment:""` | ||||||
|  | 	Remark    string `json:"remark" comment:""` | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysDictDataInsertReq) Generate(model *models.SysDictData) { | ||||||
|  | 	model.DictCode = s.Id | ||||||
|  | 	model.DictSort = s.DictSort | ||||||
|  | 	model.DictLabel = s.DictLabel | ||||||
|  | 	model.DictValue = s.DictValue | ||||||
|  | 	model.DictType = s.DictType | ||||||
|  | 	model.CssClass = s.CssClass | ||||||
|  | 	model.ListClass = s.ListClass | ||||||
|  | 	model.IsDefault = s.IsDefault | ||||||
|  | 	model.Status = s.Status | ||||||
|  | 	model.Default = s.Default | ||||||
|  | 	model.Remark = s.Remark | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysDictDataInsertReq) GetId() interface{} { | ||||||
|  | 	return s.Id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysDictDataUpdateReq 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    int    `json:"status" comment:""` | ||||||
|  | 	Default   string `json:"default" comment:""` | ||||||
|  | 	Remark    string `json:"remark" comment:""` | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysDictDataUpdateReq) Generate(model *models.SysDictData) { | ||||||
|  | 	model.DictCode = s.Id | ||||||
|  | 	model.DictSort = s.DictSort | ||||||
|  | 	model.DictLabel = s.DictLabel | ||||||
|  | 	model.DictValue = s.DictValue | ||||||
|  | 	model.DictType = s.DictType | ||||||
|  | 	model.CssClass = s.CssClass | ||||||
|  | 	model.ListClass = s.ListClass | ||||||
|  | 	model.IsDefault = s.IsDefault | ||||||
|  | 	model.Status = s.Status | ||||||
|  | 	model.Default = s.Default | ||||||
|  | 	model.Remark = s.Remark | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysDictDataUpdateReq) GetId() interface{} { | ||||||
|  | 	return s.Id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysDictDataGetReq struct { | ||||||
|  | 	Id int `uri:"dictCode"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysDictDataGetReq) GetId() interface{} { | ||||||
|  | 	return s.Id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysDictDataDeleteReq struct { | ||||||
|  | 	Ids              []int `json:"ids"` | ||||||
|  | 	common.ControlBy `json:"-"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysDictDataDeleteReq) GetId() interface{} { | ||||||
|  | 	return s.Ids | ||||||
|  | } | ||||||
							
								
								
									
										89
									
								
								app/admin/service/dto/sys_dict_type.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								app/admin/service/dto/sys_dict_type.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,89 @@ | |||||||
|  | package dto | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  |  | ||||||
|  | 	"go-admin/common/dto" | ||||||
|  | 	common "go-admin/common/models" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysDictTypeGetPageReq 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"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysDictTypeOrder struct { | ||||||
|  | 	DictIdOrder string `search:"type:order;column:dict_id;table:sys_dict_type" form:"dictIdOrder"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (m *SysDictTypeGetPageReq) GetNeedSearch() interface{} { | ||||||
|  | 	return *m | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysDictTypeInsertReq struct { | ||||||
|  | 	Id       int    `uri:"id"` | ||||||
|  | 	DictName string `json:"dictName"` | ||||||
|  | 	DictType string `json:"dictType"` | ||||||
|  | 	Status   int    `json:"status"` | ||||||
|  | 	Remark   string `json:"remark"` | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysDictTypeInsertReq) Generate(model *models.SysDictType) { | ||||||
|  | 	if s.Id != 0 { | ||||||
|  | 		model.ID = s.Id | ||||||
|  | 	} | ||||||
|  | 	model.DictName = s.DictName | ||||||
|  | 	model.DictType = s.DictType | ||||||
|  | 	model.Status = s.Status | ||||||
|  | 	model.Remark = s.Remark | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysDictTypeInsertReq) GetId() interface{} { | ||||||
|  | 	return s.Id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysDictTypeUpdateReq struct { | ||||||
|  | 	Id       int    `uri:"id"` | ||||||
|  | 	DictName string `json:"dictName"` | ||||||
|  | 	DictType string `json:"dictType"` | ||||||
|  | 	Status   int    `json:"status"` | ||||||
|  | 	Remark   string `json:"remark"` | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysDictTypeUpdateReq) Generate(model *models.SysDictType) { | ||||||
|  | 	if s.Id != 0 { | ||||||
|  | 		model.ID = s.Id | ||||||
|  | 	} | ||||||
|  | 	model.DictName = s.DictName | ||||||
|  | 	model.DictType = s.DictType | ||||||
|  | 	model.Status = s.Status | ||||||
|  | 	model.Remark = s.Remark | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysDictTypeUpdateReq) GetId() interface{} { | ||||||
|  | 	return s.Id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysDictTypeGetReq struct { | ||||||
|  | 	Id int `uri:"id"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysDictTypeGetReq) GetId() interface{} { | ||||||
|  | 	return s.Id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysDictTypeDeleteReq struct { | ||||||
|  | 	Ids []int `json:"ids"` | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysDictTypeDeleteReq) GetId() interface{} { | ||||||
|  | 	return s.Ids | ||||||
|  | } | ||||||
							
								
								
									
										57
									
								
								app/admin/service/dto/sys_login_log.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								app/admin/service/dto/sys_login_log.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,57 @@ | |||||||
|  | package dto | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"time" | ||||||
|  |  | ||||||
|  | 	"go-admin/common/dto" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysLoginLogGetPageReq 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:"归属地"` | ||||||
|  | 	BeginTime      string `form:"beginTime" search:"type:gte;column:ctime;table:sys_login_log" comment:"创建时间"` | ||||||
|  | 	EndTime        string `form:"endTime" search:"type:lte;column:ctime;table:sys_login_log" comment:"创建时间"` | ||||||
|  | 	SysLoginLogOrder | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysLoginLogOrder struct { | ||||||
|  | 	CreatedAtOrder string `search:"type:order;column:created_at;table:sys_login_log" form:"createdAtOrder"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (m *SysLoginLogGetPageReq) GetNeedSearch() interface{} { | ||||||
|  | 	return *m | ||||||
|  | } | ||||||
|  |  | ||||||
|  | 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:"信息"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysLoginLogGetReq struct { | ||||||
|  | 	Id int `uri:"id"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysLoginLogGetReq) GetId() interface{} { | ||||||
|  | 	return s.Id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // SysLoginLogDeleteReq 功能删除请求参数 | ||||||
|  | type SysLoginLogDeleteReq struct { | ||||||
|  | 	Ids []int `json:"ids"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysLoginLogDeleteReq) GetId() interface{} { | ||||||
|  | 	return s.Ids | ||||||
|  | } | ||||||
							
								
								
									
										159
									
								
								app/admin/service/dto/sys_menu.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										159
									
								
								app/admin/service/dto/sys_menu.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,159 @@ | |||||||
|  | package dto | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | 	common "go-admin/common/models" | ||||||
|  |  | ||||||
|  | 	"go-admin/common/dto" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // SysMenuGetPageReq 列表或者搜索使用结构体 | ||||||
|  | type SysMenuGetPageReq struct { | ||||||
|  | 	dto.Pagination `search:"-"` | ||||||
|  | 	Title          string `form:"title" search:"type:contains;column:title;table:sys_menu" comment:"菜单名称"`  // 菜单名称 | ||||||
|  | 	Visible        int    `form:"visible" search:"type:exact;column:visible;table:sys_menu" comment:"显示状态"` // 显示状态 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (m *SysMenuGetPageReq) GetNeedSearch() interface{} { | ||||||
|  | 	return *m | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysMenuInsertReq 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:"菜单类型"`   //菜单类型 | ||||||
|  | 	SysApi     []models.SysApi `form:"sysApi"` | ||||||
|  | 	Apis       []int           `form:"apis"` | ||||||
|  | 	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 | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysMenuInsertReq) Generate(model *models.SysMenu) { | ||||||
|  | 	if s.MenuId != 0 { | ||||||
|  | 		model.MenuId = s.MenuId | ||||||
|  | 	} | ||||||
|  | 	model.MenuName = s.MenuName | ||||||
|  | 	model.Title = s.Title | ||||||
|  | 	model.Icon = s.Icon | ||||||
|  | 	model.Path = s.Path | ||||||
|  | 	model.Paths = s.Paths | ||||||
|  | 	model.MenuType = s.MenuType | ||||||
|  | 	model.Action = s.Action | ||||||
|  | 	model.SysApi = s.SysApi | ||||||
|  | 	model.Permission = s.Permission | ||||||
|  | 	model.ParentId = s.ParentId | ||||||
|  | 	model.NoCache = s.NoCache | ||||||
|  | 	model.Breadcrumb = s.Breadcrumb | ||||||
|  | 	model.Component = s.Component | ||||||
|  | 	model.Sort = s.Sort | ||||||
|  | 	model.Visible = s.Visible | ||||||
|  | 	model.IsFrame = s.IsFrame | ||||||
|  | 	if s.CreateBy != 0 { | ||||||
|  | 		model.CreateBy = s.CreateBy | ||||||
|  | 	} | ||||||
|  | 	if s.UpdateBy != 0 { | ||||||
|  | 		model.UpdateBy = s.UpdateBy | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysMenuInsertReq) GetId() interface{} { | ||||||
|  | 	return s.MenuId | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysMenuUpdateReq 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:"菜单类型"`   //菜单类型 | ||||||
|  | 	SysApi     []models.SysApi `form:"sysApi"` | ||||||
|  | 	Apis       []int           `form:"apis"` | ||||||
|  | 	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 | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysMenuUpdateReq) Generate(model *models.SysMenu) { | ||||||
|  | 	if s.MenuId != 0 { | ||||||
|  | 		model.MenuId = s.MenuId | ||||||
|  | 	} | ||||||
|  | 	model.MenuName = s.MenuName | ||||||
|  | 	model.Title = s.Title | ||||||
|  | 	model.Icon = s.Icon | ||||||
|  | 	model.Path = s.Path | ||||||
|  | 	model.Paths = s.Paths | ||||||
|  | 	model.MenuType = s.MenuType | ||||||
|  | 	model.Action = s.Action | ||||||
|  | 	model.SysApi = s.SysApi | ||||||
|  | 	model.Permission = s.Permission | ||||||
|  | 	model.ParentId = s.ParentId | ||||||
|  | 	model.NoCache = s.NoCache | ||||||
|  | 	model.Breadcrumb = s.Breadcrumb | ||||||
|  | 	model.Component = s.Component | ||||||
|  | 	model.Sort = s.Sort | ||||||
|  | 	model.Visible = s.Visible | ||||||
|  | 	model.IsFrame = s.IsFrame | ||||||
|  | 	if s.CreateBy != 0 { | ||||||
|  | 		model.CreateBy = s.CreateBy | ||||||
|  | 	} | ||||||
|  | 	if s.UpdateBy != 0 { | ||||||
|  | 		model.UpdateBy = s.UpdateBy | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysMenuUpdateReq) GetId() interface{} { | ||||||
|  | 	return s.MenuId | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysMenuGetReq struct { | ||||||
|  | 	Id int `uri:"id"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysMenuGetReq) GetId() interface{} { | ||||||
|  | 	return s.Id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysMenuDeleteReq struct { | ||||||
|  | 	Ids []int `json:"ids"` | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysMenuDeleteReq) GetId() interface{} { | ||||||
|  | 	return s.Ids | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type MenuLabel struct { | ||||||
|  | 	Id       int         `json:"id,omitempty" gorm:"-"` | ||||||
|  | 	Label    string      `json:"label,omitempty" gorm:"-"` | ||||||
|  | 	Children []MenuLabel `json:"children,omitempty" gorm:"-"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type MenuRole struct { | ||||||
|  | 	models.SysMenu | ||||||
|  | 	IsSelect bool `json:"is_select" gorm:"-"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SelectRole struct { | ||||||
|  | 	RoleId int `uri:"roleId"` | ||||||
|  | } | ||||||
							
								
								
									
										102
									
								
								app/admin/service/dto/sys_opera_log.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								app/admin/service/dto/sys_opera_log.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,102 @@ | |||||||
|  | package dto | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"time" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | 	"go-admin/common/dto" | ||||||
|  | 	common "go-admin/common/models" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | const ( | ||||||
|  | 	OperaStatusEnabel  = "1" // 状态-正常 | ||||||
|  | 	OperaStatusDisable = "2" // 状态-关闭 | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysOperaLogGetPageReq 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:"请求方式: GET POST PUT DELETE"` | ||||||
|  | 	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"` | ||||||
|  | 	Status         int    `form:"status" search:"type:exact;column:status;table:sys_opera_log" comment:"状态 1:正常 2:关闭"` | ||||||
|  | 	BeginTime      string `form:"beginTime" search:"type:gte;column:created_at;table:sys_opera_log" comment:"创建时间"` | ||||||
|  | 	EndTime        string `form:"endTime" search:"type:lte;column:created_at;table:sys_opera_log" comment:"更新时间"` | ||||||
|  | 	SysOperaLogOrder | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysOperaLogOrder struct { | ||||||
|  | 	CreatedAtOrder string `search:"type:order;column:created_at;table:sys_opera_log" form:"createdAtOrder"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (m *SysOperaLogGetPageReq) GetNeedSearch() interface{} { | ||||||
|  | 	return *m | ||||||
|  | } | ||||||
|  |  | ||||||
|  | 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) Generate() (*models.SysOperaLog, error) { | ||||||
|  | 	return &models.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 SysOperaLogGetReq struct { | ||||||
|  | 	Id int `uri:"id"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysOperaLogGetReq) GetId() interface{} { | ||||||
|  | 	return s.Id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // SysOperaLogDeleteReq 功能删除请求参数 | ||||||
|  | type SysOperaLogDeleteReq struct { | ||||||
|  | 	Ids []int `json:"ids"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysOperaLogDeleteReq) GetId() interface{} { | ||||||
|  | 	return s.Ids | ||||||
|  | } | ||||||
							
								
								
									
										111
									
								
								app/admin/service/dto/sys_post.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								app/admin/service/dto/sys_post.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,111 @@ | |||||||
|  | package dto | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | 	common "go-admin/common/models" | ||||||
|  |  | ||||||
|  | 	"go-admin/common/dto" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // SysPostPageReq 列表或者搜索使用结构体 | ||||||
|  | type SysPostPageReq 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:contains;column:post_name;table:sys_post" comment:"名称"` // 名称 | ||||||
|  | 	PostCode       string `form:"postCode" search:"type:contains;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 *SysPostPageReq) GetNeedSearch() interface{} { | ||||||
|  | 	return *m | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // SysPostInsertReq 增使用的结构体 | ||||||
|  | type SysPostInsertReq struct { | ||||||
|  | 	PostId   int    `uri:"id"  comment:"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:"备注"` | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysPostInsertReq) Generate(model *models.SysPost) { | ||||||
|  | 	model.PostName = s.PostName | ||||||
|  | 	model.PostCode = s.PostCode | ||||||
|  | 	model.Sort = s.Sort | ||||||
|  | 	model.Status = s.Status | ||||||
|  | 	model.Remark = s.Remark | ||||||
|  | 	if s.ControlBy.UpdateBy != 0 { | ||||||
|  | 		model.UpdateBy = s.UpdateBy | ||||||
|  | 	} | ||||||
|  | 	if s.ControlBy.CreateBy != 0 { | ||||||
|  | 		model.CreateBy = s.CreateBy | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetId 获取数据对应的ID | ||||||
|  | func (s *SysPostInsertReq) GetId() interface{} { | ||||||
|  | 	return s.PostId | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // SysPostUpdateReq 改使用的结构体 | ||||||
|  | type SysPostUpdateReq struct { | ||||||
|  | 	PostId   int    `uri:"id"  comment:"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:"备注"` | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysPostUpdateReq) Generate(model *models.SysPost) { | ||||||
|  | 	model.PostId = s.PostId | ||||||
|  | 	model.PostName = s.PostName | ||||||
|  | 	model.PostCode = s.PostCode | ||||||
|  | 	model.Sort = s.Sort | ||||||
|  | 	model.Status = s.Status | ||||||
|  | 	model.Remark = s.Remark | ||||||
|  | 	if s.ControlBy.UpdateBy != 0 { | ||||||
|  | 		model.UpdateBy = s.UpdateBy | ||||||
|  | 	} | ||||||
|  | 	if s.ControlBy.CreateBy != 0 { | ||||||
|  | 		model.CreateBy = s.CreateBy | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysPostUpdateReq) GetId() interface{} { | ||||||
|  | 	return s.PostId | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // SysPostGetReq 获取单个的结构体 | ||||||
|  | type SysPostGetReq struct { | ||||||
|  | 	Id int `uri:"id"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysPostGetReq) GetId() interface{} { | ||||||
|  | 	return s.Id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // SysPostDeleteReq 删除的结构体 | ||||||
|  | type SysPostDeleteReq struct { | ||||||
|  | 	Ids []int `json:"ids"` | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysPostDeleteReq) Generate(model *models.SysPost) { | ||||||
|  | 	if s.ControlBy.UpdateBy != 0 { | ||||||
|  | 		model.UpdateBy = s.UpdateBy | ||||||
|  | 	} | ||||||
|  | 	if s.ControlBy.CreateBy != 0 { | ||||||
|  | 		model.CreateBy = s.CreateBy | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysPostDeleteReq) GetId() interface{} { | ||||||
|  | 	return s.Ids | ||||||
|  | } | ||||||
							
								
								
									
										164
									
								
								app/admin/service/dto/sys_role.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								app/admin/service/dto/sys_role.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,164 @@ | |||||||
|  | package dto | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | 	common "go-admin/common/models" | ||||||
|  |  | ||||||
|  | 	"go-admin/common/dto" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysRoleGetPageReq 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:"是否管理员"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysRoleOrder struct { | ||||||
|  | 	RoleIdOrder    string `search:"type:order;column:role_id;table:sys_role" form:"roleIdOrder"` | ||||||
|  | 	RoleNameOrder  string `search:"type:order;column:role_name;table:sys_role" form:"roleNameOrder"` | ||||||
|  | 	RoleSortOrder  string `search:"type:order;column:role_sort;table:sys_role" form:"usernameOrder"` | ||||||
|  | 	StatusOrder    string `search:"type:order;column:status;table:sys_role" form:"statusOrder"` | ||||||
|  | 	CreatedAtOrder string `search:"type:order;column:created_at;table:sys_role" form:"createdAtOrder"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (m *SysRoleGetPageReq) GetNeedSearch() interface{} { | ||||||
|  | 	return *m | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysRoleInsertReq struct { | ||||||
|  | 	RoleId    int              `uri:"id" comment:"角色编码"`        // 角色编码 | ||||||
|  | 	RoleName  string           `form:"roleName" comment:"角色名称"` // 角色名称 | ||||||
|  | 	Status    string           `form:"status" comment:"状态"`     // 状态 1禁用 2正常 | ||||||
|  | 	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"` | ||||||
|  | 	SysMenu   []models.SysMenu `form:"sysMenu"` | ||||||
|  | 	MenuIds   []int            `form:"menuIds"` | ||||||
|  | 	SysDept   []models.SysDept `form:"sysDept"` | ||||||
|  | 	DeptIds   []int            `form:"deptIds"` | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysRoleInsertReq) Generate(model *models.SysRole) { | ||||||
|  | 	if s.RoleId != 0 { | ||||||
|  | 		model.RoleId = s.RoleId | ||||||
|  | 	} | ||||||
|  | 	model.RoleName = s.RoleName | ||||||
|  | 	model.Status = s.Status | ||||||
|  | 	model.RoleKey = s.RoleKey | ||||||
|  | 	model.RoleSort = s.RoleSort | ||||||
|  | 	model.Flag = s.Flag | ||||||
|  | 	model.Remark = s.Remark | ||||||
|  | 	model.Admin = s.Admin | ||||||
|  | 	model.DataScope = s.DataScope | ||||||
|  | 	model.SysMenu = &s.SysMenu | ||||||
|  | 	model.SysDept = s.SysDept | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysRoleInsertReq) GetId() interface{} { | ||||||
|  | 	return s.RoleId | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysRoleUpdateReq 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"` | ||||||
|  | 	SysMenu   []models.SysMenu `form:"sysMenu"` | ||||||
|  | 	MenuIds   []int            `form:"menuIds"` | ||||||
|  | 	SysDept   []models.SysDept `form:"sysDept"` | ||||||
|  | 	DeptIds   []int            `form:"deptIds"` | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysRoleUpdateReq) Generate(model *models.SysRole) { | ||||||
|  | 	if s.RoleId != 0 { | ||||||
|  | 		model.RoleId = s.RoleId | ||||||
|  | 	} | ||||||
|  | 	model.RoleName = s.RoleName | ||||||
|  | 	model.Status = s.Status | ||||||
|  | 	model.RoleKey = s.RoleKey | ||||||
|  | 	model.RoleSort = s.RoleSort | ||||||
|  | 	model.Flag = s.Flag | ||||||
|  | 	model.Remark = s.Remark | ||||||
|  | 	model.Admin = s.Admin | ||||||
|  | 	model.DataScope = s.DataScope | ||||||
|  | 	model.SysMenu = &s.SysMenu | ||||||
|  | 	model.SysDept = s.SysDept | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysRoleUpdateReq) GetId() interface{} { | ||||||
|  | 	return s.RoleId | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type UpdateStatusReq struct { | ||||||
|  | 	RoleId int    `form:"roleId" comment:"角色编码"` // 角色编码 | ||||||
|  | 	Status string `form:"status" comment:"状态"`   // 状态 | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *UpdateStatusReq) Generate(model *models.SysRole) { | ||||||
|  | 	if s.RoleId != 0 { | ||||||
|  | 		model.RoleId = s.RoleId | ||||||
|  | 	} | ||||||
|  | 	model.Status = s.Status | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *UpdateStatusReq) GetId() interface{} { | ||||||
|  | 	return s.RoleId | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysRoleByName struct { | ||||||
|  | 	RoleName string `form:"role"` // 角色编码 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysRoleGetReq struct { | ||||||
|  | 	Id int `uri:"id"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysRoleGetReq) GetId() interface{} { | ||||||
|  | 	return s.Id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysRoleDeleteReq struct { | ||||||
|  | 	Ids []int `json:"ids"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysRoleDeleteReq) GetId() interface{} { | ||||||
|  | 	return s.Ids | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // RoleDataScopeReq 角色数据权限修改 | ||||||
|  | type RoleDataScopeReq struct { | ||||||
|  | 	RoleId    int    `json:"roleId" binding:"required"` | ||||||
|  | 	DataScope string `json:"dataScope" binding:"required"` | ||||||
|  | 	DeptIds   []int  `json:"deptIds"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *RoleDataScopeReq) Generate(model *models.SysRole) { | ||||||
|  | 	if s.RoleId != 0 { | ||||||
|  | 		model.RoleId = s.RoleId | ||||||
|  | 	} | ||||||
|  | 	model.DataScope = s.DataScope | ||||||
|  | 	model.DeptIds = s.DeptIds | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type DeptIdList struct { | ||||||
|  | 	DeptId int `json:"DeptId"` | ||||||
|  | } | ||||||
							
								
								
									
										189
									
								
								app/admin/service/dto/sys_user.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										189
									
								
								app/admin/service/dto/sys_user.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,189 @@ | |||||||
|  | package dto | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  |  | ||||||
|  | 	"go-admin/common/dto" | ||||||
|  | 	common "go-admin/common/models" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysUserGetPageReq 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:"邮箱"` | ||||||
|  | 	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:"状态"` | ||||||
|  | 	DeptJoin       `search:"type:left;on:dept_id:dept_id;table:sys_user;join:sys_dept"` | ||||||
|  | 	SysUserOrder | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysUserOrder struct { | ||||||
|  | 	UserIdOrder    string `search:"type:order;column:user_id;table:sys_user" form:"userIdOrder"` | ||||||
|  | 	UsernameOrder  string `search:"type:order;column:username;table:sys_user" form:"usernameOrder"` | ||||||
|  | 	StatusOrder    string `search:"type:order;column:status;table:sys_user" form:"statusOrder"` | ||||||
|  | 	CreatedAtOrder string `search:"type:order;column:created_at;table:sys_user" form:"createdAtOrder"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type DeptJoin struct { | ||||||
|  | 	DeptId string `search:"type:contains;column:dept_path;table:sys_dept" form:"deptId"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (m *SysUserGetPageReq) GetNeedSearch() interface{} { | ||||||
|  | 	return *m | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type ResetSysUserPwdReq struct { | ||||||
|  | 	UserId   int    `json:"userId" comment:"用户ID" vd:"$>0"` // 用户ID | ||||||
|  | 	Password string `json:"password" comment:"密码" vd:"len($)>0"` | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *ResetSysUserPwdReq) GetId() interface{} { | ||||||
|  | 	return s.UserId | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *ResetSysUserPwdReq) Generate(model *models.SysUser) { | ||||||
|  | 	if s.UserId != 0 { | ||||||
|  | 		model.UserId = s.UserId | ||||||
|  | 	} | ||||||
|  | 	model.Password = s.Password | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type UpdateSysUserAvatarReq struct { | ||||||
|  | 	UserId int    `json:"userId" comment:"用户ID" vd:"len($)>0"` // 用户ID | ||||||
|  | 	Avatar string `json:"avatar" comment:"头像" vd:"len($)>0"` | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *UpdateSysUserAvatarReq) GetId() interface{} { | ||||||
|  | 	return s.UserId | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *UpdateSysUserAvatarReq) Generate(model *models.SysUser) { | ||||||
|  | 	if s.UserId != 0 { | ||||||
|  | 		model.UserId = s.UserId | ||||||
|  | 	} | ||||||
|  | 	model.Avatar = s.Avatar | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type UpdateSysUserStatusReq struct { | ||||||
|  | 	UserId int    `json:"userId" comment:"用户ID" vd:"$>0"` // 用户ID | ||||||
|  | 	Status string `json:"status" comment:"状态" vd:"len($)>0"` | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *UpdateSysUserStatusReq) GetId() interface{} { | ||||||
|  | 	return s.UserId | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *UpdateSysUserStatusReq) Generate(model *models.SysUser) { | ||||||
|  | 	if s.UserId != 0 { | ||||||
|  | 		model.UserId = s.UserId | ||||||
|  | 	} | ||||||
|  | 	model.Status = s.Status | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysUserInsertReq struct { | ||||||
|  | 	UserId   int    `json:"userId" comment:"用户ID"` // 用户ID | ||||||
|  | 	Username string `json:"username" comment:"用户名" vd:"len($)>0"` | ||||||
|  | 	Password string `json:"password" comment:"密码"` | ||||||
|  | 	NickName string `json:"nickName" comment:"昵称" vd:"len($)>0"` | ||||||
|  | 	Phone    string `json:"phone" comment:"手机号" vd:"len($)>0"` | ||||||
|  | 	RoleId   int    `json:"roleId" comment:"角色ID"` | ||||||
|  | 	Avatar   string `json:"avatar" comment:"头像"` | ||||||
|  | 	Sex      string `json:"sex" comment:"性别"` | ||||||
|  | 	Email    string `json:"email" comment:"邮箱" vd:"len($)>0,email"` | ||||||
|  | 	DeptId   int    `json:"deptId" comment:"部门" vd:"$>0"` | ||||||
|  | 	PostId   int    `json:"postId" comment:"岗位"` | ||||||
|  | 	Remark   string `json:"remark" comment:"备注"` | ||||||
|  | 	Status   string `json:"status" comment:"状态" vd:"len($)>0" default:"1"` | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysUserInsertReq) Generate(model *models.SysUser) { | ||||||
|  | 	if s.UserId != 0 { | ||||||
|  | 		model.UserId = s.UserId | ||||||
|  | 	} | ||||||
|  | 	model.Username = s.Username | ||||||
|  | 	model.Password = s.Password | ||||||
|  | 	model.NickName = s.NickName | ||||||
|  | 	model.Phone = s.Phone | ||||||
|  | 	model.RoleId = s.RoleId | ||||||
|  | 	model.Avatar = s.Avatar | ||||||
|  | 	model.Sex = s.Sex | ||||||
|  | 	model.Email = s.Email | ||||||
|  | 	model.DeptId = s.DeptId | ||||||
|  | 	model.PostId = s.PostId | ||||||
|  | 	model.Remark = s.Remark | ||||||
|  | 	model.Status = s.Status | ||||||
|  | 	model.CreateBy = s.CreateBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysUserInsertReq) GetId() interface{} { | ||||||
|  | 	return s.UserId | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysUserUpdateReq struct { | ||||||
|  | 	UserId   int    `json:"userId" comment:"用户ID"` // 用户ID | ||||||
|  | 	Username string `json:"username" comment:"用户名" vd:"len($)>0"` | ||||||
|  | 	NickName string `json:"nickName" comment:"昵称" vd:"len($)>0"` | ||||||
|  | 	Phone    string `json:"phone" comment:"手机号" vd:"len($)>0"` | ||||||
|  | 	RoleId   int    `json:"roleId" comment:"角色ID"` | ||||||
|  | 	Avatar   string `json:"avatar" comment:"头像"` | ||||||
|  | 	Sex      string `json:"sex" comment:"性别"` | ||||||
|  | 	Email    string `json:"email" comment:"邮箱" vd:"len($)>0,email"` | ||||||
|  | 	DeptId   int    `json:"deptId" comment:"部门" vd:"$>0"` | ||||||
|  | 	PostId   int    `json:"postId" comment:"岗位"` | ||||||
|  | 	Remark   string `json:"remark" comment:"备注"` | ||||||
|  | 	Status   string `json:"status" comment:"状态" default:"1"` | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysUserUpdateReq) Generate(model *models.SysUser) { | ||||||
|  | 	if s.UserId != 0 { | ||||||
|  | 		model.UserId = s.UserId | ||||||
|  | 	} | ||||||
|  | 	model.Username = s.Username | ||||||
|  | 	model.NickName = s.NickName | ||||||
|  | 	model.Phone = s.Phone | ||||||
|  | 	model.RoleId = s.RoleId | ||||||
|  | 	model.Avatar = s.Avatar | ||||||
|  | 	model.Sex = s.Sex | ||||||
|  | 	model.Email = s.Email | ||||||
|  | 	model.DeptId = s.DeptId | ||||||
|  | 	model.PostId = s.PostId | ||||||
|  | 	model.Remark = s.Remark | ||||||
|  | 	model.Status = s.Status | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysUserUpdateReq) GetId() interface{} { | ||||||
|  | 	return s.UserId | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysUserById struct { | ||||||
|  | 	dto.ObjectById | ||||||
|  | 	common.ControlBy | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysUserById) GetId() interface{} { | ||||||
|  | 	if len(s.Ids) > 0 { | ||||||
|  | 		s.Ids = append(s.Ids, s.Id) | ||||||
|  | 		return s.Ids | ||||||
|  | 	} | ||||||
|  | 	return s.Id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysUserById) GenerateM() (common.ActiveRecord, error) { | ||||||
|  | 	return &models.SysUser{}, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // PassWord 密码 | ||||||
|  | type PassWord struct { | ||||||
|  | 	NewPassword string `json:"newPassword" vd:"len($)>0"` | ||||||
|  | 	OldPassword string `json:"oldPassword" vd:"len($)>0"` | ||||||
|  | } | ||||||
							
								
								
									
										123
									
								
								app/admin/service/sys_api.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								app/admin/service/sys_api.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,123 @@ | |||||||
|  | package service | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"errors" | ||||||
|  | 	"fmt" | ||||||
|  |  | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/runtime" | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/service" | ||||||
|  | 	"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/global" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysApi struct { | ||||||
|  | 	service.Service | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage 获取SysApi列表 | ||||||
|  | func (e *SysApi) GetPage(c *dto.SysApiGetPageReq, p *actions.DataPermission, list *[]models.SysApi, count *int64) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysApi | ||||||
|  |  | ||||||
|  | 	orm := e.Orm.Debug().Model(&data). | ||||||
|  | 		Scopes( | ||||||
|  | 			cDto.MakeCondition(c.GetNeedSearch()), | ||||||
|  | 			cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), | ||||||
|  | 			actions.Permission(data.TableName(), p), | ||||||
|  | 		) | ||||||
|  | 	if c.Type != "" { | ||||||
|  | 		qType := c.Type | ||||||
|  | 		if qType == "暂无" { | ||||||
|  | 			qType = "" | ||||||
|  | 		} | ||||||
|  | 		if global.Driver == "postgres" { | ||||||
|  | 			orm = orm.Where("type = ?", qType) | ||||||
|  | 		} else { | ||||||
|  | 			orm = orm.Where("`type` = ?", qType) | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  | 	err = orm.Find(list).Limit(-1).Offset(-1). | ||||||
|  | 		Count(count).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("Service GetSysApiPage error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get 获取SysApi对象with id | ||||||
|  | func (e *SysApi) Get(d *dto.SysApiGetReq, p *actions.DataPermission, model *models.SysApi) *SysApi { | ||||||
|  | 	var data models.SysApi | ||||||
|  | 	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 GetSysApi error:%s", err) | ||||||
|  | 		_ = e.AddError(err) | ||||||
|  | 		return e | ||||||
|  | 	} | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		_ = e.AddError(err) | ||||||
|  | 		return e | ||||||
|  | 	} | ||||||
|  | 	return e | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update 修改SysApi对象 | ||||||
|  | func (e *SysApi) Update(c *dto.SysApiUpdateReq, p *actions.DataPermission) error { | ||||||
|  | 	var model = models.SysApi{} | ||||||
|  | 	db := e.Orm.Debug().First(&model, c.GetId()) | ||||||
|  | 	if db.RowsAffected == 0 { | ||||||
|  | 		return errors.New("无权更新该数据") | ||||||
|  | 	} | ||||||
|  | 	c.Generate(&model) | ||||||
|  | 	db = e.Orm.Save(&model) | ||||||
|  | 	if err := db.Error; err != nil { | ||||||
|  | 		e.Log.Errorf("Service UpdateSysApi error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Remove 删除SysApi | ||||||
|  | func (e *SysApi) Remove(d *dto.SysApiDeleteReq, p *actions.DataPermission) error { | ||||||
|  | 	var data models.SysApi | ||||||
|  |  | ||||||
|  | 	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 RemoveSysApi error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if db.RowsAffected == 0 { | ||||||
|  | 		return errors.New("无权删除该数据") | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CheckStorageSysApi 创建SysApi对象 | ||||||
|  | func (e *SysApi) CheckStorageSysApi(c *[]runtime.Router) error { | ||||||
|  | 	for _, v := range *c { | ||||||
|  | 		err := e.Orm.Debug().Where(models.SysApi{Path: v.RelativePath, Action: v.HttpMethod}). | ||||||
|  | 			Attrs(models.SysApi{Handle: v.Handler}). | ||||||
|  | 			FirstOrCreate(&models.SysApi{}).Error | ||||||
|  | 		if err != nil { | ||||||
|  | 			err := fmt.Errorf("Service CheckStorageSysApi error: %s \r\n ", err.Error()) | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
							
								
								
									
										182
									
								
								app/admin/service/sys_config.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								app/admin/service/sys_config.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,182 @@ | |||||||
|  | package service | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"errors" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
|  | 	cDto "go-admin/common/dto" | ||||||
|  |  | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/service" | ||||||
|  | 	"gorm.io/gorm" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysConfig struct { | ||||||
|  | 	service.Service | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage 获取SysConfig列表 | ||||||
|  | func (e *SysConfig) GetPage(c *dto.SysConfigGetPageReq, list *[]models.SysConfig, count *int64) error { | ||||||
|  | 	err := e.Orm. | ||||||
|  | 		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 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get 获取SysConfig对象 | ||||||
|  | func (e *SysConfig) Get(d *dto.SysConfigGetReq, model *models.SysConfig) error { | ||||||
|  | 	err := e.Orm.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 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Insert 创建SysConfig对象 | ||||||
|  | func (e *SysConfig) Insert(c *dto.SysConfigControl) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysConfig | ||||||
|  | 	c.Generate(&data) | ||||||
|  | 	err = e.Orm.Create(&data).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("Service InsertSysConfig error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update 修改SysConfig对象 | ||||||
|  | func (e *SysConfig) Update(c *dto.SysConfigControl) error { | ||||||
|  | 	var err error | ||||||
|  | 	var model = models.SysConfig{} | ||||||
|  | 	e.Orm.First(&model, c.GetId()) | ||||||
|  | 	c.Generate(&model) | ||||||
|  | 	db := e.Orm.Save(&model) | ||||||
|  | 	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 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // SetSysConfig 修改SysConfig对象 | ||||||
|  | func (e *SysConfig) SetSysConfig(c *[]dto.GetSetSysConfigReq) error { | ||||||
|  | 	var err error | ||||||
|  | 	for _, req := range *c { | ||||||
|  | 		var model = models.SysConfig{} | ||||||
|  | 		e.Orm.Where("config_key = ?", req.ConfigKey).First(&model) | ||||||
|  | 		if model.Id != 0 { | ||||||
|  | 			req.Generate(&model) | ||||||
|  | 			db := e.Orm.Save(&model) | ||||||
|  | 			err = db.Error | ||||||
|  | 			if err != nil { | ||||||
|  | 				e.Log.Errorf("Service SetSysConfig error:%s", err) | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 			if db.RowsAffected == 0 { | ||||||
|  | 				return errors.New("无权更新该数据") | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e *SysConfig) GetForSet(c *[]dto.GetSetSysConfigReq) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysConfig | ||||||
|  |  | ||||||
|  | 	err = e.Orm.Model(&data). | ||||||
|  | 		Find(c).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("Service GetSysConfigPage error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e *SysConfig) UpdateForSet(c *[]dto.GetSetSysConfigReq) error { | ||||||
|  | 	m := *c | ||||||
|  | 	for _, req := range m { | ||||||
|  | 		var data models.SysConfig | ||||||
|  | 		if err := e.Orm.Where("config_key = ?", req.ConfigKey). | ||||||
|  | 			First(&data).Error; err != nil { | ||||||
|  | 			e.Log.Errorf("Service GetSysConfigPage error:%s", err) | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		if data.ConfigValue != req.ConfigValue { | ||||||
|  | 			data.ConfigValue = req.ConfigValue | ||||||
|  |  | ||||||
|  | 			if err := e.Orm.Save(&data).Error; err != nil { | ||||||
|  | 				e.Log.Errorf("Service GetSysConfigPage error:%s", err) | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Remove 删除SysConfig | ||||||
|  | func (e *SysConfig) Remove(d *dto.SysConfigDeleteReq) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysConfig | ||||||
|  |  | ||||||
|  | 	db := e.Orm.Delete(&data, d.Ids) | ||||||
|  | 	if err = db.Error; err != 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 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetWithKey 根据Key获取SysConfig | ||||||
|  | func (e *SysConfig) GetWithKey(c *dto.SysConfigByKeyReq, resp *dto.GetSysConfigByKEYForServiceResp) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysConfig | ||||||
|  | 	err = e.Orm.Table(data.TableName()).Where("config_key = ?", c.ConfigKey).First(resp).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("At Service GetSysConfigByKEY Error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e *SysConfig) GetWithKeyList(c *dto.SysConfigGetToSysAppReq, list *[]models.SysConfig) error { | ||||||
|  | 	var err error | ||||||
|  | 	err = e.Orm. | ||||||
|  | 		Scopes( | ||||||
|  | 			cDto.MakeCondition(c.GetNeedSearch()), | ||||||
|  | 		). | ||||||
|  | 		Find(list).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("Service GetSysConfigByKey error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
							
								
								
									
										295
									
								
								app/admin/service/sys_dept.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										295
									
								
								app/admin/service/sys_dept.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,295 @@ | |||||||
|  | package service | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"errors" | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  |  | ||||||
|  | 	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/service/dto" | ||||||
|  | 	cDto "go-admin/common/dto" | ||||||
|  |  | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/service" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysDept struct { | ||||||
|  | 	service.Service | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage 获取SysDept列表 | ||||||
|  | //func (e *SysDept) GetPage(c *dto.SysDeptGetPageReq, list *[]models.SysDept) error { | ||||||
|  | //	var err error | ||||||
|  | //	var data models.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 | ||||||
|  | //} | ||||||
|  |  | ||||||
|  | // Get 获取SysDept对象 | ||||||
|  | func (e *SysDept) Get(d *dto.SysDeptGetReq, model *models.SysDept) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.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 err = db.Error; err != nil { | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Insert 创建SysDept对象 | ||||||
|  | func (e *SysDept) Insert(c *dto.SysDeptInsertReq) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysDept | ||||||
|  | 	c.Generate(&data) | ||||||
|  | 	tx := e.Orm.Debug().Begin() | ||||||
|  | 	defer func() { | ||||||
|  | 		if err != nil { | ||||||
|  | 			tx.Rollback() | ||||||
|  | 		} else { | ||||||
|  | 			tx.Commit() | ||||||
|  | 		} | ||||||
|  | 	}() | ||||||
|  | 	err = tx.Create(&data).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	deptPath := pkg.IntToString(data.DeptId) + "/" | ||||||
|  | 	if data.ParentId != 0 { | ||||||
|  | 		var deptP models.SysDept | ||||||
|  | 		tx.First(&deptP, data.ParentId) | ||||||
|  | 		deptPath = deptP.DeptPath + deptPath | ||||||
|  | 	} else { | ||||||
|  | 		deptPath = "/0/" + deptPath | ||||||
|  | 	} | ||||||
|  | 	var mp = map[string]string{} | ||||||
|  | 	mp["dept_path"] = deptPath | ||||||
|  | 	if err := tx.Model(&data).Update("dept_path", deptPath).Error; err != nil { | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update 修改SysDept对象 | ||||||
|  | func (e *SysDept) Update(c *dto.SysDeptUpdateReq) error { | ||||||
|  | 	var err error | ||||||
|  | 	var model = models.SysDept{} | ||||||
|  | 	tx := e.Orm.Debug().Begin() | ||||||
|  | 	defer func() { | ||||||
|  | 		if err != nil { | ||||||
|  | 			tx.Rollback() | ||||||
|  | 		} else { | ||||||
|  | 			tx.Commit() | ||||||
|  | 		} | ||||||
|  | 	}() | ||||||
|  | 	tx.First(&model, c.GetId()) | ||||||
|  | 	c.Generate(&model) | ||||||
|  |  | ||||||
|  | 	deptPath := pkg.IntToString(model.DeptId) + "/" | ||||||
|  | 	if model.ParentId != 0 { | ||||||
|  | 		var deptP models.SysDept | ||||||
|  | 		tx.First(&deptP, model.ParentId) | ||||||
|  | 		deptPath = deptP.DeptPath + deptPath | ||||||
|  | 	} else { | ||||||
|  | 		deptPath = "/0/" + deptPath | ||||||
|  | 	} | ||||||
|  | 	model.DeptPath = deptPath | ||||||
|  | 	db := tx.Save(&model) | ||||||
|  | 	if err = db.Error; err != nil { | ||||||
|  | 		e.Log.Errorf("UpdateSysDept error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if db.RowsAffected == 0 { | ||||||
|  | 		return errors.New("无权更新该数据") | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Remove 删除SysDept | ||||||
|  | func (e *SysDept) Remove(d *dto.SysDeptDeleteReq) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysDept | ||||||
|  |  | ||||||
|  | 	db := e.Orm.Model(&data).Delete(&data, d.GetId()) | ||||||
|  | 	if err = db.Error; err != 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) getList(c *dto.SysDeptGetPageReq, list *[]models.SysDept) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.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.SysDeptGetPageReq) (m []dto.DeptLabel, err error) { | ||||||
|  | 	var list []models.SysDept | ||||||
|  | 	err = e.getList(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 *[]models.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.SysDeptGetPageReq) (m []models.SysDept, err error) { | ||||||
|  | 	var list []models.SysDept | ||||||
|  | 	err = e.getList(c, &list) | ||||||
|  | 	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 *[]models.SysDept, menu models.SysDept) models.SysDept { | ||||||
|  | 	list := *deptlist | ||||||
|  | 	min := make([]models.SysDept, 0) | ||||||
|  | 	for j := 0; j < len(list); j++ { | ||||||
|  | 		if menu.DeptId != list[j].ParentId { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		mi := models.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 = []models.SysDept{} | ||||||
|  | 		ms := e.deptPageCall(deptlist, mi) | ||||||
|  | 		min = append(min, ms) | ||||||
|  | 	} | ||||||
|  | 	menu.Children = min | ||||||
|  | 	return menu | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetWithRoleId 获取角色的部门ID集合 | ||||||
|  | func (e *SysDept) GetWithRoleId(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([]models.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 := deptLabelCall(&list, item) | ||||||
|  | 		m = append(m, deptInfo) | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // deptLabelCall | ||||||
|  | func deptLabelCall(deptList *[]models.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 := deptLabelCall(deptList, mi) | ||||||
|  | 		min = append(min, ms) | ||||||
|  | 	} | ||||||
|  | 	dept.Children = min | ||||||
|  | 	return dept | ||||||
|  | } | ||||||
							
								
								
									
										121
									
								
								app/admin/service/sys_dict_data.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								app/admin/service/sys_dict_data.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,121 @@ | |||||||
|  | package service | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"errors" | ||||||
|  |  | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/service" | ||||||
|  | 	"gorm.io/gorm" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
|  | 	cDto "go-admin/common/dto" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysDictData struct { | ||||||
|  | 	service.Service | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage 获取列表 | ||||||
|  | func (e *SysDictData) GetPage(c *dto.SysDictDataGetPageReq, list *[]models.SysDictData, count *int64) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.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.SysDictDataGetReq, model *models.SysDictData) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.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 err = db.Error; err != nil { | ||||||
|  | 		e.Log.Errorf("db error: %s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Insert 创建对象 | ||||||
|  | func (e *SysDictData) Insert(c *dto.SysDictDataInsertReq) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data = new(models.SysDictData) | ||||||
|  | 	c.Generate(data) | ||||||
|  | 	err = e.Orm.Create(data).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("db error: %s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update 修改对象 | ||||||
|  | func (e *SysDictData) Update(c *dto.SysDictDataUpdateReq) error { | ||||||
|  | 	var err error | ||||||
|  | 	var model = models.SysDictData{} | ||||||
|  | 	e.Orm.First(&model, c.GetId()) | ||||||
|  | 	c.Generate(&model) | ||||||
|  | 	db := e.Orm.Save(model) | ||||||
|  | 	if err = db.Error; err != nil { | ||||||
|  | 		e.Log.Errorf("db error: %s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if db.RowsAffected == 0 { | ||||||
|  | 		return errors.New("无权更新该数据") | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Remove 删除 | ||||||
|  | func (e *SysDictData) Remove(c *dto.SysDictDataDeleteReq) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysDictData | ||||||
|  |  | ||||||
|  | 	db := e.Orm.Delete(&data, c.GetId()) | ||||||
|  | 	if err = db.Error; err != 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.SysDictDataGetPageReq, list *[]models.SysDictData) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.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 | ||||||
|  | } | ||||||
							
								
								
									
										124
									
								
								app/admin/service/sys_dict_type.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								app/admin/service/sys_dict_type.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,124 @@ | |||||||
|  | package service | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"errors" | ||||||
|  | 	"fmt" | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/service" | ||||||
|  | 	"gorm.io/gorm" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
|  | 	cDto "go-admin/common/dto" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysDictType struct { | ||||||
|  | 	service.Service | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage 获取列表 | ||||||
|  | func (e *SysDictType) GetPage(c *dto.SysDictTypeGetPageReq, list *[]models.SysDictType, count *int64) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.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.SysDictTypeGetReq, model *models.SysDictType) 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 = db.Error; err != nil { | ||||||
|  | 		e.Log.Errorf("db error: %s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Insert 创建对象 | ||||||
|  | func (e *SysDictType) Insert(c *dto.SysDictTypeInsertReq) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysDictType | ||||||
|  | 	c.Generate(&data) | ||||||
|  | 	var count int64 | ||||||
|  | 	e.Orm.Model(&data).Where("dict_type = ?", data.DictType).Count(&count) | ||||||
|  | 	if count > 0 { | ||||||
|  | 		return errors.New(fmt.Sprintf("当前字典类型[%s]已经存在!", data.DictType)) | ||||||
|  | 	} | ||||||
|  | 	err = e.Orm.Create(&data).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("db error: %s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update 修改对象 | ||||||
|  | func (e *SysDictType) Update(c *dto.SysDictTypeUpdateReq) error { | ||||||
|  | 	var err error | ||||||
|  | 	var model = models.SysDictType{} | ||||||
|  | 	e.Orm.First(&model, c.GetId()) | ||||||
|  | 	c.Generate(&model) | ||||||
|  | 	db := e.Orm.Save(&model) | ||||||
|  | 	if err = db.Error; err != 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.SysDictTypeDeleteReq) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysDictType | ||||||
|  |  | ||||||
|  | 	db := e.Orm.Delete(&data, d.GetId()) | ||||||
|  | 	if err = db.Error; err != 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.SysDictTypeGetPageReq, list *[]models.SysDictType) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.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 | ||||||
|  | } | ||||||
							
								
								
									
										70
									
								
								app/admin/service/sys_login_log.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								app/admin/service/sys_login_log.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,70 @@ | |||||||
|  | package service | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"errors" | ||||||
|  |  | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/service" | ||||||
|  | 	"gorm.io/gorm" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
|  | 	cDto "go-admin/common/dto" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysLoginLog struct { | ||||||
|  | 	service.Service | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage 获取SysLoginLog列表 | ||||||
|  | func (e *SysLoginLog) GetPage(c *dto.SysLoginLogGetPageReq, list *[]models.SysLoginLog, count *int64) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.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 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get 获取SysLoginLog对象 | ||||||
|  | func (e *SysLoginLog) Get(d *dto.SysLoginLogGetReq, model *models.SysLoginLog) 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 = db.Error; err != nil { | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Remove 删除SysLoginLog | ||||||
|  | func (e *SysLoginLog) Remove(c *dto.SysLoginLogDeleteReq) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysLoginLog | ||||||
|  |  | ||||||
|  | 	db := e.Orm.Delete(&data, c.GetId()) | ||||||
|  | 	if err = db.Error; err != nil { | ||||||
|  | 		err = db.Error | ||||||
|  | 		e.Log.Errorf("Delete error: %s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if db.RowsAffected == 0 { | ||||||
|  | 		err = errors.New("无权删除该数据") | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
							
								
								
									
										423
									
								
								app/admin/service/sys_menu.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										423
									
								
								app/admin/service/sys_menu.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,423 @@ | |||||||
|  | package service | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"sort" | ||||||
|  | 	"strings" | ||||||
|  |  | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/pkg" | ||||||
|  | 	"github.com/pkg/errors" | ||||||
|  | 	"gorm.io/gorm" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
|  | 	cDto "go-admin/common/dto" | ||||||
|  | 	cModels "go-admin/common/models" | ||||||
|  |  | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/service" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysMenu struct { | ||||||
|  | 	service.Service | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage 获取SysMenu列表 | ||||||
|  | func (e *SysMenu) GetPage(c *dto.SysMenuGetPageReq, menus *[]models.SysMenu) *SysMenu { | ||||||
|  | 	var menu = make([]models.SysMenu, 0) | ||||||
|  | 	err := e.getPage(c, &menu).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		_ = e.AddError(err) | ||||||
|  | 		return e | ||||||
|  | 	} | ||||||
|  | 	for i := 0; i < len(menu); i++ { | ||||||
|  | 		if menu[i].ParentId != 0 { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		menusInfo := menuCall(&menu, menu[i]) | ||||||
|  | 		*menus = append(*menus, menusInfo) | ||||||
|  | 	} | ||||||
|  | 	return e | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // getPage 菜单分页列表 | ||||||
|  | func (e *SysMenu) getPage(c *dto.SysMenuGetPageReq, list *[]models.SysMenu) *SysMenu { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysMenu | ||||||
|  |  | ||||||
|  | 	err = e.Orm.Model(&data). | ||||||
|  | 		Scopes( | ||||||
|  | 			cDto.OrderDest("sort", false), | ||||||
|  | 			cDto.MakeCondition(c.GetNeedSearch()), | ||||||
|  | 		).Preload("SysApi"). | ||||||
|  | 		Find(list).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("getSysMenuPage error:%s", err) | ||||||
|  | 		_ = e.AddError(err) | ||||||
|  | 		return e | ||||||
|  | 	} | ||||||
|  | 	return e | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get 获取SysMenu对象 | ||||||
|  | func (e *SysMenu) Get(d *dto.SysMenuGetReq, model *models.SysMenu) *SysMenu { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysMenu | ||||||
|  |  | ||||||
|  | 	db := e.Orm.Model(&data).Preload("SysApi"). | ||||||
|  | 		First(model, d.GetId()) | ||||||
|  | 	err = db.Error | ||||||
|  | 	if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { | ||||||
|  | 		err = errors.New("查看对象不存在或无权查看") | ||||||
|  | 		e.Log.Errorf("GetSysMenu error:%s", err) | ||||||
|  | 		_ = e.AddError(err) | ||||||
|  | 		return e | ||||||
|  | 	} | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		_ = e.AddError(err) | ||||||
|  | 		return e | ||||||
|  | 	} | ||||||
|  | 	apis := make([]int, 0) | ||||||
|  | 	for _, v := range model.SysApi { | ||||||
|  | 		apis = append(apis, v.Id) | ||||||
|  | 	} | ||||||
|  | 	model.Apis = apis | ||||||
|  | 	return e | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Insert 创建SysMenu对象 | ||||||
|  | func (e *SysMenu) Insert(c *dto.SysMenuInsertReq) *SysMenu { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysMenu | ||||||
|  | 	c.Generate(&data) | ||||||
|  | 	tx := e.Orm.Debug().Begin() | ||||||
|  | 	defer func() { | ||||||
|  | 		if err != nil { | ||||||
|  | 			tx.Rollback() | ||||||
|  | 		} else { | ||||||
|  | 			tx.Commit() | ||||||
|  | 		} | ||||||
|  | 	}() | ||||||
|  | 	err = tx.Where("id in ?", c.Apis).Find(&data.SysApi).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		tx.Rollback() | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		_ = e.AddError(err) | ||||||
|  | 	} | ||||||
|  | 	err = tx.Create(&data).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		tx.Rollback() | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		_ = e.AddError(err) | ||||||
|  | 	} | ||||||
|  | 	c.MenuId = data.MenuId | ||||||
|  | 	err = e.initPaths(tx, &data) | ||||||
|  | 	if err != nil { | ||||||
|  | 		tx.Rollback() | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		_ = e.AddError(err) | ||||||
|  | 	} | ||||||
|  | 	tx.Commit() | ||||||
|  | 	return e | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e *SysMenu) initPaths(tx *gorm.DB, menu *models.SysMenu) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysMenu | ||||||
|  | 	parentMenu := new(models.SysMenu) | ||||||
|  | 	if menu.ParentId != 0 { | ||||||
|  | 		err = tx.Model(&data).First(parentMenu, menu.ParentId).Error | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		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) | ||||||
|  | 	} | ||||||
|  | 	err = tx.Model(&data).Where("menu_id = ?", menu.MenuId).Update("paths", menu.Paths).Error | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update 修改SysMenu对象 | ||||||
|  | func (e *SysMenu) Update(c *dto.SysMenuUpdateReq) *SysMenu { | ||||||
|  | 	var err error | ||||||
|  | 	tx := e.Orm.Debug().Begin() | ||||||
|  | 	defer func() { | ||||||
|  | 		if err != nil { | ||||||
|  | 			tx.Rollback() | ||||||
|  | 		} else { | ||||||
|  | 			tx.Commit() | ||||||
|  | 		} | ||||||
|  | 	}() | ||||||
|  | 	var alist = make([]models.SysApi, 0) | ||||||
|  | 	var model = models.SysMenu{} | ||||||
|  | 	tx.Preload("SysApi").First(&model, c.GetId()) | ||||||
|  | 	oldPath := model.Paths | ||||||
|  | 	tx.Where("id in ?", c.Apis).Find(&alist) | ||||||
|  | 	err = tx.Model(&model).Association("SysApi").Delete(model.SysApi) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("delete policy error:%s", err) | ||||||
|  | 		_ = e.AddError(err) | ||||||
|  | 		return e | ||||||
|  | 	} | ||||||
|  | 	c.Generate(&model) | ||||||
|  | 	model.SysApi = alist | ||||||
|  | 	db := tx.Model(&model).Session(&gorm.Session{FullSaveAssociations: true}).Debug().Save(&model) | ||||||
|  | 	if err = db.Error; err != nil { | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		_ = e.AddError(err) | ||||||
|  | 		return e | ||||||
|  | 	} | ||||||
|  | 	if db.RowsAffected == 0 { | ||||||
|  | 		_ = e.AddError(errors.New("无权更新该数据")) | ||||||
|  | 		return e | ||||||
|  | 	} | ||||||
|  | 	var menuList []models.SysMenu | ||||||
|  | 	tx.Where("paths like ?", oldPath+"%").Find(&menuList) | ||||||
|  | 	for _, v := range menuList { | ||||||
|  | 		v.Paths = strings.Replace(v.Paths, oldPath, model.Paths, 1) | ||||||
|  | 		tx.Model(&v).Update("paths", v.Paths) | ||||||
|  | 	} | ||||||
|  | 	return e | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Remove 删除SysMenu | ||||||
|  | func (e *SysMenu) Remove(d *dto.SysMenuDeleteReq) *SysMenu { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysMenu | ||||||
|  |  | ||||||
|  | 	db := e.Orm.Model(&data).Delete(&data, d.Ids) | ||||||
|  | 	if err = db.Error; err != nil { | ||||||
|  | 		err = db.Error | ||||||
|  | 		e.Log.Errorf("Delete error: %s", err) | ||||||
|  | 		_ = e.AddError(err) | ||||||
|  | 	} | ||||||
|  | 	if db.RowsAffected == 0 { | ||||||
|  | 		err = errors.New("无权删除该数据") | ||||||
|  | 		_ = e.AddError(err) | ||||||
|  | 	} | ||||||
|  | 	return e | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetList 获取菜单数据 | ||||||
|  | func (e *SysMenu) GetList(c *dto.SysMenuGetPageReq, list *[]models.SysMenu) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.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 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // SetLabel 修改角色中 设置菜单基础数据 | ||||||
|  | func (e *SysMenu) SetLabel() (m []dto.MenuLabel, err error) { | ||||||
|  | 	var list []models.SysMenu | ||||||
|  | 	err = e.GetList(&dto.SysMenuGetPageReq{}, &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 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetSysMenuByRoleName 左侧菜单 | ||||||
|  | func (e *SysMenu) GetSysMenuByRoleName(roleName ...string) ([]models.SysMenu, error) { | ||||||
|  | 	var MenuList []models.SysMenu | ||||||
|  | 	var role models.SysRole | ||||||
|  | 	var err error | ||||||
|  | 	admin := false | ||||||
|  | 	for _, s := range roleName { | ||||||
|  | 		if s == "admin" { | ||||||
|  | 			admin = true | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if len(roleName) > 0 && admin { | ||||||
|  | 		var data []models.SysMenu | ||||||
|  | 		err = e.Orm.Where(" menu_type in ('M','C')"). | ||||||
|  | 			Order("sort"). | ||||||
|  | 			Find(&data). | ||||||
|  | 			Error | ||||||
|  | 		MenuList = data | ||||||
|  | 	} else { | ||||||
|  | 		err = e.Orm.Model(&role).Preload("SysMenu", func(db *gorm.DB) *gorm.DB { | ||||||
|  | 			return db.Where(" menu_type in ('M','C')").Order("sort") | ||||||
|  | 		}).Where("role_name in ?", roleName).Find(&role). | ||||||
|  | 			Error | ||||||
|  | 		MenuList = *role.SysMenu | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 	} | ||||||
|  | 	return MenuList, err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // menuLabelCall 递归构造组织数据 | ||||||
|  | func menuLabelCall(eList *[]models.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 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // menuCall 构建菜单树 | ||||||
|  | func menuCall(menuList *[]models.SysMenu, menu models.SysMenu) models.SysMenu { | ||||||
|  | 	list := *menuList | ||||||
|  |  | ||||||
|  | 	min := make([]models.SysMenu, 0) | ||||||
|  | 	for j := 0; j < len(list); j++ { | ||||||
|  |  | ||||||
|  | 		if menu.MenuId != list[j].ParentId { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		mi := models.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.SysApi = list[j].SysApi | ||||||
|  | 		mi.Children = []models.SysMenu{} | ||||||
|  |  | ||||||
|  | 		if mi.MenuType != cModels.Button { | ||||||
|  | 			ms := menuCall(menuList, mi) | ||||||
|  | 			min = append(min, ms) | ||||||
|  | 		} else { | ||||||
|  | 			min = append(min, mi) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	menu.Children = min | ||||||
|  | 	return menu | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func menuDistinct(menuList []models.SysMenu) (result []models.SysMenu) { | ||||||
|  | 	distinctMap := make(map[int]struct{}, len(menuList)) | ||||||
|  | 	for _, menu := range menuList { | ||||||
|  | 		if _, ok := distinctMap[menu.MenuId]; !ok { | ||||||
|  | 			distinctMap[menu.MenuId] = struct{}{} | ||||||
|  | 			result = append(result, menu) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return result | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func recursiveSetMenu(orm *gorm.DB, mIds []int, menus *[]models.SysMenu) error { | ||||||
|  | 	if len(mIds) == 0 || menus == nil { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	var subMenus []models.SysMenu | ||||||
|  | 	err := orm.Where(fmt.Sprintf(" menu_type in ('%s', '%s', '%s') and menu_id in ?", | ||||||
|  | 		cModels.Directory, cModels.Menu, cModels.Button), mIds).Order("sort").Find(&subMenus).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	subIds := make([]int, 0) | ||||||
|  | 	for _, menu := range subMenus { | ||||||
|  | 		if menu.ParentId != 0 { | ||||||
|  | 			subIds = append(subIds, menu.ParentId) | ||||||
|  | 		} | ||||||
|  | 		if menu.MenuType != cModels.Button { | ||||||
|  | 			*menus = append(*menus, menu) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return recursiveSetMenu(orm, subIds, menus) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // SetMenuRole 获取左侧菜单树使用 | ||||||
|  | func (e *SysMenu) SetMenuRole(roleName string) (m []models.SysMenu, err error) { | ||||||
|  | 	menus, err := e.getByRoleName(roleName) | ||||||
|  | 	m = make([]models.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) ([]models.SysMenu, error) { | ||||||
|  | 	var role models.SysRole | ||||||
|  | 	var err error | ||||||
|  | 	data := make([]models.SysMenu, 0) | ||||||
|  |  | ||||||
|  | 	if roleName == "admin" { | ||||||
|  | 		err = e.Orm.Where(" menu_type in ('M','C') and deleted_at is null"). | ||||||
|  | 			Order("sort"). | ||||||
|  | 			Find(&data). | ||||||
|  | 			Error | ||||||
|  | 		err = errors.WithStack(err) | ||||||
|  | 	} else { | ||||||
|  | 		role.RoleKey = roleName | ||||||
|  | 		err = e.Orm.Model(&role).Where("role_key = ? ", roleName).Preload("SysMenu").First(&role).Error | ||||||
|  |  | ||||||
|  | 		if role.SysMenu != nil { | ||||||
|  | 			mIds := make([]int, 0) | ||||||
|  | 			for _, menu := range *role.SysMenu { | ||||||
|  | 				mIds = append(mIds, menu.MenuId) | ||||||
|  | 			} | ||||||
|  | 			if err := recursiveSetMenu(e.Orm, mIds, &data); err != nil { | ||||||
|  | 				return nil, err | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			data = menuDistinct(data) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	sort.Sort(models.SysMenuSlice(data)) | ||||||
|  | 	return data, err | ||||||
|  | } | ||||||
							
								
								
									
										83
									
								
								app/admin/service/sys_opera_log.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								app/admin/service/sys_opera_log.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,83 @@ | |||||||
|  | package service | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"errors" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
|  | 	cDto "go-admin/common/dto" | ||||||
|  |  | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/service" | ||||||
|  | 	"gorm.io/gorm" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysOperaLog struct { | ||||||
|  | 	service.Service | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage 获取SysOperaLog列表 | ||||||
|  | func (e *SysOperaLog) GetPage(c *dto.SysOperaLogGetPageReq, list *[]models.SysOperaLog, count *int64) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.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 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get 获取SysOperaLog对象 | ||||||
|  | func (e *SysOperaLog) Get(d *dto.SysOperaLogGetReq, model *models.SysOperaLog) error { | ||||||
|  | 	var data models.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 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Insert 创建SysOperaLog对象 | ||||||
|  | func (e *SysOperaLog) Insert(model *models.SysOperaLog) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.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 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Remove 删除SysOperaLog | ||||||
|  | func (e *SysOperaLog) Remove(d *dto.SysOperaLogDeleteReq) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysOperaLog | ||||||
|  |  | ||||||
|  | 	db := e.Orm.Model(&data).Delete(&data, d.GetId()) | ||||||
|  | 	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 | ||||||
|  | } | ||||||
							
								
								
									
										105
									
								
								app/admin/service/sys_post.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								app/admin/service/sys_post.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,105 @@ | |||||||
|  | package service | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"errors" | ||||||
|  |  | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/service" | ||||||
|  | 	"gorm.io/gorm" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
|  | 	cDto "go-admin/common/dto" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysPost struct { | ||||||
|  | 	service.Service | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage 获取SysPost列表 | ||||||
|  | func (e *SysPost) GetPage(c *dto.SysPostPageReq, list *[]models.SysPost, count *int64) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.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 \r", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get 获取SysPost对象 | ||||||
|  | func (e *SysPost) Get(d *dto.SysPostGetReq, model *models.SysPost) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.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 err = db.Error; err != nil { | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Insert 创建SysPost对象 | ||||||
|  | func (e *SysPost) Insert(c *dto.SysPostInsertReq) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysPost | ||||||
|  | 	c.Generate(&data) | ||||||
|  | 	err = e.Orm.Create(&data).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update 修改SysPost对象 | ||||||
|  | func (e *SysPost) Update(c *dto.SysPostUpdateReq) error { | ||||||
|  | 	var err error | ||||||
|  | 	var model = models.SysPost{} | ||||||
|  | 	e.Orm.First(&model, c.GetId()) | ||||||
|  | 	c.Generate(&model) | ||||||
|  |  | ||||||
|  | 	db := e.Orm.Save(&model) | ||||||
|  | 	if err = db.Error; err != nil { | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if db.RowsAffected == 0 { | ||||||
|  | 		return errors.New("无权更新该数据") | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Remove 删除SysPost | ||||||
|  | func (e *SysPost) Remove(d *dto.SysPostDeleteReq) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysPost | ||||||
|  |  | ||||||
|  | 	db := e.Orm.Model(&data).Delete(&data, d.GetId()) | ||||||
|  | 	if err = db.Error; err != nil { | ||||||
|  | 		err = db.Error | ||||||
|  | 		e.Log.Errorf("Delete error: %s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if db.RowsAffected == 0 { | ||||||
|  | 		err = errors.New("无权删除该数据") | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
							
								
								
									
										352
									
								
								app/admin/service/sys_role.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										352
									
								
								app/admin/service/sys_role.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,352 @@ | |||||||
|  | package service | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"errors" | ||||||
|  |  | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/config" | ||||||
|  | 	"gorm.io/gorm/clause" | ||||||
|  |  | ||||||
|  | 	"github.com/casbin/casbin/v2" | ||||||
|  |  | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/service" | ||||||
|  | 	"gorm.io/gorm" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
|  | 	cDto "go-admin/common/dto" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysRole struct { | ||||||
|  | 	service.Service | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage 获取SysRole列表 | ||||||
|  | func (e *SysRole) GetPage(c *dto.SysRoleGetPageReq, list *[]models.SysRole, count *int64) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysRole | ||||||
|  |  | ||||||
|  | 	err = e.Orm.Model(&data).Preload("SysMenu"). | ||||||
|  | 		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 获取SysRole对象 | ||||||
|  | func (e *SysRole) Get(d *dto.SysRoleGetReq, model *models.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(model.RoleId) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("get menuIds error, %s", err.Error()) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Insert 创建SysRole对象 | ||||||
|  | func (e *SysRole) Insert(c *dto.SysRoleInsertReq, cb *casbin.SyncedEnforcer) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysRole | ||||||
|  | 	var dataMenu []models.SysMenu | ||||||
|  | 	err = e.Orm.Preload("SysApi").Where("menu_id in ?", c.MenuIds).Find(&dataMenu).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	c.SysMenu = dataMenu | ||||||
|  | 	c.Generate(&data) | ||||||
|  | 	tx := e.Orm | ||||||
|  | 	if config.DatabaseConfig.Driver != "sqlite3" { | ||||||
|  | 		tx := e.Orm.Begin() | ||||||
|  | 		defer func() { | ||||||
|  | 			if err != nil { | ||||||
|  | 				tx.Rollback() | ||||||
|  | 			} else { | ||||||
|  | 				tx.Commit() | ||||||
|  | 			} | ||||||
|  | 		}() | ||||||
|  | 	} | ||||||
|  | 	var count int64 | ||||||
|  | 	err = tx.Model(&data).Where("role_key = ?", c.RoleKey).Count(&count).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if count > 0 { | ||||||
|  | 		err = errors.New("roleKey已存在,需更换在提交!") | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	err = tx.Create(&data).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	mp := make(map[string]interface{}, 0) | ||||||
|  | 	polices := make([][]string, 0) | ||||||
|  | 	for _, menu := range dataMenu { | ||||||
|  | 		for _, api := range menu.SysApi { | ||||||
|  | 			if mp[data.RoleKey+"-"+api.Path+"-"+api.Action] != "" { | ||||||
|  | 				mp[data.RoleKey+"-"+api.Path+"-"+api.Action] = "" | ||||||
|  | 				polices = append(polices, []string{data.RoleKey, api.Path, api.Action}) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if len(polices) <= 0 { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// 写入 sys_casbin_rule 权限表里 当前角色数据的记录 | ||||||
|  | 	_, err = cb.AddNamedPolicies("p", polices) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update 修改SysRole对象 | ||||||
|  | func (e *SysRole) Update(c *dto.SysRoleUpdateReq, cb *casbin.SyncedEnforcer) error { | ||||||
|  | 	var err error | ||||||
|  | 	tx := e.Orm | ||||||
|  | 	if config.DatabaseConfig.Driver != "sqlite3" { | ||||||
|  | 		tx := e.Orm.Begin() | ||||||
|  | 		defer func() { | ||||||
|  | 			if err != nil { | ||||||
|  | 				tx.Rollback() | ||||||
|  | 			} else { | ||||||
|  | 				tx.Commit() | ||||||
|  | 			} | ||||||
|  | 		}() | ||||||
|  | 	} | ||||||
|  | 	var model = models.SysRole{} | ||||||
|  | 	var mlist = make([]models.SysMenu, 0) | ||||||
|  | 	tx.Preload("SysMenu").First(&model, c.GetId()) | ||||||
|  | 	tx.Preload("SysApi").Where("menu_id in ?", c.MenuIds).Find(&mlist) | ||||||
|  | 	err = tx.Model(&model).Association("SysMenu").Delete(model.SysMenu) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("delete policy error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	c.Generate(&model) | ||||||
|  | 	model.SysMenu = &mlist | ||||||
|  | 	// 更新关联的数据,使用 FullSaveAssociations 模式 | ||||||
|  | 	db := tx.Session(&gorm.Session{FullSaveAssociations: true}).Debug().Save(&model) | ||||||
|  |  | ||||||
|  | 	if err = db.Error; err != nil { | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if db.RowsAffected == 0 { | ||||||
|  | 		return errors.New("无权更新该数据") | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// 清除 sys_casbin_rule 权限表里 当前角色的所有记录 | ||||||
|  | 	_, err = cb.RemoveFilteredPolicy(0, model.RoleKey) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("delete policy error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	mp := make(map[string]interface{}, 0) | ||||||
|  | 	polices := make([][]string, 0) | ||||||
|  | 	for _, menu := range mlist { | ||||||
|  | 		for _, api := range menu.SysApi { | ||||||
|  | 			if mp[model.RoleKey+"-"+api.Path+"-"+api.Action] != "" { | ||||||
|  | 				mp[model.RoleKey+"-"+api.Path+"-"+api.Action] = "" | ||||||
|  | 				//_, err = cb.AddNamedPolicy("p", model.RoleKey, api.Path, api.Action) | ||||||
|  | 				polices = append(polices, []string{model.RoleKey, api.Path, api.Action}) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if len(polices) <= 0 { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// 写入 sys_casbin_rule 权限表里 当前角色数据的记录 | ||||||
|  | 	_, err = cb.AddNamedPolicies("p", polices) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Remove 删除SysRole | ||||||
|  | func (e *SysRole) Remove(c *dto.SysRoleDeleteReq, cb *casbin.SyncedEnforcer) error { | ||||||
|  | 	var err error | ||||||
|  | 	tx := e.Orm | ||||||
|  | 	if config.DatabaseConfig.Driver != "sqlite3" { | ||||||
|  | 		tx := e.Orm.Begin() | ||||||
|  | 		defer func() { | ||||||
|  | 			if err != nil { | ||||||
|  | 				tx.Rollback() | ||||||
|  | 			} else { | ||||||
|  | 				tx.Commit() | ||||||
|  | 			} | ||||||
|  | 		}() | ||||||
|  | 	} | ||||||
|  | 	var model = models.SysRole{} | ||||||
|  | 	tx.Preload("SysMenu").Preload("SysDept").First(&model, c.GetId()) | ||||||
|  | 	//删除 SysRole 时,同时删除角色所有 关联其它表 记录 (SysMenu 和 SysMenu) | ||||||
|  | 	db := tx.Select(clause.Associations).Delete(&model) | ||||||
|  |  | ||||||
|  | 	if err = db.Error; err != nil { | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if db.RowsAffected == 0 { | ||||||
|  | 		return errors.New("无权更新该数据") | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// 清除 sys_casbin_rule 权限表里 当前角色的所有记录 | ||||||
|  | 	_, _ = cb.RemoveFilteredPolicy(0, model.RoleKey) | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetRoleMenuId 获取角色对应的菜单ids | ||||||
|  | func (e *SysRole) GetRoleMenuId(roleId int) ([]int, error) { | ||||||
|  | 	menuIds := make([]int, 0) | ||||||
|  | 	model := models.SysRole{} | ||||||
|  | 	model.RoleId = roleId | ||||||
|  | 	if err := e.Orm.Model(&model).Preload("SysMenu").First(&model).Error; err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	l := *model.SysMenu | ||||||
|  | 	for i := 0; i < len(l); i++ { | ||||||
|  | 		menuIds = append(menuIds, l[i].MenuId) | ||||||
|  | 	} | ||||||
|  | 	return menuIds, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e *SysRole) UpdateDataScope(c *dto.RoleDataScopeReq) *SysRole { | ||||||
|  | 	var err error | ||||||
|  | 	tx := e.Orm | ||||||
|  | 	if config.DatabaseConfig.Driver != "sqlite3" { | ||||||
|  | 		tx := e.Orm.Begin() | ||||||
|  | 		defer func() { | ||||||
|  | 			if err != nil { | ||||||
|  | 				tx.Rollback() | ||||||
|  | 			} else { | ||||||
|  | 				tx.Commit() | ||||||
|  | 			} | ||||||
|  | 		}() | ||||||
|  | 	} | ||||||
|  | 	var dlist = make([]models.SysDept, 0) | ||||||
|  | 	var model = models.SysRole{} | ||||||
|  | 	tx.Preload("SysDept").First(&model, c.RoleId) | ||||||
|  | 	tx.Where("dept_id in ?", c.DeptIds).Find(&dlist) | ||||||
|  | 	// 删除SysRole 和 SysDept 的关联关系 | ||||||
|  | 	err = tx.Model(&model).Association("SysDept").Delete(model.SysDept) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("delete SysDept error:%s", err) | ||||||
|  | 		_ = e.AddError(err) | ||||||
|  | 		return e | ||||||
|  | 	} | ||||||
|  | 	c.Generate(&model) | ||||||
|  | 	model.SysDept = dlist | ||||||
|  | 	// 更新关联的数据,使用 FullSaveAssociations 模式 | ||||||
|  | 	db := tx.Model(&model).Session(&gorm.Session{FullSaveAssociations: true}).Debug().Save(&model) | ||||||
|  | 	if err = db.Error; err != nil { | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		_ = e.AddError(err) | ||||||
|  | 		return e | ||||||
|  | 	} | ||||||
|  | 	if db.RowsAffected == 0 { | ||||||
|  | 		_ = e.AddError(errors.New("无权更新该数据")) | ||||||
|  | 		return e | ||||||
|  | 	} | ||||||
|  | 	return e | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // UpdateStatus 修改SysRole对象status | ||||||
|  | func (e *SysRole) UpdateStatus(c *dto.UpdateStatusReq) error { | ||||||
|  | 	var err error | ||||||
|  | 	tx := e.Orm | ||||||
|  | 	if config.DatabaseConfig.Driver != "sqlite3" { | ||||||
|  | 		tx := e.Orm.Begin() | ||||||
|  | 		defer func() { | ||||||
|  | 			if err != nil { | ||||||
|  | 				tx.Rollback() | ||||||
|  | 			} else { | ||||||
|  | 				tx.Commit() | ||||||
|  | 			} | ||||||
|  | 		}() | ||||||
|  | 	} | ||||||
|  | 	var model = models.SysRole{} | ||||||
|  | 	tx.First(&model, c.GetId()) | ||||||
|  | 	c.Generate(&model) | ||||||
|  | 	// 更新关联的数据,使用 FullSaveAssociations 模式 | ||||||
|  | 	db := tx.Session(&gorm.Session{FullSaveAssociations: true}).Debug().Save(&model) | ||||||
|  | 	if err = db.Error; err != nil { | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if db.RowsAffected == 0 { | ||||||
|  | 		return errors.New("无权更新该数据") | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetWithName 获取SysRole对象 | ||||||
|  | func (e *SysRole) GetWithName(d *dto.SysRoleByName, model *models.SysRole) *SysRole { | ||||||
|  | 	var err error | ||||||
|  | 	db := e.Orm.Where("role_name = ?", d.RoleName).First(model) | ||||||
|  | 	err = db.Error | ||||||
|  | 	if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { | ||||||
|  | 		err = errors.New("查看对象不存在或无权查看") | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		_ = e.AddError(err) | ||||||
|  | 		return e | ||||||
|  | 	} | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("db error:%s", err) | ||||||
|  | 		_ = e.AddError(err) | ||||||
|  | 		return e | ||||||
|  | 	} | ||||||
|  | 	model.MenuIds, err = e.GetRoleMenuId(model.RoleId) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("get menuIds error, %s", err.Error()) | ||||||
|  | 		_ = e.AddError(err) | ||||||
|  | 		return e | ||||||
|  | 	} | ||||||
|  | 	return e | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetById 获取SysRole对象 | ||||||
|  | func (e *SysRole) GetById(roleId int) ([]string, error) { | ||||||
|  | 	permissions := make([]string, 0) | ||||||
|  | 	model := models.SysRole{} | ||||||
|  | 	model.RoleId = roleId | ||||||
|  | 	if err := e.Orm.Model(&model).Preload("SysMenu").First(&model).Error; err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	l := *model.SysMenu | ||||||
|  | 	for i := 0; i < len(l); i++ { | ||||||
|  | 		if l[i].Permission != "" { | ||||||
|  | 			permissions = append(permissions, l[i].Permission) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return permissions, nil | ||||||
|  | } | ||||||
							
								
								
									
										110
									
								
								app/admin/service/sys_role_menu.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								app/admin/service/sys_role_menu.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,110 @@ | |||||||
|  | package service | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/service" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // SysRoleMenu 即将弃用结构体 | ||||||
|  | type SysRoleMenu struct { | ||||||
|  | 	service.Service | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //func (e *SysRoleMenu) ReloadRule(tx *gorm.DB, roleId int, menuId []int) (err error) { | ||||||
|  | //	var role models.SysRole | ||||||
|  | // | ||||||
|  | //	msgID := e.MsgID | ||||||
|  | // | ||||||
|  | //	menu := make([]models.Menu, 0) | ||||||
|  | //	roleMenu := make([]models.RoleMenu, len(menuId)) | ||||||
|  | //	casbinRule := make([]models.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] = models.RoleMenu{ | ||||||
|  | //			RoleId:   role.RoleId, | ||||||
|  | //			MenuId:   menu[i].MenuId, | ||||||
|  | //			RoleName: role.RoleKey, | ||||||
|  | //		} | ||||||
|  | //		if menu[i].MenuType == "A" { | ||||||
|  | //			casbinRule = append(casbinRule, models.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(&models.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(&models.RoleMenu{}).Error | ||||||
|  | //	if err != nil { | ||||||
|  | //		log.Errorf("msgID[%s] delete role's menu error, %s", msgID, err.Error()) | ||||||
|  | //		return | ||||||
|  | //	} | ||||||
|  | //	var role models.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(&models.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) ([]models.MenuPath, error) { | ||||||
|  | //	var r []models.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 | ||||||
|  | //} | ||||||
							
								
								
									
										266
									
								
								app/admin/service/sys_user.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										266
									
								
								app/admin/service/sys_user.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,266 @@ | |||||||
|  | package service | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"errors" | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
|  |  | ||||||
|  | 	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/service" | ||||||
|  | 	"gorm.io/gorm" | ||||||
|  |  | ||||||
|  | 	"go-admin/common/actions" | ||||||
|  | 	cDto "go-admin/common/dto" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysUser struct { | ||||||
|  | 	service.Service | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage 获取SysUser列表 | ||||||
|  | func (e *SysUser) GetPage(c *dto.SysUserGetPageReq, p *actions.DataPermission, list *[]models.SysUser, count *int64) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysUser | ||||||
|  |  | ||||||
|  | 	err = e.Orm.Debug().Preload("Dept"). | ||||||
|  | 		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 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get 获取SysUser对象 | ||||||
|  | func (e *SysUser) Get(d *dto.SysUserById, p *actions.DataPermission, model *models.SysUser) error { | ||||||
|  | 	var data models.SysUser | ||||||
|  |  | ||||||
|  | 	err := e.Orm.Model(&data).Debug(). | ||||||
|  | 		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("db error: %s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Insert 创建SysUser对象 | ||||||
|  | func (e *SysUser) Insert(c *dto.SysUserInsertReq) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysUser | ||||||
|  | 	var i int64 | ||||||
|  | 	err = e.Orm.Model(&data).Where("username = ?", c.Username).Count(&i).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("db error: %s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if i > 0 { | ||||||
|  | 		err := errors.New("用户名已存在!") | ||||||
|  | 		e.Log.Errorf("db error: %s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	c.Generate(&data) | ||||||
|  | 	err = e.Orm.Create(&data).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("db error: %s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update 修改SysUser对象 | ||||||
|  | func (e *SysUser) Update(c *dto.SysUserUpdateReq, p *actions.DataPermission) error { | ||||||
|  | 	var err error | ||||||
|  | 	var model models.SysUser | ||||||
|  | 	db := e.Orm.Scopes( | ||||||
|  | 		actions.Permission(model.TableName(), p), | ||||||
|  | 	).First(&model, c.GetId()) | ||||||
|  | 	if err = db.Error; err != nil { | ||||||
|  | 		e.Log.Errorf("Service UpdateSysUser error: %s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if db.RowsAffected == 0 { | ||||||
|  | 		return errors.New("无权更新该数据") | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  | 	c.Generate(&model) | ||||||
|  | 	update := e.Orm.Model(&model).Where("user_id = ?", &model.UserId).Omit("password", "salt").Updates(&model) | ||||||
|  | 	if err = update.Error; err != nil { | ||||||
|  | 		e.Log.Errorf("db error: %s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if update.RowsAffected == 0 { | ||||||
|  | 		err = errors.New("update userinfo error") | ||||||
|  | 		log.Warnf("db update error") | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // UpdateAvatar 更新用户头像 | ||||||
|  | func (e *SysUser) UpdateAvatar(c *dto.UpdateSysUserAvatarReq, p *actions.DataPermission) error { | ||||||
|  | 	var err error | ||||||
|  | 	var model models.SysUser | ||||||
|  | 	db := e.Orm.Scopes( | ||||||
|  | 		actions.Permission(model.TableName(), p), | ||||||
|  | 	).First(&model, c.GetId()) | ||||||
|  | 	if err = db.Error; err != nil { | ||||||
|  | 		e.Log.Errorf("Service UpdateSysUser error: %s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if db.RowsAffected == 0 { | ||||||
|  | 		return errors.New("无权更新该数据") | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  | 	err = e.Orm.Table(model.TableName()).Where("user_id =? ", c.UserId).Updates(c).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("Service UpdateSysUser error: %s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // UpdateStatus 更新用户状态 | ||||||
|  | func (e *SysUser) UpdateStatus(c *dto.UpdateSysUserStatusReq, p *actions.DataPermission) error { | ||||||
|  | 	var err error | ||||||
|  | 	var model models.SysUser | ||||||
|  | 	db := e.Orm.Scopes( | ||||||
|  | 		actions.Permission(model.TableName(), p), | ||||||
|  | 	).First(&model, c.GetId()) | ||||||
|  | 	if err = db.Error; err != nil { | ||||||
|  | 		e.Log.Errorf("Service UpdateSysUser error: %s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if db.RowsAffected == 0 { | ||||||
|  | 		return errors.New("无权更新该数据") | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  | 	err = e.Orm.Table(model.TableName()).Where("user_id =? ", c.UserId).Updates(c).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("Service UpdateSysUser error: %s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ResetPwd 重置用户密码 | ||||||
|  | func (e *SysUser) ResetPwd(c *dto.ResetSysUserPwdReq, p *actions.DataPermission) error { | ||||||
|  | 	var err error | ||||||
|  | 	var model models.SysUser | ||||||
|  | 	db := e.Orm.Scopes( | ||||||
|  | 		actions.Permission(model.TableName(), p), | ||||||
|  | 	).First(&model, c.GetId()) | ||||||
|  | 	if err = db.Error; err != nil { | ||||||
|  | 		e.Log.Errorf("At Service ResetSysUserPwd error: %s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if db.RowsAffected == 0 { | ||||||
|  | 		return errors.New("无权更新该数据") | ||||||
|  | 	} | ||||||
|  | 	c.Generate(&model) | ||||||
|  | 	err = e.Orm.Omit("username", "nick_name", "phone", "role_id", "avatar", "sex").Save(&model).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("At Service ResetSysUserPwd error: %s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Remove 删除SysUser | ||||||
|  | func (e *SysUser) Remove(c *dto.SysUserById, p *actions.DataPermission) error { | ||||||
|  | 	var err error | ||||||
|  | 	var data models.SysUser | ||||||
|  |  | ||||||
|  | 	db := e.Orm.Model(&data). | ||||||
|  | 		Scopes( | ||||||
|  | 			actions.Permission(data.TableName(), p), | ||||||
|  | 		).Delete(&data, c.GetId()) | ||||||
|  | 	if err = db.Error; err != nil { | ||||||
|  | 		e.Log.Errorf("Error found in  RemoveSysUser : %s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if db.RowsAffected == 0 { | ||||||
|  | 		return errors.New("无权删除该数据") | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // UpdatePwd 修改SysUser对象密码 | ||||||
|  | func (e *SysUser) UpdatePwd(id int, oldPassword, newPassword string, p *actions.DataPermission) error { | ||||||
|  | 	var err error | ||||||
|  |  | ||||||
|  | 	if newPassword == "" { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	c := &models.SysUser{} | ||||||
|  |  | ||||||
|  | 	err = e.Orm.Model(c). | ||||||
|  | 		Scopes( | ||||||
|  | 			actions.Permission(c.TableName(), p), | ||||||
|  | 		).Select("UserId", "Password", "Salt"). | ||||||
|  | 		First(c, id).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("user_id = ?", 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) GetProfile(c *dto.SysUserById, user *models.SysUser, roles *[]models.SysRole, posts *[]models.SysPost) error { | ||||||
|  | 	err := e.Orm.Preload("Dept").First(user, c.GetId()).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 | ||||||
|  | } | ||||||
							
								
								
									
										69
									
								
								app/jobs/apis/sys_job.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								app/jobs/apis/sys_job.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,69 @@ | |||||||
|  | package apis | ||||||
|  |  | ||||||
|  | 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" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/jobs/service" | ||||||
|  | 	"go-admin/common/dto" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysJob struct { | ||||||
|  | 	api.Api | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // RemoveJobForService 调用service实现 | ||||||
|  | func (e SysJob) RemoveJobForService(c *gin.Context) { | ||||||
|  | 	v := dto.GeneralDelDto{} | ||||||
|  | 	s := service.SysJob{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&v). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	s.Cron = sdk.Runtime.GetCrontabKey(c.Request.Host) | ||||||
|  | 	err = s.RemoveJob(&v) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Errorf("RemoveJob error, %s", err.Error()) | ||||||
|  | 		e.Error(500, err, "") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(nil, s.Msg) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // StartJobForService 启动job service实现 | ||||||
|  | func (e SysJob) StartJobForService(c *gin.Context) { | ||||||
|  | 	e.MakeContext(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(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	e.OK(nil, s.Msg) | ||||||
|  | } | ||||||
							
								
								
									
										40
									
								
								app/jobs/examples.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								app/jobs/examples.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,40 @@ | |||||||
|  | package jobs | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // InitJob | ||||||
|  | // 需要将定义的struct 添加到字典中; | ||||||
|  | // 字典 key 可以配置到 自动任务 调用目标 中; | ||||||
|  | func InitJob() { | ||||||
|  | 	jobList = map[string]JobExec{ | ||||||
|  | 		"ExamplesOne": ExamplesOne{}, | ||||||
|  | 		// ... | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ExamplesOne | ||||||
|  | // 新添加的job 必须按照以下格式定义,并实现Exec函数 | ||||||
|  | type ExamplesOne struct { | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (t ExamplesOne) Exec(arg interface{}) error { | ||||||
|  | 	str := time.Now().Format(timeFormat) + " [INFO] JobCore ExamplesOne exec success" | ||||||
|  | 	// TODO: 这里需要注意 Examples 传入参数是 string 所以 arg.(string);请根据对应的类型进行转化; | ||||||
|  | 	switch arg.(type) { | ||||||
|  |  | ||||||
|  | 	case string: | ||||||
|  | 		if arg.(string) != "" { | ||||||
|  | 			fmt.Println("string", arg.(string)) | ||||||
|  | 			fmt.Println(str, arg.(string)) | ||||||
|  | 		} else { | ||||||
|  | 			fmt.Println("arg is nil") | ||||||
|  | 			fmt.Println(str, "arg is nil") | ||||||
|  | 		} | ||||||
|  | 		break | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
							
								
								
									
										203
									
								
								app/jobs/jobbase.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										203
									
								
								app/jobs/jobbase.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,203 @@ | |||||||
|  | package jobs | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	log "github.com/go-admin-team/go-admin-core/logger" | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk" | ||||||
|  | 	models2 "go-admin/app/jobs/models" | ||||||
|  | 	"gorm.io/gorm" | ||||||
|  | 	"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" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | var timeFormat = "2006-01-02 15:04:05" | ||||||
|  | var retryCount = 3 | ||||||
|  |  | ||||||
|  | var jobList map[string]JobExec | ||||||
|  |  | ||||||
|  | //var lock sync.Mutex | ||||||
|  |  | ||||||
|  | type JobCore struct { | ||||||
|  | 	InvokeTarget   string | ||||||
|  | 	Name           string | ||||||
|  | 	JobId          int | ||||||
|  | 	EntryId        int | ||||||
|  | 	CronExpression string | ||||||
|  | 	Args           string | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // HttpJob 任务类型 http | ||||||
|  | type HttpJob struct { | ||||||
|  | 	JobCore | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type ExecJob struct { | ||||||
|  | 	JobCore | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e *ExecJob) Run() { | ||||||
|  | 	startTime := time.Now() | ||||||
|  | 	var obj = jobList[e.InvokeTarget] | ||||||
|  | 	if obj == nil { | ||||||
|  | 		log.Warn("[Job] ExecJob Run job nil") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	err := CallExec(obj.(JobExec), e.Args) | ||||||
|  | 	if err != nil { | ||||||
|  | 		// 如果失败暂停一段时间重试 | ||||||
|  | 		fmt.Println(time.Now().Format(timeFormat), " [ERROR] mission failed! ", err) | ||||||
|  | 	} | ||||||
|  | 	// 结束时间 | ||||||
|  | 	endTime := time.Now() | ||||||
|  |  | ||||||
|  | 	// 执行时间 | ||||||
|  | 	latencyTime := endTime.Sub(startTime) | ||||||
|  | 	//TODO: 待完善部分 | ||||||
|  | 	//str := time.Now().Format(timeFormat) + " [INFO] JobCore " + string(e.EntryId) + "exec success , spend :" + latencyTime.String() | ||||||
|  | 	//ws.SendAll(str) | ||||||
|  | 	log.Info("[Job] JobCore %s exec success , spend :%v", e.Name, latencyTime) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Run http 任务接口 | ||||||
|  | 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) | ||||||
|  | 		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", (count+1)*5, str) | ||||||
|  | 			time.Sleep(time.Duration(count+1) * 5 * time.Second) | ||||||
|  | 			count = count + 1 | ||||||
|  | 			goto LOOP | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	// 结束时间 | ||||||
|  | 	endTime := time.Now() | ||||||
|  |  | ||||||
|  | 	// 执行时间 | ||||||
|  | 	latencyTime := endTime.Sub(startTime) | ||||||
|  | 	//TODO: 待完善部分 | ||||||
|  |  | ||||||
|  | 	log.Infof("[Job] JobCore %s exec success , spend :%v", h.Name, latencyTime) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Setup 初始化 | ||||||
|  | func Setup(dbs map[string]*gorm.DB) { | ||||||
|  |  | ||||||
|  | 	fmt.Println(time.Now().Format(timeFormat), " [INFO] JobCore Starting...") | ||||||
|  |  | ||||||
|  | 	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 := models2.SysJob{} | ||||||
|  | 	jobList := make([]models2.SysJob, 0) | ||||||
|  | 	err := sysJob.GetList(db, &jobList) | ||||||
|  | 	if err != nil { | ||||||
|  | 		fmt.Println(time.Now().Format(timeFormat), " [ERROR] JobCore init error", err) | ||||||
|  | 	} | ||||||
|  | 	if len(jobList) == 0 { | ||||||
|  | 		fmt.Println(time.Now().Format(timeFormat), " [INFO] JobCore total:0") | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	_, err = sysJob.RemoveAllEntryID(db) | ||||||
|  | 	if err != nil { | ||||||
|  | 		fmt.Println(time.Now().Format(timeFormat), " [ERROR] JobCore remove entry_id error", err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for i := 0; i < len(jobList); i++ { | ||||||
|  | 		if jobList[i].JobType == 1 { | ||||||
|  | 			j := &HttpJob{} | ||||||
|  | 			j.InvokeTarget = jobList[i].InvokeTarget | ||||||
|  | 			j.CronExpression = jobList[i].CronExpression | ||||||
|  | 			j.JobId = jobList[i].JobId | ||||||
|  | 			j.Name = jobList[i].JobName | ||||||
|  |  | ||||||
|  | 			sysJob.EntryId, err = AddJob(crontab, j) | ||||||
|  | 		} else if jobList[i].JobType == 2 { | ||||||
|  | 			j := &ExecJob{} | ||||||
|  | 			j.InvokeTarget = jobList[i].InvokeTarget | ||||||
|  | 			j.CronExpression = jobList[i].CronExpression | ||||||
|  | 			j.JobId = jobList[i].JobId | ||||||
|  | 			j.Name = jobList[i].JobName | ||||||
|  | 			j.Args = jobList[i].Args | ||||||
|  | 			sysJob.EntryId, err = AddJob(crontab, j) | ||||||
|  | 		} | ||||||
|  | 		err = sysJob.Update(db, jobList[i].JobId) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// 其中任务 | ||||||
|  | 	crontab.Start() | ||||||
|  | 	fmt.Println(time.Now().Format(timeFormat), " [INFO] JobCore start success.") | ||||||
|  | 	// 关闭任务 | ||||||
|  | 	defer crontab.Stop() | ||||||
|  | 	select {} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // AddJob 添加任务 AddJob(invokeTarget string, jobId int, jobName string, cronExpression string) | ||||||
|  | func AddJob(c *cron.Cron, job Job) (int, error) { | ||||||
|  | 	if job == nil { | ||||||
|  | 		fmt.Println("unknown") | ||||||
|  | 		return 0, nil | ||||||
|  | 	} | ||||||
|  | 	return job.addJob(c) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | 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 | ||||||
|  | 	} | ||||||
|  | 	EntryId := int(id) | ||||||
|  | 	return EntryId, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e *ExecJob) addJob(c *cron.Cron) (int, error) { | ||||||
|  | 	id, err := c.AddJob(e.CronExpression, e) | ||||||
|  | 	if err != nil { | ||||||
|  | 		fmt.Println(time.Now().Format(timeFormat), " [ERROR] JobCore AddJob error", err) | ||||||
|  | 		return 0, err | ||||||
|  | 	} | ||||||
|  | 	EntryId := int(id) | ||||||
|  | 	return EntryId, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Remove 移除任务 | ||||||
|  | func Remove(c *cron.Cron, entryID int) chan bool { | ||||||
|  | 	ch := make(chan bool) | ||||||
|  | 	go func() { | ||||||
|  | 		c.Remove(cron.EntryID(entryID)) | ||||||
|  | 		fmt.Println(time.Now().Format(timeFormat), " [INFO] JobCore Remove success ,info entryID :", entryID) | ||||||
|  | 		ch <- true | ||||||
|  | 	}() | ||||||
|  | 	return ch | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 任务停止 | ||||||
|  | //func Stop() chan bool { | ||||||
|  | //	ch := make(chan bool) | ||||||
|  | //	go func() { | ||||||
|  | //		global.GADMCron.Stop() | ||||||
|  | //		ch <- true | ||||||
|  | //	}() | ||||||
|  | //	return ch | ||||||
|  | //} | ||||||
							
								
								
									
										61
									
								
								app/jobs/models/sys_job.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								app/jobs/models/sys_job.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,61 @@ | |||||||
|  | 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 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e *SysJob) GetList(tx *gorm.DB, list interface{}) (err error) { | ||||||
|  | 	return tx.Table(e.TableName()).Where("status = ?", 2).Find(list).Error | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update 更新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 | ||||||
|  | } | ||||||
							
								
								
									
										36
									
								
								app/jobs/router/int_router.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								app/jobs/router/int_router.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | |||||||
|  | package router | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	//"github.com/go-admin-team/go-admin-core/sdk/pkg" | ||||||
|  | 	"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" | ||||||
|  | 	common "go-admin/common/middleware" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // InitRouter 路由初始化,不要怀疑,这里用到了 | ||||||
|  | func InitRouter() { | ||||||
|  | 	var r *gin.Engine | ||||||
|  | 	h := sdk.Runtime.GetEngine() | ||||||
|  | 	if h == nil { | ||||||
|  | 		log.Fatal("not found engine...") | ||||||
|  | 		os.Exit(-1) | ||||||
|  | 	} | ||||||
|  | 	switch h.(type) { | ||||||
|  | 	case *gin.Engine: | ||||||
|  | 		r = h.(*gin.Engine) | ||||||
|  | 	default: | ||||||
|  | 		log.Fatal("not support other engine") | ||||||
|  | 		os.Exit(-1) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	authMiddleware, err := common.AuthInit() | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Fatalf("JWT Init Error, %s", err.Error()) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// 注册业务路由 | ||||||
|  | 	initRouter(r, authMiddleware) | ||||||
|  | } | ||||||
							
								
								
									
										42
									
								
								app/jobs/router/router.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								app/jobs/router/router.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,42 @@ | |||||||
|  | package router | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | var ( | ||||||
|  | 	routerNoCheckRole = make([]func(*gin.RouterGroup), 0) | ||||||
|  | 	routerCheckRole   = make([]func(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware), 0) | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // initRouter 路由示例 | ||||||
|  | func initRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) *gin.Engine { | ||||||
|  |  | ||||||
|  | 	// 无需认证的路由 | ||||||
|  | 	noCheckRoleRouter(r) | ||||||
|  | 	// 需要认证的路由 | ||||||
|  | 	checkRoleRouter(r, authMiddleware) | ||||||
|  |  | ||||||
|  | 	return r | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // noCheckRoleRouter 无需认证的路由示例 | ||||||
|  | func noCheckRoleRouter(r *gin.Engine) { | ||||||
|  | 	// 可根据业务需求来设置接口版本 | ||||||
|  | 	v1 := r.Group("/api/v1") | ||||||
|  |  | ||||||
|  | 	for _, f := range routerNoCheckRole { | ||||||
|  | 		f(v1) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // checkRoleRouter 需要认证的路由示例 | ||||||
|  | func checkRoleRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) { | ||||||
|  | 	// 可根据业务需求来设置接口版本 | ||||||
|  | 	v1 := r.Group("/api/v1") | ||||||
|  |  | ||||||
|  | 	for _, f := range routerCheckRole { | ||||||
|  | 		f(v1, authMiddleware) | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										38
									
								
								app/jobs/router/sys_job.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								app/jobs/router/sys_job.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,38 @@ | |||||||
|  | package router | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" | ||||||
|  | 	"go-admin/app/jobs/apis" | ||||||
|  | 	models2 "go-admin/app/jobs/models" | ||||||
|  | 	dto2 "go-admin/app/jobs/service/dto" | ||||||
|  | 	"go-admin/common/actions" | ||||||
|  | 	"go-admin/common/middleware" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func init() { | ||||||
|  | 	routerCheckRole = append(routerCheckRole, registerSysJobRouter) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 需认证的路由代码 | ||||||
|  | func registerSysJobRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { | ||||||
|  |  | ||||||
|  | 	r := v1.Group("/sysjob").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) | ||||||
|  | 	{ | ||||||
|  | 		sysJob := &models2.SysJob{} | ||||||
|  | 		r.GET("", actions.PermissionAction(), actions.IndexAction(sysJob, new(dto2.SysJobSearch), func() interface{} { | ||||||
|  | 			list := make([]models2.SysJob, 0) | ||||||
|  | 			return &list | ||||||
|  | 		})) | ||||||
|  | 		r.GET("/:id", actions.PermissionAction(), actions.ViewAction(new(dto2.SysJobById), func() interface{} { | ||||||
|  | 			return &dto2.SysJobItem{} | ||||||
|  | 		})) | ||||||
|  | 		r.POST("", actions.CreateAction(new(dto2.SysJobControl))) | ||||||
|  | 		r.PUT("", actions.PermissionAction(), actions.UpdateAction(new(dto2.SysJobControl))) | ||||||
|  | 		r.DELETE("", actions.PermissionAction(), actions.DeleteAction(new(dto2.SysJobById))) | ||||||
|  | 	} | ||||||
|  | 	sysJob := apis.SysJob{} | ||||||
|  |  | ||||||
|  | 	v1.GET("/job/remove/:id", sysJob.RemoveJobForService) | ||||||
|  | 	v1.GET("/job/start/:id", sysJob.StartJobForService) | ||||||
|  | } | ||||||
							
								
								
									
										108
									
								
								app/jobs/service/dto/sys_job.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								app/jobs/service/dto/sys_job.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,108 @@ | |||||||
|  | package dto | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/api" | ||||||
|  | 	"go-admin/app/jobs/models" | ||||||
|  |  | ||||||
|  | 	"go-admin/common/dto" | ||||||
|  | 	common "go-admin/common/models" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysJobSearch struct { | ||||||
|  | 	dto.Pagination `search:"-"` | ||||||
|  | 	JobId          int    `form:"jobId" search:"type:exact;column:job_id;table:sys_job"` | ||||||
|  | 	JobName        string `form:"jobName" search:"type:icontains;column:job_name;table:sys_job"` | ||||||
|  | 	JobGroup       string `form:"jobGroup" search:"type:exact;column:job_group;table:sys_job"` | ||||||
|  | 	CronExpression string `form:"cronExpression" search:"type:exact;column:cron_expression;table:sys_job"` | ||||||
|  | 	InvokeTarget   string `form:"invokeTarget" search:"type:exact;column:invoke_target;table:sys_job"` | ||||||
|  | 	Status         int    `form:"status" search:"type:exact;column:status;table:sys_job"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (m *SysJobSearch) GetNeedSearch() interface{} { | ||||||
|  | 	return *m | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (m *SysJobSearch) Bind(ctx *gin.Context) error { | ||||||
|  | 	log := api.GetRequestLogger(ctx) | ||||||
|  | 	err := ctx.ShouldBind(m) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Errorf("Bind error: %s", err) | ||||||
|  | 	} | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (m *SysJobSearch) Generate() dto.Index { | ||||||
|  | 	o := *m | ||||||
|  | 	return &o | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysJobControl struct { | ||||||
|  | 	JobId          int    `json:"jobId"` | ||||||
|  | 	JobName        string `json:"jobName" validate:"required"` // 名称 | ||||||
|  | 	JobGroup       string `json:"jobGroup"`                    // 任务分组 | ||||||
|  | 	JobType        int    `json:"jobType"`                     // 任务类型 | ||||||
|  | 	CronExpression string `json:"cronExpression"`              // cron表达式 | ||||||
|  | 	InvokeTarget   string `json:"invokeTarget"`                // 调用目标 | ||||||
|  | 	Args           string `json:"args"`                        // 目标参数 | ||||||
|  | 	MisfirePolicy  int    `json:"misfirePolicy"`               // 执行策略 | ||||||
|  | 	Concurrent     int    `json:"concurrent"`                  // 是否并发 | ||||||
|  | 	Status         int    `json:"status"`                      // 状态 | ||||||
|  | 	EntryId        int    `json:"entryId"`                     // job启动时返回的id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysJobControl) Bind(ctx *gin.Context) error { | ||||||
|  | 	return ctx.ShouldBind(s) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysJobControl) Generate() dto.Control { | ||||||
|  | 	cp := *s | ||||||
|  | 	return &cp | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysJobControl) GenerateM() (common.ActiveRecord, error) { | ||||||
|  | 	return &models.SysJob{ | ||||||
|  | 		JobId:          s.JobId, | ||||||
|  | 		JobName:        s.JobName, | ||||||
|  | 		JobGroup:       s.JobGroup, | ||||||
|  | 		JobType:        s.JobType, | ||||||
|  | 		CronExpression: s.CronExpression, | ||||||
|  | 		InvokeTarget:   s.InvokeTarget, | ||||||
|  | 		Args:           s.Args, | ||||||
|  | 		MisfirePolicy:  s.MisfirePolicy, | ||||||
|  | 		Concurrent:     s.Concurrent, | ||||||
|  | 		Status:         s.Status, | ||||||
|  | 		EntryId:        s.EntryId, | ||||||
|  | 	}, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysJobControl) GetId() interface{} { | ||||||
|  | 	return s.JobId | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysJobById struct { | ||||||
|  | 	dto.ObjectById | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysJobById) Generate() dto.Control { | ||||||
|  | 	cp := *s | ||||||
|  | 	return &cp | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *SysJobById) GenerateM() (common.ActiveRecord, error) { | ||||||
|  | 	return &models.SysJob{}, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type SysJobItem struct { | ||||||
|  | 	JobId          int    `json:"jobId"` | ||||||
|  | 	JobName        string `json:"jobName" validate:"required"` // 名称 | ||||||
|  | 	JobGroup       string `json:"jobGroup"`                    // 任务分组 | ||||||
|  | 	JobType        int    `json:"jobType"`                     // 任务类型 | ||||||
|  | 	CronExpression string `json:"cronExpression"`              // cron表达式 | ||||||
|  | 	InvokeTarget   string `json:"invokeTarget"`                // 调用目标 | ||||||
|  | 	Args           string `json:"args"`                        // 目标参数 | ||||||
|  | 	MisfirePolicy  int    `json:"misfirePolicy"`               // 执行策略 | ||||||
|  | 	Concurrent     int    `json:"concurrent"`                  // 是否并发 | ||||||
|  | 	Status         int    `json:"status"`                      // 状态 | ||||||
|  | 	EntryId        int    `json:"entryId"`                     // job启动时返回的id | ||||||
|  | } | ||||||
							
								
								
									
										93
									
								
								app/jobs/service/sys_job.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								app/jobs/service/sys_job.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,93 @@ | |||||||
|  | package service | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"errors" | ||||||
|  | 	"time" | ||||||
|  |  | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/service" | ||||||
|  | 	"github.com/robfig/cron/v3" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/jobs" | ||||||
|  | 	"go-admin/app/jobs/models" | ||||||
|  | 	"go-admin/common/dto" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | 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 | ||||||
|  | 	err = e.Orm.Table(data.TableName()).First(&data, c.Id).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("db error: %s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	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 { | ||||||
|  | 				e.Log.Errorf("db error: %s", err) | ||||||
|  | 			} | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 	case <-time.After(time.Second * 1): | ||||||
|  | 		e.Msg = "操作超时!" | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // StartJob 启动任务 | ||||||
|  | func (e *SysJob) StartJob(c *dto.GeneralGetDto) error { | ||||||
|  | 	var data models.SysJob | ||||||
|  | 	var err error | ||||||
|  | 	err = e.Orm.Table(data.TableName()).First(&data, c.Id).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("db error: %s", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if data.Status == 1 { | ||||||
|  | 		err = errors.New("当前Job是关闭状态不能被启动,请先启用。") | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if data.JobType == 1 { | ||||||
|  | 		var j = &jobs.HttpJob{} | ||||||
|  | 		j.InvokeTarget = data.InvokeTarget | ||||||
|  | 		j.CronExpression = data.CronExpression | ||||||
|  | 		j.JobId = data.JobId | ||||||
|  | 		j.Name = data.JobName | ||||||
|  | 		data.EntryId, err = jobs.AddJob(e.Cron, j) | ||||||
|  | 		if err != nil { | ||||||
|  | 			e.Log.Errorf("jobs AddJob[HttpJob] error: %s", err) | ||||||
|  | 		} | ||||||
|  | 	} else { | ||||||
|  | 		var j = &jobs.ExecJob{} | ||||||
|  | 		j.InvokeTarget = data.InvokeTarget | ||||||
|  | 		j.CronExpression = data.CronExpression | ||||||
|  | 		j.JobId = data.JobId | ||||||
|  | 		j.Name = data.JobName | ||||||
|  | 		j.Args = data.Args | ||||||
|  | 		data.EntryId, err = jobs.AddJob(e.Cron, j) | ||||||
|  | 		if err != nil { | ||||||
|  | 			e.Log.Errorf("jobs AddJob[ExecJob] error: %s", err) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	err = e.Orm.Table(data.TableName()).Where(c.Id).Updates(&data).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("db error: %s", err) | ||||||
|  | 	} | ||||||
|  | 	return err | ||||||
|  | } | ||||||
							
								
								
									
										16
									
								
								app/jobs/type.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								app/jobs/type.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | |||||||
|  | package jobs | ||||||
|  |  | ||||||
|  | import "github.com/robfig/cron/v3" | ||||||
|  |  | ||||||
|  | type Job interface { | ||||||
|  | 	Run() | ||||||
|  | 	addJob(*cron.Cron) (int, error) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type JobExec interface { | ||||||
|  | 	Exec(arg interface{}) error | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func CallExec(e JobExec, arg interface{}) error { | ||||||
|  | 	return e.Exec(arg) | ||||||
|  | } | ||||||
							
								
								
									
										204
									
								
								app/other/apis/file.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										204
									
								
								app/other/apis/file.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,204 @@ | |||||||
|  | package apis | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"encoding/base64" | ||||||
|  | 	"errors" | ||||||
|  | 	"fmt" | ||||||
|  | 	"io/ioutil" | ||||||
|  | 	"strings" | ||||||
|  |  | ||||||
|  | 	"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/utils" | ||||||
|  | 	"github.com/google/uuid" | ||||||
|  |  | ||||||
|  | 	"go-admin/common/file_store" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type FileResponse struct { | ||||||
|  | 	Size     int64  `json:"size"` | ||||||
|  | 	Path     string `json:"path"` | ||||||
|  | 	FullPath string `json:"full_path"` | ||||||
|  | 	Name     string `json:"name"` | ||||||
|  | 	Type     string `json:"type"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const path = "static/uploadfile/" | ||||||
|  |  | ||||||
|  | type File struct { | ||||||
|  | 	api.Api | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // UploadFile 上传图片 | ||||||
|  | // @Summary 上传图片 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 公共接口 | ||||||
|  | // @Accept multipart/form-data | ||||||
|  | // @Param type query string true "type" (1:单图,2:多图, 3:base64图片) | ||||||
|  | // @Param file formData file true "file" | ||||||
|  | // @Success 200 {string} string	"{"code": 200, "message": "添加成功"}" | ||||||
|  | // @Success 200 {string} string	"{"code": -1, "message": "添加失败"}" | ||||||
|  | // @Router /api/v1/public/uploadFile [post] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e File) UploadFile(c *gin.Context) { | ||||||
|  | 	e.MakeContext(c) | ||||||
|  | 	tag, _ := c.GetPostForm("type") | ||||||
|  | 	urlPrefix := fmt.Sprintf("%s://%s/", "http", c.Request.Host) | ||||||
|  | 	var fileResponse FileResponse | ||||||
|  |  | ||||||
|  | 	switch tag { | ||||||
|  | 	case "1": // 单图 | ||||||
|  | 		var done bool | ||||||
|  | 		fileResponse, done = e.singleFile(c, fileResponse, urlPrefix) | ||||||
|  | 		if done { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		e.OK(fileResponse, "上传成功") | ||||||
|  | 		return | ||||||
|  | 	case "2": // 多图 | ||||||
|  | 		multipartFile := e.multipleFile(c, urlPrefix) | ||||||
|  | 		e.OK(multipartFile, "上传成功") | ||||||
|  | 		return | ||||||
|  | 	case "3": // base64 | ||||||
|  | 		fileResponse = e.baseImg(c, fileResponse, urlPrefix) | ||||||
|  | 		e.OK(fileResponse, "上传成功") | ||||||
|  | 	default: | ||||||
|  | 		var done bool | ||||||
|  | 		fileResponse, done = e.singleFile(c, fileResponse, urlPrefix) | ||||||
|  | 		if done { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		e.OK(fileResponse, "上传成功") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | 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 = "/static/uploadfile/" + fileName | ||||||
|  | 		fileResponse.FullPath = "/static/uploadfile/" + 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 = "/static/uploadfile/" + fileName | ||||||
|  | 					fileResponse.FullPath = "/static/uploadfile/" + 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 = "/static/uploadfile/" + fileName | ||||||
|  | 	fileResponse.FullPath = "/static/uploadfile/" + 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) | ||||||
|  | } | ||||||
							
								
								
									
										186
									
								
								app/other/apis/sys_server_monitor.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								app/other/apis/sys_server_monitor.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,186 @@ | |||||||
|  | package apis | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"github.com/shirou/gopsutil/v3/net" | ||||||
|  | 	"runtime" | ||||||
|  | 	"strconv" | ||||||
|  | 	"strings" | ||||||
|  | 	"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/pkg" | ||||||
|  | 	_ "github.com/go-admin-team/go-admin-core/sdk/pkg/response" | ||||||
|  | 	"github.com/shirou/gopsutil/v3/cpu" | ||||||
|  | 	"github.com/shirou/gopsutil/v3/disk" | ||||||
|  | 	"github.com/shirou/gopsutil/v3/host" | ||||||
|  | 	"github.com/shirou/gopsutil/v3/mem" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | const ( | ||||||
|  | 	B  = 1 | ||||||
|  | 	KB = 1024 * B | ||||||
|  | 	MB = 1024 * KB | ||||||
|  | 	GB = 1024 * MB | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | var ( | ||||||
|  | 	//Version           string | ||||||
|  | 	//expectDiskFsTypes = []string{ | ||||||
|  | 	//	"apfs", "ext4", "ext3", "ext2", "f2fs", "reiserfs", "jfs", "btrfs", | ||||||
|  | 	//	"fuseblk", "zfs", "simfs", "ntfs", "fat32", "exfat", "xfs", "fuse.rclone", | ||||||
|  | 	//} | ||||||
|  | 	excludeNetInterfaces = []string{ | ||||||
|  | 		"lo", "tun", "docker", "veth", "br-", "vmbr", "vnet", "kube", | ||||||
|  | 	} | ||||||
|  | 	//getMacDiskNo = regexp.MustCompile(`\/dev\/disk(\d)s.*`) | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | var ( | ||||||
|  | 	netInSpeed, netOutSpeed, netInTransfer, netOutTransfer, lastUpdateNetStats uint64 | ||||||
|  | 	cachedBootTime                                                             time.Time | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type ServerMonitor struct { | ||||||
|  | 	api.Api | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetHourDiffer 获取相差时间 | ||||||
|  | func GetHourDiffer(startTime, endTime string) int64 { | ||||||
|  | 	var hour int64 | ||||||
|  | 	t1, err := time.ParseInLocation("2006-01-02 15:04:05", startTime, time.Local) | ||||||
|  | 	t2, err := time.ParseInLocation("2006-01-02 15:04:05", endTime, time.Local) | ||||||
|  | 	if err == nil && t1.Before(t2) { | ||||||
|  | 		diff := t2.Unix() - t1.Unix() // | ||||||
|  | 		hour = diff / 3600 | ||||||
|  | 		return hour | ||||||
|  | 	} else { | ||||||
|  | 		return hour | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ServerInfo 获取系统信息 | ||||||
|  | // @Summary 系统信息 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 系统信息 | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/server-monitor [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e ServerMonitor) ServerInfo(c *gin.Context) { | ||||||
|  | 	e.Context = c | ||||||
|  |  | ||||||
|  | 	sysInfo, err := host.Info() | ||||||
|  | 	osDic := make(map[string]interface{}, 0) | ||||||
|  | 	osDic["goOs"] = runtime.GOOS | ||||||
|  | 	osDic["arch"] = runtime.GOARCH | ||||||
|  | 	osDic["mem"] = runtime.MemProfileRate | ||||||
|  | 	osDic["compiler"] = runtime.Compiler | ||||||
|  | 	osDic["version"] = runtime.Version() | ||||||
|  | 	osDic["numGoroutine"] = runtime.NumGoroutine() | ||||||
|  | 	osDic["ip"] = pkg.GetLocaHonst() | ||||||
|  | 	osDic["projectDir"] = pkg.GetCurrentPath() | ||||||
|  | 	osDic["hostName"] = sysInfo.Hostname | ||||||
|  | 	osDic["time"] = time.Now().Format("2006-01-02 15:04:05") | ||||||
|  |  | ||||||
|  | 	memory, _ := mem.VirtualMemory() | ||||||
|  | 	memDic := make(map[string]interface{}, 0) | ||||||
|  | 	memDic["used"] = memory.Used / MB | ||||||
|  | 	memDic["total"] = memory.Total / MB | ||||||
|  |  | ||||||
|  | 	fmt.Println("mem", int(memory.Total/memory.Used*100)) | ||||||
|  | 	memDic["percent"] = pkg.Round(memory.UsedPercent, 2) | ||||||
|  |  | ||||||
|  | 	swapDic := make(map[string]interface{}, 0) | ||||||
|  | 	swapDic["used"] = memory.SwapTotal - memory.SwapFree | ||||||
|  | 	swapDic["total"] = memory.SwapTotal | ||||||
|  |  | ||||||
|  | 	cpuDic := make(map[string]interface{}, 0) | ||||||
|  | 	cpuDic["cpuInfo"], _ = cpu.Info() | ||||||
|  | 	percent, _ := cpu.Percent(0, false) | ||||||
|  | 	cpuDic["percent"] = pkg.Round(percent[0], 2) | ||||||
|  | 	cpuDic["cpuNum"], _ = cpu.Counts(false) | ||||||
|  |  | ||||||
|  | 	//服务器磁盘信息 | ||||||
|  | 	disklist := make([]disk.UsageStat, 0) | ||||||
|  | 	//所有分区 | ||||||
|  | 	var diskTotal, diskUsed, diskUsedPercent float64 | ||||||
|  | 	diskInfo, err := disk.Partitions(true) | ||||||
|  | 	if err == nil { | ||||||
|  | 		for _, p := range diskInfo { | ||||||
|  | 			diskDetail, err := disk.Usage(p.Mountpoint) | ||||||
|  | 			if err == nil { | ||||||
|  | 				diskDetail.UsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", diskDetail.UsedPercent), 64) | ||||||
|  | 				diskDetail.Total = diskDetail.Total / 1024 / 1024 | ||||||
|  | 				diskDetail.Used = diskDetail.Used / 1024 / 1024 | ||||||
|  | 				diskDetail.Free = diskDetail.Free / 1024 / 1024 | ||||||
|  | 				disklist = append(disklist, *diskDetail) | ||||||
|  |  | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	d, _ := disk.Usage("/") | ||||||
|  |  | ||||||
|  | 	diskTotal = float64(d.Total / GB) | ||||||
|  | 	diskUsed = float64(d.Used / GB) | ||||||
|  | 	diskUsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", d.UsedPercent), 64) | ||||||
|  |  | ||||||
|  | 	diskDic := make(map[string]interface{}, 0) | ||||||
|  | 	diskDic["total"] = diskTotal | ||||||
|  | 	diskDic["used"] = diskUsed | ||||||
|  | 	diskDic["percent"] = diskUsedPercent | ||||||
|  |  | ||||||
|  | 	bootTime, _ := host.BootTime() | ||||||
|  | 	cachedBootTime = time.Unix(int64(bootTime), 0) | ||||||
|  |  | ||||||
|  | 	TrackNetworkSpeed() | ||||||
|  | 	netDic := make(map[string]interface{}, 0) | ||||||
|  | 	netDic["in"] = pkg.Round(float64(netInSpeed/KB), 2) | ||||||
|  | 	netDic["out"] = pkg.Round(float64(netOutSpeed/KB), 2) | ||||||
|  | 	e.Custom(gin.H{ | ||||||
|  | 		"code":     200, | ||||||
|  | 		"os":       osDic, | ||||||
|  | 		"mem":      memDic, | ||||||
|  | 		"cpu":      cpuDic, | ||||||
|  | 		"disk":     diskDic, | ||||||
|  | 		"net":      netDic, | ||||||
|  | 		"swap":     swapDic, | ||||||
|  | 		"location": "Aliyun", | ||||||
|  | 		"bootTime": GetHourDiffer(cachedBootTime.Format("2006-01-02 15:04:05"), time.Now().Format("2006-01-02 15:04:05")), | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TrackNetworkSpeed() { | ||||||
|  | 	var innerNetInTransfer, innerNetOutTransfer uint64 | ||||||
|  | 	nc, err := net.IOCounters(true) | ||||||
|  | 	if err == nil { | ||||||
|  | 		for _, v := range nc { | ||||||
|  | 			if isListContainsStr(excludeNetInterfaces, v.Name) { | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 			innerNetInTransfer += v.BytesRecv | ||||||
|  | 			innerNetOutTransfer += v.BytesSent | ||||||
|  | 		} | ||||||
|  | 		now := uint64(time.Now().Unix()) | ||||||
|  | 		diff := now - lastUpdateNetStats | ||||||
|  | 		if diff > 0 { | ||||||
|  | 			netInSpeed = (innerNetInTransfer - netInTransfer) / diff | ||||||
|  | 			fmt.Println("netInSpeed", netInSpeed) | ||||||
|  | 			netOutSpeed = (innerNetOutTransfer - netOutTransfer) / diff | ||||||
|  | 			fmt.Println("netOutSpeed", netOutSpeed) | ||||||
|  | 		} | ||||||
|  | 		netInTransfer = innerNetInTransfer | ||||||
|  | 		netOutTransfer = innerNetOutTransfer | ||||||
|  | 		lastUpdateNetStats = now | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func isListContainsStr(list []string, str string) bool { | ||||||
|  | 	for i := 0; i < len(list); i++ { | ||||||
|  | 		if strings.Contains(str, list[i]) { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return false | ||||||
|  | } | ||||||
							
								
								
									
										52
									
								
								app/other/apis/tools/db_columns.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								app/other/apis/tools/db_columns.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,52 @@ | |||||||
|  | package tools | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"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/other/models/tools" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // GetDBColumnList 分页列表数据 | ||||||
|  | // @Summary 分页列表数据 / page list data | ||||||
|  | // @Description 数据库表列分页列表 / database table column page list | ||||||
|  | // @Tags 工具 / 生成工具 | ||||||
|  | // @Param tableName query string false "tableName / 数据表名称" | ||||||
|  | // @Param pageSize query int false "pageSize / 页条数" | ||||||
|  | // @Param pageIndex query int false "pageIndex / 页码" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/db/columns/page [get] | ||||||
|  | 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 = pkg.StringToInt(size) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if index := c.Request.FormValue("pageIndex"); 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(500, err, "数据库连接获取失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	data.TableName = c.Request.FormValue("tableName") | ||||||
|  | 	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, "查询成功") | ||||||
|  | } | ||||||
							
								
								
									
										60
									
								
								app/other/apis/tools/db_tables.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								app/other/apis/tools/db_tables.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,60 @@ | |||||||
|  | package tools | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"errors" | ||||||
|  | 	"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/other/models/tools" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // GetDBTableList 分页列表数据 | ||||||
|  | // @Summary 分页列表数据 / page list data | ||||||
|  | // @Description 数据库表分页列表 / database table page list | ||||||
|  | // @Tags 工具 / 生成工具 | ||||||
|  | // @Param tableName query string false "tableName / 数据表名称" | ||||||
|  | // @Param pageSize query int false "pageSize / 页条数" | ||||||
|  | // @Param pageIndex query int false "pageIndex / 页码" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/db/tables/page [get] | ||||||
|  | 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" { | ||||||
|  | 		err = errors.New("对不起,sqlite3 或 postgres 不支持代码生成!") | ||||||
|  | 		log.Warn(err) | ||||||
|  | 		e.Error(403, err, "") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if size := c.Request.FormValue("pageSize"); size != "" { | ||||||
|  | 		pageSize, err = pkg.StringToInt(size) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if index := c.Request.FormValue("pageIndex"); 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(500, err, "数据库连接获取失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	data.TableName = c.Request.FormValue("tableName") | ||||||
|  | 	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, "查询成功") | ||||||
|  | } | ||||||
							
								
								
									
										410
									
								
								app/other/apis/tools/gen.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										410
									
								
								app/other/apis/tools/gen.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,410 @@ | |||||||
|  | package tools | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"fmt" | ||||||
|  | 	"go-admin/app/admin/service" | ||||||
|  | 	"go-admin/app/admin/service/dto" | ||||||
|  | 	"strconv" | ||||||
|  | 	"strings" | ||||||
|  | 	"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/other/models/tools" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type Gen struct { | ||||||
|  | 	api.Api | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e Gen) Preview(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, fmt.Sprintf("tableId接收失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	table.TableId = id | ||||||
|  | 	t1, err := template.ParseFiles("template/v4/model.go.template") | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error(err) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("model模版读取失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	t2, err := template.ParseFiles("template/v4/no_actions/apis.go.template") | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error(err) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("api模版读取失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	t3, err := template.ParseFiles("template/v4/js.go.template") | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error(err) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("js模版读取失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	t4, err := template.ParseFiles("template/v4/vue.go.template") | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error(err) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("vue模版读取失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	t5, err := template.ParseFiles("template/v4/no_actions/router_check_role.go.template") | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error(err) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("路由模版读取失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	t6, err := template.ParseFiles("template/v4/dto.go.template") | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error(err) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("dto模版读取失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	t7, err := template.ParseFiles("template/v4/no_actions/service.go.template") | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error(err) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("service模版读取失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	db, err := pkg.GetOrm(c) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Errorf("get db connection error, %s", err.Error()) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("数据库链接获取失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	tab, _ := table.Get(db,false) | ||||||
|  | 	var b1 bytes.Buffer | ||||||
|  | 	err = t1.Execute(&b1, tab) | ||||||
|  | 	var b2 bytes.Buffer | ||||||
|  | 	err = t2.Execute(&b2, tab) | ||||||
|  | 	var b3 bytes.Buffer | ||||||
|  | 	err = t3.Execute(&b3, tab) | ||||||
|  | 	var b4 bytes.Buffer | ||||||
|  | 	err = t4.Execute(&b4, tab) | ||||||
|  | 	var b5 bytes.Buffer | ||||||
|  | 	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() | ||||||
|  | 	mp["template/api.go.template"] = b2.String() | ||||||
|  | 	mp["template/js.go.template"] = b3.String() | ||||||
|  | 	mp["template/vue.go.template"] = b4.String() | ||||||
|  | 	mp["template/router.go.template"] = b5.String() | ||||||
|  | 	mp["template/dto.go.template"] = b6.String() | ||||||
|  | 	mp["template/service.go.template"] = b7.String() | ||||||
|  | 	e.OK(mp, "") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e Gen) GenCode(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, fmt.Sprintf("tableId参数接收失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	db, err := pkg.GetOrm(c) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Errorf("get db connection error, %s", err.Error()) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("数据库链接获取失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	table.TableId = id | ||||||
|  | 	tab, _ := table.Get(db,false) | ||||||
|  |  | ||||||
|  | 	e.NOActionsGen(c, tab) | ||||||
|  |  | ||||||
|  | 	e.OK("", "Code generated successfully!") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | 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, fmt.Sprintf("tableId参数获取失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	db, err := pkg.GetOrm(c) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Errorf("get db connection error, %s", err.Error()) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("数据库链接获取失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	table.TableId = id | ||||||
|  | 	tab, _ := table.Get(db,false) | ||||||
|  | 	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() | ||||||
|  | 	tab.MLTBName = strings.Replace(tab.TBName, "_", "-", -1) | ||||||
|  |  | ||||||
|  | 	basePath := "template/v4/" | ||||||
|  | 	routerFile := basePath + "no_actions/router_check_role.go.template" | ||||||
|  |  | ||||||
|  | 	if tab.IsAuth == 2 { | ||||||
|  | 		routerFile = basePath + "no_actions/router_no_check_role.go.template" | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	t1, err := template.ParseFiles(basePath + "model.go.template") | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error(err) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("model模版读取失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	t2, err := template.ParseFiles(basePath + "no_actions/apis.go.template") | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error(err) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("api模版读取失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	t3, err := template.ParseFiles(routerFile) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error(err) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("路由模版失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	t4, err := template.ParseFiles(basePath + "js.go.template") | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error(err) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("js模版解析失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	t5, err := template.ParseFiles(basePath + "vue.go.template") | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error(err) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("vue模版解析失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	t6, err := template.ParseFiles(basePath + "dto.go.template") | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error(err) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("dto模版解析失败失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	t7, err := template.ParseFiles(basePath + "no_actions/service.go.template") | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error(err) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("service模版失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	_ = pkg.PathCreate("./app/" + tab.PackageName + "/apis/") | ||||||
|  | 	_ = 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/" + tab.PackageName + "/") | ||||||
|  | 	err = pkg.PathCreate(config.GenConfig.FrontPath + "/views/" + tab.PackageName + "/" + tab.MLTBName + "/") | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error(err) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("views目录创建失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var b1 bytes.Buffer | ||||||
|  | 	err = t1.Execute(&b1, tab) | ||||||
|  | 	var b2 bytes.Buffer | ||||||
|  | 	err = t2.Execute(&b2, tab) | ||||||
|  | 	var b3 bytes.Buffer | ||||||
|  | 	err = t3.Execute(&b3, tab) | ||||||
|  | 	var b4 bytes.Buffer | ||||||
|  | 	err = t4.Execute(&b4, tab) | ||||||
|  | 	var b5 bytes.Buffer | ||||||
|  | 	err = t5.Execute(&b5, tab) | ||||||
|  | 	var b6 bytes.Buffer | ||||||
|  | 	err = t6.Execute(&b6, tab) | ||||||
|  | 	var b7 bytes.Buffer | ||||||
|  | 	err = t7.Execute(&b7, tab) | ||||||
|  | 	pkg.FileCreate(b1, "./app/"+tab.PackageName+"/models/"+tab.TBName+".go") | ||||||
|  | 	pkg.FileCreate(b2, "./app/"+tab.PackageName+"/apis/"+tab.TBName+".go") | ||||||
|  | 	pkg.FileCreate(b3, "./app/"+tab.PackageName+"/router/"+tab.TBName+".go") | ||||||
|  | 	pkg.FileCreate(b4, config.GenConfig.FrontPath+"/api/"+tab.PackageName+"/"+tab.MLTBName+".js") | ||||||
|  | 	pkg.FileCreate(b5, config.GenConfig.FrontPath+"/views/"+tab.PackageName+"/"+tab.MLTBName+"/index.vue") | ||||||
|  | 	pkg.FileCreate(b6, "./app/"+tab.PackageName+"/service/dto/"+tab.TBName+".go") | ||||||
|  | 	pkg.FileCreate(b7, "./app/"+tab.PackageName+"/service/"+tab.TBName+".go") | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e Gen) genApiToFile(c *gin.Context, tab tools.SysTables) { | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	basePath := "template/" | ||||||
|  |  | ||||||
|  | 	t1, err := template.ParseFiles(basePath + "api_migrate.template") | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("数据迁移模版解析失败!错误详情:%s", err.Error())) | ||||||
|  | 		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) GenMenuAndApi(c *gin.Context) { | ||||||
|  | 	s := service.SysMenu{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	table := tools.SysTables{} | ||||||
|  | 	id, err := pkg.StringToInt(c.Param("tableId")) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("tableId参数解析失败!错误详情:%s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	table.TableId = id | ||||||
|  | 	tab, _ := table.Get(e.Orm,true) | ||||||
|  | 	tab.MLTBName = strings.Replace(tab.TBName, "_", "-", -1) | ||||||
|  |  | ||||||
|  | 	Mmenu := dto.SysMenuInsertReq{} | ||||||
|  | 	Mmenu.Title = tab.TableComment | ||||||
|  | 	Mmenu.Icon = "pass" | ||||||
|  | 	Mmenu.Path = "/" + tab.MLTBName | ||||||
|  | 	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 | ||||||
|  | 	s.Insert(&Mmenu) | ||||||
|  |  | ||||||
|  | 	Cmenu := dto.SysMenuInsertReq{} | ||||||
|  | 	Cmenu.MenuName = tab.ClassName + "Manage" | ||||||
|  | 	Cmenu.Title = tab.TableComment | ||||||
|  | 	Cmenu.Icon = "pass" | ||||||
|  | 	Cmenu.Path = "/" + tab.PackageName + "/" + tab.MLTBName | ||||||
|  | 	Cmenu.MenuType = "C" | ||||||
|  | 	Cmenu.Action = "无" | ||||||
|  | 	Cmenu.Permission = tab.PackageName + ":" + tab.BusinessName + ":list" | ||||||
|  | 	Cmenu.ParentId = Mmenu.MenuId | ||||||
|  | 	Cmenu.NoCache = false | ||||||
|  | 	Cmenu.Component = "/" + tab.PackageName + "/" + tab.MLTBName + "/index" | ||||||
|  | 	Cmenu.Sort = 0 | ||||||
|  | 	Cmenu.Visible = "0" | ||||||
|  | 	Cmenu.IsFrame = "0" | ||||||
|  | 	Cmenu.CreateBy = 1 | ||||||
|  | 	Cmenu.UpdateBy = 1 | ||||||
|  | 	s.Insert(&Cmenu) | ||||||
|  |  | ||||||
|  | 	MList := dto.SysMenuInsertReq{} | ||||||
|  | 	MList.MenuName = "" | ||||||
|  | 	MList.Title = "分页获取" + tab.TableComment | ||||||
|  | 	MList.Icon = "" | ||||||
|  | 	MList.Path = tab.TBName | ||||||
|  | 	MList.MenuType = "F" | ||||||
|  | 	MList.Action = "无" | ||||||
|  | 	MList.Permission = tab.PackageName + ":" + tab.BusinessName + ":query" | ||||||
|  | 	MList.ParentId = Cmenu.MenuId | ||||||
|  | 	MList.NoCache = false | ||||||
|  | 	MList.Sort = 0 | ||||||
|  | 	MList.Visible = "0" | ||||||
|  | 	MList.IsFrame = "0" | ||||||
|  | 	MList.CreateBy = 1 | ||||||
|  | 	MList.UpdateBy = 1 | ||||||
|  | 	s.Insert(&MList) | ||||||
|  |  | ||||||
|  | 	MCreate := dto.SysMenuInsertReq{} | ||||||
|  | 	MCreate.MenuName = "" | ||||||
|  | 	MCreate.Title = "创建" + tab.TableComment | ||||||
|  | 	MCreate.Icon = "" | ||||||
|  | 	MCreate.Path = tab.TBName | ||||||
|  | 	MCreate.MenuType = "F" | ||||||
|  | 	MCreate.Action = "无" | ||||||
|  | 	MCreate.Permission = tab.PackageName + ":" + tab.BusinessName + ":add" | ||||||
|  | 	MCreate.ParentId = Cmenu.MenuId | ||||||
|  | 	MCreate.NoCache = false | ||||||
|  | 	MCreate.Sort = 0 | ||||||
|  | 	MCreate.Visible = "0" | ||||||
|  | 	MCreate.IsFrame = "0" | ||||||
|  | 	MCreate.CreateBy = 1 | ||||||
|  | 	MCreate.UpdateBy = 1 | ||||||
|  | 	s.Insert(&MCreate) | ||||||
|  |  | ||||||
|  | 	MUpdate := dto.SysMenuInsertReq{} | ||||||
|  | 	MUpdate.MenuName = "" | ||||||
|  | 	MUpdate.Title = "修改" + tab.TableComment | ||||||
|  | 	MUpdate.Icon = "" | ||||||
|  | 	MUpdate.Path = tab.TBName | ||||||
|  | 	MUpdate.MenuType = "F" | ||||||
|  | 	MUpdate.Action = "无" | ||||||
|  | 	MUpdate.Permission = tab.PackageName + ":" + tab.BusinessName + ":edit" | ||||||
|  | 	MUpdate.ParentId = Cmenu.MenuId | ||||||
|  | 	MUpdate.NoCache = false | ||||||
|  | 	MUpdate.Sort = 0 | ||||||
|  | 	MUpdate.Visible = "0" | ||||||
|  | 	MUpdate.IsFrame = "0" | ||||||
|  | 	MUpdate.CreateBy = 1 | ||||||
|  | 	MUpdate.UpdateBy = 1 | ||||||
|  | 	s.Insert(&MUpdate) | ||||||
|  |  | ||||||
|  | 	MDelete := dto.SysMenuInsertReq{} | ||||||
|  | 	MDelete.MenuName = "" | ||||||
|  | 	MDelete.Title = "删除" + tab.TableComment | ||||||
|  | 	MDelete.Icon = "" | ||||||
|  | 	MDelete.Path = tab.TBName | ||||||
|  | 	MDelete.MenuType = "F" | ||||||
|  | 	MDelete.Action = "无" | ||||||
|  | 	MDelete.Permission = tab.PackageName + ":" + tab.BusinessName + ":remove" | ||||||
|  | 	MDelete.ParentId = Cmenu.MenuId | ||||||
|  | 	MDelete.NoCache = false | ||||||
|  | 	MDelete.Sort = 0 | ||||||
|  | 	MDelete.Visible = "0" | ||||||
|  | 	MDelete.IsFrame = "0" | ||||||
|  | 	MDelete.CreateBy = 1 | ||||||
|  | 	MDelete.UpdateBy = 1 | ||||||
|  | 	s.Insert(&MDelete) | ||||||
|  |  | ||||||
|  | 	e.OK("", "数据生成成功!") | ||||||
|  | } | ||||||
							
								
								
									
										361
									
								
								app/other/apis/tools/sys_tables.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										361
									
								
								app/other/apis/tools/sys_tables.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,361 @@ | |||||||
|  | package tools | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"strings" | ||||||
|  |  | ||||||
|  | 	"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/response" | ||||||
|  | 	"gorm.io/gorm" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/other/models/tools" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysTable struct { | ||||||
|  | 	api.Api | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetPage 分页列表数据 | ||||||
|  | // @Summary 分页列表数据 | ||||||
|  | // @Description 生成表分页列表 | ||||||
|  | // @Tags 工具 / 生成工具 | ||||||
|  | // @Param tableName query string false "tableName / 数据表名称" | ||||||
|  | // @Param pageSize query int false "pageSize / 页条数" | ||||||
|  | // @Param pageIndex query int false "pageIndex / 页码" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/sys/tables/page [get] | ||||||
|  | func (e SysTable) GetPage(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 = pkg.StringToInt(size) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if index := c.Request.FormValue("pageIndex"); index != "" { | ||||||
|  | 		pageIndex, err = pkg.StringToInt(index) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	db, err := e.GetOrm() | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Errorf("get db connection error, %s", err.Error()) | ||||||
|  | 		e.Error(500, err, "数据库连接获取失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	data.TBName = c.Request.FormValue("tableName") | ||||||
|  | 	data.TableComment = c.Request.FormValue("tableComment") | ||||||
|  | 	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, "查询成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get | ||||||
|  | // @Summary 获取配置 | ||||||
|  | // @Description 获取JSON | ||||||
|  | // @Tags 工具 / 生成工具 | ||||||
|  | // @Param configKey path int true "configKey" | ||||||
|  | // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" | ||||||
|  | // @Router /api/v1/sys/tables/info/{tableId} [get] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysTable) Get(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(500, err, "数据库连接获取失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var data tools.SysTables | ||||||
|  | 	data.TableId, _ = pkg.StringToInt(c.Param("tableId")) | ||||||
|  | 	result, err := data.Get(db,true) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Errorf("Get error, %s", err.Error()) | ||||||
|  | 		e.Error(500, err, "") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	mp := make(map[string]interface{}) | ||||||
|  | 	mp["list"] = result.Columns | ||||||
|  | 	mp["info"] = result | ||||||
|  | 	e.OK(mp, "") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | 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(500, err, "数据库连接获取失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var data tools.SysTables | ||||||
|  | 	if c.Request.FormValue("tableName") != "" { | ||||||
|  | 		data.TBName = c.Request.FormValue("tableName") | ||||||
|  | 	} | ||||||
|  | 	result, err := data.Get(db,true) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Errorf("Get error, %s", err.Error()) | ||||||
|  | 		e.Error(500, err, "抱歉未找到相关信息") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	mp := make(map[string]interface{}) | ||||||
|  | 	mp["list"] = result.Columns | ||||||
|  | 	mp["info"] = result | ||||||
|  | 	e.OK(mp, "") | ||||||
|  | 	//res.Data = mp | ||||||
|  | 	//c.JSON(http.StatusOK, res.ReturnOK()) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | 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(500, err, "数据库连接获取失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	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, "") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Insert | ||||||
|  | // @Summary 添加表结构 | ||||||
|  | // @Description 添加表结构 | ||||||
|  | // @Tags 工具 / 生成工具 | ||||||
|  | // @Accept  application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param tables query string false "tableName / 数据表名称" | ||||||
|  | // @Success 200 {string} string	"{"code": 200, "message": "添加成功"}" | ||||||
|  | // @Success 200 {string} string	"{"code": -1, "message": "添加失败"}" | ||||||
|  | // @Router /api/v1/sys/tables/info [post] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysTable) Insert(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(500, err, "数据库连接获取失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	tablesList := strings.Split(c.Request.FormValue("tables"), ",") | ||||||
|  | 	for i := 0; i < len(tablesList); i++ { | ||||||
|  |  | ||||||
|  | 		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(db) | ||||||
|  | 		if err != nil { | ||||||
|  | 			log.Errorf("Create error, %s", err.Error()) | ||||||
|  | 			e.Error(500, err, "") | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	e.OK(nil, "添加成功") | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | 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 = 0 | ||||||
|  |  | ||||||
|  | 	dbTable.TableName = data.TBName | ||||||
|  | 	dbtable, err := dbTable.Get(tx) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return data, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	dbColumn.TableName = data.TBName | ||||||
|  | 	tablenamelist := strings.Split(dbColumn.TableName, "_") | ||||||
|  | 	for i := 0; i < len(tablenamelist); i++ { | ||||||
|  | 		strStart := string([]byte(tablenamelist[i])[:1]) | ||||||
|  | 		strend := string([]byte(tablenamelist[i])[1:]) | ||||||
|  | 		// 大驼峰表名 结构体使用 | ||||||
|  | 		data.ClassName += strings.ToUpper(strStart) + strend | ||||||
|  | 		// 小驼峰表名 js函数名和权限标识使用 | ||||||
|  | 		if i == 0 { | ||||||
|  | 			data.BusinessName += strings.ToLower(strStart) + strend | ||||||
|  | 		} else { | ||||||
|  | 			data.BusinessName += strings.ToUpper(strStart) + strend | ||||||
|  | 		} | ||||||
|  | 		//data.PackageName += strings.ToLower(strStart) + strings.ToLower(strend) | ||||||
|  | 		//data.ModuleName += strings.ToLower(strStart) + strings.ToLower(strend) | ||||||
|  | 	} | ||||||
|  | 	//data.ModuleFrontName = strings.ReplaceAll(data.ModuleName, "_", "-") | ||||||
|  | 	data.PackageName = "admin" | ||||||
|  | 	data.TplCategory = "crud" | ||||||
|  | 	data.Crud = true | ||||||
|  | 	// 中横线表名称,接口路径、前端文件夹名称和js名称使用 | ||||||
|  | 	data.ModuleName = strings.Replace(data.TBName, "_", "-", -1) | ||||||
|  | 	dbcolumn, err := dbColumn.GetList(tx) | ||||||
|  | 	data.CreateBy = 0 | ||||||
|  | 	data.TableComment = dbtable.TableComment | ||||||
|  | 	if dbtable.TableComment == "" { | ||||||
|  | 		data.TableComment = data.ClassName | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	data.FunctionName = data.TableComment | ||||||
|  | 	//data.BusinessName = data.ModuleName | ||||||
|  | 	data.IsLogicalDelete = "1" | ||||||
|  | 	data.LogicalDelete = true | ||||||
|  | 	data.LogicalDeleteColumn = "is_del" | ||||||
|  | 	data.IsActions = 2 | ||||||
|  | 	data.IsDataScope = 1 | ||||||
|  | 	data.IsAuth = 1 | ||||||
|  |  | ||||||
|  | 	data.FunctionAuthor = "wenjianzhang" | ||||||
|  | 	for i := 0; i < len(dbcolumn); i++ { | ||||||
|  | 		var column tools.SysColumns | ||||||
|  | 		column.ColumnComment = dbcolumn[i].ColumnComment | ||||||
|  | 		column.ColumnName = dbcolumn[i].ColumnName | ||||||
|  | 		column.ColumnType = dbcolumn[i].ColumnType | ||||||
|  | 		column.Sort = i + 1 | ||||||
|  | 		column.Insert = true | ||||||
|  | 		column.IsInsert = "1" | ||||||
|  | 		column.QueryType = "EQ" | ||||||
|  | 		column.IsPk = "0" | ||||||
|  |  | ||||||
|  | 		namelist := strings.Split(dbcolumn[i].ColumnName, "_") | ||||||
|  | 		for i := 0; i < len(namelist); i++ { | ||||||
|  | 			strStart := string([]byte(namelist[i])[:1]) | ||||||
|  | 			strend := string([]byte(namelist[i])[1:]) | ||||||
|  | 			column.GoField += strings.ToUpper(strStart) + strend | ||||||
|  | 			if i == 0 { | ||||||
|  | 				column.JsonField = strings.ToLower(strStart) + strend | ||||||
|  | 			} else { | ||||||
|  | 				column.JsonField += strings.ToUpper(strStart) + strend | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if strings.Contains(dbcolumn[i].ColumnKey, "PR") { | ||||||
|  | 			column.IsPk = "1" | ||||||
|  | 			column.Pk = true | ||||||
|  | 			data.PkColumn = dbcolumn[i].ColumnName | ||||||
|  | 			//column.GoField = strings.ToUpper(column.GoField) | ||||||
|  | 			//column.JsonField = strings.ToUpper(column.JsonField) | ||||||
|  | 			data.PkGoField = column.GoField | ||||||
|  | 			data.PkJsonField = column.JsonField | ||||||
|  | 		} | ||||||
|  | 		column.IsRequired = "0" | ||||||
|  | 		if strings.Contains(dbcolumn[i].IsNullable, "NO") { | ||||||
|  | 			column.IsRequired = "1" | ||||||
|  | 			column.Required = true | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if strings.Contains(dbcolumn[i].ColumnType, "int") { | ||||||
|  | 			if strings.Contains(dbcolumn[i].ColumnKey, "PR") { | ||||||
|  | 				column.GoType = "int" | ||||||
|  | 			} else { | ||||||
|  | 				column.GoType = "string" | ||||||
|  | 			} | ||||||
|  | 			column.HtmlType = "input" | ||||||
|  | 		} else if strings.Contains(dbcolumn[i].ColumnType, "timestamp") { | ||||||
|  | 			column.GoType = "time.Time" | ||||||
|  | 			column.HtmlType = "datetime" | ||||||
|  | 		} else if strings.Contains(dbcolumn[i].ColumnType, "datetime") { | ||||||
|  | 			column.GoType = "time.Time" | ||||||
|  | 			column.HtmlType = "datetime" | ||||||
|  | 		} else { | ||||||
|  | 			column.GoType = "string" | ||||||
|  | 			column.HtmlType = "input" | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		data.Columns = append(data.Columns, column) | ||||||
|  | 	} | ||||||
|  | 	return data, err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Update | ||||||
|  | // @Summary 修改表结构 | ||||||
|  | // @Description 修改表结构 | ||||||
|  | // @Tags 工具 / 生成工具 | ||||||
|  | // @Accept  application/json | ||||||
|  | // @Product application/json | ||||||
|  | // @Param data body tools.SysTables true "body" | ||||||
|  | // @Success 200 {string} string	"{"code": 200, "message": "添加成功"}" | ||||||
|  | // @Success 200 {string} string	"{"code": -1, "message": "添加失败"}" | ||||||
|  | // @Router /api/v1/sys/tables/info [put] | ||||||
|  | // @Security Bearer | ||||||
|  | func (e SysTable) Update(c *gin.Context) { | ||||||
|  | 	var data tools.SysTables | ||||||
|  | 	err := c.Bind(&data) | ||||||
|  | 	pkg.HasError(err, "数据解析失败", 500) | ||||||
|  |  | ||||||
|  | 	e.Context = c | ||||||
|  | 	log := e.GetLogger() | ||||||
|  | 	db, err := e.GetOrm() | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Errorf("get db connection error, %s", err.Error()) | ||||||
|  | 		e.Error(500, 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, "修改成功") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Delete | ||||||
|  | // @Summary 删除表结构 | ||||||
|  | // @Description 删除表结构 | ||||||
|  | // @Tags 工具 / 生成工具 | ||||||
|  | // @Param tableId path int true "tableId" | ||||||
|  | // @Success 200 {string} string	"{"code": 200, "message": "删除成功"}" | ||||||
|  | // @Success 200 {string} string	"{"code": -1, "message": "删除失败"}" | ||||||
|  | // @Router /api/v1/sys/tables/info/{tableId} [delete] | ||||||
|  | func (e SysTable) Delete(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(500, err, "数据库连接获取失败") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var data tools.SysTables | ||||||
|  | 	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, "删除成功") | ||||||
|  | } | ||||||
							
								
								
									
										70
									
								
								app/other/models/tools/db_columns.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								app/other/models/tools/db_columns.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,70 @@ | |||||||
|  | package tools | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"errors" | ||||||
|  |  | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/config" | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/pkg" | ||||||
|  | 	"gorm.io/gorm" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type DBColumns struct { | ||||||
|  | 	TableSchema            string `gorm:"column:TABLE_SCHEMA" json:"tableSchema"` | ||||||
|  | 	TableName              string `gorm:"column:TABLE_NAME" json:"tableName"` | ||||||
|  | 	ColumnName             string `gorm:"column:COLUMN_NAME" json:"columnName"` | ||||||
|  | 	ColumnDefault          string `gorm:"column:COLUMN_DEFAULT" json:"columnDefault"` | ||||||
|  | 	IsNullable             string `gorm:"column:IS_NULLABLE" json:"isNullable"` | ||||||
|  | 	DataType               string `gorm:"column:DATA_TYPE" json:"dataType"` | ||||||
|  | 	CharacterMaximumLength string `gorm:"column:CHARACTER_MAXIMUM_LENGTH" json:"characterMaximumLength"` | ||||||
|  | 	CharacterSetName       string `gorm:"column:CHARACTER_SET_NAME" json:"characterSetName"` | ||||||
|  | 	ColumnType             string `gorm:"column:COLUMN_TYPE" json:"columnType"` | ||||||
|  | 	ColumnKey              string `gorm:"column:COLUMN_KEY" json:"columnKey"` | ||||||
|  | 	Extra                  string `gorm:"column:EXTRA" json:"extra"` | ||||||
|  | 	ColumnComment          string `gorm:"column:COLUMN_COMMENT" json:"columnComment"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | 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 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!") | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		table = table.Where("TABLE_NAME = ?", e.TableName) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	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 *DBColumns) GetList(tx *gorm.DB) ([]DBColumns, error) { | ||||||
|  | 	var doc []DBColumns | ||||||
|  | 	table := new(gorm.DB) | ||||||
|  |  | ||||||
|  | 	if e.TableName == "" { | ||||||
|  | 		return nil, errors.New("table name cannot be empty!") | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	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 { | ||||||
|  | 		pkg.Assert(true, "目前只支持mysql数据库", 500) | ||||||
|  | 	} | ||||||
|  | 	if err := table.Find(&doc).Error; err != nil { | ||||||
|  | 		return doc, err | ||||||
|  | 	} | ||||||
|  | 	return doc, nil | ||||||
|  | } | ||||||
							
								
								
									
										62
									
								
								app/other/models/tools/db_tables.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								app/other/models/tools/db_tables.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,62 @@ | |||||||
|  | package tools | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"errors" | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/sdk/pkg" | ||||||
|  |  | ||||||
|  | 	"gorm.io/gorm" | ||||||
|  |  | ||||||
|  | 	config2 "github.com/go-admin-team/go-admin-core/sdk/config" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type DBTables struct { | ||||||
|  | 	TableName      string `gorm:"column:TABLE_NAME" json:"tableName"` | ||||||
|  | 	Engine         string `gorm:"column:ENGINE" json:"engine"` | ||||||
|  | 	TableRows      string `gorm:"column:TABLE_ROWS" json:"tableRows"` | ||||||
|  | 	TableCollation string `gorm:"column:TABLE_COLLATION" json:"tableCollation"` | ||||||
|  | 	CreateTime     string `gorm:"column:CREATE_TIME" json:"createTime"` | ||||||
|  | 	UpdateTime     string `gorm:"column:UPDATE_TIME" json:"updateTime"` | ||||||
|  | 	TableComment   string `gorm:"column:TABLE_COMMENT" json:"tableComment"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | 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 = 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 != "" { | ||||||
|  | 			table = table.Where("TABLE_NAME = ?", e.TableName) | ||||||
|  | 		} | ||||||
|  | 		if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil { | ||||||
|  | 			return nil, 0, err | ||||||
|  | 		} | ||||||
|  | 	} else { | ||||||
|  | 		pkg.Assert(true, "目前只支持mysql数据库", 500) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	//table.Count(&count) | ||||||
|  | 	return doc, int(count), nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e *DBTables) Get(tx *gorm.DB) (DBTables, error) { | ||||||
|  | 	var doc DBTables | ||||||
|  | 	if config2.DatabaseConfig.Driver == "mysql" { | ||||||
|  | 		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 { | ||||||
|  | 		pkg.Assert(true, "目前只支持mysql数据库", 500) | ||||||
|  | 	} | ||||||
|  | 	return doc, nil | ||||||
|  | } | ||||||
							
								
								
									
										100
									
								
								app/other/models/tools/sys_columns.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								app/other/models/tools/sys_columns.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,100 @@ | |||||||
|  | package tools | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | 	"gorm.io/gorm" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | 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"` | ||||||
|  | 	FkCol              []SysColumns `gorm:"-" json:"fkCol"` | ||||||
|  | 	FkLabelId          string       `gorm:"" json:"fkLabelId"` | ||||||
|  | 	FkLabelName        string       `gorm:"size:255;" json:"fkLabelName"` | ||||||
|  | 	CreateBy           int          `gorm:"column:create_by;size:20;" json:"createBy"` | ||||||
|  | 	UpdateBy           int          `gorm:"column:update_By;size:20;" json:"updateBy"` | ||||||
|  |  | ||||||
|  | 	models.BaseModel | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (*SysColumns) TableName() string { | ||||||
|  | 	return "sys_columns" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e *SysColumns) GetList(tx *gorm.DB, exclude bool) ([]SysColumns, error) { | ||||||
|  | 	var doc []SysColumns | ||||||
|  | 	table := tx.Table("sys_columns") | ||||||
|  | 	table = table.Where("table_id = ? ", e.TableId) | ||||||
|  | 	if exclude { | ||||||
|  | 		notIn := make([]string, 0, 6) | ||||||
|  | 		notIn = append(notIn, "id") | ||||||
|  | 		notIn = append(notIn, "create_by") | ||||||
|  | 		notIn = append(notIn, "update_by") | ||||||
|  | 		notIn = append(notIn, "created_at") | ||||||
|  | 		notIn = append(notIn, "updated_at") | ||||||
|  | 		notIn = append(notIn, "deleted_at") | ||||||
|  | 		table = table.Where(" column_name not in(?)", notIn) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if err := table.Find(&doc).Error; err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return doc, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e *SysColumns) Create(tx *gorm.DB) (SysColumns, error) { | ||||||
|  | 	var doc SysColumns | ||||||
|  | 	e.CreateBy = 0 | ||||||
|  | 	result := tx.Table("sys_columns").Create(&e) | ||||||
|  | 	if result.Error != nil { | ||||||
|  | 		err := result.Error | ||||||
|  | 		return doc, err | ||||||
|  | 	} | ||||||
|  | 	doc = *e | ||||||
|  | 	return doc, 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:是修改的数据 | ||||||
|  | 	e.UpdateBy = 0 | ||||||
|  | 	if err = tx.Table("sys_columns").Model(&update).Updates(&e).Error; err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										238
									
								
								app/other/models/tools/sys_tables.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										238
									
								
								app/other/models/tools/sys_tables.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,238 @@ | |||||||
|  | package tools | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	common "go-admin/common/models" | ||||||
|  | 	"strings" | ||||||
|  |  | ||||||
|  | 	"gorm.io/gorm" | ||||||
|  |  | ||||||
|  | 	"go-admin/app/admin/models" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type SysTables struct { | ||||||
|  | 	TableId             int    `gorm:"primaryKey;autoIncrement" json:"tableId"`        //表编码 | ||||||
|  | 	TBName              string `gorm:"column:table_name;size:255;" json:"tableName"`   //表名称 | ||||||
|  | 	MLTBName            string `gorm:"-" json:"-"`                                     //表名称 | ||||||
|  | 	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"`                    //go文件名 | ||||||
|  | 	ModuleFrontName     string `gorm:"size:255;comment:前端文件名;" json:"moduleFrontName"` //前端文件名 | ||||||
|  | 	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;default:0;" json:"tree"` | ||||||
|  | 	Crud                bool   `gorm:"size:1;default: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"` | ||||||
|  | 	common.ModelTime | ||||||
|  | 	common.ControlBy | ||||||
|  | 	DataScope string       `gorm:"-" json:"dataScope"` | ||||||
|  | 	Params    Params       `gorm:"-" json:"params"` | ||||||
|  | 	Columns   []SysColumns `gorm:"-" json:"columns"` | ||||||
|  |  | ||||||
|  | 	models.BaseModel | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (*SysTables) TableName() string { | ||||||
|  | 	return "sys_tables" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type Params struct { | ||||||
|  | 	TreeCode       string `gorm:"-" json:"treeCode"` | ||||||
|  | 	TreeParentCode string `gorm:"-" json:"treeParentCode"` | ||||||
|  | 	TreeName       string `gorm:"-" json:"treeName"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e *SysTables) GetPage(tx *gorm.DB, pageSize int, pageIndex int) ([]SysTables, int, error) { | ||||||
|  | 	var doc []SysTables | ||||||
|  |  | ||||||
|  | 	table := tx.Table("sys_tables") | ||||||
|  |  | ||||||
|  | 	if e.TBName != "" { | ||||||
|  | 		table = table.Where("table_name = ?", e.TBName) | ||||||
|  | 	} | ||||||
|  | 	if e.TableComment != "" { | ||||||
|  | 		table = table.Where("table_comment = ?", e.TableComment) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	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 *SysTables) Get(tx *gorm.DB, exclude bool) (SysTables, error) { | ||||||
|  | 	var doc SysTables | ||||||
|  | 	var err error | ||||||
|  | 	table := tx.Table("sys_tables") | ||||||
|  |  | ||||||
|  | 	if e.TBName != "" { | ||||||
|  | 		table = table.Where("table_name = ?", e.TBName) | ||||||
|  | 	} | ||||||
|  | 	if e.TableId != 0 { | ||||||
|  | 		table = table.Where("table_id = ?", e.TableId) | ||||||
|  | 	} | ||||||
|  | 	if e.TableComment != "" { | ||||||
|  | 		table = table.Where("table_comment = ?", e.TableComment) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if err := table.First(&doc).Error; err != nil { | ||||||
|  | 		return doc, err | ||||||
|  | 	} | ||||||
|  | 	var col SysColumns | ||||||
|  | 	col.TableId = doc.TableId | ||||||
|  | 	if doc.Columns, err = col.GetList(tx, exclude); err != nil { | ||||||
|  | 		return doc, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return doc, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e *SysTables) GetTree(tx *gorm.DB) ([]SysTables, error) { | ||||||
|  | 	var doc []SysTables | ||||||
|  | 	var err error | ||||||
|  | 	table := tx.Table("sys_tables") | ||||||
|  |  | ||||||
|  | 	if e.TBName != "" { | ||||||
|  | 		table = table.Where("table_name = ?", e.TBName) | ||||||
|  | 	} | ||||||
|  | 	if e.TableId != 0 { | ||||||
|  | 		table = table.Where("table_id = ?", e.TableId) | ||||||
|  | 	} | ||||||
|  | 	if e.TableComment != "" { | ||||||
|  | 		table = table.Where("table_comment = ?", e.TableComment) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if err := table.Find(&doc).Error; err != nil { | ||||||
|  | 		return doc, err | ||||||
|  | 	} | ||||||
|  | 	for i := 0; i < len(doc); i++ { | ||||||
|  | 		var col SysColumns | ||||||
|  | 		//col.FkCol = append(col.FkCol, SysColumns{ColumnId: 0, ColumnName: "请选择"}) | ||||||
|  | 		col.TableId = doc[i].TableId | ||||||
|  | 		if doc[i].Columns, err = col.GetList(tx, false); err != nil { | ||||||
|  | 			return doc, err | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return doc, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e *SysTables) Create(tx *gorm.DB) (SysTables, error) { | ||||||
|  | 	var doc SysTables | ||||||
|  | 	e.CreateBy = 0 | ||||||
|  | 	result := tx.Table("sys_tables").Create(&e) | ||||||
|  | 	if result.Error != nil { | ||||||
|  | 		err := result.Error | ||||||
|  | 		return doc, err | ||||||
|  | 	} | ||||||
|  | 	doc = *e | ||||||
|  | 	for i := 0; i < len(e.Columns); i++ { | ||||||
|  | 		e.Columns[i].TableId = doc.TableId | ||||||
|  |  | ||||||
|  | 		_, _ = e.Columns[i].Create(tx) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return doc, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | 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:是修改的数据 | ||||||
|  | 	e.UpdateBy = 0 | ||||||
|  | 	if err = tx.Table("sys_tables").Where("table_id = ?", e.TableId).Updates(&e).Error; err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	tableNames := make([]string, 0) | ||||||
|  | 	for i := range e.Columns { | ||||||
|  | 		if e.Columns[i].FkTableName != "" { | ||||||
|  | 			tableNames = append(tableNames, e.Columns[i].FkTableName) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	tables := make([]SysTables, 0) | ||||||
|  | 	tableMap := make(map[string]*SysTables) | ||||||
|  | 	if len(tableNames) > 0 { | ||||||
|  | 		if err = tx.Table("sys_tables").Where("table_name in (?)", tableNames).Find(&tables).Error; err != nil { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		for i := range tables { | ||||||
|  | 			tableMap[tables[i].TBName] = &tables[i] | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for i := 0; i < len(e.Columns); i++ { | ||||||
|  | 		if e.Columns[i].FkTableName != "" { | ||||||
|  | 			t, ok := tableMap[e.Columns[i].FkTableName] | ||||||
|  | 			if ok { | ||||||
|  | 				e.Columns[i].FkTableNameClass = t.ClassName | ||||||
|  | 				t.MLTBName = strings.Replace(t.TBName, "_", "-", -1) | ||||||
|  | 				e.Columns[i].FkTableNamePackage = t.MLTBName | ||||||
|  | 			} else { | ||||||
|  | 				tableNameList := strings.Split(e.Columns[i].FkTableName, "_") | ||||||
|  | 				e.Columns[i].FkTableNameClass = "" | ||||||
|  | 				//e.Columns[i].FkTableNamePackage = "" | ||||||
|  | 				for a := 0; a < len(tableNameList); a++ { | ||||||
|  | 					strStart := string([]byte(tableNameList[a])[:1]) | ||||||
|  | 					strEnd := string([]byte(tableNameList[a])[1:]) | ||||||
|  | 					e.Columns[i].FkTableNameClass += strings.ToUpper(strStart) + strEnd | ||||||
|  | 					//e.Columns[i].FkTableNamePackage += strings.ToLower(strStart) + strings.ToLower(strEnd) | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		_, _ = e.Columns[i].Update(tx) | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (e *SysTables) Delete(db *gorm.DB) (success bool, err error) { | ||||||
|  | 	tx := db.Begin() | ||||||
|  | 	defer func() { | ||||||
|  | 		if err != nil { | ||||||
|  | 			tx.Rollback() | ||||||
|  | 		} else { | ||||||
|  | 			tx.Commit() | ||||||
|  | 		} | ||||||
|  | 	}() | ||||||
|  | 	if err = tx.Table("sys_tables").Delete(SysTables{}, "table_id = ?", e.TableId).Error; err != nil { | ||||||
|  | 		success = false | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	if err = tx.Table("sys_columns").Delete(SysColumns{}, "table_id = ?", e.TableId).Error; err != nil { | ||||||
|  | 		success = false | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	success = true | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  | 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 | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										20
									
								
								app/other/router/file.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								app/other/router/file.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | |||||||
|  | package router | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" | ||||||
|  | 	"go-admin/app/other/apis" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func init() { | ||||||
|  | 	routerCheckRole = append(routerCheckRole, registerFileRouter) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 需认证的路由代码 | ||||||
|  | func registerFileRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { | ||||||
|  | 	var api = apis.File{} | ||||||
|  | 	r := v1.Group("").Use(authMiddleware.MiddlewareFunc()) | ||||||
|  | 	{ | ||||||
|  | 		r.POST("/public/uploadFile", api.UploadFile) | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										56
									
								
								app/other/router/gen_router.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								app/other/router/gen_router.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,56 @@ | |||||||
|  | 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" | ||||||
|  | 	"go-admin/app/other/apis/tools" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func init() { | ||||||
|  | 	routerCheckRole = append(routerCheckRole, sysNoCheckRoleRouter, registerDBRouter, registerSysTableRouter) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func sysNoCheckRoleRouter(v1 *gin.RouterGroup ,authMiddleware *jwt.GinJWTMiddleware) { | ||||||
|  | 	r1 := v1.Group("") | ||||||
|  | 	{ | ||||||
|  | 		sys := apis.System{} | ||||||
|  | 		r1.GET("/captcha", sys.GenerateCaptchaHandler) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	r := v1.Group("").Use(authMiddleware.MiddlewareFunc()) | ||||||
|  | 	{ | ||||||
|  | 		gen := tools.Gen{} | ||||||
|  | 		r.GET("/gen/preview/:tableId", gen.Preview) | ||||||
|  | 		r.GET("/gen/toproject/:tableId", gen.GenCode) | ||||||
|  | 		r.GET("/gen/apitofile/:tableId", gen.GenApiToFile) | ||||||
|  | 		r.GET("/gen/todb/:tableId", gen.GenMenuAndApi) | ||||||
|  | 		sysTable := tools.SysTable{} | ||||||
|  | 		r.GET("/gen/tabletree", sysTable.GetSysTablesTree) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func registerDBRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { | ||||||
|  | 	db := v1.Group("/db").Use(authMiddleware.MiddlewareFunc()) | ||||||
|  | 	{ | ||||||
|  | 		gen := tools.Gen{} | ||||||
|  | 		db.GET("/tables/page", gen.GetDBTableList) | ||||||
|  | 		db.GET("/columns/page", gen.GetDBColumnList) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func registerSysTableRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { | ||||||
|  | 	tables := v1.Group("/sys/tables") | ||||||
|  | 	{ | ||||||
|  | 		sysTable := tools.SysTable{} | ||||||
|  | 		tables.Group("").Use(authMiddleware.MiddlewareFunc()).GET("/page", sysTable.GetPage) | ||||||
|  | 		tablesInfo := tables.Group("/info").Use(authMiddleware.MiddlewareFunc()) | ||||||
|  | 		{ | ||||||
|  | 			tablesInfo.POST("", sysTable.Insert) | ||||||
|  | 			tablesInfo.PUT("", sysTable.Update) | ||||||
|  | 			tablesInfo.DELETE("/:tableId", sysTable.Delete) | ||||||
|  | 			tablesInfo.GET("/:tableId", sysTable.Get) | ||||||
|  | 			tablesInfo.GET("", sysTable.GetSysTablesInfo) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										36
									
								
								app/other/router/init_router.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								app/other/router/init_router.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | |||||||
|  | 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" | ||||||
|  | 	common "go-admin/common/middleware" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // InitRouter 路由初始化,不要怀疑,这里用到了 | ||||||
|  | func InitRouter() { | ||||||
|  | 	var r *gin.Engine | ||||||
|  | 	h := sdk.Runtime.GetEngine() | ||||||
|  | 	if h == nil { | ||||||
|  | 		log.Fatal("not found engine...") | ||||||
|  | 		os.Exit(-1) | ||||||
|  | 	} | ||||||
|  | 	switch h.(type) { | ||||||
|  | 	case *gin.Engine: | ||||||
|  | 		r = h.(*gin.Engine) | ||||||
|  | 	default: | ||||||
|  | 		log.Fatal("not support other engine") | ||||||
|  | 		os.Exit(-1) | ||||||
|  | 	} | ||||||
|  | 	// the jwt middleware | ||||||
|  | 	authMiddleware, err := common.AuthInit() | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Fatalf("JWT Init Error, %s", err.Error()) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// 注册业务路由 | ||||||
|  | 	// TODO: 这里可存放业务路由,里边并无实际路由只有演示代码 | ||||||
|  | 	initRouter(r, authMiddleware) | ||||||
|  | } | ||||||
							
								
								
									
										23
									
								
								app/other/router/monitor.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								app/other/router/monitor.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | package router | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"net/http" | ||||||
|  |  | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"github.com/go-admin-team/go-admin-core/tools/transfer" | ||||||
|  | 	"github.com/prometheus/client_golang/prometheus/promhttp" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func init() { | ||||||
|  | 	routerNoCheckRole = append(routerNoCheckRole, registerMonitorRouter) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 需认证的路由代码 | ||||||
|  | func registerMonitorRouter(v1 *gin.RouterGroup) { | ||||||
|  | 	v1.GET("/metrics", transfer.Handler(promhttp.Handler())) | ||||||
|  | 	//健康检查 | ||||||
|  | 	v1.GET("/health", func(c *gin.Context) { | ||||||
|  | 		c.Status(http.StatusOK) | ||||||
|  | 	}) | ||||||
|  |  | ||||||
|  | } | ||||||
							
								
								
									
										42
									
								
								app/other/router/router.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								app/other/router/router.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,42 @@ | |||||||
|  | package router | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | var ( | ||||||
|  | 	routerNoCheckRole = make([]func(*gin.RouterGroup), 0) | ||||||
|  | 	routerCheckRole   = make([]func(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware), 0) | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // initRouter 路由示例 | ||||||
|  | func initRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) *gin.Engine { | ||||||
|  |  | ||||||
|  | 	// 无需认证的路由 | ||||||
|  | 	noCheckRoleRouter(r) | ||||||
|  | 	// 需要认证的路由 | ||||||
|  | 	checkRoleRouter(r, authMiddleware) | ||||||
|  |  | ||||||
|  | 	return r | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // noCheckRoleRouter 无需认证的路由示例 | ||||||
|  | func noCheckRoleRouter(r *gin.Engine) { | ||||||
|  | 	// 可根据业务需求来设置接口版本 | ||||||
|  | 	v1 := r.Group("/api/v1") | ||||||
|  |  | ||||||
|  | 	for _, f := range routerNoCheckRole { | ||||||
|  | 		f(v1) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // checkRoleRouter 需要认证的路由示例 | ||||||
|  | func checkRoleRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) { | ||||||
|  | 	// 可根据业务需求来设置接口版本 | ||||||
|  | 	v1 := r.Group("/api/v1") | ||||||
|  |  | ||||||
|  | 	for _, f := range routerCheckRole { | ||||||
|  | 		f(v1, authMiddleware) | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										21
									
								
								app/other/router/sys_server_monitor.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								app/other/router/sys_server_monitor.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | |||||||
|  | package router | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" | ||||||
|  | 	"go-admin/app/other/apis" | ||||||
|  | 	"go-admin/common/middleware" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func init() { | ||||||
|  | 	routerCheckRole = append(routerCheckRole, registerSysServerMonitorRouter) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 需认证的路由代码 | ||||||
|  | func registerSysServerMonitorRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { | ||||||
|  | 	api := apis.ServerMonitor{} | ||||||
|  | 	r := v1.Group("/server-monitor").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) | ||||||
|  | 	{ | ||||||
|  | 		r.GET("", api.ServerInfo) | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										6
									
								
								app/other/service/dto/sys_tables.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								app/other/service/dto/sys_tables.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | |||||||
|  | package dto | ||||||
|  |  | ||||||
|  | type SysTableSearch struct { | ||||||
|  | 	TBName       string `form:"tableName" search:"type:exact;column:table_name;table:table_name"` | ||||||
|  | 	TableComment string `form:"tableComment" search:"type:icontains;column:table_comment;table:table_comment"` | ||||||
|  | } | ||||||
							
								
								
									
										8
									
								
								cmd/api/jobs.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								cmd/api/jobs.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | |||||||
|  | package api | ||||||
|  |  | ||||||
|  | import "go-admin/app/jobs/router" | ||||||
|  |  | ||||||
|  | func init() { | ||||||
|  | 	//注册路由 fixme 其他应用的路由,在本目录新建文件放在init方法 | ||||||
|  | 	AppRouters = append(AppRouters, router.InitRouter) | ||||||
|  | } | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user