Skip to content

Commit 2946c8c

Browse files
author
奇淼(piexlmax
authored
Merge pull request #262 from Zh1Cheung/master
[fix] Unhandled error
2 parents fef12cb + 4d8d4b7 commit 2946c8c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1153
-794
lines changed

.docker-compose/shell/server-handle.sh

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@ system:
4949
addr: 8888
5050
db-type: 'mysql'
5151
oss-type: 'local'
52-
config-env: 'GVA_CONFIG'
53-
need-init-data: true
5452
use-multipoint: false
5553
5654
# captcha configuration
@@ -70,36 +68,6 @@ mysql:
7068
max-open-conns: 10
7169
log-mode: false
7270
73-
# sqlite connect configuration (sqlite需要gcc支持 windows用户需要自行安装gcc)
74-
sqlite:
75-
path: 'db.db'
76-
max-idle-conns: 10
77-
max-open-conns: 10
78-
logger: true
79-
80-
# Sqlserver connect configuration
81-
sqlserver:
82-
path: 'localhost:9930'
83-
db-name: 'gorm'
84-
username: 'gorm'
85-
password: 'LoremIpsum86'
86-
max-idle-conns: 10
87-
max-open-conns: 10
88-
logger: true
89-
90-
# Postgresql connect configuration
91-
postgresql:
92-
host: '127.0.0.1'
93-
port: '9920'
94-
config: 'sslmode=disable TimeZone=Asia/Shanghai'
95-
db-name: 'gorm'
96-
username: 'gorm'
97-
password: 'gorm'
98-
max-idle-conns: 10
99-
max-open-conns: 10
100-
prefer-simple-protocol: true
101-
logger: false
102-
10371
# local configuration
10472
local:
10573
path: 'uploads/file'

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ yarn-error.log*
2424

2525
go.sum
2626
/server/log/
27+
/server/gva
2728
/server/latest_log
2829

2930
*.iml

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212

1313
[English](./README-en.md) | 简体中文
1414

15-
[国内仓库地址](https://gitee.com/FLIPPED-AURORA/gin-vue-admin)
15+
[gitee地址](https://gitee.com/pixelmax/gin-vue-admin)
16+
[github地址](https://github.com/flipped-aurora/gin-vue-admin)
1617

1718
# 项目文档
1819
[在线文档](https://www.gin-vue-admin.com/) : https://www.gin-vue-admin.com/

dockerfile_server

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ RUN sh ./server-handle.sh
1212
RUN rm -f server-handle.sh
1313
RUN cat ./config.yaml
1414

15+
RUN go build -o gva cmd/main.go
1516
RUN go env && go build -o server .
1617

1718

@@ -20,24 +21,11 @@ LABEL MAINTAINER="SliverHorn@[email protected]"
2021

2122
WORKDIR /go/src/gin-vue-admin
2223

24+
COPY --from=0 /go/src/gin-vue-admin/gva ./
2325
COPY --from=0 /go/src/gin-vue-admin/server ./
2426
COPY --from=0 /go/src/gin-vue-admin/config.yaml ./
2527
COPY --from=0 /go/src/gin-vue-admin/resource ./resource
2628

2729
EXPOSE 8888
2830

29-
ENTRYPOINT ./server
30-
31-
# 根据Dockerfile生成Docker镜像
32-
33-
# docker build -t gva-server:1.0 .
34-
35-
#- 根据Docker镜像启动Docker容器
36-
# - 后台运行
37-
# - ```
38-
# docker run -d -p 8888:8888 --name gva-server-v1 gva-server:1.0
39-
# ```
40-
# - 以可交互模式运行, Ctrl + p + q
41-
# - ```
42-
# docker run -it -p 8888:8888 --name gva-server-v1 gva-server:1.0
43-
# ```
31+
ENTRYPOINT ./gva initdb && ./server

server/Dockerfile

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
1-
FROM golang:alpine as builder
1+
FROM golang:alpine
22

3-
# 设置go mod proxy 国内代理
4-
# 设置golang path
5-
ENV GOPROXY=https://goproxy.cn,https://goproxy.io,direct \
6-
GO111MODULE=on \
7-
CGO_ENABLED=1
8-
WORKDIR /ginvue
9-
RUN go env -w GOPROXY=https://goproxy.cn,https://goproxy.io,direct
3+
ENV GO111MODULE=on
4+
ENV GOPROXY=https://goproxy.io,direct
5+
6+
WORKDIR /go/src/gin-vue-admin
107
COPY . .
11-
RUN go env && go list && go build -o app main.go
8+
RUN go env && go build -o server .
9+
10+
FROM alpine:latest
11+
LABEL MAINTAINER="SliverHorn@[email protected]"
12+
13+
WORKDIR /go/src/gin-vue-admin
14+
COPY --from=0 /go/src/gin-vue-admin/server ./
15+
COPY --from=0 /go/src/gin-vue-admin/config.yaml ./
16+
COPY --from=0 /go/src/gin-vue-admin/resource ./resource
1217

1318
EXPOSE 8888
14-
ENTRYPOINT /ginvue/app
1519

16-
# 根据Dockerfile生成Docker镜像
17-
# docker build -t ginvue .
18-
# 根据Docker镜像启动Docker容器
19-
# docker run -itd -p 8888:8888 --name ginvue ginvue
20+
ENTRYPOINT ./server

server/Makefile

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
.PHONY: all build run gotool clean help
2+
3+
BINARY="server"
4+
GVA = "gva"
5+
6+
all: check gva initdb run
7+
8+
gva:
9+
go build -o ${GVA} cmd/main.go
10+
11+
initdb:
12+
@if [ -f ${GVA} ] ; then ./gva initdb && rm ${GVA} ; fi
13+
14+
linux-build:
15+
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
16+
17+
windows-build:
18+
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o ${BINARY}.exe
19+
20+
mac-build:
21+
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o ${BINARY}
22+
23+
run:
24+
@go run main.go
25+
26+
check:
27+
go fmt ./
28+
go vet ./
29+
30+
clean:
31+
@if [ -f ${BINARY} ] ; then rm ${BINARY} ; fi
32+
@if [ -f ${GVA} ] ; then rm ${GVA} ; fi
33+
34+
help:
35+
@echo "make - 构建gva终端工具并初始化数据,初始化数据后删除gva终端工具,启动server项目"
36+
@echo "make gva - 构建gva终端工具"
37+
@echo "make initdb - 如果有gva终端工具就初始化数据,初始化数据后删除gva终端工具,没有则不会执行"
38+
@echo "make linux-build - 编译 Go 代码, 生成Linux系统的二进制文件"
39+
@echo "make windows-build - 编译 Go 代码, 生成Windows系统的exe文件"
40+
@echo "make mac-build - 编译 Go 代码, 生成Mac系统的二进制文件"
41+
@echo "make run - 直接运行 main.go"
42+
@echo "make clean - 移除二进制文件"
43+
@echo "make check - 运行 Go 工具 'fmt' and 'vet'"

server/cmd/datas/AuthorityMenu.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package datas
2+
3+
import "gorm.io/gorm"
4+
5+
func InitAuthorityMenu(db *gorm.DB) (err error) {
6+
return db.Exec("CREATE ALGORITHM = UNDEFINED SQL SECURITY DEFINER VIEW `authority_menu` AS select `sys_base_menus`.`id` AS `id`,`sys_base_menus`.`created_at` AS `created_at`, `sys_base_menus`.`updated_at` AS `updated_at`, `sys_base_menus`.`deleted_at` AS `deleted_at`, `sys_base_menus`.`menu_level` AS `menu_level`,`sys_base_menus`.`parent_id` AS `parent_id`,`sys_base_menus`.`path` AS `path`,`sys_base_menus`.`name` AS `name`,`sys_base_menus`.`hidden` AS `hidden`,`sys_base_menus`.`component` AS `component`, `sys_base_menus`.`title` AS `title`,`sys_base_menus`.`icon` AS `icon`,`sys_base_menus`.`sort` AS `sort`,`sys_authority_menus`.`sys_authority_authority_id` AS `authority_id`,`sys_authority_menus`.`sys_base_menu_id` AS `menu_id`,`sys_base_menus`.`keep_alive` AS `keep_alive`,`sys_base_menus`.`default_menu` AS `default_menu` from (`sys_authority_menus` join `sys_base_menus` on ((`sys_authority_menus`.`sys_base_menu_id` = `sys_base_menus`.`id`)))").Error
7+
}

server/cmd/datas/apis.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package datas
2+
3+
import (
4+
"gin-vue-admin/model"
5+
"time"
6+
7+
"gorm.io/gorm"
8+
)
9+
10+
var Apis = []model.SysApi{
11+
{gorm.Model{ID: 1, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/base/login", "用户登录", "base", "POST"},
12+
{gorm.Model{ID: 2, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/user/register", "用户注册", "user", "POST"},
13+
{gorm.Model{ID: 3, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/api/createApi", "创建api", "api", "POST"},
14+
{gorm.Model{ID: 4, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/api/getApiList", "获取api列表", "api", "POST"},
15+
{gorm.Model{ID: 5, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/api/getApiById", "获取api详细信息", "api", "POST"},
16+
{gorm.Model{ID: 6, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/api/deleteApi", "删除Api", "api", "POST"},
17+
{gorm.Model{ID: 7, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/api/updateApi", "更新Api", "api", "POST"},
18+
{gorm.Model{ID: 8, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/api/getAllApis", "获取所有api", "api", "POST"},
19+
{gorm.Model{ID: 9, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/authority/createAuthority", "创建角色", "authority", "POST"},
20+
{gorm.Model{ID: 10, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/authority/deleteAuthority", "删除角色", "authority", "POST"},
21+
{gorm.Model{ID: 11, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/authority/getAuthorityList", "获取角色列表", "authority", "POST"},
22+
{gorm.Model{ID: 12, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/menu/getMenu", "获取菜单树", "menu", "POST"},
23+
{gorm.Model{ID: 13, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/menu/getMenuList", "分页获取基础menu列表", "menu", "POST"},
24+
{gorm.Model{ID: 14, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/menu/addBaseMenu", "新增菜单", "menu", "POST"},
25+
{gorm.Model{ID: 15, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/menu/getBaseMenuTree", "获取用户动态路由", "menu", "POST"},
26+
{gorm.Model{ID: 16, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/menu/addMenuAuthority", "增加menu和角色关联关系", "menu", "POST"},
27+
{gorm.Model{ID: 17, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/menu/getMenuAuthority", "获取指定角色menu", "menu", "POST"},
28+
{gorm.Model{ID: 18, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/menu/deleteBaseMenu", "删除菜单", "menu", "POST"},
29+
{gorm.Model{ID: 19, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/menu/updateBaseMenu", "更新菜单", "menu", "POST"},
30+
{gorm.Model{ID: 20, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/menu/getBaseMenuById", "根据id获取菜单", "menu", "POST"},
31+
{gorm.Model{ID: 21, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/user/changePassword", "修改密码", "user", "POST"},
32+
{gorm.Model{ID: 23, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/user/getUserList", "获取用户列表", "user", "POST"},
33+
{gorm.Model{ID: 24, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/user/setUserAuthority", "修改用户角色", "user", "POST"},
34+
{gorm.Model{ID: 25, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/fileUploadAndDownload/upload", "文件上传示例", "fileUploadAndDownload", "POST"},
35+
{gorm.Model{ID: 26, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/fileUploadAndDownload/getFileList", "获取上传文件列表", "fileUploadAndDownload", "POST"},
36+
{gorm.Model{ID: 27, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/casbin/updateCasbin", "更改角色api权限", "casbin", "POST"},
37+
{gorm.Model{ID: 28, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/casbin/getPolicyPathByAuthorityId", "获取权限列表", "casbin", "POST"},
38+
{gorm.Model{ID: 29, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/fileUploadAndDownload/deleteFile", "删除文件", "fileUploadAndDownload", "POST"},
39+
{gorm.Model{ID: 30, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/jwt/jsonInBlacklist", "jwt加入黑名单", "jwt", "POST"},
40+
{gorm.Model{ID: 31, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/authority/setDataAuthority", "设置角色资源权限", "authority", "POST"},
41+
{gorm.Model{ID: 32, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/system/getSystemConfig", "获取配置文件内容", "system", "POST"},
42+
{gorm.Model{ID: 33, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/system/setSystemConfig", "设置配置文件内容", "system", "POST"},
43+
{gorm.Model{ID: 34, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/customer/customer", "创建客户", "customer", "POST"},
44+
{gorm.Model{ID: 35, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/customer/customer", "更新客户", "customer", "PUT"},
45+
{gorm.Model{ID: 36, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/customer/customer", "删除客户", "customer", "DELETE"},
46+
{gorm.Model{ID: 37, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/customer/customer", "获取单一客户", "customer", "GET"},
47+
{gorm.Model{ID: 38, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/customer/customerList", "获取客户列表", "customer", "GET"},
48+
{gorm.Model{ID: 39, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/casbin/casbinTest/:pathParam", "RESTFUL模式测试", "casbin", "GET"},
49+
{gorm.Model{ID: 40, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/autoCode/createTemp", "自动化代码", "autoCode", "POST"},
50+
{gorm.Model{ID: 41, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/authority/updateAuthority", "更新角色信息", "authority", "PUT"},
51+
{gorm.Model{ID: 42, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/authority/copyAuthority", "拷贝角色", "authority", "POST"},
52+
{gorm.Model{ID: 43, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/user/deleteUser", "删除用户", "user", "DELETE"},
53+
{gorm.Model{ID: 44, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/sysDictionaryDetail/createSysDictionaryDetail", "新增字典内容", "sysDictionaryDetail", "POST"},
54+
{gorm.Model{ID: 45, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/sysDictionaryDetail/deleteSysDictionaryDetail", "删除字典内容", "sysDictionaryDetail", "DELETE"},
55+
{gorm.Model{ID: 46, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/sysDictionaryDetail/updateSysDictionaryDetail", "更新字典内容", "sysDictionaryDetail", "PUT"},
56+
{gorm.Model{ID: 47, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/sysDictionaryDetail/findSysDictionaryDetail", "根据ID获取字典内容", "sysDictionaryDetail", "GET"},
57+
{gorm.Model{ID: 48, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/sysDictionaryDetail/getSysDictionaryDetailList", "获取字典内容列表", "sysDictionaryDetail", "GET"},
58+
{gorm.Model{ID: 49, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/sysDictionary/createSysDictionary", "新增字典", "sysDictionary", "POST"},
59+
{gorm.Model{ID: 50, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/sysDictionary/deleteSysDictionary", "删除字典", "sysDictionary", "DELETE"},
60+
{gorm.Model{ID: 51, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/sysDictionary/updateSysDictionary", "更新字典", "sysDictionary", "PUT"},
61+
{gorm.Model{ID: 52, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/sysDictionary/findSysDictionary", "根据ID获取字典", "sysDictionary", "GET"},
62+
{gorm.Model{ID: 53, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/sysDictionary/getSysDictionaryList", "获取字典列表", "sysDictionary", "GET"},
63+
{gorm.Model{ID: 54, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/sysOperationRecord/createSysOperationRecord", "新增操作记录", "sysOperationRecord", "POST"},
64+
{gorm.Model{ID: 55, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/sysOperationRecord/deleteSysOperationRecord", "删除操作记录", "sysOperationRecord", "DELETE"},
65+
{gorm.Model{ID: 56, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/sysOperationRecord/findSysOperationRecord", "根据ID获取操作记录", "sysOperationRecord", "GET"},
66+
{gorm.Model{ID: 57, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/sysOperationRecord/getSysOperationRecordList", "获取操作记录列表", "sysOperationRecord", "GET"},
67+
{gorm.Model{ID: 58, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/autoCode/getTables", "获取数据库表", "autoCode", "GET"},
68+
{gorm.Model{ID: 59, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/autoCode/getDB", "获取所有数据库", "autoCode", "GET"},
69+
{gorm.Model{ID: 60, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/autoCode/getColume", "获取所选table的所有字段", "autoCode", "GET"},
70+
{gorm.Model{ID: 61, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/sysOperationRecord/deleteSysOperationRecordByIds", "批量删除操作历史", "sysOperationRecord", "DELETE"},
71+
{gorm.Model{ID: 62, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/simpleUploader/upload", "插件版分片上传", "simpleUploader", "POST"},
72+
{gorm.Model{ID: 63, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/simpleUploader/checkFileMd5", "文件完整度验证", "simpleUploader", "GET"},
73+
{gorm.Model{ID: 64, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/simpleUploader/mergeFileMd5", "上传完成合并文件", "simpleUploader", "GET"},
74+
{gorm.Model{ID: 65, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/user/setUserInfo", "设置用户信息", "user", "PUT"},
75+
{gorm.Model{ID: 66, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/system/getServerInfo", "获取服务器信息", "system", "POST"},
76+
{gorm.Model{ID: 67, CreatedAt: time.Now(), UpdatedAt: time.Now()}, "/email/emailTest", "发送测试邮件", "email", "POST"},
77+
}
78+
79+
func InitSysApi(db *gorm.DB) (err error) {
80+
return db.Transaction(func(tx *gorm.DB) error {
81+
if tx.Create(&Apis).Error != nil { // 遇到错误时回滚事务
82+
return err
83+
}
84+
return nil
85+
})
86+
}

server/cmd/datas/authorities.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package datas
2+
3+
import (
4+
"time"
5+
6+
"gin-vue-admin/model"
7+
"gorm.io/gorm"
8+
)
9+
10+
var Authorities = []model.SysAuthority{
11+
{CreatedAt: time.Now(), UpdatedAt: time.Now(), AuthorityId: "888", AuthorityName: "普通用户", ParentId: "0"},
12+
{CreatedAt: time.Now(), UpdatedAt: time.Now(), AuthorityId: "8881", AuthorityName: "普通用户子角色", ParentId: "888"},
13+
{CreatedAt: time.Now(), UpdatedAt: time.Now(), AuthorityId: "9528", AuthorityName: "测试角色", ParentId: "0"},
14+
}
15+
16+
func InitSysAuthority(db *gorm.DB) (err error) {
17+
return db.Transaction(func(tx *gorm.DB) error {
18+
if tx.Create(&Authorities).Error != nil { // 遇到错误时回滚事务
19+
return err
20+
}
21+
return nil
22+
})
23+
}

server/cmd/datas/authority_Ids.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package datas
2+
3+
import (
4+
"gorm.io/gorm"
5+
)
6+
7+
type SysDataAuthorityId struct {
8+
SysAuthorityAuthorityId string
9+
DataAuthorityIdAuthorityId string
10+
}
11+
12+
var DataAuthorityId = []SysDataAuthorityId{
13+
{"888", "888"},
14+
{"888", "8881"},
15+
{"888", "9528"},
16+
{"9528", "8881"},
17+
{"9528", "9528"},
18+
}
19+
20+
func InitSysDataAuthorityId(db *gorm.DB) (err error) {
21+
return db.Table("sys_data_authority_id").Transaction(func(tx *gorm.DB) error {
22+
if tx.Create(&DataAuthorityId).Error != nil { // 遇到错误时回滚事务
23+
return err
24+
}
25+
return nil
26+
})
27+
}

0 commit comments

Comments
 (0)