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}")