From 0bfe6f9d8c6af5a6dd99f4d46405097d2d22357c Mon Sep 17 00:00:00 2001 From: bwstudio Date: Sun, 6 Sep 2026 21:34:37 +0800 Subject: [PATCH] =?UTF-8?q?fix(script):=20admin=20init=20=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E6=8F=92=E5=85=A5=E7=A7=8D=E5=AD=90=E5=AF=BC=E8=88=AA?= =?UTF-8?q?=EF=BC=8C=E6=94=B9=E4=B8=BA=E6=8C=89=20url=20=E5=B9=82=E7=AD=89?= =?UTF-8?q?=E5=8E=BB=E9=87=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原 nav 导入条件 `if not Nav.query.get(id) if id else True` 对无 id 的种子项 永远为 True,导致每次容器启动 flask admin init 都重复插入 54 条种子导航, 与真实数据叠加产生重复。改为按 id 或 url 去重,已存在则跳过。 --- applications/common/script/admin.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/applications/common/script/admin.py b/applications/common/script/admin.py index a13d65a..625fcc7 100644 --- a/applications/common/script/admin.py +++ b/applications/common/script/admin.py @@ -137,14 +137,23 @@ def import_logic(file_path, is_force): user.role = roles db.session.commit() - # 5. 导入公开导航(Nav 表) + # 5. 导入公开导航(Nav 表)—— 幂等:按 id 或 url 去重,避免每次启动重复插入 from applications.models import Nav count_nav = 0 + existing_urls = {row[0] for row in db.session.query(Nav.url).all()} for item in raw_data.get("navs", []): item = parse_time(item) - if not Nav.query.get(item.get('id')) if item.get('id') else True: - db.session.add(Nav(**item)) - count_nav += 1 + # 已存在相同主键 id 则跳过 + if item.get("id") and Nav.query.get(item["id"]): + continue + # 已存在相同 url 则跳过(典型场景:用户真实导航已覆盖种子数据,避免重复) + url = item.get("url") + if url and url in existing_urls: + continue + db.session.add(Nav(**item)) + count_nav += 1 + if url: + existing_urls.add(url) db.session.commit() click.echo(f"导入成功! 新增: 部门{count_dept}, 权限{count_power}, 角色{count_role}, 用户{count_user}, 导航{count_nav}")