Releases: go-admin-team/go-admin
Release list
v2.6.0
Nothing here requires action to keep working — no migration, no import path change. One behaviour change is worth reading first.
Behaviour change
Rate-limited requests now return HTTP 429. They previously returned HTTP 200 with code: 500 in the body, so a load balancer, an uptime monitor and a benchmark all counted a rejection as a success — the earlier load tests here reported over ten times the real throughput before a status distribution gave it away. The threshold moves to extend.rateLimit.inboundQPS, defaulting to the 200 that was hardcoded, so the limit itself is unchanged; set it to 0 to switch the limiter off behind a gateway that already rate-limits. #881
- 🔒 Every tenant after the first was authorized against another tenant's policy. go-admin-core cached the casbin enforcer under a
sync.Once, and this repository passed the same empty key for every configured database. In the multi-tenant setup — one database per host — every host after the first was handed the enforcer built from the first host's database and never loaded its owncasbin_ruletable: a permission granted in one tenant applied in the others, and one denied there stayed denied however that tenant was configured. Both halves are needed, and both land here. #885 core#141 - 🔒 The captcha endpoint logged its own answer. Anyone who could read the application log could log in without solving it. #881
- 🐛 The shipped configuration had no connection pool settings, so Go's defaults applied — and
MaxIdleConnsdefaults to 2. Under load almost every request opened a TCP connection and closed it immediately, exhausting local ports:can't assign requested address, every request failing. Not slower, unavailable. The templates now setmaxIdleConns: 20,maxOpenConns: 100andconnMaxLifeTime: 3600, with the reasoning next to them —maxOpenConnsmultiplies by instance count against the database'smax_connections, andconnMaxLifeTimehas to stay under itswait_timeout. #881 - 🐛 The memory queue's buffer was 100, which is where it starts dropping rather than how much it processes at once:
Appenddiscards the message and returns an error instead of waiting. Each stream has one consumer goroutine, and the login and operation log consumers write to the database, so a burst above that write rate has only the buffer to absorb it. Under load 100 dropped more than 60% of messages; 1000 dropped none. Applies whenlogger.enableddbis on. #881 - 👌 The authorization path no longer recompiles a regexp per policy and per exclusion entry. casbin's
util.KeyMatch2callsregexp.MatchString, which compiles every time; the exclusion list is walked per request (32 entries, about 2,566 allocations) and the matcher runs once per permission the role holds. ServingGET /api/v1/deptto a non-admin whose role holds 201 permissions goes from 2,933 req/s to 13,882 at 256 concurrent, with p99 falling from 343ms to 39ms — throughput had been flat from 16 to 256 concurrent, the process saturated compiling patterns. Note thatadminskips the permission check entirely, so none of this is visible when testing with an admin token. #885 core#141 - 🔧 go-admin-core moves from v2.1.0 to v2.3.0, which is where several of the above come from and brings more besides: the in-memory queue lost about one message in seven when consumers registered while the first requests arrived — that queue carries the login and operation logs;
ResolveSearchQuerypanicked on an unexported field, so a single one on a search DTO took down the whole list endpoint; counter updates were lost under concurrency; and a cache sweep held one lock across the whole map, stalling reads for 16ms once a minute at a million entries. #881 #885 - ✅ Adds a load-test harness reporting latency percentiles and the status-code distribution across a concurrency sweep. It is skipped unless
GOADMIN_BENCH_ADDRpoints at a running server, sogo test ./...is unaffected. The status distribution is what caught the 429 problem above. #881 - 📝 Adds Traditional Chinese and Japanese READMEs, repoints the build badge — it had reported failing for years because it named a workflow that no longer exists — and unifies the documentation links. #882 #883
- 🔧 Documentation-only changes no longer trigger the deploy workflow. #884
Throughput figures were measured against MySQL on one machine, load generator and server sharing it. Read them as relative changes rather than numbers your hardware will reproduce.
本次发布没有任何需要动手才能继续工作的变更 —— 不用迁移,不用改导入路径。有一处行为变更值得先读。
行为变更
被限流的请求现在返回 HTTP 429。 此前返回的是 HTTP 200,只在 body 里写 code: 500,于是负载均衡、可用性监控和压测都把一次拒绝算成了一次成功 —— 本仓库早前的压测因此报出了十倍于真实值的吞吐,直到打印状态码分布才发现。阈值移到 extend.rateLimit.inboundQPS,默认值就是此前写死的 200,所以限流阈值本身没有变化;部署在自带限流的网关后面时,填 0 可以关闭限流。#881
- 🔒 第一个之后的所有租户,都在用别的租户的策略做鉴权。 go-admin-core 用
sync.Once缓存 casbin enforcer,而本仓库对每个已配置的数据库都传了同一个空 key。在多租户配置下(每个 host 一个库),第一个之后的每个 host 拿到的都是用第一个 host 的库构建的 enforcer,从未加载过自己的casbin_rule表:一个租户里授予的权限会在其他租户生效,而那里被拒绝的,无论该租户怎么配都仍然被拒绝。两侧改动缺一不可,本次一并发布。#885 core#141 - 🔒 验证码接口把自己的答案写进了日志。任何能读到应用日志的人都可以不解验证码直接登录。#881
- 🐛 随仓库分发的配置里没有连接池设置,于是走 Go 的默认值 —— 而
MaxIdleConns默认只有 2。高负载下几乎每个请求都新建一条 TCP 连接、用完立刻关闭,本机端口迅速耗尽:can't assign requested address,请求全部失败。不是变慢,是不可用。 配置模板现在给出maxIdleConns: 20、maxOpenConns: 100、connMaxLifeTime: 3600,并在旁边写清了取值依据 ——maxOpenConns要乘以实例数再跟数据库的max_connections比,connMaxLifeTime必须小于它的wait_timeout。#881 - 🐛 内存队列的缓冲长度是 100,而这个值是「从哪里开始丢」而不是「一次处理多少」:队列满时
Append直接丢弃该消息并返回错误,不会阻塞等待。每个 stream 只有一个消费 goroutine,而登录日志、操作日志的消费要写数据库,突发流量高于这个写入速度时,缓冲区是唯一的缓解手段。压测中 100 的丢弃率超过 60%,1000 为 0。仅在logger.enableddb开启时生效。#881 - 👌 鉴权路径不再为每条策略、每个排除项重新编译一次正则。 casbin 的
util.KeyMatch2调用的是regexp.MatchString,每次都重新编译;而排除列表每请求遍历一次(32 项,约 2,566 次内存分配),匹配器则对角色持有的每条权限各跑一次。对持有 201 条权限的非 admin 用户提供GET /api/v1/dept,256 并发下从 2,933 req/s 提升到 13,882,p99 从 343ms 降到 39ms —— 改动前吞吐从 16 到 256 并发是持平的,进程已被正则编译打满。注意admin会完全跳过权限校验,所以用 admin 账号测试看不到这里的任何变化。#885 core#141 - 🔧 go-admin-core 从 v2.1.0 升到 v2.3.0,上面几条中有几条正来源于此,此外还带来:内存队列在「首批请求到达的同时注册消费者」时约每七条丢一条 —— 而登录日志和操作日志走的就是这条队列;
ResolveSearchQuery遇到未导出字段会 panic,搜索 DTO 上只要有一个,整个列表接口就崩;计数器在并发下丢更新;缓存清理持有单一锁遍历整张表,百万条目下每分钟让读取停顿 16ms。#881 #885 - ✅ 新增压测工具,在一轮并发扫描中输出延迟分位数和状态码分布。未设置
GOADMIN_BENCH_ADDR指向运行中的服务时自动跳过,不影响go test ./...。上面那个 429 的问题,正是靠状态码分布发现的。#881 - 📝 新增繁体中文与日文 README,修正构建徽章 —— 它多年来一直显示 failing,因为指向的工作流早已不存在 —— 并统一了文档站链接。#882 #883
- 🔧 只改文档时不再触发部署工作流。#884
吞吐数据在单台机器上对 MySQL 实测,压力生成器与服务端共用同一台机器。请作为相对变化幅度参考,而非你的硬件上可复现的绝对值。
v2.5.0
This release carries two breaking changes. Read this section before upgrading.
⚠️ Before you upgrade
1. The core import path changed. Go requires a major version of 2 or above to carry /v2 in the module path, so every
github.com/go-admin-team/go-admin-core becomes github.com/go-admin-team/go-admin-core/v2.
That is 210 imports across 95 files here. Anyone who forked this repository will hit conflicts on the import lines when merging upstream — core ships a codemod, coreupgrade, that rewrites them in one pass. #864
2. You must run migrate. The soft-delete marker changes from a nullable datetime to a non-null millisecond integer. Skip the migration and the server starts, but every login is rejected as an incorrect username or password: the code queries deleted_at = 0 while an older database holds NULL, and NULL = 0 is never true. Logins are not the only casualty — menus and departments become invisible too. #863 #870
- 🔒 Stop writing the database password into the log. The startup line printed the DSN whole, so every deployment wrote its own credential into its own logs, where a log shipper, a support bundle or a screenshot carries it onward. The host and username stay; only the password is replaced. #880
- 🐛 Fix logins failing on a fresh MySQL install. A seeded menu's
sortexceeded MySQL's tinyint, so the run stopped there withError 1264and the soft-delete conversion never ran — leavingdeleted_atNULL and the login rejecting a password that was correct. sqlite ignores the declared width, so the fault appeared only on MySQL. #877 - 🐛 Fix the soft-delete migration against a real schema: it dropped a column while an index still referred to it, which SQLite refuses, and read rows through a column named
idwhensys_deptkeys ondept_idandsys_useronuser_id. #870 - 🐛 Give the natural keys a constraint the database can keep.
username,role_keyanddict_typerelied on a SELECT COUNT followed by an INSERT, which two concurrent requests both pass. A nullable delete marker cannot take part in a unique index —NULLis not equal toNULL, so the index looks like a constraint and enforces nothing. #863 - Code generator
- 🐛 Fix the column-list endpoint.
pkg.Assertpanics when its condition is false, and the guard readAssert(TableName == "")— so every request carrying a table name was rejected and the empty one was let through. The model layer repeated the inversion. The endpoint had never returned data. #865 - 🐛 Fix the mysql-only guard, which was written
Assert(true, ...)and never fired. On postgres or sqlserver it returned an empty list with a nil error, or dereferenced a zero-value*gorm.DB. #865 - 🐛 Fix the table list coming back empty.
sys_columnsandsys_tableswere left out of the soft-delete conversion, so they were queried withdeleted_at = 0against a nullable datetime and every row was invisible. #877 - 🐛 Fix the candidate table query assuming one database. It named the schema by hand, failing outright when generating from another, and read past the soft delete — so deleting a generator entry never handed its table back. #865
- 🐛 Fix the column-list endpoint.
- File upload
- 🐛 Fix the panic on
source=2andsource=3. Both branches built a zero-value client and called upload on it, asserting a nilClientfield. #875 - 🐛 Fix the qiniu branch uploading to aliyun:
qiniuUploadconstructedALiYunOSS, sosource=3could not have reached qiniu even with credentials. #875 - 🐛 Cloud storage had never been wired up:
OXS.Setupis the initialisation path and nothing called it, and no configuration field existed. Credentials now come fromextend.fileStore, and an unconfigured provider says so instead of crashing. #875 - 🐛 Fix Huawei OBS reporting success on a failed upload — the error was printed and
nilreturned. #875
- 🐛 Fix the panic on
- 🐛 Report an unknown database driver instead of panicking.
opens[driver]handedgorm.Opena nil function to call, so the operator saw a nil dereference inside gorm with nothing naming the driver — sqlite3 especially, since it needs cgo and only compiles in under thesqlite3build tag. #865 - 👌 Stop looking up the data scope on every request. The
EnableDPcheck lived in the scope rather than the middleware, so with data permission switched off — the shipped default — every list, detail, update and delete still paid for asys_userjoin whose result was discarded.deptidalso joins the token, so all four values the scope is decided by can now be read from it. #876 - 🔧 Deploys run migrations first and roll back when the new version does not come up. Previously
docker rm -fthendocker run, with no migration and no health check: a container that exited immediately left the site down with a green deploy. Healthy requires both an HTTP response and a database connection — the captcha endpoint answers without touching the database, so HTTP alone would call a container healthy that cannot reach MySQL. #880 - 🔧 Make migration output legible. An applied migration printed a bare
1, so seven of them wrote seven lines of1, and a failure named the error but never the migration. #880 - 📝 Repoint the README links that stopped resolving: the documentation tutorials, the archived jwt-go repository, and an external link that no longer answers. #867
- 🔧 Remove the repository mirrors and the leftover
Dockerfilebak. #868 #873
本次发布带两处破坏性变更,升级前请先读这一节。
⚠️ 升级必读
1. core 的导入路径变了。 Go 要求主版本 ≥2 必须把 /v2 写进模块路径,所以
github.com/go-admin-team/go-admin-core 全部变成 github.com/go-admin-team/go-admin-core/v2。
本仓库改了 210 处、95 个文件。fork 过本仓库的人合并上游时会在 import 行大量冲突,
可用 core 自带的 coreupgrade 一次性重写自己项目里的导入。#864
2. 必须执行 migrate。 软删除标记从「可空 datetime」改为「非空毫秒整数」,
不跑迁移会出现能启动、但登录报「账号密码不正确」,因为代码查 deleted_at = 0
而旧库里是 NULL,NULL = 0 恒为假 —— 不只是登录,菜单、部门也会全部查不到。
#863 #870
- 🔒 数据库密码不再写进日志。启动那行日志此前打印完整 DSN,等于每个部署都把自己的数据库凭证写进自己的日志里,日志采集、故障包、终端截图都会把它带走。现在只保留 host 和用户名。#880
- 🐛 修复 MySQL 全新安装无法登录。种子菜单的
sort值超出 MySQL 的 tinyint 范围,迁移在这里以Error 1264中断,后面的软删除转换从未执行,于是deleted_at停在NULL,登录报「账号密码不正确」而密码其实是对的。sqlite 忽略列宽,所以这个故障只在 MySQL 上出现。#877 - 🐛 修复软删除迁移在真实表结构上跑不完。删列前未先删依赖索引(SQLite 直接拒绝),且读取行时把主键写死成
id(sys_dept是dept_id、sys_user是user_id)。#870 - 🐛 自然键补上数据库层的唯一约束。
username/role_key/dict_type此前只靠「先 COUNT 再 INSERT」保证唯一,并发下两个请求都能通过。可空的删除标记进不了唯一索引 ——NULL不等于NULL,索引看着像约束、实际不约束任何东西。#863 - 代码生成器
- 🐛 修复取字段列表的接口。
pkg.Assert是条件为假时 panic,而守卫写成了Assert(TableName == ""),于是带表名的请求全部 500,不带表名的反而放行;模型层还有一处方向相同的反向判断。这个接口从未返回过数据。#865 - 🐛 修复「只支持 MySQL」的守卫从未生效。写成了
Assert(true, ...),是个空操作。postgres / sqlserver 上不会报错,而是返回空列表加 nil error,或者在零值*gorm.DB上崩溃。#865 - 🐛 修复表列表为空。
sys_columns/sys_tables漏在软删除转换清单之外,运行时用deleted_at = 0去查一个可空 datetime 列,每一行都不可见。#877 - 🐛 修复候选表查询假设只有一个库。排除清单用手写 schema 名的子查询,从别的 schema 生成时直接失败;而且它绕过软删除,删掉生成器条目后那张表再也回不到候选列表。#865
- 🐛 修复取字段列表的接口。
- 文件上传
- 🐛 数据库 driver 未知时给出可读报错。
opens[driver]取到 nil 函数直接被调用,操作者看到的是 gorm 深处的空指针,没有任何信息指向 driver 名 —— sqlite3 尤其容易踩到,它需要 cgo 且只在sqlite3构建标签下编入。#865 - 👌 数据权限不再每请求查一次库。
EnableDP的判断原本在 scope 里而不在中间件里,所以即使数据权限关闭(默认配置就是关的),每个列表/详情/更新/删除仍要跑一次sys_userjoin,查完丢掉。同时deptid补进 token,四个判定值现在都能从 token 读到。#876 - 🔧 部署流程:先跑迁移,起不来则回滚。此前是
docker rm -f后docker run,不跑迁移、不做健康检查,容器起不来就是「站点已挂、部署全绿」。健康检查要求 HTTP 与数据库连接同时成立 —— 验证码接口不碰数据库,只看 HTTP 会把连不上库的容器判为健康。#880 - 🔧 迁移输出可读。已执行的迁移原本打印一个裸的
1,七条迁移就是七行1;失败时只报错误、不说是哪条迁移。#880 - 📝 修复 ...
v2.4.0
🚨 已知问题:MySQL 上迁移无法执行完成 / Known issue: migrations cannot complete on MySQL
本版本在 MySQL 上执行
migrate会中断,报Error 1264 (22003): Out of range value for column 'sort'。
种子菜单的sort值超出 MySQL 的 tinyint 范围,而迁移框架不是事务性的,运行到此为止。后果是下面这段清理迁移从未执行 —— 它排在出错的那条之后,所以本页要求的
「清理库中的残留权限数据」在 MySQL 上并没有生效。sqlite 忽略列宽,不受影响。已在 v2.5.0 修复,建议直接升级;
v2.5.0 同时修复了另外十余个问题,其中包含一个会把数据库密码写进日志的缺陷。
Running
migrateon MySQL stops partway withError 1264 (22003): Out of range value for column 'sort'.
A seeded menu'ssortexceeds MySQL's tinyint, and the migration framework is not transactional, so the run ends there.The cleanup migration below therefore never ran — it is ordered after the one that fails, so the
"清理库中的残留权限数据" this page asks for did not take effect on MySQL. sqlite ignores the declared width and is unaffected.Fixed in v2.5.0, which is the recommended upgrade.
⚠️ 破坏性变更
移除 GET /api/v1/refresh_token
该接口用业务 token 即可换取新 token,而续期上限 MaxRefresh 依据的 orig_iat
在每次续期时被一并重置 —— 上限永远无法到达。token 一旦泄露即等同于永久访问权,
且框架没有任何吊销手段。它此前还位于 CasbinExclude 中,不受权限约束,任何角色
的已登录用户都能调用。
官方前端从未使用该接口,正常升级不受影响。
若你自行调用该端点实现续期,需改为重新登录。正确的无感续期应在
go-admin-core 中区分 access token 与 refresh token 后重新实现。
升级后请执行迁移,清理库中的残留权限数据:
./go-admin migrate -c config/settings.yml🔒 安全
- 修复 token 可无限续期问题(#820,报告者 @dangweiwu)
✨ 新功能
- 新增
app/demo标准 CRUD 参照模块 —— 一个完整的单表 CRUD 只需 model +
dto + router 三个文件。它使用common/actions的五个通用 Action,无需手写
Handler 与 Service。可编译、有测试、CI 会跑,替代此前只能靠模板传递的写法 - 新增
AGENTS.md—— 给 AI 编码工具与新贡献者的约定,只写"不遵守就会出错"
的规则 - 新增
docs/architecture.md—— 数据权限五级模型、JobExec 接口、多数据源、
迁移目录划分
🐛 修复
- 修正
GeneralDelDto.GetIds重复追加 Id - 修正欢迎页 iframe 高度塌陷
- 限制部署步骤仅在 master 收到 push 时执行 —— 此前 PR 可触发生产部署
🔧 其他
- 补充 sqlite3 构建标签说明:
driver: sqlite3时必须go run -tags sqlite3 .,
否则启动即 panic 且报错不提及构建标签 - 修正
.DS_Store忽略规则(原模式匹配不到仓库根目录) - 修正文件名拼写
int_router.go→init_router.go - 更新在线体验地址
配套前端版本:go-admin-ui v3.1.0
v2.3.0
本次发布以工具链升级与安全加固为主,无 API 破坏性变更,可从 v2.2.0 平滑升级。
🔒 安全
已知漏洞由 25 个降至 0(govulncheck 按实际调用路径检测),Dependabot 告警由 23 个降至 0。
- Go 工具链由 1.24 升级至 1.26.5,消除 21 个标准库漏洞(
crypto/tls、crypto/x509、net/http) github.com/jackc/pgx/v5→ v5.10.0,修复 SQL 注入(GO-2026-5004,影响 PostgreSQL 用户)golang.org/x/net→ v0.57.0,修复 HTTP/2 无限循环与 Punycode 校验绕过golang.org/x/text→ v0.40.0、golang.org/x/crypto→ v0.54.0golang.org/x/image→ v0.41.0,修复 TIFF 解码资源耗尽github.com/nyaruka/phonenumbers→ v1.2.2
go.sum 已纳入版本控制。此前该文件被 .gitignore 排除,导致依赖完整性无法校验,go mod verify 形同虚设——这是供应链攻击的主要防线。
⬆️ 依赖升级
| 依赖 | 版本 |
|---|---|
| gorm | 1.25.12 → 1.31.2(含 4 个数据库驱动、dbresolver 1.6.2) |
| gin | 1.10.0 → 1.12.0 |
| casbin/v2 | 2.104.0 → 2.135.0 |
| cobra | 1.9.1 → 1.10.2 |
| swag | 1.16.4 → 1.16.6 |
🐛 CI 缺陷修复
Docker 镜像发布条件失效:go.yml 中 if: startsWith(${{github.ref}}, 'refs/tags/') 的写法有误——if 表达式内使用 ${{ }} 会先将 github.ref 替换为裸字符串再参与求值,导致条件判断失效。实际表现为每次 push 到 master 都会构建并推送镜像至 ghcr.io,而非仅在打 tag 时发布。同时 on.push 缺少 tags 配置,打 tag 反而不会触发工作流。两处均已修正。
Gitee / GitLab 镜像同步长期失败:actions/checkout 默认浅克隆与 git push --mirror 语义冲突,GitLab 报 shallow update not allowed,Gitee 报拒绝删除当前分支。补充 fetch-depth: 0 后恢复正常。
移除 3 个失效工作流:issue-labeled、issue-check-inactive、issue-close-require 依赖的 actions-cool/issues-helper 仓库已被 GitHub 封禁,工作流必然失败。
🔧 其他
- GitHub Actions 全部升级并固定至完整 commit SHA:checkout v7.0.1、setup-go v7.0.0、codeql v4、docker/* 系列
docker/build-push-action升级至 v7 并补充配套的setup-buildx-action- README 环境要求更新为 go 1.26.5、Node v22+、pnpm
升级说明
- Go 版本要求提升至 1.26.5,请确认构建环境
- 使用 PostgreSQL 的用户建议尽快升级,本次修复了 pgx 的 SQL 注入漏洞
- 打 tag 现在才会触发 ghcr.io 镜像发布,push 分支仅执行构建
v2.2.0
Changelog
- delete 🎉: Remove the example code run.go
- refactor 🎨: Optimize the logging method and use log uniformly Replace log with Info Println
- fix 🐛: Fix function call error for obtaining local host IP
- refactor🎨: remove unused distributed lock setup code in initialize.go
- fix🐛: include captcha answer in GenerateCaptchaHandler for improved logging
- fix🐛: improve error logging in jobbase.go for better clarity
- refactor🎨: update go version 1.24
v2.1.2
Changelog
- fix🐛: Fix the problem that el-popconfirm does not take effect @wenjianzhang
- fix🐛: Known bug fixes
v2.1.1
Changelog
- perf 👌: upgrade gin 1.9.1 @wenjianzhang
- perf👌: Remove unused attributes @wenjianzhang
- perf👌: Optimize go warnings @wenjianzhang
- fix🐛: Known bug fixes @wenjianzhang
v2.1.0
Changelog
- feat ✨: upgrade go1.18 @wenjianzhang
- perf 👌: update casbin gorm adapter @wenjianzhang
- perf 👌: remove casbin sys_ @ wenjianzhang
- perf 👌: upgrade gorm,casbin,gin,uuid version @wenjianzhang
- refactor 🎨: errors add go mod @wenjianzhang
- refactor 🎨: update 1599190683659_ tables.go @Vingurzhou
- refactor 🎨: reload policy policy after role creation and update @wenjianzhang
- refactor 🎨: add menu paths default data @wenjianzhang
- refactor 🎨: delete template middleware duplicate initialization code @zyd
- refactor 🎨: catch exception return error message @zyd
- docs 📝: add development environment requirements @wenjianzhang
- docs 📝: write dockerfile startup script @haimat
- config 🔧: set DB CHARSET utf8mb4(#674) @wenjianzhang
- config 🔧: modify the instruction createapp to app @wenjianzhang
- fix 🐛: customized error middleware bug fix @wenjianzhang
- fix 🐛: the path in the menu is not set to fix the problem. @wenjianzhang
- fix 🐛: fix rolemenu @wenjianzhang
- fix 🐛: fix github.com/alibaba/sentinel-golang middleware(#679) @wenjianzhang
- fix 🐛: add MySQL judgment in data migration @wenjianzhang
- fix 🐛: delete template middleware duplicate initialization code @wenjianzhang
- fix 🐛: fix rolemenu @zhangzhenlun
- fix 🐛: Fix menu interface menurole with incomplete data (# 676) @wenjianzhang
- fix 🐛: Fix template get update delete error @zyd
- fix 🐛: Repair role creation prompt empty slice found (#687) @wenjianzhang
- fix 🐛: Fix create when creating a new create_ by Problem with by value of 0 (#688) @wenjianzhang
- fix 🐛: Handling Postgre startup error issues @infnan
- fix 🐛: Remove excess spaces from the template @zyd
- fix 🐛: fix sys_ router && add swag commond @NaturalGao
- fix 🐛: fix Sidebar Menu Sorting Problem (690) @wenjianzhang
- fix 🐛: fix elegant restart does not take effect @quanbisen
- fix 🐛: fix bug in filtering log creation time and reporting errors @haimat
- fix 🐛: sort parameters must receive using string @zyd
- fix 🐛: template Update method, err has not been assigned a value, and the returned err will always be nil @zyd
- fix 🐛: e. The err output from Log. Errorf ("db error:% s", err) has not been assigned a value of @zhaodongdong
- fix 🐛: update README @xiaobo
- fix 🐛: fix the bug where ordinary users cannot modify their personal information (nickname, user password) when only using query permissions. @wenyoufu