From 9586c7467aeab14ed839c07319cd057043180009 Mon Sep 17 00:00:00 2001 From: jayhgq Date: Mon, 20 Jul 2026 08:33:51 +0000 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=E8=8F=9C=E5=8D=95=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=B7=BB=E5=8A=A0=E6=8E=92=E5=BA=8F=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Permission 模型新增 sort 字段 - 后端 API 按 sort 升序排列树形菜单 - 前端菜单管理页面增加排序列 - 初始数据添加排序号 - 修复 GET /permissions/{id} 详情接口 bug Co-Authored-By: Claude Opus 4.8 --- backend/auth/apps/permissions/urls.py | 39 +- backend/auth/init_data.py | 903 +++++++++--------- backend/auth/main.py | 354 +++---- backend/auth/models.py | 279 +++--- backend/auth/schemas.py | 670 ++++++------- .../views/permissions/permission-crud.ts | 364 +++---- 6 files changed, 1334 insertions(+), 1275 deletions(-) diff --git a/backend/auth/apps/permissions/urls.py b/backend/auth/apps/permissions/urls.py index f9fec4e..30acde6 100644 --- a/backend/auth/apps/permissions/urls.py +++ b/backend/auth/apps/permissions/urls.py @@ -44,7 +44,9 @@ async def create_permission( name=permission_data.name, code=permission_data.code, parentid=permission_data.parentid, + route=permission_data.route, description=permission_data.description, + sort=permission_data.sort, ) db.add(db_permission) @@ -112,6 +114,7 @@ async def get_permission_tree( "parentid": perm.parentid, "route": perm.route, "description": perm.description, + "sort": perm.sort or 0, "createtime": perm.createtime, "updatetime": perm.updatetime, "children": [] @@ -128,6 +131,16 @@ async def get_permission_tree( # 子节点,添加到父节点的 children perm_dict[parentid]["children"].append(perm_data) + # 递归排序:按 sort 字段升序排列 + def sort_tree(nodes): + nodes.sort(key=lambda n: n.get("sort", 0)) + for node in nodes: + if node.get("children"): + sort_tree(node["children"]) + return nodes + + tree = sort_tree(tree) + # 记录查询日志 await create_operation_log( db, current_user.id, current_user.username, "search", "permission", @@ -187,6 +200,7 @@ async def get_menu( "parentid": perm.parentid, "route": perm.route, "description": perm.description, + "sort": perm.sort or 0, "createtime": perm.createtime, "updatetime": perm.updatetime, "children": [] @@ -203,6 +217,16 @@ async def get_menu( # 子节点,添加到父节点的 children perm_dict[parentid]["children"].append(perm_data) + # 递归排序:按 sort 字段升序排列 + def sort_tree(nodes): + nodes.sort(key=lambda n: n.get("sort", 0)) + for node in nodes: + if node.get("children"): + sort_tree(node["children"]) + return nodes + + tree = sort_tree(tree) + # 记录查询日志 await create_operation_log( db, current_user.id, current_user.username, "search", "permission", @@ -222,7 +246,7 @@ async def get_permission( current_user: User = Depends(get_current_user), ): """获取单个权限""" - permission = await permission_crud.get(db, id=permission_id) + permission = await permission_crud.get(db, id=permission_id, schema_to_select=PermissionResponse, return_as_model=True) if not permission: raise HTTPException(status_code=404, detail="权限不存在") @@ -271,7 +295,7 @@ async def update_permission( raise HTTPException(status_code=404, detail="权限不存在") # 记录操作日志 changed = {} - for field in ["name", "code", "parentid", "description"]: + for field in ["name", "code", "parentid", "route", "sort", "description"]: old_val = getattr(old_permission, field, None) new_val = update_data.get(field) if old_val != new_val: @@ -452,6 +476,7 @@ async def get_current_user_permissions( "parentid": perm.parentid, "route": perm.route, "description": perm.description, + "sort": perm.sort or 0, "createtime": perm.createtime, "updatetime": perm.updatetime, "children": [] @@ -468,6 +493,16 @@ async def get_current_user_permissions( # 子节点,添加到父节点的 children perm_dict[parentid]["children"].append(perm_data) + # 递归排序:按 sort 字段升序排列 + def sort_tree(nodes): + nodes.sort(key=lambda n: n.get("sort", 0)) + for node in nodes: + if node.get("children"): + sort_tree(node["children"]) + return nodes + + menu_tree = sort_tree(menu_tree) + # 记录查询日志 await create_operation_log( db, current_user.id, current_user.username, "search", "permission", diff --git a/backend/auth/init_data.py b/backend/auth/init_data.py index a6db11e..85a0096 100644 --- a/backend/auth/init_data.py +++ b/backend/auth/init_data.py @@ -1,452 +1,451 @@ -from sqlalchemy.ext.asyncio import AsyncSession -from sqlalchemy import select, text -from models import Role, User, Permission, SystemSetting -from utils.password import get_password_hash - - -async def init_permissions(db: AsyncSession): - """初始化权限数据(树形结构)""" - # 定义需要初始化的权限(树形结构) - # parentid: 0 = 顶级模块, >0 = 子权限 - permission_tree = [ - # ======================================== - # 顶级模块 (DB ID: 1,2,3) - # ======================================== - {"name": "权限管理", "code": "perm", "parentid": 0, "route": "/admin/permissions", "description": "权限管理模块"}, - {"name": "系统设置", "code": "system", "parentid": 0, "route": "/admin/settings", "description": "系统设置模块"}, - {"name": "日志管理", "code": "log", "parentid": 0, "route": "/admin/logs", "description": "日志管理模块"}, - - # ======================================== - # 权限管理 -> 二级子模块 (parentid=1, DB ID: 4,5,6) - # ======================================== - {"name": "用户管理", "code": "perm:user", "parentid": 1, "route": "/admin/users", "description": "用户管理子模块"}, - {"name": "角色管理", "code": "perm:role", "parentid": 1, "route": "/admin/roles", "description": "角色管理子模块"}, - {"name": "菜单管理", "code": "perm:menu", "parentid": 1, "route": "/admin/menu", "description": "菜单管理子模块"}, - - # ======================================== - # 用户管理操作 (parentid=4, DB ID: 7-14) - # ======================================== - {"name": "查看列表", "code": "perm:user:list", "parentid": 4, "description": "查看用户列表"}, - {"name": "查看详情", "code": "perm:user:detail", "parentid": 4, "description": "查看用户详情"}, - {"name": "搜索", "code": "perm:user:search", "parentid": 4, "description": "搜索用户"}, - {"name": "创建", "code": "perm:user:create", "parentid": 4, "description": "创建新用户"}, - {"name": "编辑", "code": "perm:user:edit", "parentid": 4, "description": "编辑用户信息"}, - {"name": "删除", "code": "perm:user:delete", "parentid": 4, "description": "删除用户"}, - {"name": "导出", "code": "perm:user:export", "parentid": 4, "description": "导出用户数据"}, - {"name": "批量操作", "code": "perm:user:batch", "parentid": 4, "description": "批量操作用户"}, - - # ======================================== - # 角色管理操作 (parentid=5, DB ID: 15-22) - # ======================================== - {"name": "查看列表", "code": "perm:role:list", "parentid": 5, "description": "查看角色列表"}, - {"name": "查看详情", "code": "perm:role:detail", "parentid": 5, "description": "查看角色详情"}, - {"name": "搜索", "code": "perm:role:search", "parentid": 5, "description": "搜索角色"}, - {"name": "创建", "code": "perm:role:create", "parentid": 5, "description": "创建新角色"}, - {"name": "编辑", "code": "perm:role:edit", "parentid": 5, "description": "编辑角色信息"}, - {"name": "删除", "code": "perm:role:delete", "parentid": 5, "description": "删除角色"}, - {"name": "导出", "code": "perm:role:export", "parentid": 5, "description": "导出角色数据"}, - {"name": "分配权限", "code": "perm:role:assign", "parentid": 5, "description": "为角色分配权限"}, - - # ======================================== - # 菜单管理操作 (parentid=6, DB ID: 23-29) - # ======================================== - {"name": "查看列表", "code": "perm:menu:list", "parentid": 6, "description": "查看菜单列表"}, - {"name": "查看详情", "code": "perm:menu:detail", "parentid": 6, "description": "查看菜单详情"}, - {"name": "搜索", "code": "perm:menu:search", "parentid": 6, "description": "搜索菜单"}, - {"name": "创建", "code": "perm:menu:create", "parentid": 6, "description": "创建新菜单"}, - {"name": "编辑", "code": "perm:menu:edit", "parentid": 6, "description": "编辑菜单信息"}, - {"name": "删除", "code": "perm:menu:delete", "parentid": 6, "description": "删除菜单"}, - {"name": "导出", "code": "perm:menu:export", "parentid": 6, "description": "导出菜单数据"}, - - # ======================================== - # 系统设置 -> 子权限 (parentid=2, DB ID: 30) - # ======================================== - {"name": "系统设置", "code": "system:view", "parentid": 2, "description": "查看和修改系统设置"}, - - # ======================================== - # 日志管理 -> 子模块 (parentid=3, DB ID: 31,32) - # ======================================== - {"name": "登录日志", "code": "log:login", "parentid": 3, "route": "/admin/login-logs", "description": "登录日志查看"}, - {"name": "操作日志", "code": "log:operation", "parentid": 3, "route": "/admin/operation-logs", "description": "操作日志查看"}, - - # ======================================== - # 登录日志操作 (parentid=31, DB ID: 33,34) - # ======================================== - {"name": "查看列表", "code": "log:login:list", "parentid": 31, "description": "查看登录日志列表"}, - {"name": "搜索", "code": "log:login:search", "parentid": 31, "description": "搜索登录日志"}, - - # ======================================== - # 操作日志操作 (parentid=32, DB ID: 35,36) - # ======================================== - {"name": "查看列表", "code": "log:operation:list", "parentid": 32, "description": "查看操作日志列表"}, - {"name": "搜索", "code": "log:operation:search", "parentid": 32, "description": "搜索操作日志"}, - - # ======================================== - # 日志清理 (parentid=3, DB ID: 37) - # ======================================== - {"name": "清理日志", "code": "log:clean", "parentid": 3, "description": "清理旧日志"}, - ] - - # 检查现有权限 - result = await db.execute(select(Permission)) - existing_permissions = result.scalars().all() - existing_permission_codes = {perm.code: perm for perm in existing_permissions} - - # 创建或更新权限 - created_count = 0 - updated_count = 0 - - for perm_data in permission_tree: - perm_code = perm_data["code"] - if perm_code not in existing_permission_codes: - # 权限不存在,需要创建 - db.add(Permission(**perm_data)) - created_count += 1 - else: - # 权限存在,检查是否需要更新 - existing_perm = existing_permission_codes[perm_code] - update_needed = False - - if existing_perm.name != perm_data["name"]: - existing_perm.name = perm_data["name"] - update_needed = True - if existing_perm.parentid != perm_data["parentid"]: - existing_perm.parentid = perm_data["parentid"] - update_needed = True - if existing_perm.route != perm_data.get("route"): - existing_perm.route = perm_data.get("route") - update_needed = True - if existing_perm.description != perm_data["description"]: - existing_perm.description = perm_data["description"] - update_needed = True - - if update_needed: - updated_count += 1 - - if created_count > 0 or updated_count > 0: - await db.commit() - print(f"创建了 {created_count} 个权限,更新了 {updated_count} 个权限") - else: - print("权限数据已存在且无需更新,跳过初始化") - - print("权限数据初始化/更新完成") - - -async def init_role_permissions(db: AsyncSession): - """初始化角色权限分配""" - from sqlalchemy.orm import selectinload - - # 获取管理员角色(使用预加载避免懒加载问题) - result = await db.execute( - select(Role) - .filter(Role.name == "管理员") - .options(selectinload(Role.permissions)) - ) - admin_role = result.scalar_one_or_none() - if not admin_role: - print("管理员角色不存在,请先初始化角色数据") - return - - # 获取所有权限 - result = await db.execute(select(Permission)) - all_permissions = result.scalars().all() - - if not all_permissions: - print("没有找到任何权限,请先初始化权限数据") - return - - # 获取管理员角色当前的权限(使用预加载的数据) - admin_permission_codes = set() - if admin_role.permissions: - admin_permission_codes = {perm.code for perm in admin_role.permissions} - - # 检查是否需要添加权限 - permissions_to_add = [] - for perm in all_permissions: - if perm.code not in admin_permission_codes: - permissions_to_add.append(perm) - - if permissions_to_add: - # 直接设置权限(替换而非追加,确保权限完整) - admin_role.permissions = all_permissions - await db.commit() - print(f"为管理员角色分配了 {len(permissions_to_add)} 个权限") - else: - print("管理员角色权限已完整,无需更新") - - print("角色权限初始化/更新完成") - - -async def init_roles(db: AsyncSession): - """初始化角色数据""" - # 定义需要初始化的角色 - required_roles = [ - {"name": "管理员", "creator": "system"}, - {"name": "普通用户", "creator": "system"}, - {"name": "访客", "creator": "system"}, - {"name": "会员", "creator": "system"}, - ] - - # 检查现有角色 - result = await db.execute(select(Role)) - existing_roles = result.scalars().all() - existing_role_names = {role.name for role in existing_roles} - - # 检查需要创建或更新的角色 - roles_to_add = [] - roles_to_update = [] - - for role_data in required_roles: - role_name = role_data["name"] - if role_name not in existing_role_names: - # 角色不存在,需要创建 - roles_to_add.append(Role(**role_data)) - else: - # 角色存在,检查是否需要更新 - existing_role = next( - role for role in existing_roles if role.name == role_name - ) - if existing_role.creator != role_data["creator"]: - # 需要更新 - existing_role.creator = role_data["creator"] - roles_to_update.append(existing_role) - - # 执行创建和更新操作 - if roles_to_add: - for role in roles_to_add: - db.add(role) - await db.commit() - print(f"创建了 {len(roles_to_add)} 个角色") - - if roles_to_update: - await db.commit() - print(f"更新了 {len(roles_to_update)} 个角色") - - if not roles_to_add and not roles_to_update: - print("角色数据已存在且无需更新,跳过初始化") - - print("角色数据初始化/更新完成") - - -async def init_admin_user(db: AsyncSession): - """初始化管理员用户""" - # 获取管理员角色 - result = await db.execute(select(Role).filter(Role.name == "管理员")) - admin_role = result.scalar_one_or_none() - if not admin_role: - print("管理员角色不存在,请先初始化角色数据") - return - - # 定义需要的管理员用户数据 - admin_data = { - "username": "admin", - "nickname": "系统管理员", - "email": "admin@example.com", - "phone": "13800138000", - "password_hash": get_password_hash("admin"), - "role_id": admin_role.id, - "avatar": "", - "wx_openid": "", - } - - # 检查管理员用户是否存在 - result = await db.execute(select(User).filter(User.username == "admin")) - existing_admin = result.scalar_one_or_none() - - if not existing_admin: - # 管理员不存在,创建 - admin_user = User(**admin_data) - db.add(admin_user) - await db.commit() - print("创建了管理员用户") - else: - # 管理员存在,检查是否需要更新 - update_needed = False - - # 检查字段是否需要更新(不包括密码,因为密码只在首次创建时设置) - if existing_admin.nickname != admin_data["nickname"]: - existing_admin.nickname = admin_data["nickname"] - update_needed = True - if existing_admin.email != admin_data["email"]: - existing_admin.email = admin_data["email"] - update_needed = True - if existing_admin.phone != admin_data["phone"]: - existing_admin.phone = admin_data["phone"] - update_needed = True - if existing_admin.role_id != admin_data["role_id"]: - existing_admin.role_id = admin_data["role_id"] - update_needed = True - if existing_admin.avatar != admin_data["avatar"]: - existing_admin.avatar = admin_data["avatar"] - update_needed = True - if existing_admin.wx_openid != admin_data["wx_openid"]: - existing_admin.wx_openid = admin_data["wx_openid"] - update_needed = True - - if update_needed: - await db.commit() - print("更新了管理员用户") - else: - print("管理员用户已存在且无需更新,跳过初始化") - - print("管理员用户初始化/更新完成") - - -async def init_test_user(db: AsyncSession): - """初始化测试用户""" - # 获取普通用户角色 - result = await db.execute(select(Role).filter(Role.name == "普通用户")) - user_role = result.scalar_one_or_none() - if not user_role: - print("普通用户角色不存在,请先初始化角色数据") - return - - # 定义需要的测试用户数据 - test_data = { - "username": "test", - "nickname": "测试用户", - "email": "test@example.com", - "phone": "13800138001", - "password_hash": get_password_hash("test"), - "role_id": user_role.id, - "avatar": "", - "wx_openid": "", - } - - # 检查测试用户是否存在 - result = await db.execute(select(User).filter(User.username == "test")) - existing_test_user = result.scalar_one_or_none() - - if not existing_test_user: - # 测试用户不存在,创建 - test_user = User(**test_data) - db.add(test_user) - await db.commit() - print("创建了测试用户") - else: - # 测试用户存在,检查是否需要更新 - update_needed = False - - # 检查字段是否需要更新(不包括密码,因为密码只在首次创建时设置) - if existing_test_user.nickname != test_data["nickname"]: - existing_test_user.nickname = test_data["nickname"] - update_needed = True - if existing_test_user.email != test_data["email"]: - existing_test_user.email = test_data["email"] - update_needed = True - if existing_test_user.phone != test_data["phone"]: - existing_test_user.phone = test_data["phone"] - update_needed = True - if existing_test_user.role_id != test_data["role_id"]: - existing_test_user.role_id = test_data["role_id"] - update_needed = True - if existing_test_user.avatar != test_data["avatar"]: - existing_test_user.avatar = test_data["avatar"] - update_needed = True - if existing_test_user.wx_openid != test_data["wx_openid"]: - existing_test_user.wx_openid = test_data["wx_openid"] - update_needed = True - - if update_needed: - await db.commit() - print("更新了测试用户") - else: - print("测试用户已存在且无需更新,跳过初始化") - - print("测试用户初始化/更新完成") - - -async def init_system_settings(db: AsyncSession): - """初始化系统设置数据""" - # 定义需要初始化的系统设置 - system_settings = [ - { - "key": "系统标题", - "value": "图书管理系统", - "type": "string", - "description": "系统显示标题" - }, - { - "key": "页脚信息", - "value": "Copyright © 2026 图书管理系统 版权所有 | 技术支持:强蕊科技", - "type": "string", - "description": "页脚信息" - }, - { - "key": "ICP信息", - "value": "京ICP备2023000000号", - "type": "string", - "description": "ICP备案信息" - }, - { - "key": "启用手机短信注册", - "value": "false", - "type": "boolean", - "description": "是否允许通过手机短信验证码注册" - }, - { - "key": "启用邮箱注册", - "value": "false", - "type": "boolean", - "description": "是否允许通过邮箱验证链接注册" - }, - { - "key": "系统Logo", - "value": "", - "type": "image", - "description": "系统Logo图片" - } - ] - - # 检查现有系统设置 - result = await db.execute(select(SystemSetting)) - existing_settings = result.scalars().all() - existing_setting_keys = {setting.key: setting for setting in existing_settings} - - # 创建或更新系统设置 - created_count = 0 - updated_count = 0 - - for setting_data in system_settings: - setting_key = setting_data["key"] - if setting_key not in existing_setting_keys: - # 设置不存在,需要创建 - db.add(SystemSetting(**setting_data)) - created_count += 1 - else: - # 设置存在,检查是否需要更新 - existing_setting = existing_setting_keys[setting_key] - update_needed = False - - if existing_setting.value != setting_data["value"]: - existing_setting.value = setting_data["value"] - update_needed = True - if existing_setting.type != setting_data["type"]: - existing_setting.type = setting_data["type"] - update_needed = True - if existing_setting.description != setting_data.get("description"): - existing_setting.description = setting_data.get("description") - update_needed = True - - if update_needed: - updated_count += 1 - - if created_count > 0 or updated_count > 0: - await db.commit() - print(f"创建了 {created_count} 个系统设置,更新了 {updated_count} 个系统设置") - else: - print("系统设置数据已存在且无需更新,跳过初始化") - - print("系统设置数据初始化/更新完成") - - -async def init_all_data(db: AsyncSession): - """初始化所有数据""" - print("开始初始化数据库数据...") - await init_roles(db) - await init_permissions(db) - await init_role_permissions(db) - await init_admin_user(db) - await init_test_user(db) - await init_system_settings(db) - print("数据库数据初始化完成") +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, text +from models import Role, User, Permission, SystemSetting +from utils.password import get_password_hash + + +async def init_permissions(db: AsyncSession): + """初始化权限数据(树形结构)""" + # 定义需要初始化的权限(树形结构) + # parentid: 0 = 顶级模块, >0 = 子权限 + permission_tree = [ + # ======================================== + # 顶级模块 (DB ID: 1,2,3) + # ======================================== + {"name": "权限管理", "code": "perm", "parentid": 0, "route": "/admin/permissions", "description": "权限管理模块", "sort": 1}, + {"name": "系统设置", "code": "system", "parentid": 0, "route": "/admin/settings", "description": "系统设置模块", "sort": 2}, + {"name": "日志管理", "code": "log", "parentid": 0, "route": "/admin/logs", "description": "日志管理模块", "sort": 3}, + + # ======================================== + # 权限管理 -> 二级子模块 (parentid=1, DB ID: 4,5,6) + # ======================================== + {"name": "用户管理", "code": "perm:user", "parentid": 1, "route": "/admin/users", "description": "用户管理子模块", "sort": 1}, + {"name": "角色管理", "code": "perm:role", "parentid": 1, "route": "/admin/roles", "description": "角色管理子模块", "sort": 2}, + {"name": "菜单管理", "code": "perm:menu", "parentid": 1, "route": "/admin/menu", "description": "菜单管理子模块", "sort": 3}, + + # ======================================== + # 用户管理操作 (parentid=4, DB ID: 7-14) + # ======================================== + {"name": "查看列表", "code": "perm:user:list", "parentid": 4, "description": "查看用户列表", "sort": 1}, + {"name": "查看详情", "code": "perm:user:detail", "parentid": 4, "description": "查看用户详情", "sort": 2}, + {"name": "搜索", "code": "perm:user:search", "parentid": 4, "description": "搜索用户", "sort": 3}, + {"name": "创建", "code": "perm:user:create", "parentid": 4, "description": "创建新用户", "sort": 4}, + {"name": "编辑", "code": "perm:user:edit", "parentid": 4, "description": "编辑用户信息", "sort": 5}, + {"name": "删除", "code": "perm:user:delete", "parentid": 4, "description": "删除用户", "sort": 6}, + {"name": "导出", "code": "perm:user:export", "parentid": 4, "description": "导出用户数据", "sort": 7}, + {"name": "批量操作", "code": "perm:user:batch", "parentid": 4, "description": "批量操作用户", "sort": 8}, + + # ======================================== + # 角色管理操作 (parentid=5, DB ID: 15-22) + # ======================================== + {"name": "查看列表", "code": "perm:role:list", "parentid": 5, "description": "查看角色列表", "sort": 1}, + {"name": "查看详情", "code": "perm:role:detail", "parentid": 5, "description": "查看角色详情", "sort": 2}, + {"name": "搜索", "code": "perm:role:search", "parentid": 5, "description": "搜索角色", "sort": 3}, + {"name": "创建", "code": "perm:role:create", "parentid": 5, "description": "创建新角色", "sort": 4}, + {"name": "编辑", "code": "perm:role:edit", "parentid": 5, "description": "编辑角色信息", "sort": 5}, + {"name": "删除", "code": "perm:role:delete", "parentid": 5, "description": "删除角色", "sort": 6}, + {"name": "导出", "code": "perm:role:export", "parentid": 5, "description": "导出角色数据", "sort": 7}, + {"name": "分配权限", "code": "perm:role:assign", "parentid": 5, "description": "为角色分配权限", "sort": 8}, + + # ======================================== + # 菜单管理操作 (parentid=6, DB ID: 23-29) + # ======================================== + {"name": "查看列表", "code": "perm:menu:list", "parentid": 6, "description": "查看菜单列表", "sort": 1}, + {"name": "查看详情", "code": "perm:menu:detail", "parentid": 6, "description": "查看菜单详情", "sort": 2}, + {"name": "搜索", "code": "perm:menu:search", "parentid": 6, "description": "搜索菜单", "sort": 3}, + {"name": "创建", "code": "perm:menu:create", "parentid": 6, "description": "创建新菜单", "sort": 4}, + {"name": "编辑", "code": "perm:menu:edit", "parentid": 6, "description": "编辑菜单信息", "sort": 5}, + {"name": "删除", "code": "perm:menu:delete", "parentid": 6, "description": "删除菜单", "sort": 6}, + {"name": "导出", "code": "perm:menu:export", "parentid": 6, "description": "导出菜单数据", "sort": 7}, + + # ======================================== + # 系统设置 -> 子权限 (parentid=2, DB ID: 30) + # ======================================== + {"name": "系统设置", "code": "system:view", "parentid": 2, "description": "查看和修改系统设置", "sort": 1}, + + # ======================================== + # 日志管理 -> 子模块 (parentid=3, DB ID: 31,32,37) + # ======================================== + {"name": "登录日志", "code": "log:login", "parentid": 3, "route": "/admin/login-logs", "description": "登录日志查看", "sort": 1}, + {"name": "操作日志", "code": "log:operation", "parentid": 3, "route": "/admin/operation-logs", "description": "操作日志查看", "sort": 2}, + {"name": "清理日志", "code": "log:clean", "parentid": 3, "description": "清理旧日志", "sort": 3}, + + # ======================================== + # 登录日志操作 (parentid=31, DB ID: 33,34) + # ======================================== + {"name": "查看列表", "code": "log:login:list", "parentid": 31, "description": "查看登录日志列表", "sort": 1}, + {"name": "搜索", "code": "log:login:search", "parentid": 31, "description": "搜索登录日志", "sort": 2}, + + # ======================================== + # 操作日志操作 (parentid=32, DB ID: 35,36) + # ======================================== + {"name": "查看列表", "code": "log:operation:list", "parentid": 32, "description": "查看操作日志列表", "sort": 1}, + {"name": "搜索", "code": "log:operation:search", "parentid": 32, "description": "搜索操作日志", "sort": 2}, + ] + + # 检查现有权限 + result = await db.execute(select(Permission)) + existing_permissions = result.scalars().all() + existing_permission_codes = {perm.code: perm for perm in existing_permissions} + + # 创建或更新权限 + created_count = 0 + updated_count = 0 + + for perm_data in permission_tree: + perm_code = perm_data["code"] + if perm_code not in existing_permission_codes: + # 权限不存在,需要创建 + db.add(Permission(**perm_data)) + created_count += 1 + else: + # 权限存在,检查是否需要更新 + existing_perm = existing_permission_codes[perm_code] + update_needed = False + + if existing_perm.name != perm_data["name"]: + existing_perm.name = perm_data["name"] + update_needed = True + if existing_perm.parentid != perm_data["parentid"]: + existing_perm.parentid = perm_data["parentid"] + update_needed = True + if existing_perm.route != perm_data.get("route"): + existing_perm.route = perm_data.get("route") + update_needed = True + if existing_perm.description != perm_data["description"]: + existing_perm.description = perm_data["description"] + update_needed = True + if existing_perm.sort != perm_data.get("sort", 0): + existing_perm.sort = perm_data.get("sort", 0) + update_needed = True + + if update_needed: + updated_count += 1 + + if created_count > 0 or updated_count > 0: + await db.commit() + print(f"创建了 {created_count} 个权限,更新了 {updated_count} 个权限") + else: + print("权限数据已存在且无需更新,跳过初始化") + + print("权限数据初始化/更新完成") + + +async def init_role_permissions(db: AsyncSession): + """初始化角色权限分配""" + from sqlalchemy.orm import selectinload + + # 获取管理员角色(使用预加载避免懒加载问题) + result = await db.execute( + select(Role) + .filter(Role.name == "管理员") + .options(selectinload(Role.permissions)) + ) + admin_role = result.scalar_one_or_none() + if not admin_role: + print("管理员角色不存在,请先初始化角色数据") + return + + # 获取所有权限 + result = await db.execute(select(Permission)) + all_permissions = result.scalars().all() + + if not all_permissions: + print("没有找到任何权限,请先初始化权限数据") + return + + # 获取管理员角色当前的权限(使用预加载的数据) + admin_permission_codes = set() + if admin_role.permissions: + admin_permission_codes = {perm.code for perm in admin_role.permissions} + + # 检查是否需要添加权限 + permissions_to_add = [] + for perm in all_permissions: + if perm.code not in admin_permission_codes: + permissions_to_add.append(perm) + + if permissions_to_add: + # 直接设置权限(替换而非追加,确保权限完整) + admin_role.permissions = all_permissions + await db.commit() + print(f"为管理员角色分配了 {len(permissions_to_add)} 个权限") + else: + print("管理员角色权限已完整,无需更新") + + print("角色权限初始化/更新完成") + + +async def init_roles(db: AsyncSession): + """初始化角色数据""" + # 定义需要初始化的角色 + required_roles = [ + {"name": "管理员", "creator": "system"}, + {"name": "普通用户", "creator": "system"}, + {"name": "访客", "creator": "system"}, + {"name": "会员", "creator": "system"}, + ] + + # 检查现有角色 + result = await db.execute(select(Role)) + existing_roles = result.scalars().all() + existing_role_names = {role.name for role in existing_roles} + + # 检查需要创建或更新的角色 + roles_to_add = [] + roles_to_update = [] + + for role_data in required_roles: + role_name = role_data["name"] + if role_name not in existing_role_names: + # 角色不存在,需要创建 + roles_to_add.append(Role(**role_data)) + else: + # 角色存在,检查是否需要更新 + existing_role = next( + role for role in existing_roles if role.name == role_name + ) + if existing_role.creator != role_data["creator"]: + # 需要更新 + existing_role.creator = role_data["creator"] + roles_to_update.append(existing_role) + + # 执行创建和更新操作 + if roles_to_add: + for role in roles_to_add: + db.add(role) + await db.commit() + print(f"创建了 {len(roles_to_add)} 个角色") + + if roles_to_update: + await db.commit() + print(f"更新了 {len(roles_to_update)} 个角色") + + if not roles_to_add and not roles_to_update: + print("角色数据已存在且无需更新,跳过初始化") + + print("角色数据初始化/更新完成") + + +async def init_admin_user(db: AsyncSession): + """初始化管理员用户""" + # 获取管理员角色 + result = await db.execute(select(Role).filter(Role.name == "管理员")) + admin_role = result.scalar_one_or_none() + if not admin_role: + print("管理员角色不存在,请先初始化角色数据") + return + + # 定义需要的管理员用户数据 + admin_data = { + "username": "admin", + "nickname": "系统管理员", + "email": "admin@example.com", + "phone": "13800138000", + "password_hash": get_password_hash("admin"), + "role_id": admin_role.id, + "avatar": "", + "wx_openid": "", + } + + # 检查管理员用户是否存在 + result = await db.execute(select(User).filter(User.username == "admin")) + existing_admin = result.scalar_one_or_none() + + if not existing_admin: + # 管理员不存在,创建 + admin_user = User(**admin_data) + db.add(admin_user) + await db.commit() + print("创建了管理员用户") + else: + # 管理员存在,检查是否需要更新 + update_needed = False + + # 检查字段是否需要更新(不包括密码,因为密码只在首次创建时设置) + if existing_admin.nickname != admin_data["nickname"]: + existing_admin.nickname = admin_data["nickname"] + update_needed = True + if existing_admin.email != admin_data["email"]: + existing_admin.email = admin_data["email"] + update_needed = True + if existing_admin.phone != admin_data["phone"]: + existing_admin.phone = admin_data["phone"] + update_needed = True + if existing_admin.role_id != admin_data["role_id"]: + existing_admin.role_id = admin_data["role_id"] + update_needed = True + if existing_admin.avatar != admin_data["avatar"]: + existing_admin.avatar = admin_data["avatar"] + update_needed = True + if existing_admin.wx_openid != admin_data["wx_openid"]: + existing_admin.wx_openid = admin_data["wx_openid"] + update_needed = True + + if update_needed: + await db.commit() + print("更新了管理员用户") + else: + print("管理员用户已存在且无需更新,跳过初始化") + + print("管理员用户初始化/更新完成") + + +async def init_test_user(db: AsyncSession): + """初始化测试用户""" + # 获取普通用户角色 + result = await db.execute(select(Role).filter(Role.name == "普通用户")) + user_role = result.scalar_one_or_none() + if not user_role: + print("普通用户角色不存在,请先初始化角色数据") + return + + # 定义需要的测试用户数据 + test_data = { + "username": "test", + "nickname": "测试用户", + "email": "test@example.com", + "phone": "13800138001", + "password_hash": get_password_hash("test"), + "role_id": user_role.id, + "avatar": "", + "wx_openid": "", + } + + # 检查测试用户是否存在 + result = await db.execute(select(User).filter(User.username == "test")) + existing_test_user = result.scalar_one_or_none() + + if not existing_test_user: + # 测试用户不存在,创建 + test_user = User(**test_data) + db.add(test_user) + await db.commit() + print("创建了测试用户") + else: + # 测试用户存在,检查是否需要更新 + update_needed = False + + # 检查字段是否需要更新(不包括密码,因为密码只在首次创建时设置) + if existing_test_user.nickname != test_data["nickname"]: + existing_test_user.nickname = test_data["nickname"] + update_needed = True + if existing_test_user.email != test_data["email"]: + existing_test_user.email = test_data["email"] + update_needed = True + if existing_test_user.phone != test_data["phone"]: + existing_test_user.phone = test_data["phone"] + update_needed = True + if existing_test_user.role_id != test_data["role_id"]: + existing_test_user.role_id = test_data["role_id"] + update_needed = True + if existing_test_user.avatar != test_data["avatar"]: + existing_test_user.avatar = test_data["avatar"] + update_needed = True + if existing_test_user.wx_openid != test_data["wx_openid"]: + existing_test_user.wx_openid = test_data["wx_openid"] + update_needed = True + + if update_needed: + await db.commit() + print("更新了测试用户") + else: + print("测试用户已存在且无需更新,跳过初始化") + + print("测试用户初始化/更新完成") + + +async def init_system_settings(db: AsyncSession): + """初始化系统设置数据""" + # 定义需要初始化的系统设置 + system_settings = [ + { + "key": "系统标题", + "value": "图书管理系统", + "type": "string", + "description": "系统显示标题" + }, + { + "key": "页脚信息", + "value": "Copyright © 2026 图书管理系统 版权所有 | 技术支持:强蕊科技", + "type": "string", + "description": "页脚信息" + }, + { + "key": "ICP信息", + "value": "京ICP备2023000000号", + "type": "string", + "description": "ICP备案信息" + }, + { + "key": "启用手机短信注册", + "value": "false", + "type": "boolean", + "description": "是否允许通过手机短信验证码注册" + }, + { + "key": "启用邮箱注册", + "value": "false", + "type": "boolean", + "description": "是否允许通过邮箱验证链接注册" + }, + { + "key": "系统Logo", + "value": "", + "type": "image", + "description": "系统Logo图片" + } + ] + + # 检查现有系统设置 + result = await db.execute(select(SystemSetting)) + existing_settings = result.scalars().all() + existing_setting_keys = {setting.key: setting for setting in existing_settings} + + # 创建或更新系统设置 + created_count = 0 + updated_count = 0 + + for setting_data in system_settings: + setting_key = setting_data["key"] + if setting_key not in existing_setting_keys: + # 设置不存在,需要创建 + db.add(SystemSetting(**setting_data)) + created_count += 1 + else: + # 设置存在,检查是否需要更新 + existing_setting = existing_setting_keys[setting_key] + update_needed = False + + if existing_setting.value != setting_data["value"]: + existing_setting.value = setting_data["value"] + update_needed = True + if existing_setting.type != setting_data["type"]: + existing_setting.type = setting_data["type"] + update_needed = True + if existing_setting.description != setting_data.get("description"): + existing_setting.description = setting_data.get("description") + update_needed = True + + if update_needed: + updated_count += 1 + + if created_count > 0 or updated_count > 0: + await db.commit() + print(f"创建了 {created_count} 个系统设置,更新了 {updated_count} 个系统设置") + else: + print("系统设置数据已存在且无需更新,跳过初始化") + + print("系统设置数据初始化/更新完成") + + +async def init_all_data(db: AsyncSession): + """初始化所有数据""" + print("开始初始化数据库数据...") + await init_roles(db) + await init_permissions(db) + await init_role_permissions(db) + await init_admin_user(db) + await init_test_user(db) + await init_system_settings(db) + print("数据库数据初始化完成") diff --git a/backend/auth/main.py b/backend/auth/main.py index 4180034..e6f03d7 100644 --- a/backend/auth/main.py +++ b/backend/auth/main.py @@ -1,172 +1,182 @@ -from fastapi import FastAPI, HTTPException -from fastapi.middleware.cors import CORSMiddleware -from fastapi.staticfiles import StaticFiles -from fastapi.responses import HTMLResponse, FileResponse -from fastapi.exceptions import RequestValidationError -from contextlib import asynccontextmanager -from apps.urls import api_router -from apps.settings.urls import UPLOAD_DIR -from database import engine, get_db -from models import Base -from init_data import init_all_data -from pathlib import Path -from starlette.requests import Request -from starlette.responses import JSONResponse - - -@asynccontextmanager -async def lifespan(app: FastAPI): - # 启动时初始化数据库 - async with engine.begin() as conn: - # 创建所有表 - await conn.run_sync(Base.metadata.create_all) - - # 初始化数据 - async for db in get_db(): - await init_all_data(db) - break - - yield - # 关闭时的清理工作 - await engine.dispose() - - -# 实例化FastAPI -app = FastAPI( - title="图书系统授权服务API", - description="""图书系统授权服务API是一套用于用户认证和授权的服务,提供用户注册、登录、权限校验等功能。 - 同时实现了基于角色的访问控制(RBAC),支持自定义角色和权限。还增加了日志记录功能,方便监控和调试。""", - version="1.0.0", - lifespan=lifespan, - docs_url=None, - redoc_url="/redoc", -) - -# 开发环境前后端分离时的跨域(生产环境请收窄 allow_origins) -app.add_middleware( - CORSMiddleware, - allow_origins=[ - "http://localhost:5173", - "http://127.0.0.1:5173", - "http://localhost:3000", - "http://127.0.0.1:3000", - ], - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], - expose_headers=["X-Captcha-ID"], -) - -# 挂载swagger-ui静态文件目录 -swagger_ui_path = Path(__file__).parent.parent / "swagger-ui" -app.mount("/static", StaticFiles(directory=str(swagger_ui_path)), name="static") - -# 上传图片通过自定义端点提供(和 settings/urls.py 中的 UPLOAD_DIR 保持一致) -@app.get("/uploads/{filename}") -async def serve_upload(filename: str): - """提供上传的图片文件""" - file_path = UPLOAD_DIR / filename - if not file_path.exists(): - raise HTTPException(status_code=404, detail="文件不存在") - return FileResponse(str(file_path)) - - -# 自定义Swagger UI页面 -@app.get("/docs", include_in_schema=False) -async def custom_swagger_ui_html(): - html_content = """ - - - - - - Book System API - Swagger UI - - - - - -
- - - - - """ - return HTMLResponse(content=html_content) - - -# 包含路由 -app.include_router(api_router) - - -# 声明装饰器方法和路径 -@app.get("/") -# 声明装饰器函数 -async def home(): - return {"message": "Hello World!!!"} - - -# 自定义验证错误处理器 -@app.exception_handler(RequestValidationError) -async def validation_exception_handler(request: Request, exc: RequestValidationError): - errors = [] - for err in exc.errors(): - field = err.get("loc", ["unknown"])[-1] - msg = err.get("msg", "验证失败") - - if "min_length" in msg.lower(): - if field == "username": - msg = "用户名长度至少为3个字符" - elif field == "password": - msg = "密码长度至少为6个字符" - elif "max_length" in msg.lower(): - if field == "username": - msg = "用户名长度不能超过50个字符" - elif field == "password": - msg = "密码长度不能超过50个字符" - - errors.append({"field": field, "message": msg}) - - return JSONResponse( - status_code=422, - content={"code": 422, "message": "验证失败", "errors": errors} - ) - - -# 如果使用命令行启动,使用uvicorn 文件名:app --reload启动即可,下面命令就不用写 -# 如果写下面的命令,就不需要命令行启动了,直接用IDE运行即可 -if __name__ == "__main__": - import uvicorn - import os - - name = f"{os.path.splitext(os.path.basename(os.path.abspath(__file__)))[0]}:app" - uvicorn.run(name, host="0.0.0.0", port=8000, reload=True, reload_dirs=["_"]) +from fastapi import FastAPI, HTTPException +from fastapi.middleware.cors import CORSMiddleware +from fastapi.staticfiles import StaticFiles +from fastapi.responses import HTMLResponse, FileResponse +from fastapi.exceptions import RequestValidationError +from contextlib import asynccontextmanager +from apps.urls import api_router +from apps.settings.urls import UPLOAD_DIR +from database import engine, get_db +from models import Base +from init_data import init_all_data +from pathlib import Path +from starlette.requests import Request +from starlette.responses import JSONResponse +from sqlalchemy import text + + +@asynccontextmanager +async def lifespan(app: FastAPI): + # 启动时初始化数据库 + async with engine.begin() as conn: + # 创建所有表 + await conn.run_sync(Base.metadata.create_all) + # 为已有表添加 sort 列(兼容 PostgreSQL 和 SQLite) + try: + await conn.execute(text("ALTER TABLE permission ADD COLUMN IF NOT EXISTS sort INTEGER DEFAULT 0")) + except Exception: + # SQLite 不支持 IF NOT EXISTS + try: + await conn.execute(text("ALTER TABLE permission ADD COLUMN sort INTEGER DEFAULT 0")) + except Exception: + pass # 列已存在则忽略 + + # 初始化数据 + async for db in get_db(): + await init_all_data(db) + break + + yield + # 关闭时的清理工作 + await engine.dispose() + + +# 实例化FastAPI +app = FastAPI( + title="图书系统授权服务API", + description="""图书系统授权服务API是一套用于用户认证和授权的服务,提供用户注册、登录、权限校验等功能。 + 同时实现了基于角色的访问控制(RBAC),支持自定义角色和权限。还增加了日志记录功能,方便监控和调试。""", + version="1.0.0", + lifespan=lifespan, + docs_url=None, + redoc_url="/redoc", +) + +# 开发环境前后端分离时的跨域(生产环境请收窄 allow_origins) +app.add_middleware( + CORSMiddleware, + allow_origins=[ + "http://localhost:5173", + "http://127.0.0.1:5173", + "http://localhost:3000", + "http://127.0.0.1:3000", + ], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + expose_headers=["X-Captcha-ID"], +) + +# 挂载swagger-ui静态文件目录 +swagger_ui_path = Path(__file__).parent.parent / "swagger-ui" +app.mount("/static", StaticFiles(directory=str(swagger_ui_path)), name="static") + +# 上传图片通过自定义端点提供(和 settings/urls.py 中的 UPLOAD_DIR 保持一致) +@app.get("/uploads/{filename}") +async def serve_upload(filename: str): + """提供上传的图片文件""" + file_path = UPLOAD_DIR / filename + if not file_path.exists(): + raise HTTPException(status_code=404, detail="文件不存在") + return FileResponse(str(file_path)) + + +# 自定义Swagger UI页面 +@app.get("/docs", include_in_schema=False) +async def custom_swagger_ui_html(): + html_content = """ + + + + + + Book System API - Swagger UI + + + + + +
+ + + + + """ + return HTMLResponse(content=html_content) + + +# 包含路由 +app.include_router(api_router) + + +# 声明装饰器方法和路径 +@app.get("/") +# 声明装饰器函数 +async def home(): + return {"message": "Hello World!!!"} + + +# 自定义验证错误处理器 +@app.exception_handler(RequestValidationError) +async def validation_exception_handler(request: Request, exc: RequestValidationError): + errors = [] + for err in exc.errors(): + field = err.get("loc", ["unknown"])[-1] + msg = err.get("msg", "验证失败") + + if "min_length" in msg.lower(): + if field == "username": + msg = "用户名长度至少为3个字符" + elif field == "password": + msg = "密码长度至少为6个字符" + elif "max_length" in msg.lower(): + if field == "username": + msg = "用户名长度不能超过50个字符" + elif field == "password": + msg = "密码长度不能超过50个字符" + + errors.append({"field": field, "message": msg}) + + return JSONResponse( + status_code=422, + content={"code": 422, "message": "验证失败", "errors": errors} + ) + + +# 如果使用命令行启动,使用uvicorn 文件名:app --reload启动即可,下面命令就不用写 +# 如果写下面的命令,就不需要命令行启动了,直接用IDE运行即可 +if __name__ == "__main__": + import uvicorn + import os + + name = f"{os.path.splitext(os.path.basename(os.path.abspath(__file__)))[0]}:app" + uvicorn.run(name, host="0.0.0.0", port=8000, reload=True, reload_dirs=["_"]) diff --git a/backend/auth/models.py b/backend/auth/models.py index ccae4e4..60c5049 100644 --- a/backend/auth/models.py +++ b/backend/auth/models.py @@ -1,140 +1,141 @@ -from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, func, Table, Index, Text -from sqlalchemy.orm import relationship -from sqlalchemy.ext.declarative import declarative_base -from datetime import datetime - -Base = declarative_base() - - -class Role(Base): - """角色数据库模型""" - - __tablename__ = "role" - id = Column(Integer, primary_key=True, index=True, comment="角色ID") - name = Column(String(50), nullable=False, unique=True, comment="角色名称") - createtime = Column(DateTime, default=datetime.utcnow, comment="创建时间") - updatetime = Column( - DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, comment="更新时间" - ) - creator = Column(String(50), nullable=True, comment="创建人") - - # 关联到User - users = relationship("User", back_populates="role_rel") - # 关联到Permission(多对多) - permissions = relationship( - "Permission", - secondary="role_permission", - back_populates="roles" - ) - - -class User(Base): - """用户数据库模型""" - - __tablename__ = "users" - id = Column(Integer, primary_key=True, index=True) - username = Column(String(50), unique=True, nullable=False, comment="登录名") - nickname = Column(String(50), nullable=False, comment="昵称") - email = Column(String(50), nullable=True, comment="电子邮箱") - phone = Column(String(11), nullable=True, comment="手机号码") - wx_openid = Column(String(100), nullable=True, comment="微信OpenID") - password_hash = Column(String(128), nullable=False, comment="密码哈希值") - avatar = Column(String(255), nullable=True, comment="头像路径") - role_id = Column(Integer, ForeignKey("role.id"), default=2, comment="角色ID") - createtime = Column(DateTime, default=datetime.utcnow, comment="创建时间") - updatetime = Column( - DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, comment="更新时间" - ) - lastlogintime = Column(DateTime, comment="最后登录时间") - - # 关联到Role - role_rel = relationship("Role", back_populates="users") - - -class Permission(Base): - """权限数据库模型""" - - __tablename__ = "permission" - id = Column(Integer, primary_key=True, index=True, comment="权限ID") - name = Column(String(100), nullable=False, comment="权限名称") - code = Column(String(100), nullable=False, unique=True, comment="权限编码") - parentid = Column(Integer, default=0, comment="父权限ID(0表示顶级模块)") - route = Column(String(255), nullable=True, comment="前端路由路径") - description = Column(String(255), nullable=True, comment="权限描述") - createtime = Column(DateTime, default=datetime.utcnow, comment="创建时间") - updatetime = Column( - DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, comment="更新时间" - ) - - # 关联到Role(多对多) - roles = relationship( - "Role", - secondary="role_permission", - back_populates="permissions" - ) - - -# 角色权限关联表(多对多) -role_permission = Table( - "role_permission", - Base.metadata, - Column("role_id", Integer, ForeignKey("role.id"), primary_key=True, comment="角色ID"), - Column("permission_id", Integer, ForeignKey("permission.id"), primary_key=True, comment="权限ID") -) - - -class SystemSetting(Base): - """系统设置数据库模型""" - - __tablename__ = "system_setting" - id = Column(Integer, primary_key=True, index=True, comment="设置ID") - key = Column(String(100), nullable=False, unique=True, comment="设置键名") - value = Column(String(2000), nullable=False, comment="设置值") - type = Column(String(20), default="string", comment="类型:string/image/select/boolean") - options = Column(String(500), nullable=True, comment="下拉选项(用|分隔)") - description = Column(String(255), nullable=True, comment="设置描述") - createtime = Column(DateTime, default=datetime.utcnow, comment="创建时间") - updatetime = Column( - DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, comment="更新时间" - ) - - -class LoginLog(Base): - """登录日志""" - - __tablename__ = "login_log" - id = Column(Integer, primary_key=True, index=True, comment="日志ID") - username = Column(String(50), nullable=False, comment="用户名") - login_time = Column(DateTime, default=datetime.utcnow, comment="登录时间") - ip_address = Column(String(50), nullable=True, comment="IP地址") - user_agent = Column(String(500), nullable=True, comment="User-Agent") - status = Column(String(20), nullable=False, comment="状态: success/failure") - failure_reason = Column(String(255), nullable=True, comment="失败原因") - - -Index("ix_login_log_login_time", LoginLog.login_time) -Index("ix_login_log_username", LoginLog.username) -Index("ix_login_log_status", LoginLog.status) - - -class OperationLog(Base): - """操作日志""" - - __tablename__ = "operation_log" - id = Column(Integer, primary_key=True, index=True, comment="日志ID") - user_id = Column(Integer, nullable=False, comment="用户ID") - username = Column(String(50), nullable=False, comment="用户名") - action_type = Column(String(20), nullable=False, comment="操作类型: create/update/delete") - target_type = Column(String(50), nullable=False, comment="目标类型: user/role/permission/setting") - target_id = Column(Integer, nullable=True, comment="目标ID") - target_name = Column(String(100), nullable=True, comment="目标名称") - detail = Column(Text, nullable=True, comment="变更详情(JSON)") - ip_address = Column(String(50), nullable=True, comment="IP地址") - user_agent = Column(String(500), nullable=True, comment="User-Agent") - createtime = Column(DateTime, default=datetime.utcnow, comment="创建时间") - - -Index("ix_operation_log_createtime", OperationLog.createtime) -Index("ix_operation_log_username", OperationLog.username) -Index("ix_operation_log_action_type", OperationLog.action_type) +from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, func, Table, Index, Text +from sqlalchemy.orm import relationship +from sqlalchemy.ext.declarative import declarative_base +from datetime import datetime + +Base = declarative_base() + + +class Role(Base): + """角色数据库模型""" + + __tablename__ = "role" + id = Column(Integer, primary_key=True, index=True, comment="角色ID") + name = Column(String(50), nullable=False, unique=True, comment="角色名称") + createtime = Column(DateTime, default=datetime.utcnow, comment="创建时间") + updatetime = Column( + DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, comment="更新时间" + ) + creator = Column(String(50), nullable=True, comment="创建人") + + # 关联到User + users = relationship("User", back_populates="role_rel") + # 关联到Permission(多对多) + permissions = relationship( + "Permission", + secondary="role_permission", + back_populates="roles" + ) + + +class User(Base): + """用户数据库模型""" + + __tablename__ = "users" + id = Column(Integer, primary_key=True, index=True) + username = Column(String(50), unique=True, nullable=False, comment="登录名") + nickname = Column(String(50), nullable=False, comment="昵称") + email = Column(String(50), nullable=True, comment="电子邮箱") + phone = Column(String(11), nullable=True, comment="手机号码") + wx_openid = Column(String(100), nullable=True, comment="微信OpenID") + password_hash = Column(String(128), nullable=False, comment="密码哈希值") + avatar = Column(String(255), nullable=True, comment="头像路径") + role_id = Column(Integer, ForeignKey("role.id"), default=2, comment="角色ID") + createtime = Column(DateTime, default=datetime.utcnow, comment="创建时间") + updatetime = Column( + DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, comment="更新时间" + ) + lastlogintime = Column(DateTime, comment="最后登录时间") + + # 关联到Role + role_rel = relationship("Role", back_populates="users") + + +class Permission(Base): + """权限数据库模型""" + + __tablename__ = "permission" + id = Column(Integer, primary_key=True, index=True, comment="权限ID") + name = Column(String(100), nullable=False, comment="权限名称") + code = Column(String(100), nullable=False, unique=True, comment="权限编码") + parentid = Column(Integer, default=0, comment="父权限ID(0表示顶级模块)") + route = Column(String(255), nullable=True, comment="前端路由路径") + description = Column(String(255), nullable=True, comment="权限描述") + sort = Column(Integer, default=0, comment="排序号(升序排列)") + createtime = Column(DateTime, default=datetime.utcnow, comment="创建时间") + updatetime = Column( + DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, comment="更新时间" + ) + + # 关联到Role(多对多) + roles = relationship( + "Role", + secondary="role_permission", + back_populates="permissions" + ) + + +# 角色权限关联表(多对多) +role_permission = Table( + "role_permission", + Base.metadata, + Column("role_id", Integer, ForeignKey("role.id"), primary_key=True, comment="角色ID"), + Column("permission_id", Integer, ForeignKey("permission.id"), primary_key=True, comment="权限ID") +) + + +class SystemSetting(Base): + """系统设置数据库模型""" + + __tablename__ = "system_setting" + id = Column(Integer, primary_key=True, index=True, comment="设置ID") + key = Column(String(100), nullable=False, unique=True, comment="设置键名") + value = Column(String(2000), nullable=False, comment="设置值") + type = Column(String(20), default="string", comment="类型:string/image/select/boolean") + options = Column(String(500), nullable=True, comment="下拉选项(用|分隔)") + description = Column(String(255), nullable=True, comment="设置描述") + createtime = Column(DateTime, default=datetime.utcnow, comment="创建时间") + updatetime = Column( + DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, comment="更新时间" + ) + + +class LoginLog(Base): + """登录日志""" + + __tablename__ = "login_log" + id = Column(Integer, primary_key=True, index=True, comment="日志ID") + username = Column(String(50), nullable=False, comment="用户名") + login_time = Column(DateTime, default=datetime.utcnow, comment="登录时间") + ip_address = Column(String(50), nullable=True, comment="IP地址") + user_agent = Column(String(500), nullable=True, comment="User-Agent") + status = Column(String(20), nullable=False, comment="状态: success/failure") + failure_reason = Column(String(255), nullable=True, comment="失败原因") + + +Index("ix_login_log_login_time", LoginLog.login_time) +Index("ix_login_log_username", LoginLog.username) +Index("ix_login_log_status", LoginLog.status) + + +class OperationLog(Base): + """操作日志""" + + __tablename__ = "operation_log" + id = Column(Integer, primary_key=True, index=True, comment="日志ID") + user_id = Column(Integer, nullable=False, comment="用户ID") + username = Column(String(50), nullable=False, comment="用户名") + action_type = Column(String(20), nullable=False, comment="操作类型: create/update/delete") + target_type = Column(String(50), nullable=False, comment="目标类型: user/role/permission/setting") + target_id = Column(Integer, nullable=True, comment="目标ID") + target_name = Column(String(100), nullable=True, comment="目标名称") + detail = Column(Text, nullable=True, comment="变更详情(JSON)") + ip_address = Column(String(50), nullable=True, comment="IP地址") + user_agent = Column(String(500), nullable=True, comment="User-Agent") + createtime = Column(DateTime, default=datetime.utcnow, comment="创建时间") + + +Index("ix_operation_log_createtime", OperationLog.createtime) +Index("ix_operation_log_username", OperationLog.username) +Index("ix_operation_log_action_type", OperationLog.action_type) Index("ix_operation_log_target_type", OperationLog.target_type) \ No newline at end of file diff --git a/backend/auth/schemas.py b/backend/auth/schemas.py index f94a2f7..a6ca708 100644 --- a/backend/auth/schemas.py +++ b/backend/auth/schemas.py @@ -1,335 +1,337 @@ -from pydantic import BaseModel, Field -from typing import Optional -from datetime import datetime - - -class UserBase(BaseModel): - """用户基础模型""" - - username: str = Field( - ..., - min_length=3, - max_length=50, - description="登录名", - json_schema_extra={ - "error_messages": { - "min_length": "用户名长度至少为3个字符", - "max_length": "用户名长度不能超过50个字符" - } - } - ) - nickname: str = Field(..., max_length=50, description="昵称") - email: Optional[str] = Field(None, max_length=50, description="电子邮箱") - phone: Optional[str] = Field(None, max_length=11, description="手机号码") - wx_openid: Optional[str] = Field(None, max_length=100, description="微信OpenID") - avatar: Optional[str] = Field(None, max_length=255, description="头像路径") - role_id: Optional[int] = Field(2, description="角色ID") - - model_config = {"extra": "ignore"} - - -class UserCreateRequest(UserBase): - """用户创建请求模型""" - - password: str = Field( - ..., - min_length=6, - max_length=50, - description="密码", - json_schema_extra={ - "error_messages": { - "min_length": "密码长度至少为6个字符", - "max_length": "密码长度不能超过50个字符" - } - } - ) - - -class UserCreate(UserBase): - """用户创建模型""" - - password_hash: str = Field( - ..., min_length=6, max_length=128, description="密码哈希值" - ) - - -class UserUpdate(BaseModel): - """用户更新模型""" - - username: str = Field(..., min_length=3, max_length=50, description="登录名") - nickname: str = Field(..., max_length=50, description="昵称") - email: Optional[str] = Field(None, max_length=50, description="电子邮箱") - phone: Optional[str] = Field(None, max_length=11, description="手机号码") - wx_openid: Optional[str] = Field(None, max_length=100, description="微信OpenID") - avatar: Optional[str] = Field(None, max_length=255, description="头像路径") - role_id: Optional[int] = Field(2, description="角色ID") - password: Optional[str] = Field(None, max_length=128, description="密码") - - -class UserLogin(BaseModel): - """用户登录模型""" - - username: str = Field(..., description="用户名/邮箱/手机号") - password: str = Field(..., description="密码") - captcha_id: str = Field(..., description="验证码ID") - captcha_code: str = Field(..., description="验证码") - - -class UserResponse(BaseModel): - """用户响应模型""" - - id: int = Field(..., description="用户ID") - username: str = Field(..., description="登录名") - nickname: str = Field(..., description="昵称") - email: Optional[str] = Field(None, description="电子邮箱") - phone: Optional[str] = Field(None, description="手机号码") - wx_openid: Optional[str] = Field(None, description="微信OpenID") - avatar: Optional[str] = Field(None, description="头像路径") - role_id: int = Field(..., description="角色ID") - createtime: datetime = Field(..., description="创建时间") - updatetime: datetime = Field(..., description="更新时间") - lastlogintime: Optional[datetime] = Field(None, description="最后登录时间") - - class Config: - from_attributes = True - - -class Token(BaseModel): - """令牌模型""" - - access_token: str = Field(..., description="访问令牌") - token_type: str = Field(..., description="令牌类型") - - -class TokenData(BaseModel): - """令牌数据模型""" - - user_id: Optional[int] = None - email: Optional[str] = None - - -class RoleBase(BaseModel): - """角色基础模型""" - - name: str = Field(..., max_length=50, description="角色名称") - - -class RoleCreate(RoleBase): - """角色创建模型""" - - creator: Optional[str] = Field(None, max_length=50, description="创建人") - - -class RoleResponse(RoleBase): - """角色响应模型""" - - id: int = Field(..., description="角色ID") - createtime: datetime = Field(..., description="创建时间") - updatetime: datetime = Field(..., description="更新时间") - creator: Optional[str] = Field(None, description="创建人") - - class Config: - from_attributes = True - - -# 权限相关模型 -class PermissionBase(BaseModel): - """权限基础模型""" - - name: str = Field(..., max_length=100, description="权限名称") - code: str = Field(..., max_length=100, description="权限编码") - parentid: int = Field(0, description="父权限ID(0表示顶级模块)") - route: Optional[str] = Field(None, max_length=255, description="前端路由路径") - description: Optional[str] = Field(None, max_length=255, description="权限描述") - - -class PermissionCreate(PermissionBase): - """权限创建模型""" - pass - - -class PermissionResponse(PermissionBase): - """权限响应模型""" - - id: int = Field(..., description="权限ID") - createtime: datetime = Field(..., description="创建时间") - updatetime: datetime = Field(..., description="更新时间") - - class Config: - from_attributes = True - - -class PermissionTreeResponse(BaseModel): - """权限树响应模型""" - - id: int = Field(..., description="权限ID") - name: str = Field(..., description="权限名称") - code: str = Field(..., description="权限编码") - parentid: int = Field(..., description="父权限ID") - route: Optional[str] = Field(None, description="前端路由路径") - createtime: Optional[datetime] = Field(None, description="创建时间") - updatetime: Optional[datetime] = Field(None, description="更新时间") - description: Optional[str] = Field(None, description="权限描述") - children: list = Field([], description="子权限列表") - - -# 角色权限关联相关模型 -class RolePermissionAssign(BaseModel): - """角色权限分配模型""" - - role_id: int = Field(..., description="角色ID") - permission_ids: list[int] = Field(..., description="权限ID列表") - - -class RolePermissionResponse(BaseModel): - """角色权限响应模型""" - - role_id: int = Field(..., description="角色ID") - role_name: str = Field(..., description="角色名称") - permissions: list[PermissionResponse] = Field(..., description="权限列表") - menu: list = Field([], description="菜单树形结构") - - -# 系统设置相关模型 -class SystemSettingBase(BaseModel): - """系统设置基础模型""" - - key: str = Field(..., max_length=100, description="设置键名") - value: str = Field(..., max_length=2000, description="设置值") - type: Optional[str] = Field("string", max_length=20, description="类型:string/image/select/boolean") - options: Optional[str] = Field(None, max_length=500, description="下拉选项(用|分隔)") - description: Optional[str] = Field(None, max_length=255, description="设置描述") - - model_config = {"extra": "ignore"} - - -class SystemSettingCreate(SystemSettingBase): - """系统设置创建模型""" - pass - - -class SystemSettingUpdate(SystemSettingBase): - """系统设置更新模型""" - key: Optional[str] = Field(None, max_length=100, description="设置键名") - - -class SystemSettingResponse(BaseModel): - """系统设置响应模型""" - - id: int = Field(..., description="设置ID") - key: str = Field(..., description="设置键名") - value: str = Field(..., description="设置值") - type: str = Field(..., description="类型") - options: Optional[str] = Field(None, description="下拉选项") - description: Optional[str] = Field(None, description="设置描述") - createtime: datetime = Field(..., description="创建时间") - updatetime: datetime = Field(..., description="更新时间") - - class Config: - from_attributes = True - - -class LoginLogResponse(BaseModel): - """登录日志响应模型""" - - id: int = Field(..., description="日志ID") - username: str = Field(..., description="用户名") - login_time: datetime = Field(..., description="登录时间") - ip_address: Optional[str] = Field(None, description="IP地址") - user_agent: Optional[str] = Field(None, description="User-Agent") - status: str = Field(..., description="状态: success/failure") - failure_reason: Optional[str] = Field(None, description="失败原因") - - class Config: - from_attributes = True - - -class LoginLogSearch(BaseModel): - """登录日志搜索模型""" - - username: Optional[str] = Field(None, description="用户名(模糊搜索)") - status: Optional[str] = Field(None, description="状态") - start_time: Optional[datetime] = Field(None, description="开始时间") - end_time: Optional[datetime] = Field(None, description="结束时间") - - -class LoginLogCleanRequest(BaseModel): - """登录日志清理请求模型""" - - before_date: datetime = Field(..., description="清理此日期之前的日志") - - -class OperationLogResponse(BaseModel): - """操作日志响应模型""" - - id: int = Field(..., description="日志ID") - user_id: int = Field(..., description="用户ID") - username: str = Field(..., description="用户名") - action_type: str = Field(..., description="操作类型: create/update/delete") - target_type: str = Field(..., description="目标类型: user/role/permission/setting") - target_id: Optional[int] = Field(None, description="目标ID") - target_name: Optional[str] = Field(None, description="目标名称") - detail: Optional[str] = Field(None, description="变更详情(JSON)") - ip_address: Optional[str] = Field(None, description="IP地址") - user_agent: Optional[str] = Field(None, description="User-Agent") - createtime: datetime = Field(..., description="创建时间") - - class Config: - from_attributes = True - - -class OperationLogSearch(BaseModel): - """操作日志搜索模型""" - - username: Optional[str] = Field(None, description="用户名(模糊搜索)") - action_type: Optional[str] = Field(None, description="操作类型") - target_type: Optional[str] = Field(None, description="目标类型") - start_time: Optional[datetime] = Field(None, description="开始时间") - end_time: Optional[datetime] = Field(None, description="结束时间") - - -# ======================================== -# 用户注册相关模型 -# ======================================== - - -class PhoneSendCodeRequest(BaseModel): - """发送短信验证码请求""" - phone: str = Field(..., pattern=r"^\d{11}$", description="手机号(11位数字)") - - -class PhoneSendCodeResponse(BaseModel): - """发送短信验证码响应""" - message: str = "验证码已发送" - expire_seconds: int = 300 - - -class PhoneRegisterRequest(BaseModel): - """手机号注册请求""" - username: str = Field(..., min_length=3, max_length=50, description="用户名") - phone: str = Field(..., pattern=r"^\d{11}$", description="手机号") - code: str = Field(..., min_length=6, max_length=6, description="短信验证码") - password: str = Field(..., min_length=6, max_length=50, description="密码") - nickname: str = Field(..., max_length=50, description="昵称") - - -class EmailRegisterInitRequest(BaseModel): - """邮箱注册初始化请求""" - username: str = Field(..., min_length=3, max_length=50, description="用户名") - email: str = Field(..., max_length=50, description="电子邮箱") - password: str = Field(..., min_length=6, max_length=50, description="密码") - nickname: str = Field(..., max_length=50, description="昵称") - - -class EmailRegisterInitResponse(BaseModel): - """邮箱注册初始化响应""" - message: str = "验证邮件已发送,请查收并点击链接完成注册" - expire_minutes: int = 30 - - -class RegisterSuccessResponse(BaseModel): - """注册成功响应""" - id: int - username: str - nickname: str +from pydantic import BaseModel, Field +from typing import Optional +from datetime import datetime + + +class UserBase(BaseModel): + """用户基础模型""" + + username: str = Field( + ..., + min_length=3, + max_length=50, + description="登录名", + json_schema_extra={ + "error_messages": { + "min_length": "用户名长度至少为3个字符", + "max_length": "用户名长度不能超过50个字符" + } + } + ) + nickname: str = Field(..., max_length=50, description="昵称") + email: Optional[str] = Field(None, max_length=50, description="电子邮箱") + phone: Optional[str] = Field(None, max_length=11, description="手机号码") + wx_openid: Optional[str] = Field(None, max_length=100, description="微信OpenID") + avatar: Optional[str] = Field(None, max_length=255, description="头像路径") + role_id: Optional[int] = Field(2, description="角色ID") + + model_config = {"extra": "ignore"} + + +class UserCreateRequest(UserBase): + """用户创建请求模型""" + + password: str = Field( + ..., + min_length=6, + max_length=50, + description="密码", + json_schema_extra={ + "error_messages": { + "min_length": "密码长度至少为6个字符", + "max_length": "密码长度不能超过50个字符" + } + } + ) + + +class UserCreate(UserBase): + """用户创建模型""" + + password_hash: str = Field( + ..., min_length=6, max_length=128, description="密码哈希值" + ) + + +class UserUpdate(BaseModel): + """用户更新模型""" + + username: str = Field(..., min_length=3, max_length=50, description="登录名") + nickname: str = Field(..., max_length=50, description="昵称") + email: Optional[str] = Field(None, max_length=50, description="电子邮箱") + phone: Optional[str] = Field(None, max_length=11, description="手机号码") + wx_openid: Optional[str] = Field(None, max_length=100, description="微信OpenID") + avatar: Optional[str] = Field(None, max_length=255, description="头像路径") + role_id: Optional[int] = Field(2, description="角色ID") + password: Optional[str] = Field(None, max_length=128, description="密码") + + +class UserLogin(BaseModel): + """用户登录模型""" + + username: str = Field(..., description="用户名/邮箱/手机号") + password: str = Field(..., description="密码") + captcha_id: str = Field(..., description="验证码ID") + captcha_code: str = Field(..., description="验证码") + + +class UserResponse(BaseModel): + """用户响应模型""" + + id: int = Field(..., description="用户ID") + username: str = Field(..., description="登录名") + nickname: str = Field(..., description="昵称") + email: Optional[str] = Field(None, description="电子邮箱") + phone: Optional[str] = Field(None, description="手机号码") + wx_openid: Optional[str] = Field(None, description="微信OpenID") + avatar: Optional[str] = Field(None, description="头像路径") + role_id: int = Field(..., description="角色ID") + createtime: datetime = Field(..., description="创建时间") + updatetime: datetime = Field(..., description="更新时间") + lastlogintime: Optional[datetime] = Field(None, description="最后登录时间") + + class Config: + from_attributes = True + + +class Token(BaseModel): + """令牌模型""" + + access_token: str = Field(..., description="访问令牌") + token_type: str = Field(..., description="令牌类型") + + +class TokenData(BaseModel): + """令牌数据模型""" + + user_id: Optional[int] = None + email: Optional[str] = None + + +class RoleBase(BaseModel): + """角色基础模型""" + + name: str = Field(..., max_length=50, description="角色名称") + + +class RoleCreate(RoleBase): + """角色创建模型""" + + creator: Optional[str] = Field(None, max_length=50, description="创建人") + + +class RoleResponse(RoleBase): + """角色响应模型""" + + id: int = Field(..., description="角色ID") + createtime: datetime = Field(..., description="创建时间") + updatetime: datetime = Field(..., description="更新时间") + creator: Optional[str] = Field(None, description="创建人") + + class Config: + from_attributes = True + + +# 权限相关模型 +class PermissionBase(BaseModel): + """权限基础模型""" + + name: str = Field(..., max_length=100, description="权限名称") + code: str = Field(..., max_length=100, description="权限编码") + parentid: int = Field(0, description="父权限ID(0表示顶级模块)") + route: Optional[str] = Field(None, max_length=255, description="前端路由路径") + description: Optional[str] = Field(None, max_length=255, description="权限描述") + sort: int = Field(0, description="排序号(升序排列)") + + +class PermissionCreate(PermissionBase): + """权限创建模型""" + pass + + +class PermissionResponse(PermissionBase): + """权限响应模型""" + + id: int = Field(..., description="权限ID") + createtime: datetime = Field(..., description="创建时间") + updatetime: datetime = Field(..., description="更新时间") + + class Config: + from_attributes = True + + +class PermissionTreeResponse(BaseModel): + """权限树响应模型""" + + id: int = Field(..., description="权限ID") + name: str = Field(..., description="权限名称") + code: str = Field(..., description="权限编码") + parentid: int = Field(..., description="父权限ID") + route: Optional[str] = Field(None, description="前端路由路径") + createtime: Optional[datetime] = Field(None, description="创建时间") + updatetime: Optional[datetime] = Field(None, description="更新时间") + description: Optional[str] = Field(None, description="权限描述") + sort: int = Field(0, description="排序号") + children: list = Field([], description="子权限列表") + + +# 角色权限关联相关模型 +class RolePermissionAssign(BaseModel): + """角色权限分配模型""" + + role_id: int = Field(..., description="角色ID") + permission_ids: list[int] = Field(..., description="权限ID列表") + + +class RolePermissionResponse(BaseModel): + """角色权限响应模型""" + + role_id: int = Field(..., description="角色ID") + role_name: str = Field(..., description="角色名称") + permissions: list[PermissionResponse] = Field(..., description="权限列表") + menu: list = Field([], description="菜单树形结构") + + +# 系统设置相关模型 +class SystemSettingBase(BaseModel): + """系统设置基础模型""" + + key: str = Field(..., max_length=100, description="设置键名") + value: str = Field(..., max_length=2000, description="设置值") + type: Optional[str] = Field("string", max_length=20, description="类型:string/image/select/boolean") + options: Optional[str] = Field(None, max_length=500, description="下拉选项(用|分隔)") + description: Optional[str] = Field(None, max_length=255, description="设置描述") + + model_config = {"extra": "ignore"} + + +class SystemSettingCreate(SystemSettingBase): + """系统设置创建模型""" + pass + + +class SystemSettingUpdate(SystemSettingBase): + """系统设置更新模型""" + key: Optional[str] = Field(None, max_length=100, description="设置键名") + + +class SystemSettingResponse(BaseModel): + """系统设置响应模型""" + + id: int = Field(..., description="设置ID") + key: str = Field(..., description="设置键名") + value: str = Field(..., description="设置值") + type: str = Field(..., description="类型") + options: Optional[str] = Field(None, description="下拉选项") + description: Optional[str] = Field(None, description="设置描述") + createtime: datetime = Field(..., description="创建时间") + updatetime: datetime = Field(..., description="更新时间") + + class Config: + from_attributes = True + + +class LoginLogResponse(BaseModel): + """登录日志响应模型""" + + id: int = Field(..., description="日志ID") + username: str = Field(..., description="用户名") + login_time: datetime = Field(..., description="登录时间") + ip_address: Optional[str] = Field(None, description="IP地址") + user_agent: Optional[str] = Field(None, description="User-Agent") + status: str = Field(..., description="状态: success/failure") + failure_reason: Optional[str] = Field(None, description="失败原因") + + class Config: + from_attributes = True + + +class LoginLogSearch(BaseModel): + """登录日志搜索模型""" + + username: Optional[str] = Field(None, description="用户名(模糊搜索)") + status: Optional[str] = Field(None, description="状态") + start_time: Optional[datetime] = Field(None, description="开始时间") + end_time: Optional[datetime] = Field(None, description="结束时间") + + +class LoginLogCleanRequest(BaseModel): + """登录日志清理请求模型""" + + before_date: datetime = Field(..., description="清理此日期之前的日志") + + +class OperationLogResponse(BaseModel): + """操作日志响应模型""" + + id: int = Field(..., description="日志ID") + user_id: int = Field(..., description="用户ID") + username: str = Field(..., description="用户名") + action_type: str = Field(..., description="操作类型: create/update/delete") + target_type: str = Field(..., description="目标类型: user/role/permission/setting") + target_id: Optional[int] = Field(None, description="目标ID") + target_name: Optional[str] = Field(None, description="目标名称") + detail: Optional[str] = Field(None, description="变更详情(JSON)") + ip_address: Optional[str] = Field(None, description="IP地址") + user_agent: Optional[str] = Field(None, description="User-Agent") + createtime: datetime = Field(..., description="创建时间") + + class Config: + from_attributes = True + + +class OperationLogSearch(BaseModel): + """操作日志搜索模型""" + + username: Optional[str] = Field(None, description="用户名(模糊搜索)") + action_type: Optional[str] = Field(None, description="操作类型") + target_type: Optional[str] = Field(None, description="目标类型") + start_time: Optional[datetime] = Field(None, description="开始时间") + end_time: Optional[datetime] = Field(None, description="结束时间") + + +# ======================================== +# 用户注册相关模型 +# ======================================== + + +class PhoneSendCodeRequest(BaseModel): + """发送短信验证码请求""" + phone: str = Field(..., pattern=r"^\d{11}$", description="手机号(11位数字)") + + +class PhoneSendCodeResponse(BaseModel): + """发送短信验证码响应""" + message: str = "验证码已发送" + expire_seconds: int = 300 + + +class PhoneRegisterRequest(BaseModel): + """手机号注册请求""" + username: str = Field(..., min_length=3, max_length=50, description="用户名") + phone: str = Field(..., pattern=r"^\d{11}$", description="手机号") + code: str = Field(..., min_length=6, max_length=6, description="短信验证码") + password: str = Field(..., min_length=6, max_length=50, description="密码") + nickname: str = Field(..., max_length=50, description="昵称") + + +class EmailRegisterInitRequest(BaseModel): + """邮箱注册初始化请求""" + username: str = Field(..., min_length=3, max_length=50, description="用户名") + email: str = Field(..., max_length=50, description="电子邮箱") + password: str = Field(..., min_length=6, max_length=50, description="密码") + nickname: str = Field(..., max_length=50, description="昵称") + + +class EmailRegisterInitResponse(BaseModel): + """邮箱注册初始化响应""" + message: str = "验证邮件已发送,请查收并点击链接完成注册" + expire_minutes: int = 30 + + +class RegisterSuccessResponse(BaseModel): + """注册成功响应""" + id: int + username: str + nickname: str message: str = "注册成功" \ No newline at end of file diff --git a/frontend/src/modules/admin/views/permissions/permission-crud.ts b/frontend/src/modules/admin/views/permissions/permission-crud.ts index 66603d1..b3fe497 100644 --- a/frontend/src/modules/admin/views/permissions/permission-crud.ts +++ b/frontend/src/modules/admin/views/permissions/permission-crud.ts @@ -1,176 +1,188 @@ -import type { CreateCrudOptions } from "@fast-crud/fast-crud"; -import dayjs from "dayjs"; -import { ElMessage } from "element-plus"; -import { http } from "@/modules/admin/api/http"; -import { toSearchParams } from "@/modules/admin/utils/list-query"; - -export type PermissionRow = { - id: number; - name: string; - code: string; - parentid: number; - route?: string | null; - description?: string | null; - createtime: string; - updatetime: string; - children?: PermissionRow[]; -}; - -export const createPermissionCrudOptions: CreateCrudOptions = () => { - return { - crudOptions: { - pagination: { show: false }, - search: { - show: true, - options: { - layout: 'inline', - }, - expand: false, - }, - tree: { - enable: true, - childrenKey: "children", - parentKey: "parentid", - hasChildField: "children", - }, - request: { - transformQuery: ({ form }) => - toSearchParams(form as Record, ["name", "code"]), - pageRequest: async (_query) => { - const { data } = await http.get("/permissions/tree"); - return data; - }, - transformRes: ({ res }) => { - const records = Array.isArray(res) ? res : []; - return { - currentPage: 1, - pageSize: Math.max(records.length, 1), - total: records.length, - records, - }; - }, - addRequest: async ({ form }) => { - await http.post("/permissions/", form); - ElMessage.success({ message: "添加成功", duration: 5000 }); - }, - editRequest: async ({ form, row }) => { - if (!row) return; - await http.put(`/permissions/${row.id}`, form); - ElMessage.success({ message: "修改成功", duration: 5000 }); - }, - delRequest: async ({ row }) => { - if (!row) return; - await http.delete(`/permissions/${row.id}`); - ElMessage.success({ message: "删除成功", duration: 5000 }); - }, - onSuccess: ({ action }: { action: string }) => { - if (action === "add") { - ElMessage.success({ message: "添加成功", duration: 5000 }); - } else if (action === "edit") { - ElMessage.success({ message: "修改成功", duration: 5000 }); - } - }, - onError: (error: any) => { - let message = "操作失败"; - if (error.response?.data) { - const data = error.response.data; - if (data.message) { - message = data.message; - } else if (data.detail) { - message = typeof data.detail === "string" ? data.detail : "操作失败"; - } - } - ElMessage.error({ message, duration: 5000 }); - }, - }, - table: { - remove: { - showSuccessNotification: false, - }, - }, - rowHandle: { - buttons: { - edit: { text: "编辑" }, - remove: { text: "删除" }, - }, - }, - columns: { - id: { - title: "ID", - key: "id", - type: "number", - column: { width: 70 }, - form: { show: false }, - }, - name: { - title: "名称", - key: "name", - type: "text", - search: { show: true }, - form: { - rules: [{ required: true, message: "必填" }], - }, - }, - code: { - title: "编码", - key: "code", - type: "text", - search: { show: true }, - form: { - rules: [{ required: true, message: "必填" }], - }, - }, - parentid: { - title: "父级ID", - key: "parentid", - type: "number", - form: { - value: 0, - rules: [{ required: true, message: "必填" }], - }, - }, - description: { - title: "描述", - key: "description", - type: "textarea", - column: { show: false }, - }, - route: { - title: "路由", - key: "route", - type: "text", - column: { width: 200 }, - form: { - placeholder: "如:/admin/users", - }, - }, - createtime: { - title: "创建时间", - key: "createtime", - type: "text", - form: { show: false }, - column: { width: 170 }, - valueBuilder({ value, row, key }) { - if (!row || value == null) return; - (row as Record)[key as string] = dayjs(value).format( - "YYYY-MM-DD HH:mm:ss", - ); - }, - }, - updatetime: { - title: "更新时间", - key: "updatetime", - type: "text", - form: { show: false }, - column: { width: 170 }, - valueBuilder({ value, row, key }) { - if (!row || value == null) return; - (row as Record)[key as string] = dayjs(value).format( - "YYYY-MM-DD HH:mm:ss", - ); - }, - }, - }, - }, - }; -}; +import type { CreateCrudOptions } from "@fast-crud/fast-crud"; +import dayjs from "dayjs"; +import { ElMessage } from "element-plus"; +import { http } from "@/modules/admin/api/http"; +import { toSearchParams } from "@/modules/admin/utils/list-query"; + +export type PermissionRow = { + id: number; + name: string; + code: string; + parentid: number; + route?: string | null; + description?: string | null; + sort: number; + createtime: string; + updatetime: string; + children?: PermissionRow[]; +}; + +export const createPermissionCrudOptions: CreateCrudOptions = () => { + return { + crudOptions: { + pagination: { show: false }, + search: { + show: true, + options: { + layout: 'inline', + }, + expand: false, + }, + tree: { + enable: true, + childrenKey: "children", + parentKey: "parentid", + hasChildField: "children", + }, + request: { + transformQuery: ({ form }) => + toSearchParams(form as Record, ["name", "code"]), + pageRequest: async (_query) => { + const { data } = await http.get("/permissions/tree"); + return data; + }, + transformRes: ({ res }) => { + const records = Array.isArray(res) ? res : []; + return { + currentPage: 1, + pageSize: Math.max(records.length, 1), + total: records.length, + records, + }; + }, + addRequest: async ({ form }) => { + await http.post("/permissions/", form); + ElMessage.success({ message: "添加成功", duration: 5000 }); + }, + editRequest: async ({ form, row }) => { + if (!row) return; + await http.put(`/permissions/${row.id}`, form); + ElMessage.success({ message: "修改成功", duration: 5000 }); + }, + delRequest: async ({ row }) => { + if (!row) return; + await http.delete(`/permissions/${row.id}`); + ElMessage.success({ message: "删除成功", duration: 5000 }); + }, + onSuccess: ({ action }: { action: string }) => { + if (action === "add") { + ElMessage.success({ message: "添加成功", duration: 5000 }); + } else if (action === "edit") { + ElMessage.success({ message: "修改成功", duration: 5000 }); + } + }, + onError: (error: any) => { + let message = "操作失败"; + if (error.response?.data) { + const data = error.response.data; + if (data.message) { + message = data.message; + } else if (data.detail) { + message = typeof data.detail === "string" ? data.detail : "操作失败"; + } + } + ElMessage.error({ message, duration: 5000 }); + }, + }, + table: { + remove: { + showSuccessNotification: false, + }, + }, + rowHandle: { + buttons: { + edit: { text: "编辑" }, + remove: { text: "删除" }, + }, + }, + columns: { + id: { + title: "ID", + key: "id", + type: "number", + column: { width: 70 }, + form: { show: false }, + }, + name: { + title: "名称", + key: "name", + type: "text", + search: { show: true }, + form: { + rules: [{ required: true, message: "必填" }], + }, + }, + code: { + title: "编码", + key: "code", + type: "text", + search: { show: true }, + form: { + rules: [{ required: true, message: "必填" }], + }, + }, + parentid: { + title: "父级ID", + key: "parentid", + type: "number", + form: { + value: 0, + rules: [{ required: true, message: "必填" }], + }, + }, + description: { + title: "描述", + key: "description", + type: "textarea", + column: { show: false }, + }, + route: { + title: "路由", + key: "route", + type: "text", + column: { width: 200 }, + form: { + placeholder: "如:/admin/users", + }, + }, + sort: { + title: "排序", + key: "sort", + type: "number", + column: { width: 80, align: "center" }, + form: { + value: 0, + rules: [{ required: true, message: "必填" }], + helper: "数字越小,排序越靠前", + }, + }, + createtime: { + title: "创建时间", + key: "createtime", + type: "text", + form: { show: false }, + column: { width: 170 }, + valueBuilder({ value, row, key }) { + if (!row || value == null) return; + (row as Record)[key as string] = dayjs(value).format( + "YYYY-MM-DD HH:mm:ss", + ); + }, + }, + updatetime: { + title: "更新时间", + key: "updatetime", + type: "text", + form: { show: false }, + column: { width: 170 }, + valueBuilder({ value, row, key }) { + if (!row || value == null) return; + (row as Record)[key as string] = dayjs(value).format( + "YYYY-MM-DD HH:mm:ss", + ); + }, + }, + }, + }, + }; +}; From 677d8a53b57296e883f9a4ed806c42b62a2326f7 Mon Sep 17 00:00:00 2001 From: jayhgq Date: Mon, 20 Jul 2026 17:16:38 +0800 Subject: [PATCH 2/2] build(frontend): update frontend build artifacts for new deploy update the hashed asset filenames in index.html, replace old deleted assets with new built ones, add all latest dist assets to the project bundle --- .../{AdminLayout-C8hRi9x-.js => AdminLayout-ltF-ui71.js} | 2 +- ...oginLogManage-CQqltd1Y.js => LoginLogManage-COZ7cyEH.js} | 2 +- .../assets/{LoginView-CL6FqBfI.js => LoginView-CdDWJNab.js} | 2 +- .../{MenuManage-J689-0Rz.js => MenuManage-BEleckEE.js} | 2 +- ...LogManage-CrJsIKz-.js => OperationLogManage-BIONNQB8.js} | 2 +- .../{PublicHome-BE6848HM.js => PublicHome-4L60krmd.js} | 2 +- .../{RoleManage-C7cZ0SSm.js => RoleManage-7Ni_fgq0.js} | 2 +- frontend/dist/assets/SettingManage-CAoqayco.css | 1 - ...{SettingManage-DbOShH1j.js => SettingManage-D3eSU6jo.js} | 2 +- frontend/dist/assets/SettingManage-DcldOeo6.css | 1 + .../{UserManage-DExq8OEE.js => UserManage-DDgTVhjY.js} | 2 +- ...ndex-64865240-CievhkpU.js => index-64865240-B3tEj8Ws.js} | 2 +- .../dist/assets/{index-ChTrSGCb.js => index-rb7Oshfn.js} | 6 +++--- frontend/dist/index.html | 2 +- 14 files changed, 15 insertions(+), 15 deletions(-) rename frontend/dist/assets/{AdminLayout-C8hRi9x-.js => AdminLayout-ltF-ui71.js} (98%) rename frontend/dist/assets/{LoginLogManage-CQqltd1Y.js => LoginLogManage-COZ7cyEH.js} (97%) rename frontend/dist/assets/{LoginView-CL6FqBfI.js => LoginView-CdDWJNab.js} (97%) rename frontend/dist/assets/{MenuManage-J689-0Rz.js => MenuManage-BEleckEE.js} (58%) rename frontend/dist/assets/{OperationLogManage-CrJsIKz-.js => OperationLogManage-BIONNQB8.js} (98%) rename frontend/dist/assets/{PublicHome-BE6848HM.js => PublicHome-4L60krmd.js} (89%) rename frontend/dist/assets/{RoleManage-C7cZ0SSm.js => RoleManage-7Ni_fgq0.js} (97%) delete mode 100644 frontend/dist/assets/SettingManage-CAoqayco.css rename frontend/dist/assets/{SettingManage-DbOShH1j.js => SettingManage-D3eSU6jo.js} (96%) create mode 100644 frontend/dist/assets/SettingManage-DcldOeo6.css rename frontend/dist/assets/{UserManage-DExq8OEE.js => UserManage-DDgTVhjY.js} (98%) rename frontend/dist/assets/{index-64865240-CievhkpU.js => index-64865240-B3tEj8Ws.js} (99%) rename frontend/dist/assets/{index-ChTrSGCb.js => index-rb7Oshfn.js} (99%) diff --git a/frontend/dist/assets/AdminLayout-C8hRi9x-.js b/frontend/dist/assets/AdminLayout-ltF-ui71.js similarity index 98% rename from frontend/dist/assets/AdminLayout-C8hRi9x-.js rename to frontend/dist/assets/AdminLayout-ltF-ui71.js index 9d3d23e..2a41f05 100644 --- a/frontend/dist/assets/AdminLayout-C8hRi9x-.js +++ b/frontend/dist/assets/AdminLayout-ltF-ui71.js @@ -1 +1 @@ -import{f as K,u as O,p as y,g as Q,E as X,q as d,w as a,k as Y,l as Z,h as f,r as o,i as p,s as ee,v as te,x as ae,d as c,a as n,c as _,y as b,t as l,z as I,F as k,A as N,B as w,b as S,C as T,D as se,o as s,_ as ne}from"./index-ChTrSGCb.js";const oe={class:"brand"},ce=["src"],ie={class:"brand-text"},le={class:"right"},re={class:"nick"},ue={class:"page-title-bar"},de={class:"page-title"},_e={class:"page-content"},fe={key:0,class:"footer"},pe={href:"https://beian.miit.gov.cn",target:"_blank"},me={key:0},ge=K({__name:"AdminLayout",setup(he){const m=Y(),x=Z(),i=O(),L=p(""),g=p(""),h=p(""),v=p(""),V=T(()=>m.path),$=T(()=>m.meta.title||""),R={perm:y(ae),system:y(te),log:y(ee)};function C(r){for(const e in R)if(r.startsWith(e))return R[e];return se}async function D(){let e=await f.get("/api/settings/public?setting_id=1");e.data&&(L.value=e.data.value)}async function E(){try{let e=await f.get("/api/settings/public?setting_id=2");e.data&&(h.value=e.data.value)}catch{}}async function M(){try{let e=await f.get("/api/settings/public?setting_id=3");e.data&&(v.value=e.data.value)}catch{}}async function P(){try{let e=await f.get("/api/settings/public?key=系统Logo");e.data&&e.data.value&&(g.value=e.data.value)}catch{}}Q(async()=>{try{await D(),await P(),await E(),await M(),i.user||await i.fetchProfile(),await i.fetchPermissions()}catch{X.error("获取用户信息失败,请重新登录"),await i.logout(),x.replace({name:"admin-login",query:{redirect:m.fullPath}})}});async function q(){await i.logout(),x.push({name:"admin-login"})}return(r,e)=>{const U=o("el-icon"),B=o("el-menu-item"),F=o("el-sub-menu"),z=o("el-menu"),W=o("el-aside"),j=o("el-button"),G=o("el-header"),H=o("router-view"),J=o("el-main"),A=o("el-container");return s(),d(A,{class:"admin-root"},{default:a(()=>[c(W,{width:"220px",class:"aside"},{default:a(()=>[n("div",oe,[g.value?(s(),_("img",{key:0,src:g.value,class:"brand-logo"},null,8,ce)):b("",!0),n("span",ie,l(L.value),1)]),c(z,{"default-active":V.value,router:"","background-color":"#0f172a","text-color":"#e2e8f0","active-text-color":"#38bdf8"},{default:a(()=>[(s(!0),_(k,null,I(w(i).menu,t=>(s(),_(k,{key:t.id},[t.children&&t.children.length>0?(s(),d(F,{key:0,index:t.route},{title:a(()=>[c(U,null,{default:a(()=>[(s(),d(N(C(t.code))))]),_:2},1024),n("span",null,l(t.name),1)]),default:a(()=>[(s(!0),_(k,null,I(t.children,u=>(s(),d(B,{key:u.id,index:u.route},{default:a(()=>[n("span",null,l(u.name),1)]),_:2},1032,["index"]))),128))]),_:2},1032,["index"])):(s(),d(B,{key:1,index:t.route},{default:a(()=>[c(U,null,{default:a(()=>[(s(),d(N(C(t.code))))]),_:2},1024),n("span",null,l(t.name),1)]),_:2},1032,["index"]))],64))),128))]),_:1},8,["default-active"])]),_:1}),c(A,null,{default:a(()=>[c(G,{class:"header"},{default:a(()=>{var t,u;return[n("div",le,[n("span",re,l(((t=w(i).user)==null?void 0:t.nickname)||((u=w(i).user)==null?void 0:u.username)),1),c(j,{type:"primary",link:"",onClick:q},{default:a(()=>[...e[0]||(e[0]=[S("退出",-1)])]),_:1})])]}),_:1}),c(J,{class:"main"},{default:a(()=>[n("div",ue,[n("h1",de,l($.value),1)]),n("div",_e,[c(H)]),h.value?(s(),_("div",fe,[S(l(h.value)+" ",1),n("a",pe,[v.value?(s(),_("span",me," | "+l(v.value),1)):b("",!0)])])):b("",!0)]),_:1})]),_:1})]),_:1})}}}),ye=ne(ge,[["__scopeId","data-v-627faa7f"]]);export{ye as default}; +import{f as K,u as O,p as y,g as Q,E as X,q as d,w as a,k as Y,l as Z,h as f,r as o,i as p,s as ee,v as te,x as ae,d as c,a as n,c as _,y as b,t as l,z as I,F as k,A as N,B as w,b as S,C as T,D as se,o as s,_ as ne}from"./index-rb7Oshfn.js";const oe={class:"brand"},ce=["src"],ie={class:"brand-text"},le={class:"right"},re={class:"nick"},ue={class:"page-title-bar"},de={class:"page-title"},_e={class:"page-content"},fe={key:0,class:"footer"},pe={href:"https://beian.miit.gov.cn",target:"_blank"},me={key:0},ge=K({__name:"AdminLayout",setup(he){const m=Y(),x=Z(),i=O(),L=p(""),g=p(""),h=p(""),v=p(""),V=T(()=>m.path),$=T(()=>m.meta.title||""),R={perm:y(ae),system:y(te),log:y(ee)};function C(r){for(const e in R)if(r.startsWith(e))return R[e];return se}async function D(){let e=await f.get("/api/settings/public?setting_id=1");e.data&&(L.value=e.data.value)}async function E(){try{let e=await f.get("/api/settings/public?setting_id=2");e.data&&(h.value=e.data.value)}catch{}}async function M(){try{let e=await f.get("/api/settings/public?setting_id=3");e.data&&(v.value=e.data.value)}catch{}}async function P(){try{let e=await f.get("/api/settings/public?key=系统Logo");e.data&&e.data.value&&(g.value=e.data.value)}catch{}}Q(async()=>{try{await D(),await P(),await E(),await M(),i.user||await i.fetchProfile(),await i.fetchPermissions()}catch{X.error("获取用户信息失败,请重新登录"),await i.logout(),x.replace({name:"admin-login",query:{redirect:m.fullPath}})}});async function q(){await i.logout(),x.push({name:"admin-login"})}return(r,e)=>{const U=o("el-icon"),B=o("el-menu-item"),F=o("el-sub-menu"),z=o("el-menu"),W=o("el-aside"),j=o("el-button"),G=o("el-header"),H=o("router-view"),J=o("el-main"),A=o("el-container");return s(),d(A,{class:"admin-root"},{default:a(()=>[c(W,{width:"220px",class:"aside"},{default:a(()=>[n("div",oe,[g.value?(s(),_("img",{key:0,src:g.value,class:"brand-logo"},null,8,ce)):b("",!0),n("span",ie,l(L.value),1)]),c(z,{"default-active":V.value,router:"","background-color":"#0f172a","text-color":"#e2e8f0","active-text-color":"#38bdf8"},{default:a(()=>[(s(!0),_(k,null,I(w(i).menu,t=>(s(),_(k,{key:t.id},[t.children&&t.children.length>0?(s(),d(F,{key:0,index:t.route},{title:a(()=>[c(U,null,{default:a(()=>[(s(),d(N(C(t.code))))]),_:2},1024),n("span",null,l(t.name),1)]),default:a(()=>[(s(!0),_(k,null,I(t.children,u=>(s(),d(B,{key:u.id,index:u.route},{default:a(()=>[n("span",null,l(u.name),1)]),_:2},1032,["index"]))),128))]),_:2},1032,["index"])):(s(),d(B,{key:1,index:t.route},{default:a(()=>[c(U,null,{default:a(()=>[(s(),d(N(C(t.code))))]),_:2},1024),n("span",null,l(t.name),1)]),_:2},1032,["index"]))],64))),128))]),_:1},8,["default-active"])]),_:1}),c(A,null,{default:a(()=>[c(G,{class:"header"},{default:a(()=>{var t,u;return[n("div",le,[n("span",re,l(((t=w(i).user)==null?void 0:t.nickname)||((u=w(i).user)==null?void 0:u.username)),1),c(j,{type:"primary",link:"",onClick:q},{default:a(()=>[...e[0]||(e[0]=[S("退出",-1)])]),_:1})])]}),_:1}),c(J,{class:"main"},{default:a(()=>[n("div",ue,[n("h1",de,l($.value),1)]),n("div",_e,[c(H)]),h.value?(s(),_("div",fe,[S(l(h.value)+" ",1),n("a",pe,[v.value?(s(),_("span",me," | "+l(v.value),1)):b("",!0)])])):b("",!0)]),_:1})]),_:1})]),_:1})}}}),ye=ne(ge,[["__scopeId","data-v-627faa7f"]]);export{ye as default}; diff --git a/frontend/dist/assets/LoginLogManage-CQqltd1Y.js b/frontend/dist/assets/LoginLogManage-COZ7cyEH.js similarity index 97% rename from frontend/dist/assets/LoginLogManage-CQqltd1Y.js rename to frontend/dist/assets/LoginLogManage-COZ7cyEH.js index e9e9dd2..67bb9ba 100644 --- a/frontend/dist/assets/LoginLogManage-CQqltd1Y.js +++ b/frontend/dist/assets/LoginLogManage-COZ7cyEH.js @@ -1 +1 @@ -import{G as y,O as M,n as w,f as V,H as Y,g as D,c as H,d as n,w as l,F as O,i as p,r as s,I as R,B as E,b as _,E as m,P as L,o as I}from"./index-ChTrSGCb.js";function P(f){return()=>({crudOptions:{pagination:{show:!1},search:{show:!0,options:{layout:"inline"},expand:!1},request:{pageRequest:async e=>{const{data:t}=await w.post("/login-logs/search",e);return t},transformQuery:({form:e})=>{const t={};return e!=null&&e.username&&(t.username=e.username),e!=null&&e.status&&(t.status=e.status),t},transformRes:({res:e})=>{const t=Array.isArray(e)?e:[];return{currentPage:1,pageSize:Math.max(t.length,1),total:t.length,records:t}}},rowHandle:{show:!1},toolbar:{buttons:{clean:{text:"清理旧日志",type:"warning",click:()=>f.onClean()}}},columns:{id:{title:"ID",key:"id",type:"number",column:{width:70},form:{show:!1}},username:{title:"用户名",key:"username",type:"text",search:{show:!0}},status:{title:"状态",key:"status",type:"dict-select",search:{show:!0},dict:M({data:[{value:"success",label:"成功"},{value:"failure",label:"失败"}],value:"value",label:"label"}),column:{width:80}},failure_reason:{title:"失败原因",key:"failure_reason",type:"text",column:{width:160}},ip_address:{title:"IP地址",key:"ip_address",type:"text",column:{width:150}},user_agent:{title:"User-Agent",key:"user_agent",type:"text",column:{width:300}},login_time:{title:"登录时间",key:"login_time",type:"text",column:{width:170},form:{show:!1},valueBuilder({value:e,row:t,key:u}){!t||e==null||(t[u]=y(e).format("YYYY-MM-DD HH:mm:ss"))}}}}})}const S=V({__name:"LoginLogManage",setup(f){const{crudBinding:e,crudRef:t,crudExpose:u}=Y({createCrudOptions:P({onClean:()=>{o.value=!0}})}),o=p(!1),r=p(),d=p(!1);async function h(){if(!r.value){m.warning("请选择要清理的日期");return}try{await L.confirm(`确定要清理 ${y(r.value).format("YYYY-MM-DD HH:mm:ss")} 之前的所有登录日志吗?此操作不可撤销。`,"确认清理",{confirmButtonText:"确认清理",cancelButtonText:"取消",type:"warning"})}catch{return}d.value=!0;try{const{data:c}=await w.delete("/login-logs/clean",{data:{before_date:r.value.toISOString()}});m.success(c.message||"清理成功"),o.value=!1,u.doRefresh()}catch{m.error("清理失败")}finally{d.value=!1}}return D(()=>{u.doRefresh()}),(c,a)=>{const v=s("fs-crud"),x=s("fs-page"),k=s("el-date-picker"),b=s("el-form-item"),C=s("el-form"),g=s("el-button"),B=s("el-dialog");return I(),H(O,null,[n(x,null,{default:l(()=>[n(v,R({ref_key:"crudRef",ref:t},E(e)),null,16)]),_:1}),n(B,{modelValue:o.value,"onUpdate:modelValue":a[2]||(a[2]=i=>o.value=i),title:"清理旧日志",width:"420px"},{footer:l(()=>[n(g,{onClick:a[1]||(a[1]=i=>o.value=!1)},{default:l(()=>[...a[3]||(a[3]=[_("取消",-1)])]),_:1}),n(g,{type:"warning",loading:d.value,onClick:h},{default:l(()=>[...a[4]||(a[4]=[_("确认清理",-1)])]),_:1},8,["loading"])]),default:l(()=>[n(C,null,{default:l(()=>[n(b,{label:"清理此日期之前的日志"},{default:l(()=>[n(k,{modelValue:r.value,"onUpdate:modelValue":a[0]||(a[0]=i=>r.value=i),type:"datetime",placeholder:"选择日期时间",style:{width:"100%"}},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue"])],64)}}});export{S as default}; +import{G as y,O as M,n as w,f as V,H as Y,g as D,c as H,d as n,w as l,F as O,i as p,r as s,I as R,B as E,b as _,E as m,P as L,o as I}from"./index-rb7Oshfn.js";function P(f){return()=>({crudOptions:{pagination:{show:!1},search:{show:!0,options:{layout:"inline"},expand:!1},request:{pageRequest:async e=>{const{data:t}=await w.post("/login-logs/search",e);return t},transformQuery:({form:e})=>{const t={};return e!=null&&e.username&&(t.username=e.username),e!=null&&e.status&&(t.status=e.status),t},transformRes:({res:e})=>{const t=Array.isArray(e)?e:[];return{currentPage:1,pageSize:Math.max(t.length,1),total:t.length,records:t}}},rowHandle:{show:!1},toolbar:{buttons:{clean:{text:"清理旧日志",type:"warning",click:()=>f.onClean()}}},columns:{id:{title:"ID",key:"id",type:"number",column:{width:70},form:{show:!1}},username:{title:"用户名",key:"username",type:"text",search:{show:!0}},status:{title:"状态",key:"status",type:"dict-select",search:{show:!0},dict:M({data:[{value:"success",label:"成功"},{value:"failure",label:"失败"}],value:"value",label:"label"}),column:{width:80}},failure_reason:{title:"失败原因",key:"failure_reason",type:"text",column:{width:160}},ip_address:{title:"IP地址",key:"ip_address",type:"text",column:{width:150}},user_agent:{title:"User-Agent",key:"user_agent",type:"text",column:{width:300}},login_time:{title:"登录时间",key:"login_time",type:"text",column:{width:170},form:{show:!1},valueBuilder({value:e,row:t,key:u}){!t||e==null||(t[u]=y(e).format("YYYY-MM-DD HH:mm:ss"))}}}}})}const S=V({__name:"LoginLogManage",setup(f){const{crudBinding:e,crudRef:t,crudExpose:u}=Y({createCrudOptions:P({onClean:()=>{o.value=!0}})}),o=p(!1),r=p(),d=p(!1);async function h(){if(!r.value){m.warning("请选择要清理的日期");return}try{await L.confirm(`确定要清理 ${y(r.value).format("YYYY-MM-DD HH:mm:ss")} 之前的所有登录日志吗?此操作不可撤销。`,"确认清理",{confirmButtonText:"确认清理",cancelButtonText:"取消",type:"warning"})}catch{return}d.value=!0;try{const{data:c}=await w.delete("/login-logs/clean",{data:{before_date:r.value.toISOString()}});m.success(c.message||"清理成功"),o.value=!1,u.doRefresh()}catch{m.error("清理失败")}finally{d.value=!1}}return D(()=>{u.doRefresh()}),(c,a)=>{const v=s("fs-crud"),x=s("fs-page"),k=s("el-date-picker"),b=s("el-form-item"),C=s("el-form"),g=s("el-button"),B=s("el-dialog");return I(),H(O,null,[n(x,null,{default:l(()=>[n(v,R({ref_key:"crudRef",ref:t},E(e)),null,16)]),_:1}),n(B,{modelValue:o.value,"onUpdate:modelValue":a[2]||(a[2]=i=>o.value=i),title:"清理旧日志",width:"420px"},{footer:l(()=>[n(g,{onClick:a[1]||(a[1]=i=>o.value=!1)},{default:l(()=>[...a[3]||(a[3]=[_("取消",-1)])]),_:1}),n(g,{type:"warning",loading:d.value,onClick:h},{default:l(()=>[...a[4]||(a[4]=[_("确认清理",-1)])]),_:1},8,["loading"])]),default:l(()=>[n(C,null,{default:l(()=>[n(b,{label:"清理此日期之前的日志"},{default:l(()=>[n(k,{modelValue:r.value,"onUpdate:modelValue":a[0]||(a[0]=i=>r.value=i),type:"datetime",placeholder:"选择日期时间",style:{width:"100%"}},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue"])],64)}}});export{S as default}; diff --git a/frontend/dist/assets/LoginView-CL6FqBfI.js b/frontend/dist/assets/LoginView-CdDWJNab.js similarity index 97% rename from frontend/dist/assets/LoginView-CL6FqBfI.js rename to frontend/dist/assets/LoginView-CdDWJNab.js index c595902..971c5bc 100644 --- a/frontend/dist/assets/LoginView-CL6FqBfI.js +++ b/frontend/dist/assets/LoginView-CdDWJNab.js @@ -1 +1 @@ -import{f as q,u as I,g as j,c as h,d as o,w as r,h as k,E as g,r as u,i,j as B,k as D,l as E,o as w,m as M,a as v,b as N,t as O,n as P,_ as $}from"./index-ChTrSGCb.js";const A={class:"login-wrap"},W={class:"card-title"},X={class:"captcha-row"},z=["src"],F={key:1,class:"captcha-placeholder"},G=q({__name:"LoginView",setup(H){const x=D(),R=E(),m=I(),b=i(),_=i(!1),l=i(""),p=i(""),y=i(""),V="/api",a=B({username:"",password:"",captcha_code:""}),U={username:[{required:!0,message:"请输入用户名",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}],captcha_code:[{required:!0,message:"请输入验证码",trigger:"blur"}]};async function C(){let t=await k.get(`${V}/settings/public?setting_id=1`);t.data&&(y.value=t.data.value)}async function f(){l.value.startsWith("blob:")&&URL.revokeObjectURL(l.value),l.value="",p.value="";const t=await k.get(`${V}/users/captcha`,{responseType:"blob",headers:{}}),e=t.headers["x-captcha-id"]||t.headers["X-Captcha-ID"];if(!e){g.error("未获取到验证码 ID,请检查后端 CORS expose_headers");return}p.value=e,l.value=URL.createObjectURL(t.data),a.captcha_code=""}async function L(){var e,n;if(!p.value){g.warning("请先加载验证码");return}const t=b.value;if(t){try{await t.validate()}catch{return}_.value=!0;try{const{data:s}=await P.post("/users/login",{username:a.username,password:a.password,captcha_id:p.value,captcha_code:a.captcha_code});m.setToken(s.access_token),await m.fetchProfile(),await m.fetchPermissions();const c=x.query.redirect||"/admin";await R.replace(c)}catch(s){const c=(n=(e=s==null?void 0:s.response)==null?void 0:e.data)==null?void 0:n.detail;g.error(typeof c=="string"?c:"登录失败"),await f()}finally{_.value=!1}}}return j(()=>{f(),C()}),(t,e)=>{const n=u("el-input"),s=u("el-form-item"),c=u("el-button"),S=u("el-form"),T=u("el-card");return w(),h("div",A,[o(T,{class:"card",shadow:"hover"},{header:r(()=>[v("span",W,O(y.value),1)]),default:r(()=>[o(S,{ref_key:"formRef",ref:b,model:a,rules:U,"label-width":"88px",onSubmit:e[3]||(e[3]=M(()=>{},["prevent"]))},{default:r(()=>[o(s,{label:"用户名",prop:"username"},{default:r(()=>[o(n,{modelValue:a.username,"onUpdate:modelValue":e[0]||(e[0]=d=>a.username=d),autocomplete:"username"},null,8,["modelValue"])]),_:1}),o(s,{label:"密码",prop:"password"},{default:r(()=>[o(n,{modelValue:a.password,"onUpdate:modelValue":e[1]||(e[1]=d=>a.password=d),type:"password","show-password":"",autocomplete:"current-password"},null,8,["modelValue"])]),_:1}),o(s,{label:"验证码",prop:"captcha_code"},{default:r(()=>[v("div",X,[o(n,{modelValue:a.captcha_code,"onUpdate:modelValue":e[2]||(e[2]=d=>a.captcha_code=d),maxlength:"8",placeholder:"请输入验证码"},null,8,["modelValue"]),v("div",{class:"captcha-img",onClick:f},[l.value?(w(),h("img",{key:0,src:l.value,alt:"captcha"},null,8,z)):(w(),h("span",F,"点击获取"))])])]),_:1}),o(s,null,{default:r(()=>[o(c,{type:"primary",loading:_.value,style:{width:"100%"},onClick:L},{default:r(()=>[...e[4]||(e[4]=[N(" 登录 ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])]),_:1})])}}}),K=$(G,[["__scopeId","data-v-3d2542ad"]]);export{K as default}; +import{f as q,u as I,g as j,c as h,d as o,w as r,h as k,E as g,r as u,i,j as B,k as D,l as E,o as w,m as M,a as v,b as N,t as O,n as P,_ as $}from"./index-rb7Oshfn.js";const A={class:"login-wrap"},W={class:"card-title"},X={class:"captcha-row"},z=["src"],F={key:1,class:"captcha-placeholder"},G=q({__name:"LoginView",setup(H){const x=D(),R=E(),m=I(),b=i(),_=i(!1),l=i(""),p=i(""),y=i(""),V="/api",a=B({username:"",password:"",captcha_code:""}),U={username:[{required:!0,message:"请输入用户名",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}],captcha_code:[{required:!0,message:"请输入验证码",trigger:"blur"}]};async function C(){let t=await k.get(`${V}/settings/public?setting_id=1`);t.data&&(y.value=t.data.value)}async function f(){l.value.startsWith("blob:")&&URL.revokeObjectURL(l.value),l.value="",p.value="";const t=await k.get(`${V}/users/captcha`,{responseType:"blob",headers:{}}),e=t.headers["x-captcha-id"]||t.headers["X-Captcha-ID"];if(!e){g.error("未获取到验证码 ID,请检查后端 CORS expose_headers");return}p.value=e,l.value=URL.createObjectURL(t.data),a.captcha_code=""}async function L(){var e,n;if(!p.value){g.warning("请先加载验证码");return}const t=b.value;if(t){try{await t.validate()}catch{return}_.value=!0;try{const{data:s}=await P.post("/users/login",{username:a.username,password:a.password,captcha_id:p.value,captcha_code:a.captcha_code});m.setToken(s.access_token),await m.fetchProfile(),await m.fetchPermissions();const c=x.query.redirect||"/admin";await R.replace(c)}catch(s){const c=(n=(e=s==null?void 0:s.response)==null?void 0:e.data)==null?void 0:n.detail;g.error(typeof c=="string"?c:"登录失败"),await f()}finally{_.value=!1}}}return j(()=>{f(),C()}),(t,e)=>{const n=u("el-input"),s=u("el-form-item"),c=u("el-button"),S=u("el-form"),T=u("el-card");return w(),h("div",A,[o(T,{class:"card",shadow:"hover"},{header:r(()=>[v("span",W,O(y.value),1)]),default:r(()=>[o(S,{ref_key:"formRef",ref:b,model:a,rules:U,"label-width":"88px",onSubmit:e[3]||(e[3]=M(()=>{},["prevent"]))},{default:r(()=>[o(s,{label:"用户名",prop:"username"},{default:r(()=>[o(n,{modelValue:a.username,"onUpdate:modelValue":e[0]||(e[0]=d=>a.username=d),autocomplete:"username"},null,8,["modelValue"])]),_:1}),o(s,{label:"密码",prop:"password"},{default:r(()=>[o(n,{modelValue:a.password,"onUpdate:modelValue":e[1]||(e[1]=d=>a.password=d),type:"password","show-password":"",autocomplete:"current-password"},null,8,["modelValue"])]),_:1}),o(s,{label:"验证码",prop:"captcha_code"},{default:r(()=>[v("div",X,[o(n,{modelValue:a.captcha_code,"onUpdate:modelValue":e[2]||(e[2]=d=>a.captcha_code=d),maxlength:"8",placeholder:"请输入验证码"},null,8,["modelValue"]),v("div",{class:"captcha-img",onClick:f},[l.value?(w(),h("img",{key:0,src:l.value,alt:"captcha"},null,8,z)):(w(),h("span",F,"点击获取"))])])]),_:1}),o(s,null,{default:r(()=>[o(c,{type:"primary",loading:_.value,style:{width:"100%"},onClick:L},{default:r(()=>[...e[4]||(e[4]=[N(" 登录 ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])]),_:1})])}}}),K=$(G,[["__scopeId","data-v-3d2542ad"]]);export{K as default}; diff --git a/frontend/dist/assets/MenuManage-J689-0Rz.js b/frontend/dist/assets/MenuManage-BEleckEE.js similarity index 58% rename from frontend/dist/assets/MenuManage-J689-0Rz.js rename to frontend/dist/assets/MenuManage-BEleckEE.js index afbc784..a1fb520 100644 --- a/frontend/dist/assets/MenuManage-J689-0Rz.js +++ b/frontend/dist/assets/MenuManage-BEleckEE.js @@ -1 +1 @@ -import{G as l,E as t,n as u,f as y,H as h,g as w,q as _,w as x,r as m,d as k,I as q,B as E,o as M}from"./index-ChTrSGCb.js";import{t as D}from"./list-query-4ZZvVtjn.js";const R=()=>({crudOptions:{pagination:{show:!1},search:{show:!0,options:{layout:"inline"},expand:!1},tree:{enable:!0,childrenKey:"children",parentKey:"parentid",hasChildField:"children"},request:{transformQuery:({form:e})=>D(e,["name","code"]),pageRequest:async e=>{const{data:s}=await u.get("/permissions/tree");return s},transformRes:({res:e})=>{const s=Array.isArray(e)?e:[];return{currentPage:1,pageSize:Math.max(s.length,1),total:s.length,records:s}},addRequest:async({form:e})=>{await u.post("/permissions/",e),t.success({message:"添加成功",duration:5e3})},editRequest:async({form:e,row:s})=>{s&&(await u.put(`/permissions/${s.id}`,e),t.success({message:"修改成功",duration:5e3}))},delRequest:async({row:e})=>{e&&(await u.delete(`/permissions/${e.id}`),t.success({message:"删除成功",duration:5e3}))},onSuccess:({action:e})=>{e==="add"?t.success({message:"添加成功",duration:5e3}):e==="edit"&&t.success({message:"修改成功",duration:5e3})},onError:e=>{var r;let s="操作失败";if((r=e.response)!=null&&r.data){const a=e.response.data;a.message?s=a.message:a.detail&&(s=typeof a.detail=="string"?a.detail:"操作失败")}t.error({message:s,duration:5e3})}},table:{remove:{showSuccessNotification:!1}},rowHandle:{buttons:{edit:{text:"编辑"},remove:{text:"删除"}}},columns:{id:{title:"ID",key:"id",type:"number",column:{width:70},form:{show:!1}},name:{title:"名称",key:"name",type:"text",search:{show:!0},form:{rules:[{required:!0,message:"必填"}]}},code:{title:"编码",key:"code",type:"text",search:{show:!0},form:{rules:[{required:!0,message:"必填"}]}},parentid:{title:"父级ID",key:"parentid",type:"number",form:{value:0,rules:[{required:!0,message:"必填"}]}},description:{title:"描述",key:"description",type:"textarea",column:{show:!1}},route:{title:"路由",key:"route",type:"text",column:{width:200},form:{placeholder:"如:/admin/users"}},createtime:{title:"创建时间",key:"createtime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:s,key:r}){!s||e==null||(s[r]=l(e).format("YYYY-MM-DD HH:mm:ss"))}},updatetime:{title:"更新时间",key:"updatetime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:s,key:r}){!s||e==null||(s[r]=l(e).format("YYYY-MM-DD HH:mm:ss"))}}}}}),B=y({__name:"MenuManage",setup(e){const{crudBinding:s,crudRef:r,crudExpose:a}=h({createCrudOptions:R}),p=()=>{t.success({message:"添加成功",duration:5e3})},f=()=>{t.success({message:"修改成功",duration:5e3})},g=()=>{t.success({message:"删除成功",duration:5e3})},d=c=>{var i;let n="操作失败";if((i=c.response)!=null&&i.data){const o=c.response.data;o.message?n=o.message:o.detail&&(n=typeof o.detail=="string"?o.detail:"操作失败")}t.error({message:n,duration:5e3})};return w(()=>{a.doRefresh()}),(c,n)=>{const i=m("fs-crud"),o=m("fs-page");return M(),_(o,null,{default:x(()=>[k(i,q({ref_key:"crudRef",ref:r},E(s),{onAddSuccess:p,onEditSuccess:f,onDelSuccess:g,onAddError:d,onEditError:d,onDelError:d}),null,16)]),_:1})}}});export{B as default}; +import{G as l,E as t,n as u,f as y,H as h,g as w,q as _,w as x,r as m,d as k,I as q,B as E,o as M}from"./index-rb7Oshfn.js";import{t as D}from"./list-query-4ZZvVtjn.js";const R=()=>({crudOptions:{pagination:{show:!1},search:{show:!0,options:{layout:"inline"},expand:!1},tree:{enable:!0,childrenKey:"children",parentKey:"parentid",hasChildField:"children"},request:{transformQuery:({form:e})=>D(e,["name","code"]),pageRequest:async e=>{const{data:s}=await u.get("/permissions/tree");return s},transformRes:({res:e})=>{const s=Array.isArray(e)?e:[];return{currentPage:1,pageSize:Math.max(s.length,1),total:s.length,records:s}},addRequest:async({form:e})=>{await u.post("/permissions/",e),t.success({message:"添加成功",duration:5e3})},editRequest:async({form:e,row:s})=>{s&&(await u.put(`/permissions/${s.id}`,e),t.success({message:"修改成功",duration:5e3}))},delRequest:async({row:e})=>{e&&(await u.delete(`/permissions/${e.id}`),t.success({message:"删除成功",duration:5e3}))},onSuccess:({action:e})=>{e==="add"?t.success({message:"添加成功",duration:5e3}):e==="edit"&&t.success({message:"修改成功",duration:5e3})},onError:e=>{var r;let s="操作失败";if((r=e.response)!=null&&r.data){const a=e.response.data;a.message?s=a.message:a.detail&&(s=typeof a.detail=="string"?a.detail:"操作失败")}t.error({message:s,duration:5e3})}},table:{remove:{showSuccessNotification:!1}},rowHandle:{buttons:{edit:{text:"编辑"},remove:{text:"删除"}}},columns:{id:{title:"ID",key:"id",type:"number",column:{width:70},form:{show:!1}},name:{title:"名称",key:"name",type:"text",search:{show:!0},form:{rules:[{required:!0,message:"必填"}]}},code:{title:"编码",key:"code",type:"text",search:{show:!0},form:{rules:[{required:!0,message:"必填"}]}},parentid:{title:"父级ID",key:"parentid",type:"number",form:{value:0,rules:[{required:!0,message:"必填"}]}},description:{title:"描述",key:"description",type:"textarea",column:{show:!1}},route:{title:"路由",key:"route",type:"text",column:{width:200},form:{placeholder:"如:/admin/users"}},sort:{title:"排序",key:"sort",type:"number",column:{width:80,align:"center"},form:{value:0,rules:[{required:!0,message:"必填"}],helper:"数字越小,排序越靠前"}},createtime:{title:"创建时间",key:"createtime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:s,key:r}){!s||e==null||(s[r]=l(e).format("YYYY-MM-DD HH:mm:ss"))}},updatetime:{title:"更新时间",key:"updatetime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:s,key:r}){!s||e==null||(s[r]=l(e).format("YYYY-MM-DD HH:mm:ss"))}}}}}),b=y({__name:"MenuManage",setup(e){const{crudBinding:s,crudRef:r,crudExpose:a}=h({createCrudOptions:R}),p=()=>{t.success({message:"添加成功",duration:5e3})},f=()=>{t.success({message:"修改成功",duration:5e3})},g=()=>{t.success({message:"删除成功",duration:5e3})},d=c=>{var i;let n="操作失败";if((i=c.response)!=null&&i.data){const o=c.response.data;o.message?n=o.message:o.detail&&(n=typeof o.detail=="string"?o.detail:"操作失败")}t.error({message:n,duration:5e3})};return w(()=>{a.doRefresh()}),(c,n)=>{const i=m("fs-crud"),o=m("fs-page");return M(),_(o,null,{default:x(()=>[k(i,q({ref_key:"crudRef",ref:r},E(s),{onAddSuccess:p,onEditSuccess:f,onDelSuccess:g,onAddError:d,onEditError:d,onDelError:d}),null,16)]),_:1})}}});export{b as default}; diff --git a/frontend/dist/assets/OperationLogManage-CrJsIKz-.js b/frontend/dist/assets/OperationLogManage-BIONNQB8.js similarity index 98% rename from frontend/dist/assets/OperationLogManage-CrJsIKz-.js rename to frontend/dist/assets/OperationLogManage-BIONNQB8.js index 79bc404..18fd5c2 100644 --- a/frontend/dist/assets/OperationLogManage-CrJsIKz-.js +++ b/frontend/dist/assets/OperationLogManage-BIONNQB8.js @@ -1 +1 @@ -import{G as w,O as f,n as h,f as M,H as V,g as O,c as Y,d as l,w as n,F as H,i as p,r as o,I,B as R,b as g,E as m,P as E,o as P}from"./index-ChTrSGCb.js";function A(_){return()=>({crudOptions:{pagination:{show:!1},search:{show:!0,options:{layout:"inline"},expand:!1},request:{pageRequest:async e=>{const{data:t}=await h.post("/operation-logs/search",e);return t},transformQuery:({form:e})=>{const t={};return e!=null&&e.username&&(t.username=e.username),e!=null&&e.action_type&&(t.action_type=e.action_type),e!=null&&e.target_type&&(t.target_type=e.target_type),t},transformRes:({res:e})=>{const t=Array.isArray(e)?e:[];return{currentPage:1,pageSize:Math.max(t.length,1),total:t.length,records:t}}},rowHandle:{show:!1},toolbar:{buttons:{clean:{text:"清理旧日志",type:"warning",click:()=>_.onClean()}}},columns:{id:{title:"ID",key:"id",type:"number",column:{width:70},form:{show:!1}},user_id:{title:"用户ID",key:"user_id",type:"number",column:{width:80},form:{show:!1}},username:{title:"操作人",key:"username",type:"text",search:{show:!0}},action_type:{title:"操作类型",key:"action_type",type:"dict-select",search:{show:!0},dict:f({data:[{value:"create",label:"创建"},{value:"update",label:"更新"},{value:"delete",label:"删除"}],value:"value",label:"label"}),column:{width:90}},target_type:{title:"目标类型",key:"target_type",type:"dict-select",search:{show:!0},dict:f({data:[{value:"user",label:"用户"},{value:"role",label:"角色"},{value:"permission",label:"菜单"},{value:"setting",label:"系统设置"}],value:"value",label:"label"}),column:{width:100}},target_name:{title:"目标名称",key:"target_name",type:"text",column:{width:140}},target_id:{title:"目标ID",key:"target_id",type:"number",column:{width:80},form:{show:!1}},detail:{title:"变更详情",key:"detail",type:"text",column:{width:200},form:{show:!1}},ip_address:{title:"IP地址",key:"ip_address",type:"text",column:{width:150}},user_agent:{title:"User-Agent",key:"user_agent",type:"text",column:{width:300}},createtime:{title:"操作时间",key:"createtime",type:"text",column:{width:170},form:{show:!1},valueBuilder({value:e,row:t,key:u}){!t||e==null||(t[u]=w(e).format("YYYY-MM-DD HH:mm:ss"))}}}}})}const S=M({__name:"OperationLogManage",setup(_){const{crudBinding:e,crudRef:t,crudExpose:u}=V({createCrudOptions:A({onClean:()=>{s.value=!0}})}),s=p(!1),r=p(),d=p(!1);async function v(){if(!r.value){m.warning("请选择要清理的日期");return}try{await E.confirm(`确定要清理 ${w(r.value).format("YYYY-MM-DD HH:mm:ss")} 之前的所有操作日志吗?此操作不可撤销。`,"确认清理",{confirmButtonText:"确认清理",cancelButtonText:"取消",type:"warning"})}catch{return}d.value=!0;try{const{data:c}=await h.delete("/operation-logs/clean",{data:{before_date:r.value.toISOString()}});m.success(c.message||"清理成功"),s.value=!1,u.doRefresh()}catch{m.error("清理失败")}finally{d.value=!1}}return O(()=>{u.doRefresh()}),(c,a)=>{const b=o("fs-crud"),k=o("fs-page"),x=o("el-date-picker"),C=o("el-form-item"),B=o("el-form"),y=o("el-button"),D=o("el-dialog");return P(),Y(H,null,[l(k,null,{default:n(()=>[l(b,I({ref_key:"crudRef",ref:t},R(e)),null,16)]),_:1}),l(D,{modelValue:s.value,"onUpdate:modelValue":a[2]||(a[2]=i=>s.value=i),title:"清理旧日志",width:"420px"},{footer:n(()=>[l(y,{onClick:a[1]||(a[1]=i=>s.value=!1)},{default:n(()=>[...a[3]||(a[3]=[g("取消",-1)])]),_:1}),l(y,{type:"warning",loading:d.value,onClick:v},{default:n(()=>[...a[4]||(a[4]=[g("确认清理",-1)])]),_:1},8,["loading"])]),default:n(()=>[l(B,null,{default:n(()=>[l(C,{label:"清理此日期之前的日志"},{default:n(()=>[l(x,{modelValue:r.value,"onUpdate:modelValue":a[0]||(a[0]=i=>r.value=i),type:"datetime",placeholder:"选择日期时间",style:{width:"100%"}},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue"])],64)}}});export{S as default}; +import{G as w,O as f,n as h,f as M,H as V,g as O,c as Y,d as l,w as n,F as H,i as p,r as o,I,B as R,b as g,E as m,P as E,o as P}from"./index-rb7Oshfn.js";function A(_){return()=>({crudOptions:{pagination:{show:!1},search:{show:!0,options:{layout:"inline"},expand:!1},request:{pageRequest:async e=>{const{data:t}=await h.post("/operation-logs/search",e);return t},transformQuery:({form:e})=>{const t={};return e!=null&&e.username&&(t.username=e.username),e!=null&&e.action_type&&(t.action_type=e.action_type),e!=null&&e.target_type&&(t.target_type=e.target_type),t},transformRes:({res:e})=>{const t=Array.isArray(e)?e:[];return{currentPage:1,pageSize:Math.max(t.length,1),total:t.length,records:t}}},rowHandle:{show:!1},toolbar:{buttons:{clean:{text:"清理旧日志",type:"warning",click:()=>_.onClean()}}},columns:{id:{title:"ID",key:"id",type:"number",column:{width:70},form:{show:!1}},user_id:{title:"用户ID",key:"user_id",type:"number",column:{width:80},form:{show:!1}},username:{title:"操作人",key:"username",type:"text",search:{show:!0}},action_type:{title:"操作类型",key:"action_type",type:"dict-select",search:{show:!0},dict:f({data:[{value:"create",label:"创建"},{value:"update",label:"更新"},{value:"delete",label:"删除"}],value:"value",label:"label"}),column:{width:90}},target_type:{title:"目标类型",key:"target_type",type:"dict-select",search:{show:!0},dict:f({data:[{value:"user",label:"用户"},{value:"role",label:"角色"},{value:"permission",label:"菜单"},{value:"setting",label:"系统设置"}],value:"value",label:"label"}),column:{width:100}},target_name:{title:"目标名称",key:"target_name",type:"text",column:{width:140}},target_id:{title:"目标ID",key:"target_id",type:"number",column:{width:80},form:{show:!1}},detail:{title:"变更详情",key:"detail",type:"text",column:{width:200},form:{show:!1}},ip_address:{title:"IP地址",key:"ip_address",type:"text",column:{width:150}},user_agent:{title:"User-Agent",key:"user_agent",type:"text",column:{width:300}},createtime:{title:"操作时间",key:"createtime",type:"text",column:{width:170},form:{show:!1},valueBuilder({value:e,row:t,key:u}){!t||e==null||(t[u]=w(e).format("YYYY-MM-DD HH:mm:ss"))}}}}})}const S=M({__name:"OperationLogManage",setup(_){const{crudBinding:e,crudRef:t,crudExpose:u}=V({createCrudOptions:A({onClean:()=>{s.value=!0}})}),s=p(!1),r=p(),d=p(!1);async function v(){if(!r.value){m.warning("请选择要清理的日期");return}try{await E.confirm(`确定要清理 ${w(r.value).format("YYYY-MM-DD HH:mm:ss")} 之前的所有操作日志吗?此操作不可撤销。`,"确认清理",{confirmButtonText:"确认清理",cancelButtonText:"取消",type:"warning"})}catch{return}d.value=!0;try{const{data:c}=await h.delete("/operation-logs/clean",{data:{before_date:r.value.toISOString()}});m.success(c.message||"清理成功"),s.value=!1,u.doRefresh()}catch{m.error("清理失败")}finally{d.value=!1}}return O(()=>{u.doRefresh()}),(c,a)=>{const b=o("fs-crud"),k=o("fs-page"),x=o("el-date-picker"),C=o("el-form-item"),B=o("el-form"),y=o("el-button"),D=o("el-dialog");return P(),Y(H,null,[l(k,null,{default:n(()=>[l(b,I({ref_key:"crudRef",ref:t},R(e)),null,16)]),_:1}),l(D,{modelValue:s.value,"onUpdate:modelValue":a[2]||(a[2]=i=>s.value=i),title:"清理旧日志",width:"420px"},{footer:n(()=>[l(y,{onClick:a[1]||(a[1]=i=>s.value=!1)},{default:n(()=>[...a[3]||(a[3]=[g("取消",-1)])]),_:1}),l(y,{type:"warning",loading:d.value,onClick:v},{default:n(()=>[...a[4]||(a[4]=[g("确认清理",-1)])]),_:1},8,["loading"])]),default:n(()=>[l(B,null,{default:n(()=>[l(C,{label:"清理此日期之前的日志"},{default:n(()=>[l(x,{modelValue:r.value,"onUpdate:modelValue":a[0]||(a[0]=i=>r.value=i),type:"datetime",placeholder:"选择日期时间",style:{width:"100%"}},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue"])],64)}}});export{S as default}; diff --git a/frontend/dist/assets/PublicHome-BE6848HM.js b/frontend/dist/assets/PublicHome-4L60krmd.js similarity index 89% rename from frontend/dist/assets/PublicHome-BE6848HM.js rename to frontend/dist/assets/PublicHome-4L60krmd.js index 486c591..f2a61c0 100644 --- a/frontend/dist/assets/PublicHome-BE6848HM.js +++ b/frontend/dist/assets/PublicHome-4L60krmd.js @@ -1 +1 @@ -import{_ as n,c as r,a as s,b as t,d as l,w as d,r as i,o as a}from"./index-ChTrSGCb.js";const p={},u={class:"public-wrap"},m={class:"hint"};function f(_,o){const e=i("router-link");return a(),r("div",u,[o[5]||(o[5]=s("h1",null,"BookSystem",-1)),s("p",m,[o[1]||(o[1]=t(" 此处预留为",-1)),o[2]||(o[2]=s("strong",null,"无需登录",-1)),o[3]||(o[3]=t("的站点首页(图书浏览、门户等)。管理功能请前往 ",-1)),l(e,{to:"/admin/login"},{default:d(()=>[...o[0]||(o[0]=[t("管理后台",-1)])]),_:1}),o[4]||(o[4]=t("。 ",-1))])])}const x=n(p,[["render",f],["__scopeId","data-v-f5876933"]]);export{x as default}; +import{_ as n,c as r,a as s,b as t,d as l,w as d,r as i,o as a}from"./index-rb7Oshfn.js";const p={},u={class:"public-wrap"},m={class:"hint"};function f(_,o){const e=i("router-link");return a(),r("div",u,[o[5]||(o[5]=s("h1",null,"BookSystem",-1)),s("p",m,[o[1]||(o[1]=t(" 此处预留为",-1)),o[2]||(o[2]=s("strong",null,"无需登录",-1)),o[3]||(o[3]=t("的站点首页(图书浏览、门户等)。管理功能请前往 ",-1)),l(e,{to:"/admin/login"},{default:d(()=>[...o[0]||(o[0]=[t("管理后台",-1)])]),_:1}),o[4]||(o[4]=t("。 ",-1))])])}const x=n(p,[["render",f],["__scopeId","data-v-f5876933"]]);export{x as default}; diff --git a/frontend/dist/assets/RoleManage-C7cZ0SSm.js b/frontend/dist/assets/RoleManage-7Ni_fgq0.js similarity index 97% rename from frontend/dist/assets/RoleManage-C7cZ0SSm.js rename to frontend/dist/assets/RoleManage-7Ni_fgq0.js index bfd1884..f4f819a 100644 --- a/frontend/dist/assets/RoleManage-C7cZ0SSm.js +++ b/frontend/dist/assets/RoleManage-7Ni_fgq0.js @@ -1 +1 @@ -import{G as A,E as d,n as f,f as K,H as L,g as U,q as w,w as y,r as v,i as p,d as k,I as F,B as j,c as V,b as x,a as B,t as C,y as Y,F as G,z as J,o as c,J as Q,K as W,_ as X}from"./index-ChTrSGCb.js";import{t as Z}from"./list-query-4ZZvVtjn.js";function ee(b){return()=>({crudOptions:{pagination:{show:!1},search:{show:!0,options:{layout:"inline"},expand:!1},request:{transformQuery:({form:e})=>Z(e,["name"]),pageRequest:async e=>{const{data:t}=await f.post("/roles/search",e);return t},transformRes:({res:e})=>{const t=Array.isArray(e)?e:[];return{currentPage:1,pageSize:Math.max(t.length,1),total:t.length,records:t}},addRequest:async({form:e})=>{await f.post("/roles/",e),d.success({message:"添加成功",duration:5e3})},editRequest:async({form:e,row:t})=>{t&&(await f.put(`/roles/${t.id}`,e),d.success({message:"修改成功",duration:5e3}))},delRequest:async({row:e})=>{e&&(await f.delete(`/roles/${e.id}`),d.success({message:"删除成功",duration:5e3}))},onSuccess:({action:e})=>{e==="add"?d.success({message:"添加成功",duration:5e3}):e==="edit"&&d.success({message:"修改成功",duration:5e3})},onError:e=>{var r;let t="操作失败";if((r=e.response)!=null&&r.data){const a=e.response.data;a.message?t=a.message:a.detail&&(t=typeof a.detail=="string"?a.detail:"操作失败")}d.error({message:t,duration:5e3})}},table:{remove:{showSuccessNotification:!1}},rowHandle:{width:300,buttons:{view:{show:!1},viewPerm:{text:"查看",order:1,click:({row:e})=>{e&&b.onView(e)}},assignPerm:{text:"分配权限",order:2,click:({row:e})=>{e&&b.onAssign(e)}},edit:{text:"编辑",order:10},remove:{text:"删除",order:20}}},columns:{id:{title:"ID",key:"id",type:"number",column:{width:70},form:{show:!1}},name:{title:"角色名称",key:"name",type:"text",search:{show:!0},form:{rules:[{required:!0,message:"必填"}]}},creator:{title:"创建人",key:"creator",type:"text"},createtime:{title:"创建时间",key:"createtime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:t,key:r}){!t||e==null||(t[r]=A(e).format("YYYY-MM-DD HH:mm:ss"))}},updatetime:{title:"更新时间",key:"updatetime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:t,key:r}){!t||e==null||(t[r]=A(e).format("YYYY-MM-DD HH:mm:ss"))}}}}})}const se={key:0,class:"dlg-role"},te={key:1,class:"perm-tags"},oe={key:0,class:"dlg-role"},ae=K({__name:"RoleManage",setup(b){const e=p(!1),t=p(!1),r=p(null),a=p([]),_=p(null),D=p([]),R=p(),P=p(!1),E={label:"label",children:"children"};function M(o){return o.map(s=>{var l;return{id:s.id,label:`${s.name}(${s.code})`,children:(l=s.children)!=null&&l.length?M(s.children):void 0}})}async function T(){const{data:o}=await f.get("/permissions/tree");D.value=M(o??[])}async function H(o){r.value=o,e.value=!0;try{const{data:s}=await f.get(`/permissions/role/${o.id}`);a.value=s.permissions??[]}catch{d.error("加载权限失败"),a.value=[]}}function S(o){_.value=o,t.value=!0}async function N(){var s,l,g,n,m;const o=_.value;if(o)try{console.log(`Loading permissions for role id: ${o.id}`);const i=await f.get(`/permissions/role/${o.id}`);console.log("Response data:",i.data);const h=(i.data.permissions??[]).map(q=>q.id);console.log("Permission IDs:",h),await Q(),(s=R.value)==null||s.setCheckedKeys(h)}catch(i){console.error("Error loading role permissions:",i),W(i)&&(console.error("Response status:",(l=i.response)==null?void 0:l.status),console.error("Response data:",(g=i.response)==null?void 0:g.data),console.error("Request URL:",(n=i.request)==null?void 0:n.url)),d.error("加载角色权限失败"),(m=R.value)==null||m.setCheckedKeys([])}}async function O(){var s,l,g;const o=_.value;if(o){P.value=!0;try{const n=((s=R.value)==null?void 0:s.getCheckedKeys(!1))??[];await f.post("/permissions/assign",{role_id:o.id,permission_ids:n}),d.success("保存成功"),t.value=!1,$.doRefresh()}catch(n){const m=(g=(l=n==null?void 0:n.response)==null?void 0:l.data)==null?void 0:g.detail;d.error(typeof m=="string"?m:"保存失败")}finally{P.value=!1}}}const{crudBinding:z,crudRef:I,crudExpose:$}=L({createCrudOptions:ee({onView:H,onAssign:S})});return U(async()=>{await T(),$.doRefresh()}),(o,s)=>{const l=v("fs-crud"),g=v("el-tag"),n=v("el-empty"),m=v("el-dialog"),i=v("el-tree"),h=v("el-button"),q=v("fs-page");return c(),w(q,null,{default:y(()=>[k(l,F({ref_key:"crudRef",ref:I},j(z)),null,16),k(m,{modelValue:e.value,"onUpdate:modelValue":s[0]||(s[0]=u=>e.value=u),title:"查看角色权限",width:"560px","destroy-on-close":"",onClosed:s[1]||(s[1]=u=>a.value=[])},{default:y(()=>[r.value?(c(),V("p",se,[s[4]||(s[4]=x(" 角色:",-1)),B("strong",null,C(r.value.name),1)])):Y("",!0),a.value.length?(c(),V("div",te,[(c(!0),V(G,null,J(a.value,u=>(c(),w(g,{key:u.id,class:"perm-tag",type:"info"},{default:y(()=>[x(C(u.name)+"("+C(u.code)+") ",1)]),_:2},1024))),128))])):(c(),w(n,{key:2,description:"暂未分配权限","image-size":72}))]),_:1},8,["modelValue"]),k(m,{modelValue:t.value,"onUpdate:modelValue":s[3]||(s[3]=u=>t.value=u),title:"分配权限",width:"640px","destroy-on-close":"",onOpen:N},{footer:y(()=>[k(h,{onClick:s[2]||(s[2]=u=>t.value=!1)},{default:y(()=>[...s[6]||(s[6]=[x("取消",-1)])]),_:1}),k(h,{type:"primary",loading:P.value,onClick:O},{default:y(()=>[...s[7]||(s[7]=[x(" 保存 ",-1)])]),_:1},8,["loading"])]),default:y(()=>[_.value?(c(),V("p",oe,[s[5]||(s[5]=x(" 角色:",-1)),B("strong",null,C(_.value.name),1)])):Y("",!0),D.value.length?(c(),w(i,{key:1,ref_key:"permTreeRef",ref:R,class:"perm-tree",data:D.value,"show-checkbox":"","node-key":"id",props:E,"default-expand-all":"","check-strictly":!1},null,8,["data"])):(c(),w(n,{key:2,description:"暂无权限数据","image-size":64}))]),_:1},8,["modelValue"])]),_:1})}}}),le=X(ae,[["__scopeId","data-v-0e80fdd4"]]);export{le as default}; +import{G as A,E as d,n as f,f as K,H as L,g as U,q as w,w as y,r as v,i as p,d as k,I as F,B as j,c as V,b as x,a as B,t as C,y as Y,F as G,z as J,o as c,J as Q,K as W,_ as X}from"./index-rb7Oshfn.js";import{t as Z}from"./list-query-4ZZvVtjn.js";function ee(b){return()=>({crudOptions:{pagination:{show:!1},search:{show:!0,options:{layout:"inline"},expand:!1},request:{transformQuery:({form:e})=>Z(e,["name"]),pageRequest:async e=>{const{data:t}=await f.post("/roles/search",e);return t},transformRes:({res:e})=>{const t=Array.isArray(e)?e:[];return{currentPage:1,pageSize:Math.max(t.length,1),total:t.length,records:t}},addRequest:async({form:e})=>{await f.post("/roles/",e),d.success({message:"添加成功",duration:5e3})},editRequest:async({form:e,row:t})=>{t&&(await f.put(`/roles/${t.id}`,e),d.success({message:"修改成功",duration:5e3}))},delRequest:async({row:e})=>{e&&(await f.delete(`/roles/${e.id}`),d.success({message:"删除成功",duration:5e3}))},onSuccess:({action:e})=>{e==="add"?d.success({message:"添加成功",duration:5e3}):e==="edit"&&d.success({message:"修改成功",duration:5e3})},onError:e=>{var r;let t="操作失败";if((r=e.response)!=null&&r.data){const a=e.response.data;a.message?t=a.message:a.detail&&(t=typeof a.detail=="string"?a.detail:"操作失败")}d.error({message:t,duration:5e3})}},table:{remove:{showSuccessNotification:!1}},rowHandle:{width:300,buttons:{view:{show:!1},viewPerm:{text:"查看",order:1,click:({row:e})=>{e&&b.onView(e)}},assignPerm:{text:"分配权限",order:2,click:({row:e})=>{e&&b.onAssign(e)}},edit:{text:"编辑",order:10},remove:{text:"删除",order:20}}},columns:{id:{title:"ID",key:"id",type:"number",column:{width:70},form:{show:!1}},name:{title:"角色名称",key:"name",type:"text",search:{show:!0},form:{rules:[{required:!0,message:"必填"}]}},creator:{title:"创建人",key:"creator",type:"text"},createtime:{title:"创建时间",key:"createtime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:t,key:r}){!t||e==null||(t[r]=A(e).format("YYYY-MM-DD HH:mm:ss"))}},updatetime:{title:"更新时间",key:"updatetime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:t,key:r}){!t||e==null||(t[r]=A(e).format("YYYY-MM-DD HH:mm:ss"))}}}}})}const se={key:0,class:"dlg-role"},te={key:1,class:"perm-tags"},oe={key:0,class:"dlg-role"},ae=K({__name:"RoleManage",setup(b){const e=p(!1),t=p(!1),r=p(null),a=p([]),_=p(null),D=p([]),R=p(),P=p(!1),E={label:"label",children:"children"};function M(o){return o.map(s=>{var l;return{id:s.id,label:`${s.name}(${s.code})`,children:(l=s.children)!=null&&l.length?M(s.children):void 0}})}async function T(){const{data:o}=await f.get("/permissions/tree");D.value=M(o??[])}async function H(o){r.value=o,e.value=!0;try{const{data:s}=await f.get(`/permissions/role/${o.id}`);a.value=s.permissions??[]}catch{d.error("加载权限失败"),a.value=[]}}function S(o){_.value=o,t.value=!0}async function N(){var s,l,g,n,m;const o=_.value;if(o)try{console.log(`Loading permissions for role id: ${o.id}`);const i=await f.get(`/permissions/role/${o.id}`);console.log("Response data:",i.data);const h=(i.data.permissions??[]).map(q=>q.id);console.log("Permission IDs:",h),await Q(),(s=R.value)==null||s.setCheckedKeys(h)}catch(i){console.error("Error loading role permissions:",i),W(i)&&(console.error("Response status:",(l=i.response)==null?void 0:l.status),console.error("Response data:",(g=i.response)==null?void 0:g.data),console.error("Request URL:",(n=i.request)==null?void 0:n.url)),d.error("加载角色权限失败"),(m=R.value)==null||m.setCheckedKeys([])}}async function O(){var s,l,g;const o=_.value;if(o){P.value=!0;try{const n=((s=R.value)==null?void 0:s.getCheckedKeys(!1))??[];await f.post("/permissions/assign",{role_id:o.id,permission_ids:n}),d.success("保存成功"),t.value=!1,$.doRefresh()}catch(n){const m=(g=(l=n==null?void 0:n.response)==null?void 0:l.data)==null?void 0:g.detail;d.error(typeof m=="string"?m:"保存失败")}finally{P.value=!1}}}const{crudBinding:z,crudRef:I,crudExpose:$}=L({createCrudOptions:ee({onView:H,onAssign:S})});return U(async()=>{await T(),$.doRefresh()}),(o,s)=>{const l=v("fs-crud"),g=v("el-tag"),n=v("el-empty"),m=v("el-dialog"),i=v("el-tree"),h=v("el-button"),q=v("fs-page");return c(),w(q,null,{default:y(()=>[k(l,F({ref_key:"crudRef",ref:I},j(z)),null,16),k(m,{modelValue:e.value,"onUpdate:modelValue":s[0]||(s[0]=u=>e.value=u),title:"查看角色权限",width:"560px","destroy-on-close":"",onClosed:s[1]||(s[1]=u=>a.value=[])},{default:y(()=>[r.value?(c(),V("p",se,[s[4]||(s[4]=x(" 角色:",-1)),B("strong",null,C(r.value.name),1)])):Y("",!0),a.value.length?(c(),V("div",te,[(c(!0),V(G,null,J(a.value,u=>(c(),w(g,{key:u.id,class:"perm-tag",type:"info"},{default:y(()=>[x(C(u.name)+"("+C(u.code)+") ",1)]),_:2},1024))),128))])):(c(),w(n,{key:2,description:"暂未分配权限","image-size":72}))]),_:1},8,["modelValue"]),k(m,{modelValue:t.value,"onUpdate:modelValue":s[3]||(s[3]=u=>t.value=u),title:"分配权限",width:"640px","destroy-on-close":"",onOpen:N},{footer:y(()=>[k(h,{onClick:s[2]||(s[2]=u=>t.value=!1)},{default:y(()=>[...s[6]||(s[6]=[x("取消",-1)])]),_:1}),k(h,{type:"primary",loading:P.value,onClick:O},{default:y(()=>[...s[7]||(s[7]=[x(" 保存 ",-1)])]),_:1},8,["loading"])]),default:y(()=>[_.value?(c(),V("p",oe,[s[5]||(s[5]=x(" 角色:",-1)),B("strong",null,C(_.value.name),1)])):Y("",!0),D.value.length?(c(),w(i,{key:1,ref_key:"permTreeRef",ref:R,class:"perm-tree",data:D.value,"show-checkbox":"","node-key":"id",props:E,"default-expand-all":"","check-strictly":!1},null,8,["data"])):(c(),w(n,{key:2,description:"暂无权限数据","image-size":64}))]),_:1},8,["modelValue"])]),_:1})}}}),le=X(ae,[["__scopeId","data-v-0e80fdd4"]]);export{le as default}; diff --git a/frontend/dist/assets/SettingManage-CAoqayco.css b/frontend/dist/assets/SettingManage-CAoqayco.css deleted file mode 100644 index b7324bd..0000000 --- a/frontend/dist/assets/SettingManage-CAoqayco.css +++ /dev/null @@ -1 +0,0 @@ -.setting-container[data-v-a71db493]{padding:20px}.header[data-v-a71db493]{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.header h2[data-v-a71db493]{margin:0;font-size:18px}.add-btn[data-v-a71db493]{background:#409eff;color:#fff;border:none;padding:8px 16px;border-radius:4px;cursor:pointer}.add-btn[data-v-a71db493]:hover{background:#66b1ff}.settings-table[data-v-a71db493]{width:100%;border-collapse:collapse}.settings-table th[data-v-a71db493],.settings-table td[data-v-a71db493]{border:1px solid #ebeef5;padding:12px;text-align:left}.settings-table th[data-v-a71db493]{background:#f5f7fa;font-weight:600}.value-cell[data-v-a71db493]{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cell-image[data-v-a71db493]{width:60px;height:60px;object-fit:contain;border-radius:4px;background:#f5f7fa}.actions[data-v-a71db493]{display:flex;gap:8px}.edit-btn[data-v-a71db493]{background:#67c23a;color:#fff;border:none;padding:4px 12px;border-radius:4px;cursor:pointer}.edit-btn[data-v-a71db493]:hover{background:#85ce61}.modal-overlay[data-v-a71db493]{position:fixed;top:0;left:0;right:0;bottom:0;background:#00000080;display:flex;justify-content:center;align-items:center;z-index:1000}.modal-content[data-v-a71db493]{background:#fff;padding:24px;border-radius:8px;width:480px}.modal-content h3[data-v-a71db493]{margin:0 0 20px;font-size:16px}.form-group[data-v-a71db493]{margin-bottom:16px}.form-group label[data-v-a71db493]{display:block;margin-bottom:8px;font-weight:500}.form-group input[data-v-a71db493],.form-group textarea[data-v-a71db493],.form-select[data-v-a71db493]{width:100%;padding:8px;border:1px solid #dcdfe6;border-radius:4px;box-sizing:border-box}.form-group textarea[data-v-a71db493]{resize:vertical}.form-select[data-v-a71db493]{height:36px}.image-upload-area[data-v-a71db493]{display:flex;flex-direction:column;align-items:center;gap:12px;padding:16px;border:1px dashed #dcdfe6;border-radius:4px;background:#fafafa}.preview-image[data-v-a71db493]{max-width:200px;max-height:120px;object-fit:contain;border-radius:4px}.no-image[data-v-a71db493]{color:#c0c4cc;font-size:13px;padding:12px}.upload-btn[data-v-a71db493]{background:#409eff;color:#fff;border:none;padding:6px 16px;border-radius:4px;cursor:pointer;font-size:13px}.upload-btn[data-v-a71db493]:hover{background:#66b1ff}.upload-hint[data-v-a71db493]{color:#909399;font-size:13px}.modal-footer[data-v-a71db493]{display:flex;justify-content:flex-end;gap:12px;margin-top:24px}.cancel-btn[data-v-a71db493]{background:#f5f7fa;color:#606266;border:none;padding:8px 16px;border-radius:4px;cursor:pointer}.cancel-btn[data-v-a71db493]:hover{background:#e4e7ed}.submit-btn[data-v-a71db493]{background:#409eff;color:#fff;border:none;padding:8px 16px;border-radius:4px;cursor:pointer}.submit-btn[data-v-a71db493]:hover{background:#66b1ff} diff --git a/frontend/dist/assets/SettingManage-DbOShH1j.js b/frontend/dist/assets/SettingManage-D3eSU6jo.js similarity index 96% rename from frontend/dist/assets/SettingManage-DbOShH1j.js rename to frontend/dist/assets/SettingManage-D3eSU6jo.js index f2b772d..7ad0476 100644 --- a/frontend/dist/assets/SettingManage-DbOShH1j.js +++ b/frontend/dist/assets/SettingManage-D3eSU6jo.js @@ -1 +1 @@ -import{f as I,c as n,a as e,F as L,z as B,m as T,t as u,L as p,M as b,N as M,y as C,i as r,n as f,E as i,o,_ as R}from"./index-ChTrSGCb.js";const j={class:"setting-container"},z={class:"settings-table"},A={class:"value-cell"},H=["src"],Y={key:1},q={class:"actions"},G=["onClick"],J={class:"modal-content"},K={class:"form-group"},O={class:"form-group"},P={class:"form-group"},Q={key:0,class:"image-upload-area"},W=["src"],X={key:1,class:"no-image"},Z={key:2,class:"upload-hint"},ee={class:"form-group"},te={class:"modal-footer"},le=I({__name:"SettingManage",setup(ae){const D=s=>({string:"字符串",image:"图片",select:"下拉列表",boolean:"布尔值"})[s]||s,_=s=>{const t=new Date(s);if(isNaN(t.getTime()))return"-";const l=t.getFullYear(),c=String(t.getMonth()+1).padStart(2,"0"),y=String(t.getDate()).padStart(2,"0"),k=String(t.getHours()).padStart(2,"0"),F=String(t.getMinutes()).padStart(2,"0"),N=String(t.getSeconds()).padStart(2,"0");return`${l}-${c}-${y} ${k}:${F}:${N}`},h=r([]),v=r(!1),d=r(!1),g=r(!1),S=r(),a=r({id:0,key:"",value:"",type:"string",description:""}),w=async()=>{try{const{data:s}=await f.get("/settings/");h.value=s}catch{i.error("加载失败")}},$=()=>{d.value=!1,a.value={id:0,key:"",value:"",type:"string",description:""},v.value=!0},x=s=>{d.value=!0,a.value={id:s.id,key:s.key,value:s.value,type:s.type||"string",description:s.description},v.value=!0},m=()=>{v.value=!1,g.value=!1},V=()=>{var s;(s=S.value)==null||s.click()},U=async s=>{var c;const t=s.target,l=(c=t.files)==null?void 0:c[0];if(l){g.value=!0;try{const y=new FormData;y.append("file",l);const{data:k}=await f.post("/settings/upload",y);a.value.value=k.url,i.success("图片上传成功")}catch{i.error("图片上传失败")}finally{g.value=!1,t.value=""}}},E=async()=>{if(!a.value.key){i.warning("请输入设置键名");return}try{d.value?(await f.put(`/settings/${a.value.id}`,a.value),i.success("修改成功")):(await f.post("/settings/",a.value),i.success("添加成功")),m(),await w()}catch{i.error("操作失败")}};return w(),(s,t)=>(o(),n("div",j,[e("div",{class:"header"},[t[5]||(t[5]=e("h2",null,"系统设置管理",-1)),e("button",{class:"add-btn",onClick:$},"添加设置")]),e("table",z,[t[6]||(t[6]=e("thead",null,[e("tr",null,[e("th",null,"ID"),e("th",null,"设置键名"),e("th",null,"类型"),e("th",null,"设置值"),e("th",null,"描述"),e("th",null,"更新时间"),e("th",null,"创建时间"),e("th",null,"操作")])],-1)),e("tbody",null,[(o(!0),n(L,null,B(h.value,l=>(o(),n("tr",{key:l.id},[e("td",null,u(l.id),1),e("td",null,u(l.key),1),e("td",null,u(D(l.type)),1),e("td",A,[l.type==="image"&&l.value?(o(),n("img",{key:0,src:l.value,class:"cell-image"},null,8,H)):(o(),n("span",Y,u(l.value),1))]),e("td",null,u(l.description||"-"),1),e("td",null,u(_(l.updatetime)),1),e("td",null,u(_(l.createtime)),1),e("td",q,[e("button",{class:"edit-btn",onClick:c=>x(l)},"编辑",8,G)])]))),128))])]),v.value?(o(),n("div",{key:0,class:"modal-overlay",onClick:T(m,["self"])},[e("div",J,[e("h3",null,u(d.value?"编辑设置":"添加设置"),1),e("div",K,[t[7]||(t[7]=e("label",null,"设置键名 *",-1)),p(e("input",{"onUpdate:modelValue":t[0]||(t[0]=l=>a.value.key=l),type:"text",placeholder:"请输入设置键名"},null,512),[[b,a.value.key]])]),e("div",O,[t[9]||(t[9]=e("label",null,"类型",-1)),p(e("select",{"onUpdate:modelValue":t[1]||(t[1]=l=>a.value.type=l),class:"form-select"},[...t[8]||(t[8]=[e("option",{value:"string"},"字符串",-1),e("option",{value:"image"},"图片",-1),e("option",{value:"select"},"下拉列表",-1),e("option",{value:"boolean"},"布尔值",-1)])],512),[[M,a.value.type]])]),e("div",P,[t[11]||(t[11]=e("label",null,"设置值",-1)),a.value.type==="image"?(o(),n("div",Q,[a.value.value?(o(),n("img",{key:0,src:a.value.value,class:"preview-image"},null,8,W)):(o(),n("div",X,"暂无图片")),e("input",{ref_key:"fileInputRef",ref:S,type:"file",accept:"image/png,image/jpeg,image/gif,image/webp",style:{display:"none"},onChange:U},null,544),e("button",{class:"upload-btn",onClick:V},"选择图片"),g.value?(o(),n("span",Z,"上传中...")):C("",!0)])):a.value.type==="boolean"?p((o(),n("select",{key:1,"onUpdate:modelValue":t[2]||(t[2]=l=>a.value.value=l),class:"form-select"},[...t[10]||(t[10]=[e("option",{value:"true"},"是",-1),e("option",{value:"false"},"否",-1)])],512)),[[M,a.value.value]]):p((o(),n("textarea",{key:2,"onUpdate:modelValue":t[3]||(t[3]=l=>a.value.value=l),rows:"3",placeholder:"请输入设置值"},null,512)),[[b,a.value.value]])]),e("div",ee,[t[12]||(t[12]=e("label",null,"描述",-1)),p(e("textarea",{"onUpdate:modelValue":t[4]||(t[4]=l=>a.value.description=l),rows:"2",placeholder:"请输入描述"},null,512),[[b,a.value.description]])]),e("div",te,[e("button",{class:"cancel-btn",onClick:m},"取消"),e("button",{class:"submit-btn",onClick:E},u(d.value?"保存修改":"确认添加"),1)])])])):C("",!0)]))}}),ne=R(le,[["__scopeId","data-v-a71db493"]]);export{ne as default}; +import{f as I,c as n,a as e,F as L,z as B,m as T,t as u,L as p,M as b,N as M,y as C,i as r,n as f,E as i,o,_ as R}from"./index-rb7Oshfn.js";const j={class:"setting-container"},z={class:"settings-table"},A={class:"value-cell"},H=["src"],Y={key:1},q={class:"actions"},G=["onClick"],J={class:"modal-content"},K={class:"form-group"},O={class:"form-group"},P={class:"form-group"},Q={key:0,class:"image-upload-area"},W=["src"],X={key:1,class:"no-image"},Z={key:2,class:"upload-hint"},ee={class:"form-group"},te={class:"modal-footer"},le=I({__name:"SettingManage",setup(ae){const D=s=>({string:"字符串",image:"图片",select:"下拉列表",boolean:"布尔值"})[s]||s,_=s=>{const t=new Date(s);if(isNaN(t.getTime()))return"-";const l=t.getFullYear(),c=String(t.getMonth()+1).padStart(2,"0"),y=String(t.getDate()).padStart(2,"0"),k=String(t.getHours()).padStart(2,"0"),F=String(t.getMinutes()).padStart(2,"0"),N=String(t.getSeconds()).padStart(2,"0");return`${l}-${c}-${y} ${k}:${F}:${N}`},h=r([]),v=r(!1),d=r(!1),g=r(!1),S=r(),a=r({id:0,key:"",value:"",type:"string",description:""}),w=async()=>{try{const{data:s}=await f.get("/settings/");h.value=s}catch{i.error("加载失败")}},$=()=>{d.value=!1,a.value={id:0,key:"",value:"",type:"string",description:""},v.value=!0},x=s=>{d.value=!0,a.value={id:s.id,key:s.key,value:s.value,type:s.type||"string",description:s.description},v.value=!0},m=()=>{v.value=!1,g.value=!1},V=()=>{var s;(s=S.value)==null||s.click()},U=async s=>{var c;const t=s.target,l=(c=t.files)==null?void 0:c[0];if(l){g.value=!0;try{const y=new FormData;y.append("file",l);const{data:k}=await f.post("/settings/upload",y);a.value.value=k.url,i.success("图片上传成功")}catch{i.error("图片上传失败")}finally{g.value=!1,t.value=""}}},E=async()=>{if(!a.value.key){i.warning("请输入设置键名");return}try{d.value?(await f.put(`/settings/${a.value.id}`,a.value),i.success("修改成功")):(await f.post("/settings/",a.value),i.success("添加成功")),m(),await w()}catch{i.error("操作失败")}};return w(),(s,t)=>(o(),n("div",j,[e("div",{class:"header"},[t[5]||(t[5]=e("h2",null,"系统设置管理",-1)),e("button",{class:"add-btn",onClick:$},"添加设置")]),e("table",z,[t[6]||(t[6]=e("thead",null,[e("tr",null,[e("th",null,"ID"),e("th",null,"设置键名"),e("th",null,"类型"),e("th",null,"设置值"),e("th",null,"描述"),e("th",null,"更新时间"),e("th",null,"创建时间"),e("th",null,"操作")])],-1)),e("tbody",null,[(o(!0),n(L,null,B(h.value,l=>(o(),n("tr",{key:l.id},[e("td",null,u(l.id),1),e("td",null,u(l.key),1),e("td",null,u(D(l.type)),1),e("td",A,[l.type==="image"&&l.value?(o(),n("img",{key:0,src:l.value,class:"cell-image"},null,8,H)):(o(),n("span",Y,u(l.value),1))]),e("td",null,u(l.description||"-"),1),e("td",null,u(_(l.updatetime)),1),e("td",null,u(_(l.createtime)),1),e("td",q,[e("button",{class:"edit-btn",onClick:c=>x(l)},"编辑",8,G)])]))),128))])]),v.value?(o(),n("div",{key:0,class:"modal-overlay",onClick:T(m,["self"])},[e("div",J,[e("h3",null,u(d.value?"编辑设置":"添加设置"),1),e("div",K,[t[7]||(t[7]=e("label",null,"设置键名 *",-1)),p(e("input",{"onUpdate:modelValue":t[0]||(t[0]=l=>a.value.key=l),type:"text",placeholder:"请输入设置键名"},null,512),[[b,a.value.key]])]),e("div",O,[t[9]||(t[9]=e("label",null,"类型",-1)),p(e("select",{"onUpdate:modelValue":t[1]||(t[1]=l=>a.value.type=l),class:"form-select"},[...t[8]||(t[8]=[e("option",{value:"string"},"字符串",-1),e("option",{value:"image"},"图片",-1),e("option",{value:"select"},"下拉列表",-1),e("option",{value:"boolean"},"布尔值",-1)])],512),[[M,a.value.type]])]),e("div",P,[t[11]||(t[11]=e("label",null,"设置值",-1)),a.value.type==="image"?(o(),n("div",Q,[a.value.value?(o(),n("img",{key:0,src:a.value.value,class:"preview-image"},null,8,W)):(o(),n("div",X,"暂无图片")),e("input",{ref_key:"fileInputRef",ref:S,type:"file",accept:"image/png,image/jpeg,image/gif,image/webp",style:{display:"none"},onChange:U},null,544),e("button",{class:"upload-btn",onClick:V},"选择图片"),g.value?(o(),n("span",Z,"上传中...")):C("",!0)])):a.value.type==="boolean"?p((o(),n("select",{key:1,"onUpdate:modelValue":t[2]||(t[2]=l=>a.value.value=l),class:"form-select"},[...t[10]||(t[10]=[e("option",{value:"true"},"是",-1),e("option",{value:"false"},"否",-1)])],512)),[[M,a.value.value]]):p((o(),n("textarea",{key:2,"onUpdate:modelValue":t[3]||(t[3]=l=>a.value.value=l),rows:"3",placeholder:"请输入设置值"},null,512)),[[b,a.value.value]])]),e("div",ee,[t[12]||(t[12]=e("label",null,"描述",-1)),p(e("textarea",{"onUpdate:modelValue":t[4]||(t[4]=l=>a.value.description=l),rows:"2",placeholder:"请输入描述"},null,512),[[b,a.value.description]])]),e("div",te,[e("button",{class:"cancel-btn",onClick:m},"取消"),e("button",{class:"submit-btn",onClick:E},u(d.value?"保存修改":"确认添加"),1)])])])):C("",!0)]))}}),ne=R(le,[["__scopeId","data-v-1321c610"]]);export{ne as default}; diff --git a/frontend/dist/assets/SettingManage-DcldOeo6.css b/frontend/dist/assets/SettingManage-DcldOeo6.css new file mode 100644 index 0000000..f0e3cd6 --- /dev/null +++ b/frontend/dist/assets/SettingManage-DcldOeo6.css @@ -0,0 +1 @@ +.setting-container[data-v-1321c610]{padding:20px}.header[data-v-1321c610]{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.header h2[data-v-1321c610]{margin:0;font-size:18px}.add-btn[data-v-1321c610]{background:#409eff;color:#fff;border:none;padding:8px 16px;border-radius:4px;cursor:pointer}.add-btn[data-v-1321c610]:hover{background:#66b1ff}.settings-table[data-v-1321c610]{width:100%;border-collapse:collapse}.settings-table th[data-v-1321c610],.settings-table td[data-v-1321c610]{border:1px solid #ebeef5;padding:12px;text-align:left}.settings-table th[data-v-1321c610]{background:#f5f7fa;font-weight:600}.value-cell[data-v-1321c610]{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cell-image[data-v-1321c610]{width:60px;height:60px;object-fit:contain;border-radius:4px;background:#f5f7fa}.actions[data-v-1321c610]{display:flex;gap:8px}.edit-btn[data-v-1321c610]{background:#67c23a;color:#fff;border:none;padding:4px 12px;border-radius:4px;cursor:pointer}.edit-btn[data-v-1321c610]:hover{background:#85ce61}.modal-overlay[data-v-1321c610]{position:fixed;top:0;left:0;right:0;bottom:0;background:#00000080;display:flex;justify-content:center;align-items:center;z-index:1000}.modal-content[data-v-1321c610]{background:#fff;padding:24px;border-radius:8px;width:480px}.modal-content h3[data-v-1321c610]{margin:0 0 20px;font-size:16px}.form-group[data-v-1321c610]{margin-bottom:16px}.form-group label[data-v-1321c610]{display:block;margin-bottom:8px;font-weight:500}.form-group input[data-v-1321c610],.form-group textarea[data-v-1321c610],.form-select[data-v-1321c610]{width:100%;padding:8px;border:1px solid #dcdfe6;border-radius:4px;box-sizing:border-box}.form-group textarea[data-v-1321c610]{resize:vertical}.form-select[data-v-1321c610]{height:36px}.image-upload-area[data-v-1321c610]{display:flex;flex-direction:column;align-items:center;gap:12px;padding:16px;border:1px dashed #dcdfe6;border-radius:4px;background:#fafafa}.preview-image[data-v-1321c610]{max-width:200px;max-height:120px;object-fit:contain;border-radius:4px}.no-image[data-v-1321c610]{color:#c0c4cc;font-size:13px;padding:12px}.upload-btn[data-v-1321c610]{background:#409eff;color:#fff;border:none;padding:6px 16px;border-radius:4px;cursor:pointer;font-size:13px}.upload-btn[data-v-1321c610]:hover{background:#66b1ff}.upload-hint[data-v-1321c610]{color:#909399;font-size:13px}.modal-footer[data-v-1321c610]{display:flex;justify-content:flex-end;gap:12px;margin-top:24px}.cancel-btn[data-v-1321c610]{background:#f5f7fa;color:#606266;border:none;padding:8px 16px;border-radius:4px;cursor:pointer}.cancel-btn[data-v-1321c610]:hover{background:#e4e7ed}.submit-btn[data-v-1321c610]{background:#409eff;color:#fff;border:none;padding:8px 16px;border-radius:4px;cursor:pointer}.submit-btn[data-v-1321c610]:hover{background:#66b1ff} diff --git a/frontend/dist/assets/UserManage-DExq8OEE.js b/frontend/dist/assets/UserManage-DDgTVhjY.js similarity index 98% rename from frontend/dist/assets/UserManage-DExq8OEE.js rename to frontend/dist/assets/UserManage-DDgTVhjY.js index 3f2209d..3cded9e 100644 --- a/frontend/dist/assets/UserManage-DExq8OEE.js +++ b/frontend/dist/assets/UserManage-DDgTVhjY.js @@ -1 +1 @@ -import{G as n,O as c,n as i,E as o,f as d,H as p,g as f,q as h,w as g,r as u,d as y,I as w,B as x,o as _}from"./index-ChTrSGCb.js";import{t as k}from"./list-query-4ZZvVtjn.js";const Y=()=>({crudOptions:{pagination:{show:!1},search:{show:!0},searchFormOptions:{inline:!0,labelWidth:"80px",col:{span:0}},request:{transformQuery:({form:e})=>k(e,["username","nickname","email","phone"]),pageRequest:async e=>{const{data:s}=await i.post("/users/search",e);return s},transformRes:({res:e})=>{const s=Array.isArray(e)?e:[];return{currentPage:1,pageSize:Math.max(s.length,1),total:s.length,records:s}},onError:e=>{var t;let s="操作失败";if((t=e.response)!=null&&t.data){const a=e.response.data;if(a.errors&&Array.isArray(a.errors))s=a.errors.map(r=>r.message).join(";");else if(a.message)s=a.message;else if(a.detail){const r=a.detail;typeof r=="string"&&(r.includes("at least 6 characters")?s="密码长度至少为6个字符":s=r)}}else e.message&&(s=e.message);throw o.error({message:s,duration:5e3}),e},addRequest:async({form:e})=>{await i.post("/users/",e),o.success({message:"添加成功",duration:5e3})},editRequest:async({form:e,row:s})=>{if(!s)return;const t={...e};t.password||delete t.password,await i.put(`/users/${s.id}`,t),o.success({message:"修改成功",duration:5e3})},delRequest:async({row:e})=>{e&&(await i.delete(`/users/${e.id}`),o.success({message:"删除成功",duration:5e3}))},onSuccess:({action:e})=>{e==="add"?o.success({message:"添加成功",duration:5e3}):e==="edit"&&o.success({message:"修改成功",duration:5e3})}},table:{remove:{showSuccessNotification:!1}},rowHandle:{buttons:{edit:{text:"编辑"},remove:{text:"删除",show:!0}}},columns:{id:{title:"ID",key:"id",type:"number",column:{width:70},form:{show:!1}},username:{title:"登录名",key:"username",type:"text",search:{show:!0},form:{rules:[{required:!0,message:"请输入登录名",trigger:"blur"},{min:3,max:50,message:"用户名长度必须在3-50个字符之间",trigger:"blur"}]}},nickname:{title:"昵称",key:"nickname",type:"text",search:{show:!0},form:{rules:[{required:!0,message:"必填"}]}},password:{title:"密码",key:"password",type:"password",column:{show:!1},form:{show:!1},addForm:{show:!0,rules:[{required:!0,message:"请输入密码",trigger:"blur"},{min:6,max:50,message:"密码长度必须在6-50个字符之间",trigger:"blur"}]},editForm:{show:!0,component:{placeholder:"不修改请留空"},rules:[{min:6,max:50,message:"密码长度必须在6-50个字符之间",trigger:"blur"}]}},email:{title:"邮箱",key:"email",type:"text",search:{show:!0}},phone:{title:"手机",key:"phone",type:"text",search:{show:!0}},wx_openid:{title:"微信OpenID",key:"wx_openid",type:"text",column:{show:!1}},avatar:{title:"头像",key:"avatar",type:"text",column:{show:!1}},role_id:{title:"角色",key:"role_id",type:"dict-select",dict:c({getData:async()=>{const{data:e}=await i.post("/roles/search",{});return e},value:"id",label:"name"}),column:{width:120,dict:!0},form:{rules:[{required:!0,message:"必选"}],value:2}},createtime:{title:"创建时间",key:"createtime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:s,key:t}){!s||e==null||(s[t]=n(e).format("YYYY-MM-DD HH:mm:ss"))}},updatetime:{title:"更新时间",key:"updatetime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:s,key:t}){!s||e==null||(s[t]=n(e).format("YYYY-MM-DD HH:mm:ss"))}},lastlogintime:{title:"最后登录",key:"lastlogintime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:s,key:t}){!s||e==null||(s[t]=n(e).format("YYYY-MM-DD HH:mm:ss"))}}}}}),D=d({__name:"UserManage",setup(e){const{crudBinding:s,crudRef:t,crudExpose:a}=p({createCrudOptions:Y});return f(()=>{a.doRefresh()}),(r,b)=>{const l=u("fs-crud"),m=u("fs-page");return _(),h(m,null,{default:g(()=>[y(l,w({ref_key:"crudRef",ref:t},x(s)),null,16)]),_:1})}}});export{D as default}; +import{G as n,O as c,n as i,E as o,f as d,H as p,g as f,q as h,w as g,r as u,d as y,I as w,B as x,o as _}from"./index-rb7Oshfn.js";import{t as k}from"./list-query-4ZZvVtjn.js";const Y=()=>({crudOptions:{pagination:{show:!1},search:{show:!0},searchFormOptions:{inline:!0,labelWidth:"80px",col:{span:0}},request:{transformQuery:({form:e})=>k(e,["username","nickname","email","phone"]),pageRequest:async e=>{const{data:s}=await i.post("/users/search",e);return s},transformRes:({res:e})=>{const s=Array.isArray(e)?e:[];return{currentPage:1,pageSize:Math.max(s.length,1),total:s.length,records:s}},onError:e=>{var t;let s="操作失败";if((t=e.response)!=null&&t.data){const a=e.response.data;if(a.errors&&Array.isArray(a.errors))s=a.errors.map(r=>r.message).join(";");else if(a.message)s=a.message;else if(a.detail){const r=a.detail;typeof r=="string"&&(r.includes("at least 6 characters")?s="密码长度至少为6个字符":s=r)}}else e.message&&(s=e.message);throw o.error({message:s,duration:5e3}),e},addRequest:async({form:e})=>{await i.post("/users/",e),o.success({message:"添加成功",duration:5e3})},editRequest:async({form:e,row:s})=>{if(!s)return;const t={...e};t.password||delete t.password,await i.put(`/users/${s.id}`,t),o.success({message:"修改成功",duration:5e3})},delRequest:async({row:e})=>{e&&(await i.delete(`/users/${e.id}`),o.success({message:"删除成功",duration:5e3}))},onSuccess:({action:e})=>{e==="add"?o.success({message:"添加成功",duration:5e3}):e==="edit"&&o.success({message:"修改成功",duration:5e3})}},table:{remove:{showSuccessNotification:!1}},rowHandle:{buttons:{edit:{text:"编辑"},remove:{text:"删除",show:!0}}},columns:{id:{title:"ID",key:"id",type:"number",column:{width:70},form:{show:!1}},username:{title:"登录名",key:"username",type:"text",search:{show:!0},form:{rules:[{required:!0,message:"请输入登录名",trigger:"blur"},{min:3,max:50,message:"用户名长度必须在3-50个字符之间",trigger:"blur"}]}},nickname:{title:"昵称",key:"nickname",type:"text",search:{show:!0},form:{rules:[{required:!0,message:"必填"}]}},password:{title:"密码",key:"password",type:"password",column:{show:!1},form:{show:!1},addForm:{show:!0,rules:[{required:!0,message:"请输入密码",trigger:"blur"},{min:6,max:50,message:"密码长度必须在6-50个字符之间",trigger:"blur"}]},editForm:{show:!0,component:{placeholder:"不修改请留空"},rules:[{min:6,max:50,message:"密码长度必须在6-50个字符之间",trigger:"blur"}]}},email:{title:"邮箱",key:"email",type:"text",search:{show:!0}},phone:{title:"手机",key:"phone",type:"text",search:{show:!0}},wx_openid:{title:"微信OpenID",key:"wx_openid",type:"text",column:{show:!1}},avatar:{title:"头像",key:"avatar",type:"text",column:{show:!1}},role_id:{title:"角色",key:"role_id",type:"dict-select",dict:c({getData:async()=>{const{data:e}=await i.post("/roles/search",{});return e},value:"id",label:"name"}),column:{width:120,dict:!0},form:{rules:[{required:!0,message:"必选"}],value:2}},createtime:{title:"创建时间",key:"createtime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:s,key:t}){!s||e==null||(s[t]=n(e).format("YYYY-MM-DD HH:mm:ss"))}},updatetime:{title:"更新时间",key:"updatetime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:s,key:t}){!s||e==null||(s[t]=n(e).format("YYYY-MM-DD HH:mm:ss"))}},lastlogintime:{title:"最后登录",key:"lastlogintime",type:"text",form:{show:!1},column:{width:170},valueBuilder({value:e,row:s,key:t}){!s||e==null||(s[t]=n(e).format("YYYY-MM-DD HH:mm:ss"))}}}}}),D=d({__name:"UserManage",setup(e){const{crudBinding:s,crudRef:t,crudExpose:a}=p({createCrudOptions:Y});return f(()=>{a.doRefresh()}),(r,b)=>{const l=u("fs-crud"),m=u("fs-page");return _(),h(m,null,{default:g(()=>[y(l,w({ref_key:"crudRef",ref:t},x(s)),null,16)]),_:1})}}});export{D as default}; diff --git a/frontend/dist/assets/index-64865240-CievhkpU.js b/frontend/dist/assets/index-64865240-B3tEj8Ws.js similarity index 99% rename from frontend/dist/assets/index-64865240-CievhkpU.js rename to frontend/dist/assets/index-64865240-B3tEj8Ws.js index 136ad37..9ec875c 100644 --- a/frontend/dist/assets/index-64865240-CievhkpU.js +++ b/frontend/dist/assets/index-64865240-B3tEj8Ws.js @@ -1,4 +1,4 @@ -import{e as Nl,Z as da}from"./index-ChTrSGCb.js";function On(e){const t=navigator.userAgent;return t.indexOf("compatible")>-1&&t.indexOf("MSIE")>-1?(new RegExp("MSIE (\\d+\\.\\d+);").test(t),parseFloat(RegExp.$1)):!1}const Il={_isIE11(){let e=0;const t=/MSIE (\d+\.\d+);/.test(navigator.userAgent),r=!!navigator.userAgent.match(/Trident\/7.0/),a=navigator.userAgent.indexOf("rv:11.0");return t&&(e=Number(RegExp.$1)),navigator.appVersion.indexOf("MSIE 10")!==-1&&(e=10),r&&a!==-1&&(e=11),e===11},_isEdge(){return/Edge/.test(navigator.userAgent)},_getDownloadUrl(e){const t="\uFEFF";if(window.Blob&&window.URL&&window.URL.createObjectURL){const r=new Blob([t+e],{type:"text/csv"});return URL.createObjectURL(r)}else return"data:attachment/csv;charset=utf-8,"+t+encodeURIComponent(e)},download(e,t){if(On()&&On()<10){const r=window.top.open("about:blank","_blank");r.document.charset="utf-8",r.document.write(t),r.document.close(),r.document.execCommand("SaveAs",e+".csv"),r.close()}else if(On()===10||this._isIE11()||this._isEdge()){const r="\uFEFF",a=new Blob([r+t],{type:"text/csv"});navigator.msSaveBlob(a,e+".csv")}else{const r=document.createElement("a");r.download=e+".csv",r.href=this._getDownloadUrl(t),document.body.appendChild(r),r.click(),document.body.removeChild(r)}}},Fl=`\r +import{e as Nl,Z as da}from"./index-rb7Oshfn.js";function On(e){const t=navigator.userAgent;return t.indexOf("compatible")>-1&&t.indexOf("MSIE")>-1?(new RegExp("MSIE (\\d+\\.\\d+);").test(t),parseFloat(RegExp.$1)):!1}const Il={_isIE11(){let e=0;const t=/MSIE (\d+\.\d+);/.test(navigator.userAgent),r=!!navigator.userAgent.match(/Trident\/7.0/),a=navigator.userAgent.indexOf("rv:11.0");return t&&(e=Number(RegExp.$1)),navigator.appVersion.indexOf("MSIE 10")!==-1&&(e=10),r&&a!==-1&&(e=11),e===11},_isEdge(){return/Edge/.test(navigator.userAgent)},_getDownloadUrl(e){const t="\uFEFF";if(window.Blob&&window.URL&&window.URL.createObjectURL){const r=new Blob([t+e],{type:"text/csv"});return URL.createObjectURL(r)}else return"data:attachment/csv;charset=utf-8,"+t+encodeURIComponent(e)},download(e,t){if(On()&&On()<10){const r=window.top.open("about:blank","_blank");r.document.charset="utf-8",r.document.write(t),r.document.close(),r.document.execCommand("SaveAs",e+".csv"),r.close()}else if(On()===10||this._isIE11()||this._isEdge()){const r="\uFEFF",a=new Blob([r+t],{type:"text/csv"});navigator.msSaveBlob(a,e+".csv")}else{const r=document.createElement("a");r.download=e+".csv",r.href=this._getDownloadUrl(t),document.body.appendChild(r),r.click(),document.body.removeChild(r)}}},Fl=`\r `,Nn=(e,t,{separator:r,quoted:a})=>{const n=t.map(s=>a?(s=typeof s=="string"?s.replace(/"/g,'"'):s,`"${s}"`):s);e.push(n.join(r))},Pl={separator:",",quoted:!1};function Dl(e,t,r,a=!1){r=Object.assign({},Pl,r);let n;const s=[],i=[];return e?(n=e.map(o=>typeof o=="string"?o:(a||i.push(typeof o.label<"u"?o.label:o.prop),o.prop)),i.length>0&&Nn(s,i,r)):(n=[],t.forEach(o=>{Array.isArray(o)||(n=n.concat(Object.keys(o)))}),n.length>0&&(n=n.filter((o,c,l)=>l.indexOf(o)===c),a||Nn(s,n,r))),Array.isArray(t)&&t.forEach(o=>{Array.isArray(o)||(o=n.map(c=>typeof o[c]<"u"?o[c]:"")),Nn(s,o,r)}),s.join(Fl)}/*! @source http://purl.eligrey.com/github/Blob.js/blob/master/Blob.js */(function(e){if(e.URL=e.URL||e.webkitURL,e.Blob&&e.URL)try{new Blob;return}catch{}var t=e.BlobBuilder||e.WebKitBlobBuilder||e.MozBlobBuilder||function(r){var a=function(x){return Object.prototype.toString.call(x).match(/^\[object\s(.*)\]$/)[1]},n=function(){this.data=[]},s=function(x,A,P){this.data=x,this.size=x.length,this.type=A,this.encoding=P},i=n.prototype,o=s.prototype,c=r.FileReaderSync,l=function(x){this.code=this[this.name=x]},f="NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR".split(" "),p=f.length,h=r.URL||r.webkitURL||r,d=h.createObjectURL,m=h.revokeObjectURL,u=h,b=r.btoa,T=r.atob,S=r.ArrayBuffer,g=r.Uint8Array;for(s.fake=o.fake=!0;p--;)l.prototype[f[p]]=p+1;return h.createObjectURL||(u=r.URL={}),u.createObjectURL=function(x){var A=x.type,P;if(A===null&&(A="application/octet-stream"),x instanceof s)return P="data:"+A,x.encoding==="base64"?P+";base64,"+x.data:x.encoding==="URI"?P+","+decodeURIComponent(x.data):b?P+";base64,"+b(x.data):P+","+encodeURIComponent(x.data);if(d)return d.call(h,x)},u.revokeObjectURL=function(x){x.substring(0,5)!=="data:"&&m&&m.call(h,x)},i.append=function(x){var A=this.data;if(g&&(x instanceof S||x instanceof g)){for(var P="",R=new g(x),U=0,I=R.length;U1?A:this.data.length),P,this.encoding)},o.toString=function(){return"[object Blob]"},o.close=function(){this.size=this.data.length=0},n}(e);e.Blob=function(r,a){var n=a&&a.type||"",s=new t;if(r)for(var i=0,o=r.length;i"u"?f={autoBom:!1}:typeof f!="object"&&(console.warn("Deprecated: Expected third argument to be a object"),f={autoBom:!f}),f.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(l.type)?new Blob(["\uFEFF",l],{type:l.type}):l}function a(l,f,p){var h=new XMLHttpRequest;h.open("GET",l),h.responseType="blob",h.onload=function(){c(h.response,f,p)},h.onerror=function(){console.error("could not download file")},h.send()}function n(l){var f=new XMLHttpRequest;f.open("HEAD",l,!1);try{f.send()}catch{}return 200<=f.status&&299>=f.status}function s(l){try{l.dispatchEvent(new MouseEvent("click"))}catch{var f=document.createEvent("MouseEvents");f.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),l.dispatchEvent(f)}}var i=typeof window=="object"&&window.window===window?window:typeof self=="object"&&self.self===self?self:typeof da=="object"&&da.global===da?da:void 0,o=i.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),c=i.saveAs||(typeof window!="object"||window!==i?function(){}:"download"in HTMLAnchorElement.prototype&&!o?function(l,f,p){var h=i.URL||i.webkitURL,d=document.createElement("a");f=f||l.name||"download",d.download=f,d.rel="noopener",typeof l=="string"?(d.href=l,d.origin===location.origin?s(d):n(d.href)?a(l,f,p):s(d,d.target="_blank")):(d.href=h.createObjectURL(l),setTimeout(function(){h.revokeObjectURL(d.href)},4e4),setTimeout(function(){s(d)},0))}:"msSaveOrOpenBlob"in navigator?function(l,f,p){if(f=f||l.name||"download",typeof l!="string")navigator.msSaveOrOpenBlob(r(l,p),f);else if(n(l))a(l,f,p);else{var h=document.createElement("a");h.href=l,h.target="_blank",setTimeout(function(){s(h)})}}:function(l,f,p,h){if(h=h||open("","_blank"),h&&(h.document.title=h.document.body.innerText="downloading..."),typeof l=="string")return a(l,f,p);var d=l.type==="application/octet-stream",m=/constructor/i.test(i.HTMLElement)||i.safari,u=/CriOS\/[\d]+/.test(navigator.userAgent);if((u||d&&m||o)&&typeof FileReader<"u"){var b=new FileReader;b.onloadend=function(){var g=b.result;g=u?g:g.replace(/^data:[^;]*;/,"data:attachment/file;"),h?h.location.href=g:location=g,h=null},b.readAsDataURL(l)}else{var T=i.URL||i.webkitURL,S=T.createObjectURL(l);h?h.location=S:location.href=S,h=null,setTimeout(function(){T.revokeObjectURL(S)},4e4)}});i.saveAs=c.saveAs=c,e.exports=c})})(no);var Ll=no.exports;const so=Nl(Ll);/*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */var nn={};nn.version="0.18.5";var io=1252,Ml=[874,932,936,949,950,1250,1251,1252,1253,1254,1255,1256,1257,1258,1e4],is={0:1252,1:65001,2:65001,77:1e4,128:932,129:949,130:1361,134:936,136:950,161:1253,162:1254,163:1258,177:1255,178:1256,186:1257,204:1251,222:874,238:1250,255:1252,69:6969},os=function(e){Ml.indexOf(e)!=-1&&(io=is[0]=e)};function Ul(){os(1252)}var jr=function(e){os(e)};function cs(){jr(1200),Ul()}function Zs(e){for(var t=[],r=0,a=e.length;r>1;++r)t[r]=String.fromCharCode(e.charCodeAt(2*r)+(e.charCodeAt(2*r+1)<<8));return t.join("")}function oo(e){for(var t=[],r=0;r>1;++r)t[r]=String.fromCharCode(e.charCodeAt(2*r+1)+(e.charCodeAt(2*r)<<8));return t.join("")}var ma=function(e){var t=e.charCodeAt(0),r=e.charCodeAt(1);return t==255&&r==254?Bl(e.slice(2)):t==254&&r==255?oo(e.slice(2)):t==65279?e.slice(1):e},Xa=function(e){return String.fromCharCode(e)},qs=function(e){return String.fromCharCode(e)},Kt,mt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";function xa(e){for(var t="",r=0,a=0,n=0,s=0,i=0,o=0,c=0,l=0;l>2,a=e.charCodeAt(l++),i=(r&3)<<4|a>>4,n=e.charCodeAt(l++),o=(a&15)<<2|n>>6,c=n&63,isNaN(a)?o=c=64:isNaN(n)&&(c=64),t+=mt.charAt(s)+mt.charAt(i)+mt.charAt(o)+mt.charAt(c);return t}function Ir(e){var t="",r=0,a=0,n=0,s=0,i=0,o=0,c=0;e=e.replace(/[^\w\+\/\=]/g,"");for(var l=0;l>4,t+=String.fromCharCode(r),o=mt.indexOf(e.charAt(l++)),a=(i&15)<<4|o>>2,o!==64&&(t+=String.fromCharCode(a)),c=mt.indexOf(e.charAt(l++)),n=(o&3)<<6|c,c!==64&&(t+=String.fromCharCode(n));return t}var Se=function(){return typeof Buffer<"u"&&typeof process<"u"&&typeof process.versions<"u"&&!!process.versions.node}(),lt=function(){if(typeof Buffer<"u"){var e=!Buffer.from;if(!e)try{Buffer.from("foo","utf8")}catch{e=!0}return e?function(t,r){return r?new Buffer(t,r):new Buffer(t)}:Buffer.from.bind(Buffer)}return function(){}}();function vt(e){return Se?Buffer.alloc?Buffer.alloc(e):new Buffer(e):typeof Uint8Array<"u"?new Uint8Array(e):new Array(e)}function Qs(e){return Se?Buffer.allocUnsafe?Buffer.allocUnsafe(e):new Buffer(e):typeof Uint8Array<"u"?new Uint8Array(e):new Array(e)}var Or=function(e){return Se?lt(e,"binary"):e.split("").map(function(t){return t.charCodeAt(0)&255})};function gn(e){if(typeof ArrayBuffer>"u")return Or(e);for(var t=new ArrayBuffer(e.length),r=new Uint8Array(t),a=0;a!=e.length;++a)r[a]=e.charCodeAt(a)&255;return t}function Tt(e){if(Array.isArray(e))return e.map(function(a){return String.fromCharCode(a)}).join("");for(var t=[],r=0;r"u")throw new Error("Unsupported");return new Uint8Array(e)}function ls(e){if(typeof ArrayBuffer>"u")throw new Error("Unsupported");if(e instanceof ArrayBuffer)return ls(new Uint8Array(e));for(var t=new Array(e.length),r=0;r>6&31,n[r++]=128|i&63;else if(i>=55296&&i<57344){i=(i&1023)+64;var o=e.charCodeAt(++s)&1023;n[r++]=240|i>>8&7,n[r++]=128|i>>2&63,n[r++]=128|o>>6&15|(i&3)<<4,n[r++]=128|o&63}else n[r++]=224|i>>12&15,n[r++]=128|i>>6&63,n[r++]=128|i&63;r>a&&(t.push(n.slice(0,r)),r=0,n=vt(65535),a=65530)}return t.push(n.slice(0,r)),ir(t)}var yr=/\u0000/g,ba=/[\u0001-\u0006]/g;function Jt(e){for(var t="",r=e.length-1;r>=0;)t+=e.charAt(r--);return t}function $r(e,t){var r=""+e;return r.length>=t?r:$e("0",t-r.length)+r}function fs(e,t){var r=""+e;return r.length>=t?r:$e(" ",t-r.length)+r}function sn(e,t){var r=""+e;return r.length>=t?r:r+$e(" ",t-r.length)}function Hl(e,t){var r=""+Math.round(e);return r.length>=t?r:$e("0",t-r.length)+r}function Gl(e,t){var r=""+e;return r.length>=t?r:$e("0",t-r.length)+r}var ei=Math.pow(2,32);function Vt(e,t){if(e>ei||e<-ei)return Hl(e,t);var r=Math.round(e);return Gl(r,t)}function on(e,t){return t=t||0,e.length>=7+t&&(e.charCodeAt(t)|32)===103&&(e.charCodeAt(t+1)|32)===101&&(e.charCodeAt(t+2)|32)===110&&(e.charCodeAt(t+3)|32)===101&&(e.charCodeAt(t+4)|32)===114&&(e.charCodeAt(t+5)|32)===97&&(e.charCodeAt(t+6)|32)===108}var ri=[["Sun","Sunday"],["Mon","Monday"],["Tue","Tuesday"],["Wed","Wednesday"],["Thu","Thursday"],["Fri","Friday"],["Sat","Saturday"]],In=[["J","Jan","January"],["F","Feb","February"],["M","Mar","March"],["A","Apr","April"],["M","May","May"],["J","Jun","June"],["J","Jul","July"],["A","Aug","August"],["S","Sep","September"],["O","Oct","October"],["N","Nov","November"],["D","Dec","December"]];function Vl(e){return e||(e={}),e[0]="General",e[1]="0",e[2]="0.00",e[3]="#,##0",e[4]="#,##0.00",e[9]="0%",e[10]="0.00%",e[11]="0.00E+00",e[12]="# ?/?",e[13]="# ??/??",e[14]="m/d/yy",e[15]="d-mmm-yy",e[16]="d-mmm",e[17]="mmm-yy",e[18]="h:mm AM/PM",e[19]="h:mm:ss AM/PM",e[20]="h:mm",e[21]="h:mm:ss",e[22]="m/d/yy h:mm",e[37]="#,##0 ;(#,##0)",e[38]="#,##0 ;[Red](#,##0)",e[39]="#,##0.00;(#,##0.00)",e[40]="#,##0.00;[Red](#,##0.00)",e[45]="mm:ss",e[46]="[h]:mm:ss",e[47]="mmss.0",e[48]="##0.0E+0",e[49]="@",e[56]='"上午/下午 "hh"時"mm"分"ss"秒 "',e}var be={0:"General",1:"0",2:"0.00",3:"#,##0",4:"#,##0.00",9:"0%",10:"0.00%",11:"0.00E+00",12:"# ?/?",13:"# ??/??",14:"m/d/yy",15:"d-mmm-yy",16:"d-mmm",17:"mmm-yy",18:"h:mm AM/PM",19:"h:mm:ss AM/PM",20:"h:mm",21:"h:mm:ss",22:"m/d/yy h:mm",37:"#,##0 ;(#,##0)",38:"#,##0 ;[Red](#,##0)",39:"#,##0.00;(#,##0.00)",40:"#,##0.00;[Red](#,##0.00)",45:"mm:ss",46:"[h]:mm:ss",47:"mmss.0",48:"##0.0E+0",49:"@",56:'"上午/下午 "hh"時"mm"分"ss"秒 "'},ti={5:37,6:38,7:39,8:40,23:0,24:0,25:0,26:0,27:14,28:14,29:14,30:14,31:14,50:14,51:14,52:14,53:14,54:14,55:14,56:14,57:14,58:14,59:1,60:2,61:3,62:4,67:9,68:10,69:12,70:13,71:14,72:14,73:15,74:16,75:17,76:20,77:21,78:22,79:45,80:46,81:47,82:0},jl={5:'"$"#,##0_);\\("$"#,##0\\)',63:'"$"#,##0_);\\("$"#,##0\\)',6:'"$"#,##0_);[Red]\\("$"#,##0\\)',64:'"$"#,##0_);[Red]\\("$"#,##0\\)',7:'"$"#,##0.00_);\\("$"#,##0.00\\)',65:'"$"#,##0.00_);\\("$"#,##0.00\\)',8:'"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',66:'"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',41:'_(* #,##0_);_(* \\(#,##0\\);_(* "-"_);_(@_)',42:'_("$"* #,##0_);_("$"* \\(#,##0\\);_("$"* "-"_);_(@_)',43:'_(* #,##0.00_);_(* \\(#,##0.00\\);_(* "-"??_);_(@_)',44:'_("$"* #,##0.00_);_("$"* \\(#,##0.00\\);_("$"* "-"??_);_(@_)'};function cn(e,t,r){for(var a=e<0?-1:1,n=e*a,s=0,i=1,o=0,c=1,l=0,f=0,p=Math.floor(n);lt&&(l>t?(f=c,o=s):(f=l,o=i)),!r)return[0,a*o,f];var h=Math.floor(a*o/f);return[h,a*o-h*f,f]}function Ct(e,t,r){if(e>2958465||e<0)return null;var a=e|0,n=Math.floor(86400*(e-a)),s=0,i=[],o={D:a,T:n,u:86400*(e-a)-n,y:0,m:0,d:0,H:0,M:0,S:0,q:0};if(Math.abs(o.u)<1e-6&&(o.u=0),t&&t.date1904&&(a+=1462),o.u>.9999&&(o.u=0,++n==86400&&(o.T=n=0,++a,++o.D)),a===60)i=r?[1317,10,29]:[1900,2,29],s=3;else if(a===0)i=r?[1317,8,29]:[1900,1,0],s=6;else{a>60&&--a;var c=new Date(1900,0,1);c.setDate(c.getDate()+a-1),i=[c.getFullYear(),c.getMonth()+1,c.getDate()],s=c.getDay(),a<60&&(s=(s+6)%7),r&&(s=Zl(c,i))}return o.y=i[0],o.m=i[1],o.d=i[2],o.S=n%60,n=Math.floor(n/60),o.M=n%60,n=Math.floor(n/60),o.H=n,o.q=s,o}var co=new Date(1899,11,31,0,0,0),$l=co.getTime(),Xl=new Date(1900,2,1,0,0,0);function lo(e,t){var r=e.getTime();return t?r-=1461*24*60*60*1e3:e>=Xl&&(r+=24*60*60*1e3),(r-($l+(e.getTimezoneOffset()-co.getTimezoneOffset())*6e4))/(24*60*60*1e3)}function hs(e){return e.indexOf(".")==-1?e:e.replace(/(?:\.0*|(\.\d*[1-9])0+)$/,"$1")}function Yl(e){return e.indexOf("E")==-1?e:e.replace(/(?:\.0*|(\.\d*[1-9])0+)[Ee]/,"$1E").replace(/(E[+-])(\d)$/,"$10$2")}function Kl(e){var t=e<0?12:11,r=hs(e.toFixed(12));return r.length<=t||(r=e.toPrecision(10),r.length<=t)?r:e.toExponential(5)}function Jl(e){var t=hs(e.toFixed(11));return t.length>(e<0?12:11)||t==="0"||t==="-0"?e.toPrecision(6):t}function Aa(e){var t=Math.floor(Math.log(Math.abs(e))*Math.LOG10E),r;return t>=-4&&t<=-1?r=e.toPrecision(10+t):Math.abs(t)<=9?r=Kl(e):t===10?r=e.toFixed(10).substr(0,12):r=Jl(e),hs(Yl(r.toUpperCase()))}function Nt(e,t){switch(typeof e){case"string":return e;case"boolean":return e?"TRUE":"FALSE";case"number":return(e|0)===e?e.toString(10):Aa(e);case"undefined":return"";case"object":if(e==null)return"";if(e instanceof Date)return zr(14,lo(e,t&&t.date1904),t)}throw new Error("unsupported value in General format: "+e)}function Zl(e,t){t[0]-=581;var r=e.getDay();return e<60&&(r=(r+6)%7),r}function ql(e,t,r,a){var n="",s=0,i=0,o=r.y,c,l=0;switch(e){case 98:o=r.y+543;case 121:switch(t.length){case 1:case 2:c=o%100,l=2;break;default:c=o%1e4,l=4;break}break;case 109:switch(t.length){case 1:case 2:c=r.m,l=t.length;break;case 3:return In[r.m-1][1];case 5:return In[r.m-1][0];default:return In[r.m-1][2]}break;case 100:switch(t.length){case 1:case 2:c=r.d,l=t.length;break;case 3:return ri[r.q][0];default:return ri[r.q][1]}break;case 104:switch(t.length){case 1:case 2:c=1+(r.H+11)%12,l=t.length;break;default:throw"bad hour format: "+t}break;case 72:switch(t.length){case 1:case 2:c=r.H,l=t.length;break;default:throw"bad hour format: "+t}break;case 77:switch(t.length){case 1:case 2:c=r.M,l=t.length;break;default:throw"bad minute format: "+t}break;case 115:if(t!="s"&&t!="ss"&&t!=".0"&&t!=".00"&&t!=".000")throw"bad second format: "+t;return r.u===0&&(t=="s"||t=="ss")?$r(r.S,t.length):(a>=2?i=a===3?1e3:100:i=a===1?10:1,s=Math.round(i*(r.S+r.u)),s>=60*i&&(s=0),t==="s"?s===0?"0":""+s/i:(n=$r(s,2+a),t==="ss"?n.substr(0,2):"."+n.substr(2,t.length-1)));case 90:switch(t){case"[h]":case"[hh]":c=r.D*24+r.H;break;case"[m]":case"[mm]":c=(r.D*24+r.H)*60+r.M;break;case"[s]":case"[ss]":c=((r.D*24+r.H)*60+r.M)*60+Math.round(r.S+r.u);break;default:throw"bad abstime format: "+t}l=t.length===3?1:2;break;case 101:c=o,l=1;break}var f=l>0?$r(c,l):"";return f}function bt(e){var t=3;if(e.length<=t)return e;for(var r=e.length%t,a=e.substr(0,r);r!=e.length;r+=t)a+=(a.length>0?",":"")+e.substr(r,t);return a}var fo=/%/g;function Ql(e,t,r){var a=t.replace(fo,""),n=t.length-a.length;return st(e,a,r*Math.pow(10,2*n))+$e("%",n)}function ef(e,t,r){for(var a=t.length-1;t.charCodeAt(a-1)===44;)--a;return st(e,t.substr(0,a),r/Math.pow(10,3*(t.length-a)))}function ho(e,t){var r,a=e.indexOf("E")-e.indexOf(".")-1;if(e.match(/^#+0.0E\+0$/)){if(t==0)return"0.0E+0";if(t<0)return"-"+ho(e,-t);var n=e.indexOf(".");n===-1&&(n=e.indexOf("E"));var s=Math.floor(Math.log(t)*Math.LOG10E)%n;if(s<0&&(s+=n),r=(t/Math.pow(10,s)).toPrecision(a+1+(n+s)%n),r.indexOf("e")===-1){var i=Math.floor(Math.log(t)*Math.LOG10E);for(r.indexOf(".")===-1?r=r.charAt(0)+"."+r.substr(1)+"E+"+(i-r.length+s):r+="E+"+(i-s);r.substr(0,2)==="0.";)r=r.charAt(0)+r.substr(2,n)+"."+r.substr(2+n),r=r.replace(/^0+([1-9])/,"$1").replace(/^0+\./,"0.");r=r.replace(/\+-/,"-")}r=r.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function(o,c,l,f){return c+l+f.substr(0,(n+s)%n)+"."+f.substr(s)+"E"})}else r=t.toExponential(a);return e.match(/E\+00$/)&&r.match(/e[+-]\d$/)&&(r=r.substr(0,r.length-1)+"0"+r.charAt(r.length-1)),e.match(/E\-/)&&r.match(/e\+/)&&(r=r.replace(/e\+/,"e")),r.replace("e","E")}var uo=/# (\?+)( ?)\/( ?)(\d+)/;function rf(e,t,r){var a=parseInt(e[4],10),n=Math.round(t*a),s=Math.floor(n/a),i=n-s*a,o=a;return r+(s===0?"":""+s)+" "+(i===0?$e(" ",e[1].length+1+e[4].length):fs(i,e[1].length)+e[2]+"/"+e[3]+$r(o,e[4].length))}function tf(e,t,r){return r+(t===0?"":""+t)+$e(" ",e[1].length+2+e[4].length)}var po=/^#*0*\.([0#]+)/,mo=/\).*[0#]/,bo=/\(###\) ###\\?-####/;function Tr(e){for(var t="",r,a=0;a!=e.length;++a)switch(r=e.charCodeAt(a)){case 35:break;case 63:t+=" ";break;case 48:t+="0";break;default:t+=String.fromCharCode(r)}return t}function ai(e,t){var r=Math.pow(10,t);return""+Math.round(e*r)/r}function ni(e,t){var r=e-Math.floor(e),a=Math.pow(10,t);return t<(""+Math.round(r*a)).length?0:Math.round(r*a)}function af(e,t){return t<(""+Math.round((e-Math.floor(e))*Math.pow(10,t))).length?1:0}function nf(e){return e<2147483647&&e>-2147483648?""+(e>=0?e|0:e-1|0):""+Math.floor(e)}function Dr(e,t,r){if(e.charCodeAt(0)===40&&!t.match(mo)){var a=t.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");return r>=0?Dr("n",a,r):"("+Dr("n",a,-r)+")"}if(t.charCodeAt(t.length-1)===44)return ef(e,t,r);if(t.indexOf("%")!==-1)return Ql(e,t,r);if(t.indexOf("E")!==-1)return ho(t,r);if(t.charCodeAt(0)===36)return"$"+Dr(e,t.substr(t.charAt(1)==" "?2:1),r);var n,s,i,o,c=Math.abs(r),l=r<0?"-":"";if(t.match(/^00+$/))return l+Vt(c,t.length);if(t.match(/^[#?]+$/))return n=Vt(r,0),n==="0"&&(n=""),n.length>t.length?n:Tr(t.substr(0,t.length-n.length))+n;if(s=t.match(uo))return rf(s,c,l);if(t.match(/^#+0+$/))return l+Vt(c,t.length-t.indexOf("0"));if(s=t.match(po))return n=ai(r,s[1].length).replace(/^([^\.]+)$/,"$1."+Tr(s[1])).replace(/\.$/,"."+Tr(s[1])).replace(/\.(\d*)$/,function(m,u){return"."+u+$e("0",Tr(s[1]).length-u.length)}),t.indexOf("0.")!==-1?n:n.replace(/^0\./,".");if(t=t.replace(/^#+([0.])/,"$1"),s=t.match(/^(0*)\.(#*)$/))return l+ai(c,s[2].length).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,s[1].length?"0.":".");if(s=t.match(/^#{1,3},##0(\.?)$/))return l+bt(Vt(c,0));if(s=t.match(/^#,##0\.([#0]*0)$/))return r<0?"-"+Dr(e,t,-r):bt(""+(Math.floor(r)+af(r,s[1].length)))+"."+$r(ni(r,s[1].length),s[1].length);if(s=t.match(/^#,#*,#0/))return Dr(e,t.replace(/^#,#*,/,""),r);if(s=t.match(/^([0#]+)(\\?-([0#]+))+$/))return n=Jt(Dr(e,t.replace(/[\\-]/g,""),r)),i=0,Jt(Jt(t.replace(/\\/g,"")).replace(/[0#]/g,function(m){return i=0?Jr("n",a,r):"("+Jr("n",a,-r)+")"}if(t.charCodeAt(t.length-1)===44)return sf(e,t,r);if(t.indexOf("%")!==-1)return of(e,t,r);if(t.indexOf("E")!==-1)return vo(t,r);if(t.charCodeAt(0)===36)return"$"+Jr(e,t.substr(t.charAt(1)==" "?2:1),r);var n,s,i,o,c=Math.abs(r),l=r<0?"-":"";if(t.match(/^00+$/))return l+$r(c,t.length);if(t.match(/^[#?]+$/))return n=""+r,r===0&&(n=""),n.length>t.length?n:Tr(t.substr(0,t.length-n.length))+n;if(s=t.match(uo))return tf(s,c,l);if(t.match(/^#+0+$/))return l+$r(c,t.length-t.indexOf("0"));if(s=t.match(po))return n=(""+r).replace(/^([^\.]+)$/,"$1."+Tr(s[1])).replace(/\.$/,"."+Tr(s[1])),n=n.replace(/\.(\d*)$/,function(m,u){return"."+u+$e("0",Tr(s[1]).length-u.length)}),t.indexOf("0.")!==-1?n:n.replace(/^0\./,".");if(t=t.replace(/^#+([0.])/,"$1"),s=t.match(/^(0*)\.(#*)$/))return l+(""+c).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,s[1].length?"0.":".");if(s=t.match(/^#{1,3},##0(\.?)$/))return l+bt(""+c);if(s=t.match(/^#,##0\.([#0]*0)$/))return r<0?"-"+Jr(e,t,-r):bt(""+r)+"."+$e("0",s[1].length);if(s=t.match(/^#,#*,#0/))return Jr(e,t.replace(/^#,#*,/,""),r);if(s=t.match(/^([0#]+)(\\?-([0#]+))+$/))return n=Jt(Jr(e,t.replace(/[\\-]/g,""),r)),i=0,Jt(Jt(t.replace(/\\/g,"")).replace(/[0#]/g,function(m){return i-1||r=="\\"&&e.charAt(t+1)=="-"&&"0#".indexOf(e.charAt(t+2))>-1););break;case"?":for(;e.charAt(++t)===r;);break;case"*":++t,(e.charAt(t)==" "||e.charAt(t)=="*")&&++t;break;case"(":case")":++t;break;case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":for(;t-1;);break;case" ":++t;break;default:++t;break}return!1}function lf(e,t,r,a){for(var n=[],s="",i=0,o="",c="t",l,f,p,h="H";i=12?"P":"A"),u.t="T",h="h",i+=3):e.substr(i,5).toUpperCase()==="AM/PM"?(l!=null&&(u.v=l.H>=12?"PM":"AM"),u.t="T",i+=5,h="h"):e.substr(i,5).toUpperCase()==="上午/下午"?(l!=null&&(u.v=l.H>=12?"下午":"上午"),u.t="T",i+=5,h="h"):(u.t="t",++i),l==null&&u.t==="T")return"";n[n.length]=u,c=o;break;case"[":for(s=o;e.charAt(i++)!=="]"&&i-1&&(s=(s.match(/\$([^-\[\]]*)/)||[])[1]||"$",sa(e)||(n[n.length]={t:"t",v:s}));break;case".":if(l!=null){for(s=o;++i-1;)s+=o;n[n.length]={t:"n",v:s};break;case"?":for(s=o;e.charAt(++i)===o;)s+=o;n[n.length]={t:o,v:s},c=o;break;case"*":++i,(e.charAt(i)==" "||e.charAt(i)=="*")&&++i;break;case"(":case")":n[n.length]={t:a===1?"t":o,v:o},++i;break;case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":for(s=o;i-1;)s+=e.charAt(i);n[n.length]={t:"D",v:s};break;case" ":n[n.length]={t:o,v:o},++i;break;case"$":n[n.length]={t:"t",v:"$"},++i;break;default:if(",$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP".indexOf(o)===-1)throw new Error("unrecognized character "+o+" in "+e);n[n.length]={t:"t",v:o},++i;break}var b=0,T=0,S;for(i=n.length-1,c="t";i>=0;--i)switch(n[i].t){case"h":case"H":n[i].t=h,c="h",b<1&&(b=1);break;case"s":(S=n[i].v.match(/\.0+$/))&&(T=Math.max(T,S[0].length-1)),b<3&&(b=3);case"d":case"y":case"M":case"e":c=n[i].t;break;case"m":c==="s"&&(n[i].t="M",b<2&&(b=2));break;case"X":break;case"Z":b<1&&n[i].v.match(/[Hh]/)&&(b=1),b<2&&n[i].v.match(/[Mm]/)&&(b=2),b<3&&n[i].v.match(/[Ss]/)&&(b=3)}switch(b){case 0:break;case 1:l.u>=.5&&(l.u=0,++l.S),l.S>=60&&(l.S=0,++l.M),l.M>=60&&(l.M=0,++l.H);break;case 2:l.u>=.5&&(l.u=0,++l.S),l.S>=60&&(l.S=0,++l.M);break}var g="",x;for(i=0;i0){g.charCodeAt(0)==40?(P=t<0&&g.charCodeAt(0)===45?-t:t,R=st("n",g,P)):(P=t<0&&a>1?-t:t,R=st("n",g,P),P<0&&n[0]&&n[0].t=="t"&&(R=R.substr(1),n[0].v="-"+n[0].v)),x=R.length-1;var U=n.length;for(i=0;i-1){U=i;break}var I=n.length;if(U===n.length&&R.indexOf("E")===-1){for(i=n.length-1;i>=0;--i)n[i]==null||"n?".indexOf(n[i].t)===-1||(x>=n[i].v.length-1?(x-=n[i].v.length,n[i].v=R.substr(x+1,n[i].v.length)):x<0?n[i].v="":(n[i].v=R.substr(0,x+1),x=-1),n[i].t="t",I=i);x>=0&&I=0;--i)if(!(n[i]==null||"n?".indexOf(n[i].t)===-1)){for(f=n[i].v.indexOf(".")>-1&&i===U?n[i].v.indexOf(".")-1:n[i].v.length-1,A=n[i].v.substr(f+1);f>=0;--f)x>=0&&(n[i].v.charAt(f)==="0"||n[i].v.charAt(f)==="#")&&(A=R.charAt(x--)+A);n[i].v=A,n[i].t="t",I=i}for(x>=0&&I-1&&i===U?n[i].v.indexOf(".")+1:0,A=n[i].v.substr(0,f);f-1&&(P=a>1&&t<0&&i>0&&n[i-1].v==="-"?-t:t,n[i].v=st(n[i].t,n[i].v,P),n[i].t="t");var G="";for(i=0;i!==n.length;++i)n[i]!=null&&(G+=n[i].v);return G}var si=/\[(=|>[=]?|<[>=]?)(-?\d+(?:\.\d*)?)\]/;function ii(e,t){if(t==null)return!1;var r=parseFloat(t[2]);switch(t[1]){case"=":if(e==r)return!0;break;case">":if(e>r)return!0;break;case"<":if(e":if(e!=r)return!0;break;case">=":if(e>=r)return!0;break;case"<=":if(e<=r)return!0;break}return!1}function ff(e,t){var r=cf(e),a=r.length,n=r[a-1].indexOf("@");if(a<4&&n>-1&&--a,r.length>4)throw new Error("cannot find right format for |"+r.join("|")+"|");if(typeof t!="number")return[4,r.length===4||n>-1?r[r.length-1]:"@"];switch(r.length){case 1:r=n>-1?["General","General","General",r[0]]:[r[0],r[0],r[0],"@"];break;case 2:r=n>-1?[r[0],r[0],r[0],r[1]]:[r[0],r[1],r[0],"@"];break;case 3:r=n>-1?[r[0],r[1],r[0],r[2]]:[r[0],r[1],r[2],"@"];break}var s=t>0?r[0]:t<0?r[1]:r[2];if(r[0].indexOf("[")===-1&&r[1].indexOf("[")===-1)return[a,s];if(r[0].match(/\[[=<>]/)!=null||r[1].match(/\[[=<>]/)!=null){var i=r[0].match(si),o=r[1].match(si);return ii(t,i)?[a,r[0]]:ii(t,o)?[a,r[1]]:[a,r[i!=null&&o!=null?2:1]]}return[a,s]}function zr(e,t,r){r==null&&(r={});var a="";switch(typeof e){case"string":e=="m/d/yy"&&r.dateNF?a=r.dateNF:a=e;break;case"number":e==14&&r.dateNF?a=r.dateNF:a=(r.table!=null?r.table:be)[e],a==null&&(a=r.table&&r.table[ti[e]]||be[ti[e]]),a==null&&(a=jl[e]||"General");break}if(on(a,0))return Nt(t,r);t instanceof Date&&(t=lo(t,r.date1904));var n=ff(a,t);if(on(n[1]))return Nt(t,r);if(t===!0)t="TRUE";else if(t===!1)t="FALSE";else if(t===""||t==null)return"";return lf(n[1],t,r,n[0])}function it(e,t){if(typeof t!="number"){t=+t||-1;for(var r=0;r<392;++r){if(be[r]==null){t<0&&(t=r);continue}if(be[r]==e){t=r;break}}t<0&&(t=391)}return be[t]=e,t}function wn(e){for(var t=0;t!=392;++t)e[t]!==void 0&&it(e[t],t)}function ia(){be=Vl()}var hf={_table:be},uf={5:'"$"#,##0_);\\("$"#,##0\\)',6:'"$"#,##0_);[Red]\\("$"#,##0\\)',7:'"$"#,##0.00_);\\("$"#,##0.00\\)',8:'"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',23:"General",24:"General",25:"General",26:"General",27:"m/d/yy",28:"m/d/yy",29:"m/d/yy",30:"m/d/yy",31:"m/d/yy",32:"h:mm:ss",33:"h:mm:ss",34:"h:mm:ss",35:"h:mm:ss",36:"m/d/yy",41:'_(* #,##0_);_(* (#,##0);_(* "-"_);_(@_)',42:'_("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)',43:'_(* #,##0.00_);_(* (#,##0.00);_(* "-"??_);_(@_)',44:'_("$"* #,##0.00_);_("$"* (#,##0.00);_("$"* "-"??_);_(@_)',50:"m/d/yy",51:"m/d/yy",52:"m/d/yy",53:"m/d/yy",54:"m/d/yy",55:"m/d/yy",56:"m/d/yy",57:"m/d/yy",58:"m/d/yy",59:"0",60:"0.00",61:"#,##0",62:"#,##0.00",63:'"$"#,##0_);\\("$"#,##0\\)',64:'"$"#,##0_);[Red]\\("$"#,##0\\)',65:'"$"#,##0.00_);\\("$"#,##0.00\\)',66:'"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',67:"0%",68:"0.00%",69:"# ?/?",70:"# ??/??",71:"m/d/yy",72:"m/d/yy",73:"d-mmm-yy",74:"d-mmm",75:"mmm-yy",76:"h:mm",77:"h:mm:ss",78:"m/d/yy h:mm",79:"mm:ss",80:"[h]:mm:ss",81:"mmss.0"},wo=/[dD]+|[mM]+|[yYeE]+|[Hh]+|[Ss]+/g;function df(e){var t=typeof e=="number"?be[e]:e;return t=t.replace(wo,"(\\d+)"),new RegExp("^"+t+"$")}function pf(e,t,r){var a=-1,n=-1,s=-1,i=-1,o=-1,c=-1;(t.match(wo)||[]).forEach(function(p,h){var d=parseInt(r[h+1],10);switch(p.toLowerCase().charAt(0)){case"y":a=d;break;case"d":s=d;break;case"h":i=d;break;case"s":c=d;break;case"m":i>=0?o=d:n=d;break}}),c>=0&&o==-1&&n>=0&&(o=n,n=-1);var l=(""+(a>=0?a:new Date().getFullYear())).slice(-4)+"-"+("00"+(n>=1?n:1)).slice(-2)+"-"+("00"+(s>=1?s:1)).slice(-2);l.length==7&&(l="0"+l),l.length==8&&(l="20"+l);var f=("00"+(i>=0?i:0)).slice(-2)+":"+("00"+(o>=0?o:0)).slice(-2)+":"+("00"+(c>=0?c:0)).slice(-2);return i==-1&&o==-1&&c==-1?l:a==-1&&n==-1&&s==-1?f:l+"T"+f}var mf=function(){var e={};e.version="1.2.0";function t(){for(var R=0,U=new Array(256),I=0;I!=256;++I)R=I,R=R&1?-306674912^R>>>1:R>>>1,R=R&1?-306674912^R>>>1:R>>>1,R=R&1?-306674912^R>>>1:R>>>1,R=R&1?-306674912^R>>>1:R>>>1,R=R&1?-306674912^R>>>1:R>>>1,R=R&1?-306674912^R>>>1:R>>>1,R=R&1?-306674912^R>>>1:R>>>1,R=R&1?-306674912^R>>>1:R>>>1,U[I]=R;return typeof Int32Array<"u"?new Int32Array(U):U}var r=t();function a(R){var U=0,I=0,G=0,W=typeof Int32Array<"u"?new Int32Array(4096):new Array(4096);for(G=0;G!=256;++G)W[G]=R[G];for(G=0;G!=256;++G)for(I=R[G],U=256+G;U<4096;U+=256)I=W[U]=I>>>8^R[I&255];var D=[];for(G=1;G!=16;++G)D[G-1]=typeof Int32Array<"u"?W.subarray(G*256,G*256+256):W.slice(G*256,G*256+256);return D}var n=a(r),s=n[0],i=n[1],o=n[2],c=n[3],l=n[4],f=n[5],p=n[6],h=n[7],d=n[8],m=n[9],u=n[10],b=n[11],T=n[12],S=n[13],g=n[14];function x(R,U){for(var I=U^-1,G=0,W=R.length;G>>8^r[(I^R.charCodeAt(G++))&255];return~I}function A(R,U){for(var I=U^-1,G=R.length-15,W=0;W>8&255]^T[R[W++]^I>>16&255]^b[R[W++]^I>>>24]^u[R[W++]]^m[R[W++]]^d[R[W++]]^h[R[W++]]^p[R[W++]]^f[R[W++]]^l[R[W++]]^c[R[W++]]^o[R[W++]]^i[R[W++]]^s[R[W++]]^r[R[W++]];for(G+=15;W>>8^r[(I^R[W++])&255];return~I}function P(R,U){for(var I=U^-1,G=0,W=R.length,D=0,te=0;G>>8^r[(I^D)&255]:D<2048?(I=I>>>8^r[(I^(192|D>>6&31))&255],I=I>>>8^r[(I^(128|D&63))&255]):D>=55296&&D<57344?(D=(D&1023)+64,te=R.charCodeAt(G++)&1023,I=I>>>8^r[(I^(240|D>>8&7))&255],I=I>>>8^r[(I^(128|D>>2&63))&255],I=I>>>8^r[(I^(128|te>>6&15|(D&3)<<4))&255],I=I>>>8^r[(I^(128|te&63))&255]):(I=I>>>8^r[(I^(224|D>>12&15))&255],I=I>>>8^r[(I^(128|D>>6&63))&255],I=I>>>8^r[(I^(128|D&63))&255]);return~I}return e.table=r,e.bstr=x,e.buf=A,e.str=P,e}(),pe=function(){var e={};e.version="1.2.1";function t(v,E){for(var w=v.split("/"),k=E.split("/"),y=0,_=0,M=Math.min(w.length,k.length);y>>1,v.write_shift(2,w);var k=E.getFullYear()-1980;k=k<<4|E.getMonth()+1,k=k<<5|E.getDate(),v.write_shift(2,k)}function s(v){var E=v.read_shift(2)&65535,w=v.read_shift(2)&65535,k=new Date,y=w&31;w>>>=5;var _=w&15;w>>>=4,k.setMilliseconds(0),k.setFullYear(w+1980),k.setMonth(_-1),k.setDate(y);var M=E&31;E>>>=5;var z=E&63;return E>>>=6,k.setHours(E),k.setMinutes(z),k.setSeconds(M<<1),k}function i(v){lr(v,0);for(var E={},w=0;v.l<=v.length-4;){var k=v.read_shift(2),y=v.read_shift(2),_=v.l+y,M={};switch(k){case 21589:w=v.read_shift(1),w&1&&(M.mtime=v.read_shift(4)),y>5&&(w&2&&(M.atime=v.read_shift(4)),w&4&&(M.ctime=v.read_shift(4))),M.mtime&&(M.mt=new Date(M.mtime*1e3));break}v.l=_,E[k]=M}return E}var o;function c(){return o||(o={})}function l(v,E){if(v[0]==80&&v[1]==75)return Js(v,E);if((v[0]|32)==109&&(v[1]|32)==105)return _l(v,E);if(v.length<512)throw new Error("CFB file size "+v.length+" < 512");var w=3,k=512,y=0,_=0,M=0,z=0,B=0,H=[],V=v.slice(0,512);lr(V,0);var Z=f(V);switch(w=Z[0],w){case 3:k=512;break;case 4:k=4096;break;case 0:if(Z[1]==0)return Js(v,E);default:throw new Error("Major Version: Expected 3 or 4 saw "+w)}k!==512&&(V=v.slice(0,k),lr(V,28));var oe=v.slice(0,k);p(V,w);var ce=V.read_shift(4,"i");if(w===3&&ce!==0)throw new Error("# Directory Sectors: Expected 0 saw "+ce);V.l+=4,M=V.read_shift(4,"i"),V.l+=4,V.chk("00100000","Mini Stream Cutoff Size: "),z=V.read_shift(4,"i"),y=V.read_shift(4,"i"),B=V.read_shift(4,"i"),_=V.read_shift(4,"i");for(var ie=-1,he=0;he<109&&(ie=V.read_shift(4,"i"),!(ie<0));++he)H[he]=ie;var Ae=h(v,k);u(B,_,Ae,k,H);var He=T(Ae,M,H,k);He[M].name="!Directory",y>0&&z!==D&&(He[z].name="!MiniFAT"),He[H[0]].name="!FAT",He.fat_addrs=H,He.ssz=k;var Ge={},Ar=[],fa=[],ha=[];S(M,He,Ae,Ar,y,Ge,fa,z),d(fa,ha,Ar),Ar.shift();var ua={FileIndex:fa,FullPaths:ha};return E&&E.raw&&(ua.raw={header:oe,sectors:Ae}),ua}function f(v){if(v[v.l]==80&&v[v.l+1]==75)return[0,0];v.chk(te,"Header Signature: "),v.l+=16;var E=v.read_shift(2,"u");return[v.read_shift(2,"u"),E]}function p(v,E){var w=9;switch(v.l+=2,w=v.read_shift(2)){case 9:if(E!=3)throw new Error("Sector Shift: Expected 9 saw "+w);break;case 12:if(E!=4)throw new Error("Sector Shift: Expected 12 saw "+w);break;default:throw new Error("Sector Shift: Expected 9 or 12 saw "+w)}v.chk("0600","Mini Sector Shift: "),v.chk("000000000000","Reserved: ")}function h(v,E){for(var w=Math.ceil(v.length/E)-1,k=[],y=1;y0&&M>=0;)_.push(E.slice(M*W,M*W+W)),y-=W,M=At(w,M*4);return _.length===0?j(0):ir(_).slice(0,v.size)}function u(v,E,w,k,y){var _=D;if(v===D){if(E!==0)throw new Error("DIFAT chain shorter than expected")}else if(v!==-1){var M=w[v],z=(k>>>2)-1;if(!M)return;for(var B=0;B=0;){y[B]=!0,_[_.length]=B,M.push(v[B]);var V=w[Math.floor(B*4/k)];if(H=B*4&z,k<4+H)throw new Error("FAT boundary crossed: "+B+" 4 "+k);if(!v[V])break;B=At(v[V],H)}return{nodes:_,data:gi([M])}}function T(v,E,w,k){var y=v.length,_=[],M=[],z=[],B=[],H=k-1,V=0,Z=0,oe=0,ce=0;for(V=0;V=y&&(oe-=y),!M[oe]){B=[];var ie=[];for(Z=oe;Z>=0;){ie[Z]=!0,M[Z]=!0,z[z.length]=Z,B.push(v[Z]);var he=w[Math.floor(Z*4/k)];if(ce=Z*4&H,k<4+ce)throw new Error("FAT boundary crossed: "+Z+" 4 "+k);if(!v[he]||(Z=At(v[he],ce),ie[Z]))break}_[oe]={nodes:z,data:gi([B])}}return _}function S(v,E,w,k,y,_,M,z){for(var B=0,H=k.length?2:0,V=E[v].data,Z=0,oe=0,ce;Z0&&B!==D&&(E[B].name="!StreamData")):he.size>=4096?(he.storage="fat",E[he.start]===void 0&&(E[he.start]=b(w,he.start,E.fat_addrs,E.ssz)),E[he.start].name=he.name,he.content=E[he.start].data.slice(0,he.size)):(he.storage="minifat",he.size<0?he.size=0:B!==D&&he.start!==D&&E[B]&&(he.content=m(he,E[B].data,(E[z]||{}).data))),he.content&&lr(he.content,0),_[ce]=he,M.push(he)}}function g(v,E){return new Date((Rr(v,E+4)/1e7*Math.pow(2,32)+Rr(v,E)/1e7-11644473600)*1e3)}function x(v,E){return c(),l(o.readFileSync(v),E)}function A(v,E){var w=E&&E.type;switch(w||Se&&Buffer.isBuffer(v)&&(w="buffer"),w||"base64"){case"file":return x(v,E);case"base64":return l(Or(Ir(v)),E);case"binary":return l(Or(v),E)}return l(v,E)}function P(v,E){var w=E||{},k=w.root||"Root Entry";if(v.FullPaths||(v.FullPaths=[]),v.FileIndex||(v.FileIndex=[]),v.FullPaths.length!==v.FileIndex.length)throw new Error("inconsistent CFB structure");v.FullPaths.length===0&&(v.FullPaths[0]=k+"/",v.FileIndex[0]={name:k,type:5}),w.CLSID&&(v.FileIndex[0].clsid=w.CLSID),R(v)}function R(v){var E="Sh33tJ5";if(!pe.find(v,"/"+E)){var w=j(4);w[0]=55,w[1]=w[3]=50,w[2]=54,v.FileIndex.push({name:E,type:2,content:w,size:4,L:69,R:69,C:69}),v.FullPaths.push(v.FullPaths[0]+E),U(v)}}function U(v,E){P(v);for(var w=!1,k=!1,y=v.FullPaths.length-1;y>=0;--y){var _=v.FileIndex[y];switch(_.type){case 0:k?w=!0:(v.FileIndex.pop(),v.FullPaths.pop());break;case 1:case 2:case 5:k=!0,isNaN(_.R*_.L*_.C)&&(w=!0),_.R>-1&&_.L>-1&&_.R==_.L&&(w=!0);break;default:w=!0;break}}if(!(!w&&!E)){var M=new Date(1987,1,19),z=0,B=Object.create?Object.create(null):{},H=[];for(y=0;y1?1:-1,Z.size=0,Z.type=5;else if(oe.slice(-1)=="/"){for(z=y+1;z=H.length?-1:z,z=y+1;z=H.length?-1:z,Z.type=1}else r(v.FullPaths[y+1]||"")==r(oe)&&(Z.R=y+1),Z.type=2}}}function I(v,E){var w=E||{};if(w.fileType=="mad")return xl(v,w);switch(U(v),w.fileType){case"zip":return wl(v,w)}var k=function(ce){for(var ie=0,he=0,Ae=0;Ae0&&(Ge<4096?ie+=Ge+63>>6:he+=Ge+511>>9)}}for(var Ar=ce.FullPaths.length+3>>2,fa=ie+7>>3,ha=ie+127>>7,ua=fa+he+Ar+ha,xt=ua+127>>7,Rn=xt<=109?0:Math.ceil((xt-109)/127);ua+xt+Rn+127>>7>xt;)Rn=++xt<=109?0:Math.ceil((xt-109)/127);var at=[1,Rn,xt,ha,Ar,he,ie,0];return ce.FileIndex[0].size=ie<<6,at[7]=(ce.FileIndex[0].start=at[0]+at[1]+at[2]+at[3]+at[4]+at[5])+(at[6]+7>>3),at}(v),y=j(k[7]<<9),_=0,M=0;{for(_=0;_<8;++_)y.write_shift(1,fe[_]);for(_=0;_<8;++_)y.write_shift(2,0);for(y.write_shift(2,62),y.write_shift(2,3),y.write_shift(2,65534),y.write_shift(2,9),y.write_shift(2,6),_=0;_<3;++_)y.write_shift(2,0);for(y.write_shift(4,0),y.write_shift(4,k[2]),y.write_shift(4,k[0]+k[1]+k[2]+k[3]-1),y.write_shift(4,0),y.write_shift(4,4096),y.write_shift(4,k[3]?k[0]+k[1]+k[2]-1:D),y.write_shift(4,k[3]),y.write_shift(-4,k[1]?k[0]-1:D),y.write_shift(4,k[1]),_=0;_<109;++_)y.write_shift(-4,_>9)));for(z(k[6]+7>>3);y.l&511;)y.write_shift(-4,de.ENDOFCHAIN);for(M=_=0,B=0;B=4096)&&(V.start=M,z(H+63>>6)));for(;y.l&511;)y.write_shift(-4,de.ENDOFCHAIN);for(_=0;_=4096)if(y.l=V.start+1<<9,Se&&Buffer.isBuffer(V.content))V.content.copy(y,y.l,0,V.size),y.l+=V.size+511&-512;else{for(B=0;B0&&V.size<4096)if(Se&&Buffer.isBuffer(V.content))V.content.copy(y,y.l,0,V.size),y.l+=V.size+63&-64;else{for(B=0;B>16|E>>8|E)&255}for(var J=typeof Uint8Array<"u",Q=J?new Uint8Array(256):[],q=0;q<256;++q)Q[q]=ne(q);function Ee(v,E){var w=Q[v&255];return E<=8?w>>>8-E:(w=w<<8|Q[v>>8&255],E<=16?w>>>16-E:(w=w<<8|Q[v>>16&255],w>>>24-E))}function O(v,E){var w=E&7,k=E>>>3;return(v[k]|(w<=6?0:v[k+1]<<8))>>>w&3}function Me(v,E){var w=E&7,k=E>>>3;return(v[k]|(w<=5?0:v[k+1]<<8))>>>w&7}function Oe(v,E){var w=E&7,k=E>>>3;return(v[k]|(w<=4?0:v[k+1]<<8))>>>w&15}function De(v,E){var w=E&7,k=E>>>3;return(v[k]|(w<=3?0:v[k+1]<<8))>>>w&31}function xe(v,E){var w=E&7,k=E>>>3;return(v[k]|(w<=1?0:v[k+1]<<8))>>>w&127}function le(v,E,w){var k=E&7,y=E>>>3,_=(1<>>k;return w<8-k||(M|=v[y+1]<<8-k,w<16-k)||(M|=v[y+2]<<16-k,w<24-k)||(M|=v[y+3]<<24-k),M&_}function rr(v,E,w){var k=E&7,y=E>>>3;return k<=5?v[y]|=(w&7)<>8-k),E+3}function Gr(v,E,w){var k=E&7,y=E>>>3;return w=(w&1)<>>3;return w<<=k,v[y]|=w&255,w>>>=8,v[y+1]=w,E+8}function la(v,E,w){var k=E&7,y=E>>>3;return w<<=k,v[y]|=w&255,w>>>=8,v[y+1]=w&255,v[y+2]=w>>>8,E+16}function Gt(v,E){var w=v.length,k=2*w>E?2*w:E+5,y=0;if(w>=E)return v;if(Se){var _=Qs(k);if(v.copy)v.copy(_);else for(;y>k-Z,M=(1<=0;--M)E[z|M<0;)z[z.l++]=M[B++]}return z.l}function _(M,z){for(var B=0,H=0,V=J?new Uint16Array(32768):[];H0;)z[z.l++]=M[H++];B=z.l*8;continue}B=rr(z,B,+(H+Z==M.length)+2);for(var oe=0;Z-- >0;){var ce=M[H];oe=(oe<<5^ce)&32767;var ie=-1,he=0;if((ie=V[oe])&&(ie|=H&-32768,ie>H&&(ie-=32768),ie2){ce=k[he],ce<=22?B=wr(z,B,Q[ce+1]>>1)-1:(wr(z,B,3),B+=5,wr(z,B,Q[ce-23]>>5),B+=3);var Ae=ce<8?0:ce-4>>2;Ae>0&&(la(z,B,he-N[ce]),B+=Ae),ce=v[H-ie],B=wr(z,B,Q[ce]>>3),B-=3;var He=ce<4?0:ce-2>>1;He>0&&(la(z,B,H-ie-X[ce]),B+=He);for(var Ge=0;Ge>8-ie;for(var he=(1<<7-ie)-1;he>=0;--he)tr[ce|he<>>=3){case 16:for(_=3+O(v,E),E+=2,ce=Ae[Ae.length-1];_-- >0;)Ae.push(ce);break;case 17:for(_=3+Me(v,E),E+=3;_-- >0;)Ae.push(0);break;case 18:for(_=11+xe(v,E),E+=7;_-- >0;)Ae.push(0);break;default:Ae.push(ce),B>>0,z=0,B=0;!(k&1);){if(k=Me(v,w),w+=3,k>>>1)k>>1==1?(z=9,B=5):(w=bl(v,w),z=_t,B=Xs);else{w&7&&(w+=8-(w&7));var H=v[w>>>3]|v[(w>>>3)+1]<<8;if(w+=32,H>0)for(!E&&M<_+H&&(y=Gt(y,_+H),M=y.length);H-- >0;)y[_++]=v[w>>>3],w+=8;continue}for(;;){!E&&M<_+32767&&(y=Gt(y,_+32767),M=y.length);var V=le(v,w,z),Z=k>>>1==1?ut[V]:Ue[V];if(w+=Z&15,Z>>>=4,!(Z>>>8&255))y[_++]=Z;else{if(Z==256)break;Z-=257;var oe=Z<8?0:Z-4>>2;oe>5&&(oe=0);var ce=_+N[Z];oe>0&&(ce+=le(v,w,oe),w+=oe),V=le(v,w,B),Z=k>>>1==1?dt[V]:Fr[V],w+=Z&15,Z>>>=4;var ie=Z<4?0:Z-2>>1,he=X[Z];for(ie>0&&(he+=le(v,w,ie),w+=ie),!E&&M>>3]:[y.slice(0,_),w+7>>>3]}function Ys(v,E){var w=v.slice(v.l||0),k=vl(w,E);return v.l+=k[1],k[0]}function Ks(v,E){if(v)typeof console<"u"&&console.error(E);else throw new Error(E)}function Js(v,E){var w=v;lr(w,0);var k=[],y=[],_={FileIndex:k,FullPaths:y};P(_,{root:E.root});for(var M=w.length-4;(w[M]!=80||w[M+1]!=75||w[M+2]!=5||w[M+3]!=6)&&M>=0;)--M;w.l=M+4,w.l+=4;var z=w.read_shift(2);w.l+=6;var B=w.read_shift(4);for(w.l=B,M=0;Mi.map(i=>d[i]); +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/PublicHome-4L60krmd.js","assets/PublicHome-DJV5lKWp.css","assets/LoginView-CdDWJNab.js","assets/LoginView-CvZfAeZ0.css","assets/AdminLayout-ltF-ui71.js","assets/AdminLayout-BbmuxEs9.css","assets/UserManage-DDgTVhjY.js","assets/list-query-4ZZvVtjn.js","assets/RoleManage-7Ni_fgq0.js","assets/RoleManage-DVUY3tTJ.css","assets/MenuManage-BEleckEE.js","assets/SettingManage-D3eSU6jo.js","assets/SettingManage-DcldOeo6.css"])))=>i.map(i=>d[i]); (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))a(o);new MutationObserver(o=>{for(const r of o)if(r.type==="childList")for(const l of r.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&a(l)}).observe(document,{childList:!0,subtree:!0});function n(o){const r={};return o.integrity&&(r.integrity=o.integrity),o.referrerPolicy&&(r.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?r.credentials="include":o.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function a(o){if(o.ep)return;o.ep=!0;const r=n(o);fetch(o.href,r)}})();/** * @vue/shared v3.5.34 * (c) 2018-present Yuxi (Evan) You and Vue contributors @@ -94,7 +94,7 @@ usage: app.provide(ZINDEX_INJECTION_KEY, { current: 0 })`),{initialZIndex:a,curr callback failed before deep iterate at: `+t(r.path)),p}}if(u)break;r.res!==!1&&!u&&!r.isCircular&&r.info.isObject&&(l.childrenPath!==void 0&&(r.depth||!l.rootIsChildren)?(r.childrenItems=[],r.children.length&&r.children.forEach(([f,p,m,h])=>{r.childrenItems=[...r.childrenItems,...h.isArray?a(r,m,l,f,p):o(r,m,l,f,p)]})):r.childrenItems=r.info.isArray?a(r,r.value,l,[],""):o(r,r.value,l,[],"")),r.currentChildIndex=-1}if(r.childrenItems&&r.currentChildIndex=0;l--)r.childrenPath[l]=jL(r.strChildrenPath[l])}return t({value:a,callback:o,options:r,obj:a}),a}return n}const z1e=B1e({isString:Nd}),H1e={forEachDeep:z1e},j1e={omit(e,...t){const n=Object.keys(e.value),a={};for(const o of n)o!=="loading"&&(t.indexOf(o)>=0||(a[o]=e.value[o]));return a}};function q8(e){const t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.top="0",t.style.left="0",t.style.opacity="0",t.style.pointerEvents="none",t.style.zIndex="-1",document.body.appendChild(t);try{t.select(),t.setSelectionRange(0,99999);const n=document.execCommand("copy");return document.body.removeChild(t),n?!0:(console.error("传统复制方法失败"),!1)}catch(n){return console.error("传统复制方法出错: ",n),document.body.removeChild(t),!1}}async function K1e(e){try{return!navigator.clipboard||!navigator.clipboard.writeText?(console.warn("Clipboard API not supported, falling back to traditional method"),q8(e)):(await navigator.clipboard.writeText(e),!0)}catch(t){return console.error("复制失败: ",t),q8(e)}}async function W1e(){return new Promise((e,t)=>{const n=document.createElement("textarea");n.style.position="fixed",n.style.top="0",n.style.left="0",n.style.opacity="0",document.body.appendChild(n);try{if(n.focus(),document.execCommand("paste")){const a=n.value;document.body.removeChild(n),e(a)}else document.body.removeChild(n),t(new Error("传统读取方法失败"))}finally{document.body.removeChild(n)}})}async function q1e(){try{if(!navigator.clipboard||!navigator.clipboard.readText)throw console.warn("Clipboard API not supported for reading"),new Error("浏览器不支持读取剪贴板");if(navigator.permissions&&(await navigator.permissions.query({name:"clipboard-read"})).state==="denied")throw new Error("剪贴板读取权限被拒绝");return await navigator.clipboard.readText()}catch(e){return console.error("读取剪贴板失败: ",e),await W1e()}}const sb=Nt({store:{}});function U1e(e,t="__default__"){sb.store[t]=e}function Y1e(e="__default__"){return sb.store[e]}function G1e(e="__default__"){sb.store[e]=""}const X1e=Object.freeze(Object.defineProperty({__proto__:null,clearMemoryClipboard:G1e,copyToClipboard:K1e,copyToMemory:U1e,readToClipboard:q1e,readToMemory:Y1e},Symbol.toStringTag,{value:"Module"})),ys={logger:Lt,dash:j1e,clipboard:X1e},Zd={commonOptions(e){return{}},defaultOptions(e){const{t,crudOptionsRef:n}=e,a=r=>x(()=>t(r)),o=zn.get();return{settings:{plugins:{mobile:{enabled:!0,props:{isMobile:x(()=>window.innerWidth<768)}}}},mode:{},status:{},search:{container:{is:"fs-search-layout-default",collapse:!0,col:{span:4}},formItem:{wrapperCol:{style:{}}},options:{...o.form.inlineLayout,showFeedback:!1},onValidateError({trigger:r}){r==="search"&&o.notification.error({message:t("fs.search.error.message")})},collapse:!0,show:!0,buttons:{search:{className:{"fs-search-btn-search":!0},icon:o.icons.search},reset:{className:{"fs-search-btn-reset":!0},icon:o.icons.refresh}}},form:{pasteKey:"__default__",labelPlacement:"left",labelPosition:"right",labelWidth:"120px",style:{"grid-template-columns":"50% 50%"},row:{gutter:10},col:{span:12},labelAlign:"right",labelCol:{span:4},wrapperCol:{span:18},wrapper:{is:o.dialog.name,...o.formWrapper.buildWidthBind(o.dialog.name,"960px"),...o.formWrapper.buildInitBind(o.dialog.name),dragenabled:!0,destroyOnClose:!0,...o.dialog.footer(),buttons:{copy:{text:a("fs.form.copy"),order:1,click:async({form:r})=>{var l,s;const i=(s=(l=n.value)==null?void 0:l.form)==null?void 0:s.pasteKey;ys.clipboard.copyToMemory(JSON.stringify(r),i),o.message.success(t("fs.form.copySuccess"))}},paste:{text:a("fs.form.paste"),order:2,badge:x(()=>{var r,l;const s=(l=(r=n.value)==null?void 0:r.form)==null?void 0:l.pasteKey,i=ys.clipboard.readToMemory(s);return{[o.badge.value]:i?1:0,[o.badge.dot]:!!i}}),click:async({form:r})=>{var l,s;const i=(s=(l=n.value)==null?void 0:l.form)==null?void 0:s.pasteKey,u=ys.clipboard.readToMemory(i);if(u)try{const c=JSON.parse(u);Fs(r,c)}catch(c){console.error(c)}finally{ys.clipboard.clearMemoryClipboard(i)}}},cancel:{text:a("fs.form.cancel"),order:4,click:({doClose:r})=>{r()}},reset:{text:a("fs.form.reset"),order:3,click:({reset:r})=>{r()}},ok:{text:a("fs.form.ok"),order:5,type:"primary",click:async({submit:r})=>{await r()}}}}},addForm:{mode:"add",wrapper:{title:a("fs.addForm.title")}},editForm:{mode:"edit",wrapper:{title:a("fs.editForm.title")}},viewForm:{mode:"view",wrapper:{title:a("fs.viewForm.title"),buttons:{reset:{show:!1},cancel:{show:!1}}}},rowHandle:{width:250,title:a("fs.rowHandle.title"),order:1e3,dropdown:{more:{text:null,type:"primary",icon:o.icons.more}}},pagination:{background:!0,pageSize:20,[o.pagination.currentPage]:1,[o.pagination.total]:1,pageSizes:[5,10,20,50],layout:"total, sizes, prev, pager, next, jumper",showSizeChanger:!0,showQuickJumper:!0,showSizePicker:!0,showTotal:r=>t("fs.pagination.showTotal",[r])},table:{show:!0,height:"100%",rowKey:o.table.defaultRowKey,stripe:!0,border:!0,bordered:!0,singleLine:!1,scrollTopOnRefreshed:!0,editable:{enabled:!1,rowKey:"$editable_id"},pagination:!1},toolbar:{compact:!0,buttons:{search:{className:{"fs-toolbar-btn-search":!0}},compact:{className:{"fs-toolbar-btn-compact":!0}},refresh:{className:{"fs-toolbar-btn-refresh":!0}},export:{className:{"fs-toolbar-btn-export":!0}},columns:{className:{"fs-toolbar-btn-columns":!0}}}},actionbar:{buttons:{add:{className:{"fs-actionbar-btn-add":!0},type:"primary",text:a("fs.actionbar.add")}}}}}};function fv(e,t){return e.type!=="antdv"?{}:{labelCol:{span:t},wrapperCol:{span:23-t}}}function J1e(){const{ui:e}=sn();return{colspan:{form:{col:{span:24},...fv(e,2)}},colspan3:{form:{col:{span:24},...fv(e,3)}},colspan4:{form:{col:{span:24},...fv(e,4)}}}}const Z1e=Object.freeze(Object.defineProperty({__proto__:null,default:J1e},Symbol.toStringTag,{value:"Module"}));function Q1e(){const e=zn.get();return{button:{form:{component:{name:e.input.name,vModel:e.input.modelValue,[e.input.clearable]:!0}},column:{component:{name:"fs-button",vModel:"text"}}},link:{form:{component:{name:e.input.name,vModel:e.input.modelValue,[e.input.clearable]:!0}},column:{component:{name:"fs-button",vModel:"text",...e.button.linkType}}}}}const e4e=Object.freeze(Object.defineProperty({__proto__:null,default:Q1e},Symbol.toStringTag,{value:"Module"}));function t4e(){const e=zn.get();return{"dict-cascader":{search:{component:{clearable:!0}},form:{component:{name:"fs-dict-cascader",vModel:e.cascader.modelValue,[e.cascader.clearable]:!0}},column:{component:{name:"fs-dict-cascader-format"}}}}}const n4e=Object.freeze(Object.defineProperty({__proto__:null,default:t4e},Symbol.toStringTag,{value:"Module"})),f7={name:"zh-cn",fs:{component:{select:{placeholder:"请选择"}},addForm:{title:"添加"},editForm:{title:"编辑"},viewForm:{title:"查看"},rowHandle:{title:"操作",remove:{text:"删除",confirmTitle:"删除提示",confirmMessage:"您确定要删除该记录吗?",success:"删除成功!",confirmText:"确定",cancelText:"取消"},copy:{text:"复制"},edit:{text:"编辑"},view:{text:"查看"}},form:{cancel:"取消",ok:"确定",reset:"重置",saveRemind:{title:"提示",content:"表单数据有变更,是否保存",cancel:"不保存",ok:"保存"},copy:"复制",paste:"粘贴",copySuccess:"表单数据已复制,您可以在添加对话框中粘贴"},actionbar:{add:"添加"},toolbar:{columnFilter:{title:"列设置",fixed:"固定",order:"排序",reset:"还原",confirm:"确定",unnamed:"未命名"},search:{title:"查询显示"},refresh:{title:"刷新"},compact:{title:"紧凑模式"},export:{title:"导出"},columns:{title:"列设置"}},search:{container:{collapseButton:{text:{collapse:"收起",expand:"展开"}}},search:{text:"查询"},reset:{text:"重置"},error:{message:"查询表单校验失败"}},pagination:{showTotal:"共 {0} 条"},date:{formatter:{to:"至"}},extends:{tableSelect:{view:"查看",select:"选择",ok:"确定",cancel:"取消"},cropper:{title:"图片裁剪",preview:"预览",reChoose:"重新选择",flipX:"左右翻转",flipY:"上下翻转",reset:"重置",cancel:"取消",confirm:"确定",chooseImage:"+ 选择图片",onlySupport:"仅支持",sizeLimit:"大小不能超过",sizeNoLimit:"大小不限制"},fileUploader:{text:"文件上传",limitTip:"文件数量不能超过 {0}",sizeLimitTip:"文件大小不能超过 {0},当前大小:{1}",loadError:"图片加载失败",pixelLimitTip:"图片像素尺寸不能超过 宽:{0},高:{1}",hasUploading:"还有文件正在上传,请等待上传完成,或删除它"}}}},a4e={fs:{component:{select:{placeholder:"please select"}},addForm:{title:"add"},editForm:{title:"edit"},viewForm:{title:"view"},rowHandle:{title:"handle",remove:{text:"remove",confirmTitle:"remove tip",confirmMessage:"Are you sure you want to delete this record?",success:"delete success!",confirmText:"confirm",cancelText:"cancel"},copy:{text:"copy"},edit:{text:"edit"},view:{text:"view"}},form:{cancel:"cancel",ok:"ok",reset:"reset",saveRemind:{title:"save remind",content:"The form data has changed, whether to save",cancel:"don't save",ok:"save"},copy:"copy",paste:"paste"},actionbar:{add:"add"},toolbar:{columnFilter:{title:"columns set",fixed:"fixed",order:"sort",reset:"reset",confirm:"ok",unnamed:"unnamed"},search:{title:"show search bar"},refresh:{title:"refresh"},compact:{title:"compact mode"},export:{title:"export"},columns:{title:"columns set"}},search:{container:{collapseButton:{text:{collapse:"collapse",expand:"expand"}}},search:{text:"search"},reset:{text:"reset"},error:{message:"form valid error"}},pagination:{showTotal:"Total {0} items"},date:{formatter:{to:"to"}},extends:{tableSelect:{view:"view",select:"select"},cropper:{title:"image crop",preview:"preview",reChoose:"reChoose",flipX:"flipX",flipY:"flipY",reset:"reset",cancel:"cancel",confirm:"confirm",chooseImage:"+ choose image",onlySupport:"only",sizeLimit:"size limit",sizeNoLimit:" no limit"},fileUploader:{text:"fileUpload",limitTip:"file count limit: {0}",sizeLimitTip:"file size limit: {0}, current size: {1}",loadError:"image load error",pixelLimitTip:"pixel limit : width:{0},height:{1}",hasUploading:"The file is being uploaded, please wait for the upload to complete or delete"}}}};function o4e(e,t){let n=on(f7,e);return n==null?e:t instanceof Array?(dt(t,(a,o)=>{n=n.replace("{"+o+"}",a)}),n):n.replace("{n}",t)}class r4e{constructor(){$t(this,"vueI18nInstance",null)}t(t,n){return o4e(t,n)}setVueI18n(t){if(!t)return;t.global&&(t=t.global);const n=t.availableLocales;for(const a of n){if(a.startsWith("zh")){const o=t.getLocaleMessage(a),r=Kn(o.fs||{});t.mergeLocaleMessage(a,{fs:f7.fs}),t.mergeLocaleMessage(a,{fs:r})}else if(a.startsWith("en")){const o=t.getLocaleMessage(a),r=Kn(o.fs||{});t.mergeLocaleMessage(a,{fs:a4e.fs}),t.mergeLocaleMessage(a,{fs:r})}Lt.debug("i18n",t.getLocaleMessage(a))}this.vueI18nInstance=t}}const jp=new r4e;function ao(){return jp.vueI18nInstance!=null?{t:jp.vueI18nInstance.t}:{t:jp.t}}var tm=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function nm(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var p7={exports:{}};(function(e,t){(function(n,a){e.exports=a()})(tm,function(){return function(n,a){var o=a.prototype,r=o.format;o.format=function(l){var s=this,i=this.$locale();if(!this.isValid())return r.bind(this)(l);var u=this.$utils(),c=(l||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,function(f){switch(f){case"Q":return Math.ceil((s.$M+1)/3);case"Do":return i.ordinal(s.$D);case"gggg":return s.weekYear();case"GGGG":return s.isoWeekYear();case"wo":return i.ordinal(s.week(),"W");case"w":case"ww":return u.s(s.week(),f==="w"?1:2,"0");case"W":case"WW":return u.s(s.isoWeek(),f==="W"?1:2,"0");case"k":case"kk":return u.s(String(s.$H===0?24:s.$H),f==="k"?1:2,"0");case"X":return Math.floor(s.$d.getTime()/1e3);case"x":return s.$d.getTime();case"z":return"["+s.offsetName()+"]";case"zzz":return"["+s.offsetName("long")+"]";default:return f}});return r.bind(this)(c)}}})})(p7);var l4e=p7.exports;const s4e=nm(l4e);tt.extend(s4e);function pv(e,t){if(!i7.isEmpty(e))return tt(e).format(t)}function h7(e,t="YYYY-MM-DD HH:mm:ss"){if(e!=null&&e instanceof Array&&e.length>1){if(i7.hasEmpty(e))return;const{t:n}=ao();return`${pv(e[0],t)} ${n("fs.date.formatter.to")} ${pv(e[1],t)}`}return pv(e,t)}function i4e(e){const{value:t}=e;return h7(t,"YYYY-MM-DD")}function u4e(e){const{value:t}=e;return h7(t,"YYYY-MM-DD HH:mm:ss")}var m7={exports:{}};(function(e,t){(function(n,a){e.exports=a()})(tm,function(){var n="week",a="year";return function(o,r,l){var s=r.prototype;s.week=function(i){if(i===void 0&&(i=null),i!==null)return this.add(7*(i-this.week()),"day");var u=this.$locale().yearStart||1;if(this.month()===11&&this.date()>25){var c=l(this).startOf(a).add(1,a).date(u),f=l(this).endOf(n);if(c.isBefore(f))return 1}var p=l(this).startOf(a).date(u).startOf(n).subtract(1,"millisecond"),m=this.diff(p,n,!0);return m<0?l(this).startOf("week").week():Math.ceil(m)},s.weeks=function(i){return i===void 0&&(i=null),this.week(i)}}})})(m7);var c4e=m7.exports;const d4e=nm(c4e);var v7={exports:{}};(function(e,t){(function(n,a){e.exports=a()})(tm,function(){return function(n,a){a.prototype.weekday=function(o){var r=this.$locale().weekStart||0,l=this.$W,s=(l{b7.push(e.default)});const Qd={};function P4e(){return Qd}function N4e(e){return Qd[e]}function I4e(e){for(const t in e)Qd[t]=e[t]}const y7={getType:N4e,addTypes:I4e,getTypes:P4e,install(){for(const e of b7)dt(e(),(t,n)=>{Qd[n]=t});Lt.debug("types installed:",Qd)}},V4e=K({name:"FsPage",setup(){const e=F();return gt(()=>{window.getComputedStyle(e.value.parentNode).getPropertyValue("position")!=="relative"&&ys.logger.warn("fs-page父节点的position建议为relative,因为fs-page为相对定位(position:absolute),如果样式没有异常,你可以忽略此警告")}),{pageRef:e}}}),Rn=(e,t)=>{const n=e.__vccOpts||e;for(const[a,o]of t)n[a]=o;return n},L4e={ref:"pageRef",class:"fs-page"},F4e={key:0,class:"fs-page-header"},D4e={class:"fs-page-content"},B4e={key:1,class:"fs-page-footer"};function z4e(e,t,n,a,o,r){return C(),A("div",L4e,[e.$slots.header!=null?(C(),A("div",F4e,[re(e.$slots,"header")])):le("",!0),M("div",D4e,[re(e.$slots,"default")]),e.$slots.footer!=null?(C(),A("div",B4e,[re(e.$slots,"footer")])):le("",!0)],512)}const H4e=Rn(V4e,[["render",z4e]]);function vg(e){return e!=null&&(e instanceof w7||nn(e)||Qa(e))}function U8(e){return vg(e)&&!e.cloneable}function j4e(e,...t){function n(o,r){if(r!=null&&(Un(o)||vg(r)))return r}let a=null;for(const o of t)vg(o)&&(a=o);return a||UV(e,...t,n)}function K4e(e){if(U8(e))return e;function t(n){if(U8(n))return n}return eV(e,t)}let w7=class{constructor(){$t(this,"cloneable",!1)}setCloneable(e){this.cloneable=e}};function _n(){return{merge:j4e,cloneDeep:K4e,UnMergeable:w7}}const{cloneDeep:W4e}=_n();function q4e(e){return e instanceof ib}function U4e(e){return e instanceof am}function Y8(e,t,n){const a={};if(e==null)return a;const o=n?q4e:U4e;return H1e.forEachDeep(e,(r,l,s,i)=>{if(r==null)return!1;if(o(r)){const u=i.path;if(t){for(const c of t)if(typeof c=="string"){if(u.startsWith(c))return!1}else if(c instanceof RegExp&&c.test(u))return!0}return a[u]=r,!1}return!Qa(r)},{checkCircular:!0}),a}function Y4e(e,t){if(e==null||Object.keys(e).length<=0)return null;const n={};return dt(e,(a,o)=>{n[o]=a.buildAsyncRef(t)}),n}function G4e(e,t){t==null||Object.keys(t).length<=0||dt(t,(n,a)=>{Zn(e,a,n.value==null?null:n.value)})}function X4e(e,t,n,a){const o=x(()=>{const s=e();return Y8(s,n,!1)}),r=x(()=>{const s=e();return Y8(s,n,!0)}),l=Y4e(r.value,t);return x(()=>{let s=e();const i=Object.keys(r.value).length,u=Object.keys(o.value).length;if(i>0||u>0){if(s=W4e(s),u>0){const c=t?t():{};dt(o.value,(f,p)=>{Zn(s,p,f.computeFn(c))})}i>0&&G4e(s,l)}return a?a(s):s})}class am{constructor(t){$t(this,"computeFn"),this.computeFn=t}}function J4e(e){return new am(e)}class ib{constructor(t){$t(this,"watch"),$t(this,"asyncFn"),$t(this,"defaultValue");const{asyncFn:n,defaultValue:a}=t;this.watch=t.watch,this.asyncFn=n,this.defaultValue=a}buildAsyncRef(t){t=t||function(){};const n=F(this.defaultValue),a=x(()=>this.watch?this.watch(t()):null);return pe(()=>a.value,async o=>{n.value=await this.asyncFn(o,t())},{immediate:!0}),n}}function Z4e(e){return new ib(e)}function kr(){return{ComputeValue:am,compute:J4e,AsyncComputeValue:ib,asyncCompute:Z4e,doComputed:X4e}}const Bs={orderDefault:1},{merge:or,cloneDeep:Tl}=_n(),zc=[];function C7(e){I_(zc,t=>t.name===e.name),zc.push(e),zc.sort((t,n)=>t.order-n.order),Lt.debug("mergeColumnPlugin register success: current:",e,"registered:",zc)}function Q4e(e){var t,n;if(e.dict){if((t=e.column)!=null&&t.component){const a=Os(Tl(e.dict));a.cloneable&&(a.cloneable=!1),e.column.component.dict=or(a,e.column.component.dict)}if((n=e.form)!=null&&n.component){const a=Os(Tl(e.dict));a.cloneable&&(a.cloneable=!1),e.form.component.dict=or(a,e.form.component.dict)}}return e}function ebe(e){if(!e.type)return e;let t=[];typeof e.type=="string"?t=[e.type]:e.type instanceof Array&&(t=e.type);const n={};for(const a of t){const o=y7.getType(a);o&&or(n,o)}return e=or(n,e),e}const hc=[];hc.push({name:"type",handle:ebe,order:-2});hc.push({name:"dict",handle:Q4e,order:-1});hc.push({name:"viewFormUseCellComponent",order:10,handle:(e={},t={})=>{var n,a;if(!((n=t.settings)!=null&&n.viewFormUseCellComponent))return e;const o={component:((a=e.column)==null?void 0:a.component)||{}};return(e.type==="text"||e.type instanceof Array&&e.type.includes("text"))&&(o.render||(o.render=r=>{const{value:l}=r;return J("span",null,[l])})),or(e,{viewForm:o}),e}});hc.push({name:"NaiveFormRuleFix",order:10,handle:(e={},t={})=>{var n,a,o,r,l;const{ui:s}=sn();return s.type!=="naive"||((n=e.addForm)!=null&&n.rules&&(e.addForm.rule=e.addForm.rules),(a=e.editForm)!=null&&a.rules&&(e.editForm.rule=e.editForm.rules),(o=e.viewForm)!=null&&o.rules&&(e.viewForm.rule=e.viewForm.rules),(r=e.form)!=null&&r.rules&&(e.form.rule=e.form.rules),(l=e.search)!=null&&l.rules&&(e.search.rule=e.search.rules)),e}});hc.push({name:"DefaultOrder",order:0,handle:(e={},t={},n)=>(on(e,"column.order")==null&&Zn(e,"column.order",n),on(e,"form.order")==null&&Zn(e,"form.order",n),e)});for(const e of hc)C7(e);function ub(e,t){const n={};let a=0;return dt(e,(o,r)=>{if(o.key=r,o.children)o.children=ub(o.children,t);else for(const l of zc)o=l.handle(o,t,a);n[r]=o,a++}),n}function cb(e={},t){return dt(t,(n,a)=>{n.children?cb(e,n.children):e[a]=n}),e}function db(e={},t){return dt(t,(n,a)=>{n.children?db(e,n.children):e[a]=n}),e}function tbe(e){const t=e,n=t.column||{};return n.title==null&&(n.title=t.title),n.key=t.key,t.children&&(n.children=S7(t.children)),_7(n),Nt(n)}function _7(e){var t;e&&(t=e.component)!=null&&t.name&&typeof e.component.name!="string"&&(nn(e.component.name)||(e.component.name=un(e.component.name)))}function S7(e){let t={};return dt(e,(n,a)=>{t[a]=tbe(n)}),t=fb(t),t}function nbe(e){return Bi(e,t=>t.order??Bs.orderDefault)}function fb(e){const t=[];for(const o in e){const r=e[o];r.key=o,r.children&&zL(r.children)>0&&(r.children=fb(r.children)),t.push(r)}const n=nbe(t),a={};for(const o of n)a[o.key]=o;return a}function x7(e,t){const n={};return dt(e,a=>{const o=Tl(a[t])||{};t==="form"&&o.title==null&&(o.title=a.title),o.key=a.key,n[a.key]=o,_7(o)}),n}function Hc(e,t,n,a){const o=x7(n,t),r=or(Tl(e.form),e[t],{columns:o});return a&&a(r),r}function abe(e,t="search",n){var a;const o=x7(n,t),r={},l=((a=e.settings)==null?void 0:a.searchCopyFormProps)??["component","valueChange","title","key","label","render"];function s(i,u,c){if(sL(l,c)&&e.columns[u]){const f=e.columns[u][c];f&&(i[c]=f)}}return dt(Tl(e.form.columns),(i,u)=>{const c={};s(c,u,"valueResolve"),s(c,u,"valueBuilder"),r[u]=or(c,ur(i,l))}),or({columns:r},{columns:o},e.search)}function obe(e,t,n="form"){const{t:a}=ao(),{merge:o}=_n();t=t||{};const r={value:null},l=o(Zd.defaultOptions({t:a,crudOptionsRef:r}),Zd.commonOptions({crudOptions:e,context:t,crudExpose:null}),e);r.value=l;const s=ub(Tl(l.columns),l),i=cb({},s),u=n==="form"?"form":`${n}Form`;return Hc(l,u,i)}function rbe(e){dt(e.columns,(a,o)=>{a.key=o});const t=ub(Tl(e.columns),e);e.columns=t;const n=cb({},t);return e.table.columns=S7(Tl(t)),e.table.columnsMap=db({},e.table.columns),or(e.toolbar,{columnsFilter:{originalColumns:Tl(e.table.columns)}}),e.form=Hc(e,"form",n),e.addForm=Hc(e,"addForm",n),e.editForm=Hc(e,"editForm",n),e.viewForm=Hc(e,"viewForm",n,a=>{dt(a.columns,o=>{o.component||(o.component={}),o.component.disabled=!0})}),e.search=abe(e,"search",n),e.table.editable&&(e.table.editable.addForm=or(e.addForm.columns,e.table.editable.addForm),e.table.editable.editForm=or(e.editForm.columns,e.table.editable.editForm)),e}function Kh(e,t){dt(e,(n,a)=>{n.key||(n.key=a),n.children?Kh(n.children,t):t(n,a)})}function Wh(e,t){dt(e,(n,a)=>{n.key||(n.key=a),n.children?Wh(n.children,t):t(n,a)})}function pb(){return{buildFormOptions:obe,buildColumns:rbe,registerMergeColumnPlugin:C7,forEachColumns:Wh,doColumnsSort:fb,forEachTableColumns:Kh}}let lbe=0;const hv={};async function sbe(e){const t=e.id||`${lbe++}`,n=document.createElement("div");return new Promise((a,o)=>{let r=hv[t];r!=null&&(r.vm.exposed.open(e),a(r));const l=J(ef,{id:t,onClosed(){e.id||delete hv[t]}});l.appContext=ef._context,$l(l,n),document.body.appendChild(n);const s=l.component;r={id:t,vNode:l,vm:s,props:l.component.props},hv[t]=r,r.vm.exposed.open(e),a(r.vm.exposed)})}function ibe(){let e=null;try{e=Fe("use:form:wrapper",()=>{})()}catch(a){Lt.warn("cant inject use:form:wrapper,建议在App.vue中使用组件包裹",a)}let t=null;e==null?t=async a=>await sbe(a):t=async a=>await e.open(a);async function n(a){const{buildFormOptions:o}=pb(),r=o(a.crudOptions,a.context);return await t(r)}return{openDialog:t,openCrudFormDialog:n}}const{merge:k7}=_n(),ube=k7;function cbe(e){const{crudExpose:t}=e,{crudBinding:n}=t;sn(),ao();const{merge:a}=_n();pe(()=>{var r,l,s;return(s=(l=(r=n.value)==null?void 0:r.table)==null?void 0:l.editable)==null?void 0:s.enabled},r=>{var l,s,i,u,c;const f=(i=(s=(l=n.value)==null?void 0:l.table)==null?void 0:s.editable)==null?void 0:i.customRowHandleActive;if(f){f({enabled:r,mode:(u=n.value.table.editable)==null?void 0:u.mode,rowHandle:n.value.rowHandle});return}r?((c=n.value.table.editable)==null?void 0:c.mode)==="row"?n.value.rowHandle.active="editRow":n.value.rowHandle.active="editable":n.value.rowHandle.active="default"});const o={async enable(r,l){const s=n.value.table.editable;a(s,{enabled:!0},r),l&&l({editable:s})},disable(){var r;(r=t.getTableRef())==null||r.editable.resume(),n.value.table.editable.enabled=!1,n.value.rowHandle.active="default"},active(r){t.getTableRef().editable.active(r)},inactive(){t.getTableRef().editable.inactive()},addRow(r){t.getTableRef().editable.addRow(r)},activeCols(r){t.getTableRef().editable.activeCols(r)},resume(){t.getTableRef().editable.resume()},cancel(){t.getTableRef().editable.cancelAll()},persist(){t.getTableRef().editable.persist()},removeRow(r){t.getTableRef().editable.removeRow(r)},getEditableRow(r){var l,s;return(s=(l=t.getTableRef())==null?void 0:l.editable)==null?void 0:s.getEditableRow(r)},getActiveRows(){var r,l;return(l=(r=t.getTableRef())==null?void 0:r.editable)==null?void 0:l.getActiveRows()},async doSaveRow(r){let l=r.editableId;l||(l=r.row[n.value.table.editable.rowKey]);const s=o.getEditableRow(l);await s.save({async doSave(i){var u,c;const{isAdd:f,row:p,setData:m}=i,h=p;if(((c=(u=n.value)==null?void 0:u.mode)==null?void 0:c.name)!=="local")try{if(s.loading=!0,f){const v=await n.value.request.addRequest({form:h});m(v)}else await n.value.request.editRequest({form:h,row:h})}finally{s.loading=!1}}})},async doCancelRow(r){let l=r.editableId;l||(l=r.row[n.value.table.editable.rowKey]);const s=o.getEditableRow(l);if(s.isAdd){o.removeRow(l);return}s.cancel()},async doRemoveRow(r){let l=r.editableId;l||(l=r.row[n.value.table.editable.rowKey]);const s=o.getEditableRow(l);return await t.doRemove(r,{async handle(){return s.isAdd?(o.removeRow(l),!1):n.value.mode.name==="local"?(o.removeRow(l),{isLocal:!0}):await n.value.request.delRequest(r)}})},getInstance(){t.getTableRef().editable},eachCells(r){var l;(l=t.getTableRef().editable)==null||l.eachCells(r)},eachRows(r){var l;(l=t.getTableRef().editable)==null||l.eachRows(r)},async validate(){var r;return await((r=t.getTableRef().editable)==null?void 0:r.validate())},getTableData(r){var l;return(l=t.getTableRef().editable)==null?void 0:l.getCleanTableData(r)},getCleanTableData(r){var l;return(l=t.getTableRef().editable)==null?void 0:l.getCleanTableData(r)}};return o}function E7(e){const{crudRef:t,crudBinding:n}=e,{ui:a}=sn(),{t:o}=ao(),r=ibe();function l(){t.value==null&&Lt.warn("crudRef还未初始化,请在onMounted之后调用")}function s(){n.value==null&&Lt.warn("crudBinding还未初始化,请在useFs或useCrud之后调用")}const i={crudRef:t,crudBinding:n,getFormWrapperRef(){return t.value.formWrapperRef},getFormRef:()=>{const u=i.getFormWrapperRef();if(u==null||(u==null?void 0:u.formRef)==null){Lt.error("当前无法获取FormRef,请在编辑对话框已打开的状态下调用此方法,如果是在打开对话框时调用,可以尝试先nextTick");return}return u==null?void 0:u.formRef},getFormData:()=>{const u=i.getFormRef();return u==null?void 0:u.getFormData()},setFormData:(u,c)=>{var f;(f=i.getFormRef())==null||f.setFormData(u,c)},getFormComponentRef(u,c=!1){const f=i.getFormRef();return f==null?void 0:f.getComponentRef(u,c)},doValueBuilder(u,c){c==null&&(c=Qt(n.value.columns)),Lt.debug("doValueBuilder ,columns=",c);const f=[];Wh(c,p=>{p.valueBuilder!=null&&f.push(p)}),f.length!==0&&(dt(u,(p,m)=>{dt(f,h=>{const v=h.valueBuilder({value:on(p,h.key),row:p,form:p,index:m,key:h.key,column:h});v!=null&&!(v instanceof Promise)&&Zn(p,h.key,v)}),p.children&&Un(p.children)&&i.doValueBuilder(p.children,c)}),Lt.debug("valueBuilder success:",u))},doValueResolve({form:u},c){c==null&&(c=Qt(n.value.columns));const f=[];Wh(c,p=>{p.valueResolve!=null&&f.push(p)}),f.length!==0&&(Lt.debug("doValueResolve ,columns=",c),dt(f,p=>{const m=p.key,h=p.valueResolve({value:on(u,m),row:u,form:u,key:m,column:p});h!=null&&!(h instanceof Promise)&&Zn(u,m,h)}),Lt.debug("valueResolve success:",u))},doSearchValidate(){i.getSearchRef().doValidate()},getSearchFormData(){return n.value.search.validatedForm},getSearchValidatedFormData(){return n.value.search.validatedForm},setSearchFormData(u){if(t.value&&t.value.setSearchFormData({form:u.form,mergeForm:u.mergeForm}),u.mergeForm===!1)for(const f in n.value.search.validatedForm)delete n.value.search.validatedForm[f];const{merge:c}=_n();c(n.value.search.validatedForm,u.form),u.triggerSearch&&i.doRefresh()},getSearchRef(){var u;return l(),(u=t.value)==null?void 0:u.getSearchRef()},buildPageQuery(u){var c,f;const p=u.page;let m=u.form;m==null&&(m=Kn(i.getSearchValidatedFormData())||{},(f=(c=n.value)==null?void 0:c.search)!=null&&f.columns&&i.doValueResolve({form:m},Qt(n.value.search.columns)));let h=u.sort;h==null&&(h=n.value.table.sort||{});const v={page:p,form:m,sort:h};let g=v;return n.value.request.transformQuery&&(g=n.value.request.transformQuery(v)),g},async search(u,c={}){const f=i.buildPageQuery(u);let p;const m=d(n.value.table.disableLoading);try{c.silence!==!0&&m!==!0&&(n.value.table.loading=!0),Lt.debug("pageRequest",f),p=await n.value.request.pageRequest(f)}finally{n.value.table.loading=!1}if(p==null){Lt.warn("pageRequest返回结果不能为空");return}let h=p;return n.value.request.transformRes&&(h=n.value.request.transformRes({res:p,query:f})),h.records&&i.doValueBuilder(h.records),h},getPage(){let u={currentPage:1,pageSize:10};return n.value.pagination&&(u={currentPage:n.value.pagination[a.pagination.currentPage],pageSize:n.value.pagination.pageSize}),u},async doRefresh(u){var c,f;if(n.value.request.pageRequest==null)return;Lt.debug("do refresh:",u),n.value.pagination&&u!=null&&u.goFirstPage&&(n.value.pagination[a.pagination.currentPage]=1);const p=i.getPage(),m=await i.search({page:p},{silence:u==null?void 0:u.silence});if(m==null){Lt.error("pageRequest返回结构不正确,请配置正确的request.transformRes,期望:{currentPage>0, pageSize>0, total, records:[]},实际返回:",m);return}const{currentPage:h=p.currentPage||1,pageSize:v=p.pageSize,total:g}=m,{records:b}=m;if(b==null||!(b instanceof Array)||g==null||h==null||h<=0||isNaN(h)||v==null||v<=0||isNaN(v)){Lt.error("pageRequest返回结构不正确,请配置正确的request.transformRes,期望:{currentPage>0, pageSize>0, total, records:[]},实际返回:",m),Lt.info("如果你的不需要分页,也需要按照上面的格式返回,可以让pageSize=99999,然后配置crudOptions.pagination.show=false来隐藏分页组件");return}if(n.value.data=b,n.value.pagination&&(n.value.pagination[a.pagination.currentPage]=h,n.value.pagination.pageSize=v,n.value.pagination[a.pagination.total]=g||b.length),(u==null?void 0:u.scrollTop)??n.value.table.scrollTopOnRefreshed){const y=i.getTableRef();y==null||y.scrollTo(0)}(f=(c=n.value)==null?void 0:c.table)!=null&&f.onRefreshed&&n.value.table.onRefreshed({data:b})},getToolbarRef:()=>t.value.toolbarRef,getColumnsFilterRef:()=>i.getToolbarRef().columnsFilterRef,getColumnsFilterOriginalColumnsRef:()=>i.getColumnsFilterRef().original,getColumnsFilterColumnsRef:()=>i.getColumnsFilterRef().columns,doPageTurn(u){n.value.pagination[a.pagination.currentPage]=u},async doSearch(u){Lt.debug("do search:",u),u=k7({goFirstPage:!0},u),u.goFirstPage&&i.doPageTurn(1),u.form&&t.value&&i.setSearchFormData({form:u.form,mergeForm:u.mergeForm,refWarning:!1,triggerSearch:!1}),await i.doRefresh()},getTableRef(){var u;return l(),(u=t.value)==null?void 0:u.tableRef},getBaseTableRef(){const u=this.getTableRef();if(u==null){Lt.warn("fs-table还未挂载");return}return u.tableRef},getTableData(){return s(),n.value.data},setTableData(u){s(),n.value.data=u},insertTableRow(u,c){s(),n.value.data.splice(u,0,c)},updateTableRow(u,c,f=!0){f?n.value.data[u]=ube(n.value.data[u],c):n.value.data[u]=c},removeTableRow(u){s(),n.value.data.splice(u,1)},removeTableRowByRowKey:(u,c)=>{s(),c==null&&(c=n.value.data);for(let f=0;fAr(()=>import("./index-64865240-CievhkpU.js"),[])});let t=null;return dt(e,n=>{t=n}),(await t()).exportUtil}function fbe({originalRow:e,row:t,key:n,col:a}){var o;const r=e[n],l=(o=a.component)==null?void 0:o.dict;if(l&&r!=null){const s=l.getNodesFromDataMap(r);if(s!=null&&s.length>0){const i=E_(s,u=>l.getLabel(u)||l.getValue(u)).join("|");i!=null&&i!==""&&(t[n]=i)}}return t}async function pbe(e,t={}){if(t.server){const u=e.getPage(),c=e.buildPageQuery({page:u});await t.server(c);return}const n=e.crudBinding;let a=t.columns;a==null&&(a=[],dt(n.value.table.columnsMap,u=>{if(!(t.columnFilter&&t.columnFilter(u)===!1)&&!(t.onlyShow&&d(u.show)===!1)&&u.exportable!==!1&&u.key!=="_index"){const c={key:u.key,title:u.title};a.push(c)}}));for(const u of a){const c=n.value.table.columnsMap[u.key];u.columnProps=c||{},t.columnBuilder&&t.columnBuilder({col:u})}const{merge:o}=_n(),r=await dbe(),l=[];let s=n.value.data;if(t.dataFrom==="search"){const u=o({page:{currentPage:1,pageSize:99999999}},n.value.toolbar.export.searchParams);s=(await e.search(u,{silence:!0})).records}for(const u of s){const c=Kn(u);dt(a,f=>{const p=f.columnProps,m={row:c,originalRow:u,key:f.key,col:p,exportCol:f};t.autoUseDictLabel!==!1&&fbe(m),t.dataFormatter&&t.dataFormatter(m)}),l.push(c)}const i=o({columns:a,data:l,filename:"table",noHeader:!1,separator:",",quoted:!1},{...t});t.fileType==="excel"?await r.excel(i):await r.csv(i)}const T7={};function M7(e,t,n={}){T7[e]={handle:t,opts:n}}function hbe(e){return T7[e]}M7("rowSelection",(e,t,n)=>{const a=t.crudExpose.crudBinding;function o(){var s,i;return((i=(s=a.value)==null?void 0:s.table)==null?void 0:i.rowKey)||"id"}const{ui:r}=sn();if(!e){Lt.warn("请配置settings.plugins.rowSelection.props参数");return}let l=r.table;return(n==null?void 0:n.table.tableVersion)=="v2"&&(l=r.tableV2),l.buildSelectionCrudOptions({crossPage:e.crossPage,getRowKey:o,getPageData(){return a.value.data},useCompute:()=>kr(),selectionFixed:e.selectionFixed,multiple:e.multiple,selectedRowKeys:e.selectedRowKeys,onSelectedKeysChanged:async s=>{const i=e.selectedRowKeys instanceof Function?e.selectedRowKeys():e.selectedRowKeys;i.value=[...s],await Oe(),e.onSelectedChanged&&e.onSelectedChanged(i.value)}})},{before:!0,order:-2});M7("mobile",(e,t,n)=>{const a=n.rowHandle,o=a.buttons;let r={};for(const s in o){const i=o[s];nn(i.dropdown)?r=i:r[s]={...i,dropdown:x(()=>e.isMobile.value?!0:i.dropdown)}}let l=a.width;return(l==null||!nn(l))&&(l=x(()=>{var s;return e.isMobile.value?((s=e==null?void 0:e.rowHandle)==null?void 0:s.width)||60:a.width||250})),{rowHandle:{width:l,buttons:r}}},{before:!1,order:-2});const{merge:rs}=_n();function mbe(e){e.context==null&&(e.context={});const t=zn.get(),{t:n}=ao(),a=E=>x(()=>n(E));let o=e.crudOptions;const r=e.expose||e.crudExpose;if(!r)throw new Error("crudExpose不能为空,请给useCrud传入{crudExpose}参数");const l=r,{crudBinding:s}=l,{doRefresh:i,doValueResolve:u}=l;function c(){return{pagination:{...t.pagination.onChange({setCurrentPage(E){s.value.pagination[t.pagination.currentPage]=E,s.value.pagination._onCurrentChange&&s.value.pagination._onCurrentChange({current:E,pagination:s.value.pagination})},setPageSize(E){s.value.pagination.pageSize=E,s.value.pagination[t.pagination.currentPage]=1,s.value.pagination._onPageSizeChange&&s.value.pagination._onPageSizeChange({pageSize:E,current:1,pagination:s.value.pagination})},async doAfterChange(){return await i()}})}}}function f(){return{form:{async doSubmit(E){var O,I,$,z;if(E.mode==="edit")if(u(E),((O=o.mode)==null?void 0:O.name)==="local")l.updateTableRow(E.index,E.form,o.mode.isMergeWhenUpdate);else return(I=s.value.request)!=null&&I.editRequest||Lt.warn("request.editRequest 未定义,无法保存"),await s.value.request.editRequest(E);else if(E.mode==="add")if(u(E),(($=o.mode)==null?void 0:$.name)==="local"){const q=o.mode.isAppendWhenAdd?l.getTableData().length:0;l.insertTableRow(q,E.form)}else return(z=s.value.request)!=null&&z.addRequest||Lt.warn("request.addRequest 未定义,无法保存"),await s.value.request.addRequest(E)},async onSuccess({mode:E}){E==="edit"?await i({scrollTop:!1}):E==="add"?await i({scrollTop:!0,goFirstPage:!0}):await i()}}}}function p(){return{rowHandle:{buttons:{remove:{click:async E=>{E.row=E[t.tableColumn.row],await l.doRemove(E)}},copy:{show:!1,click:async E=>{E.row=E[t.tableColumn.row],await l.openCopy({row:E.row,index:E.index})}},edit:{click:async E=>{E.row=E[t.tableColumn.row],await l.openEdit({row:E.row,index:E.index})}},view:{click:async E=>{E.row=E[t.tableColumn.row],await l.openView({row:E.row,index:E.index})}}}}}}function m(){return{search:{buttons:{search:{loading:x(()=>{var E,O;return(O=(E=s.value)==null?void 0:E.table)==null?void 0:O.loading})}},on_reset(){s.value.table.sort={},Kh(s.value.table.columns,O=>{O.sortOrder=!1});const E=r.getBaseTableRef();E!=null&&E.clearSort&&E.clearSort()},on_search(){r.doRefresh({goFirstPage:!0})},"onUpdate:form":E=>{s.value.search.form=E},"onUpdate:validatedForm":E=>{s.value.search.validatedForm=E},"onUpdate:collapse":E=>{s.value.search.collapse=E},container:{collapse:!0,"onUpdate:collapse":E=>{s.value.search.container.collapse=E}}}}}function h(){return{tabs:{},onTabChange(E){r.setSearchFormData({form:E,mergeForm:!0}),i()}}}function v(){const E=F(!1);return{toolbar:{buttons:{refresh:{type:"primary",icon:t.icons.refresh,title:a("fs.toolbar.refresh.title"),order:1,circle:!0,click:async()=>{await r.doRefresh({scrollTop:!1})}},search:{type:x(()=>s.value.search.show!==!1?"primary":"default"),icon:t.icons.search,title:a("fs.toolbar.search.title"),order:2,circle:!0,click:()=>{s.value.search.show=!s.value.search.show}},compact:{type:x(()=>s.value.toolbar.compact?"primary":"default"),icon:t.icons.compact,title:a("fs.toolbar.compact.title"),order:3,circle:!0,click:()=>{s.value.toolbar.compact=!s.value.toolbar.compact}},export:{show:!0,type:"primary",icon:t.icons.export,order:4,loading:E,title:a("fs.toolbar.export.title"),circle:!0,click:async()=>{E.value=!0;try{await pbe(r,s.value.toolbar.export)}finally{E.value=!1}}},columns:{type:"primary",icon:t.icons.columnsFilter,title:a("fs.toolbar.columns.title"),circle:!0,order:5}},"onUpdate:columns"(O){const I=s.value.table.columns;function $(q,W){const j={};return dt(W,N=>{const V=q[N.key];if(V){if(V.columnSetShow===!1){j[N.key]=V;return}delete V.order;const H=rs({...V},N);j[N.key]=H,V.children&&(H.children=$(V.children,N.children))}}),j}const z=$(I,O);s.value.table.columns=z,s.value.table.columnsMap=db({},z)}}}}function g(){return{table:{onSortChange(E){const{isServerSort:O,prop:I,asc:$,order:z}=E;Kh(s.value.table.columns,W=>{W.key===I?W.sortOrder=z:W.sortOrder=!1});const q=s.value.table.sort;s.value.table.sort=O?{prop:I,order:z,asc:$}:null,(O||q!=null)&&l.doRefresh()}}}}function b(){return{actionbar:{buttons:{add:{click(){l.openAdd({})}}}}}}function y(){const{compute:E}=kr();return{actionbar:{buttons:{addRow:{show:!1,text:a("fs.actionbar.add"),type:"primary",click:()=>{l.editable.addRow()}}}},rowHandle:{group:{editable:{remove:{text:"删除",...t.button.colors("danger"),click:async O=>{const{index:I,row:$}=O,z=$[s.value.table.editable.rowKey];await l.editable.doRemoveRow({editableId:z,row:$})}}},editRow:{edit:{text:"编辑",loading:E(O=>{const{index:I,row:$}=O,z=$[s.value.table.editable.rowKey],q=l.editable.getEditableRow(z);return!!(q!=null&&q.loading)}),click:async O=>{var I;const{index:$,row:z}=O,q=z[s.value.table.editable.rowKey];if(s.value.table.editable.exclusive){const W=l.editable.getActiveRows();dt(W,j=>{s.value.table.editable.exclusiveEffect==="save"?l.editable.doSaveRow({row:j.rowData}):l.editable.doCancelRow({row:j.rowData})})}(I=l.editable.getEditableRow(q))==null||I.active()},show:E(O=>{var I,$;const{index:z,row:q}=O,W=q[s.value.table.editable.rowKey];return!(($=(I=l.editable)==null?void 0:I.getEditableRow(W))!=null&&$.isEditing)})},save:{text:"保存",loading:!1,click:async O=>{const{index:I,row:$}=O;await l.editable.doSaveRow({row:$})},show:E(O=>{var I,$;const{index:z,row:q}=O,W=q[s.value.table.editable.rowKey];return!!(($=(I=l.editable)==null?void 0:I.getEditableRow(W))!=null&&$.isEditing)})},cancel:{text:"取消",click:async O=>{var I;const{index:$,row:z}=O;await((I=l.editable)==null?void 0:I.doCancelRow({row:z}))},show:E(O=>{var I,$;const{index:z,row:q}=O,W=q[s.value.table.editable.rowKey];return!!(($=(I=l.editable)==null?void 0:I.getEditableRow(W))!=null&&$.isEditing)})},remove:{text:"删除",...t.button.colors("danger"),click:async O=>{var I;const{index:$,row:z}=O,q=z[s.value.table.editable.rowKey];await((I=l.editable)==null?void 0:I.doRemoveRow({row:z,editableId:q}))}}}}}}}const{cloneDeep:w}=_n();function _(E){E.search.validatedForm=w(E.search.initialForm)}function S(E){var O;const I={value:null};let $=w(E);const z=Zd.commonOptions(e),q=Zd.defaultOptions({t:n,crudOptionsRef:I});o=rs({},q,z,$),I.value=o;const W=d(o.settings);if(W){const H=d(W.plugins);dt(H,(Y,P)=>{if(Y.enabled===!1)return;let D=Y.handle,B={};if(D==null){const ce=hbe(P);ce!=null&&(D=ce.handle,B=ce.opts)}if(D==null)return;const U=Y.before??B.before,X=D(Y.props,e,o);U!==!1?$=rs(X,$):$=rs($,X)})}const j=rs(q,c(),f(),p(),m(),h(),v(),g(),b(),y(),z,$),{buildColumns:N}=pb(),V=N(j);return _(V),(O=V==null?void 0:V.settings)!=null&&O.onUseCrud&&V.settings.onUseCrud(V),V}function k(E){s.value=S(E),Lt.info("fast-crud inited, crudBinding=",s.value)}function T(E){const O=rs({},o,E);return k(O),o=O,O}k(o);function R(E){rs(s.value,E)}return{appendCrudOptions:T,resetCrudOptions:k,appendCrudBinding:R,rebuildCrudBindings:S}}function O7(e){const{createCrudOptions:t,crudExposeRef:n}=e,a=e.crudRef||F(),o=e.crudBinding||F({});let r=e.crudExpose;r||(r=E7({crudRef:a,crudBinding:o}).crudExpose),n&&!n.value&&(n.value=r),e.context==null&&(e.context={});const l=e.context;e.onExpose&&e.onExpose({crudRef:a,crudBinding:o,crudExpose:r,context:l});const s=t({...e,crudExpose:r,expose:r,context:l});function i(u){const c={crudExpose:r,...u,context:l};rs(u.crudOptions,e.crudOptionsOverride);const f=mbe(c);return{...u,...f,crudRef:a,crudExpose:r,crudBinding:o,context:l}}return s instanceof Promise?s.then(u=>i(u)):i(s)}function r_e(e){return O7(e)}function vbe(e){return O7(e)}function gbe(){const e=F(),t=F(),n={},{crudExpose:a}=E7({crudBinding:t,crudRef:e});return{crudRef:e,crudBinding:t,context:n,crudExpose:a}}function zs(e,t,n="modelValue"){const a=zn.get();let o=e.dict;o&&o.prototype&&(o.clear(),o=Os(Kn(e.dict)),o.cloneable=!1,o.clear());function r(){return x(()=>{let _=[];if(e.options?_=e.options:o&&o.data!=null&&(o.data instanceof Array||ys.logger.warn("dict.data类型错误,期望为数组,实际:",o.data),_=o.data,e.transformDictData&&(_=e.transformDictData(Kn(o.data)))),a.type==="naive"||a.type==="element"){const S=[];for(const k of _)S.push({...k,value:b(k),label:w(k)});return S}return _})}function l(){return o}const s=Fe("get:scope",function(){});function i(){const _=e[n]||t.attrs[n];return{...s(),componentRef:u,value:_}}const{proxy:u}=bt(),c=async(_=!1)=>{if(!o)return;if(o.getNodesByValues){const k=i();if(k.value==null)return;let T=k.value;Array.isArray(k.value)||(T=[k.value]),await o.appendByValues(T);return}if(o.loading)return;const S=i();if(_){await o.reloadDict(S);return}await o.loadDict(S)};c();const f=async()=>{await c(!0)},p=()=>{o&&o.clear()},m=()=>{o!=null&&(!o.prototype&&!o.cloneable||pe(()=>e[n],()=>{f()}))};pe(()=>o==null?void 0:o.data,()=>{const _=i();t.attrs.onDictChange,t.emit("dict-change",{dict:o,..._})},{immediate:!0});const h=()=>{var _;return(_=l())==null?void 0:_.data},v=(_,S)=>{let k=S;return l()&&(k=l()[S]),_[k]},g=(_,S)=>{let k=S;l()&&(k=l()[S]),delete _[k]},b=_=>v(_,"value"),y=_=>v(_,"children"),w=_=>{if(e.labelFormatter)return e.labelFormatter(_);const S=v(_,"label");return S==null?"":String(S)};return{createComputedOptions:r,loadDict:c,reloadDict:f,clearDict:p,getDictData:h,getDict:l,watchValue:m,getValue:b,getLabel:w,getChildren:y,getColor:_=>v(_,"color"),removePropValue:g,curDict:o}}const Ru=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,R7=new Set,gg=typeof process=="object"&&process?process:{},A7=(e,t,n,a)=>{typeof gg.emitWarning=="function"?gg.emitWarning(e,t,n,a):console.error(`[${n}] ${t}: ${e}`)};let qh=globalThis.AbortController,G8=globalThis.AbortSignal;var X8;if(typeof qh>"u"){G8=class{constructor(){$t(this,"onabort"),$t(this,"_onabort",[]),$t(this,"reason"),$t(this,"aborted",!1)}addEventListener(n,a){this._onabort.push(a)}},qh=class{constructor(){$t(this,"signal",new G8),t()}abort(n){var a,o;if(!this.signal.aborted){this.signal.reason=n,this.signal.aborted=!0;for(const r of this.signal._onabort)r(n);(o=(a=this.signal).onabort)==null||o.call(a,n)}}};let e=((X8=gg.env)==null?void 0:X8.LRU_CACHE_IGNORE_AC_WARNING)!=="1";const t=()=>{e&&(e=!1,A7("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",t))}}const bbe=e=>!R7.has(e),ps=e=>e&&e===Math.floor(e)&&e>0&&isFinite(e),$7=e=>ps(e)?e<=Math.pow(2,8)?Uint8Array:e<=Math.pow(2,16)?Uint16Array:e<=Math.pow(2,32)?Uint32Array:e<=Number.MAX_SAFE_INTEGER?Kp:null:null;class Kp extends Array{constructor(t){super(t),this.fill(0)}}var dd;const P7=class jc{constructor(t,n){if($t(this,"heap"),$t(this,"length"),!fe(jc,dd))throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new n(t),this.length=0}static create(t){const n=$7(t);if(!n)return[];Bt(jc,dd,!0);const a=new jc(t,n);return Bt(jc,dd,!1),a}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}};dd=new WeakMap,Jt(P7,dd,!1);let ybe=P7;var Fr,Io,Dr,Nr,fd,Kc,Ca,Vo,ha,jn,Zt,so,Fo,Ga,Ma,Wr,Oa,Br,zr,Do,Hr,pi,io,Wp,bg,pu,us,Uh,Bo,yg,N7,hu,pd,Yh,dl,ls,pl,cs,qp,mv,I7,hd,Gh,Wc,Up,Nn,Ln,Yp,vv,uu,qc,Sl,ws,Xh,wg;const wbe=class V7{constructor(t){Jt(this,Wp),Jt(this,yg),Jt(this,dl),Jt(this,pl),Jt(this,qp),Jt(this,hd),Jt(this,Wc),Jt(this,Nn),Jt(this,Yp),Jt(this,uu),Jt(this,Sl),Jt(this,Xh),Jt(this,Fr,void 0),Jt(this,Io,void 0),Jt(this,Dr,void 0),Jt(this,Nr,void 0),Jt(this,fd,void 0),Jt(this,Kc,void 0),$t(this,"ttl"),$t(this,"ttlResolution"),$t(this,"ttlAutopurge"),$t(this,"updateAgeOnGet"),$t(this,"updateAgeOnHas"),$t(this,"allowStale"),$t(this,"noDisposeOnSet"),$t(this,"noUpdateTTL"),$t(this,"maxEntrySize"),$t(this,"sizeCalculation"),$t(this,"noDeleteOnFetchRejection"),$t(this,"noDeleteOnStaleGet"),$t(this,"allowStaleOnFetchAbort"),$t(this,"allowStaleOnFetchRejection"),$t(this,"ignoreFetchAbort"),Jt(this,Ca,void 0),Jt(this,Vo,void 0),Jt(this,ha,void 0),Jt(this,jn,void 0),Jt(this,Zt,void 0),Jt(this,so,void 0),Jt(this,Fo,void 0),Jt(this,Ga,void 0),Jt(this,Ma,void 0),Jt(this,Wr,void 0),Jt(this,Oa,void 0),Jt(this,Br,void 0),Jt(this,zr,void 0),Jt(this,Do,void 0),Jt(this,Hr,void 0),Jt(this,pi,void 0),Jt(this,io,void 0),Jt(this,pu,()=>{}),Jt(this,us,()=>{}),Jt(this,Uh,()=>{}),Jt(this,Bo,()=>!1),Jt(this,hu,R=>{}),Jt(this,pd,(R,E,O)=>{}),Jt(this,Yh,(R,E,O,I)=>{if(O||I)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0}),$t(this,I7,"LRUCache");const{max:n=0,ttl:a,ttlResolution:o=1,ttlAutopurge:r,updateAgeOnGet:l,updateAgeOnHas:s,allowStale:i,dispose:u,disposeAfter:c,noDisposeOnSet:f,noUpdateTTL:p,maxSize:m=0,maxEntrySize:h=0,sizeCalculation:v,fetchMethod:g,memoMethod:b,noDeleteOnFetchRejection:y,noDeleteOnStaleGet:w,allowStaleOnFetchRejection:_,allowStaleOnFetchAbort:S,ignoreFetchAbort:k}=t;if(n!==0&&!ps(n))throw new TypeError("max option must be a nonnegative integer");const T=n?$7(n):Array;if(!T)throw new Error("invalid max value: "+n);if(Bt(this,Fr,n),Bt(this,Io,m),this.maxEntrySize=h||fe(this,Io),this.sizeCalculation=v,this.sizeCalculation){if(!fe(this,Io)&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(b!==void 0&&typeof b!="function")throw new TypeError("memoMethod must be a function if defined");if(Bt(this,Kc,b),g!==void 0&&typeof g!="function")throw new TypeError("fetchMethod must be a function if specified");if(Bt(this,fd,g),Bt(this,pi,!!g),Bt(this,ha,new Map),Bt(this,jn,new Array(n).fill(void 0)),Bt(this,Zt,new Array(n).fill(void 0)),Bt(this,so,new T(n)),Bt(this,Fo,new T(n)),Bt(this,Ga,0),Bt(this,Ma,0),Bt(this,Wr,ybe.create(n)),Bt(this,Ca,0),Bt(this,Vo,0),typeof u=="function"&&Bt(this,Dr,u),typeof c=="function"?(Bt(this,Nr,c),Bt(this,Oa,[])):(Bt(this,Nr,void 0),Bt(this,Oa,void 0)),Bt(this,Hr,!!fe(this,Dr)),Bt(this,io,!!fe(this,Nr)),this.noDisposeOnSet=!!f,this.noUpdateTTL=!!p,this.noDeleteOnFetchRejection=!!y,this.allowStaleOnFetchRejection=!!_,this.allowStaleOnFetchAbort=!!S,this.ignoreFetchAbort=!!k,this.maxEntrySize!==0){if(fe(this,Io)!==0&&!ps(fe(this,Io)))throw new TypeError("maxSize must be a positive integer if specified");if(!ps(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");Mt(this,yg,N7).call(this)}if(this.allowStale=!!i,this.noDeleteOnStaleGet=!!w,this.updateAgeOnGet=!!l,this.updateAgeOnHas=!!s,this.ttlResolution=ps(o)||o===0?o:1,this.ttlAutopurge=!!r,this.ttl=a||0,this.ttl){if(!ps(this.ttl))throw new TypeError("ttl must be a positive integer if specified");Mt(this,Wp,bg).call(this)}if(fe(this,Fr)===0&&this.ttl===0&&fe(this,Io)===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!fe(this,Fr)&&!fe(this,Io)){const R="LRU_CACHE_UNBOUNDED";bbe(R)&&(R7.add(R),A7("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",R,V7))}}static unsafeExposeInternals(t){return{starts:fe(t,zr),ttls:fe(t,Do),sizes:fe(t,Br),keyMap:fe(t,ha),keyList:fe(t,jn),valList:fe(t,Zt),next:fe(t,so),prev:fe(t,Fo),get head(){return fe(t,Ga)},get tail(){return fe(t,Ma)},free:fe(t,Wr),isBackgroundFetch:n=>{var a;return Mt(a=t,Nn,Ln).call(a,n)},backgroundFetch:(n,a,o,r)=>{var l;return Mt(l=t,Wc,Up).call(l,n,a,o,r)},moveToTail:n=>{var a;return Mt(a=t,uu,qc).call(a,n)},indexes:n=>{var a;return Mt(a=t,dl,ls).call(a,n)},rindexes:n=>{var a;return Mt(a=t,pl,cs).call(a,n)},isStale:n=>{var a;return fe(a=t,Bo).call(a,n)}}}get max(){return fe(this,Fr)}get maxSize(){return fe(this,Io)}get calculatedSize(){return fe(this,Vo)}get size(){return fe(this,Ca)}get fetchMethod(){return fe(this,fd)}get memoMethod(){return fe(this,Kc)}get dispose(){return fe(this,Dr)}get disposeAfter(){return fe(this,Nr)}getRemainingTTL(t){return fe(this,ha).has(t)?1/0:0}*entries(){for(const t of Mt(this,dl,ls).call(this))fe(this,Zt)[t]!==void 0&&fe(this,jn)[t]!==void 0&&!Mt(this,Nn,Ln).call(this,fe(this,Zt)[t])&&(yield[fe(this,jn)[t],fe(this,Zt)[t]])}*rentries(){for(const t of Mt(this,pl,cs).call(this))fe(this,Zt)[t]!==void 0&&fe(this,jn)[t]!==void 0&&!Mt(this,Nn,Ln).call(this,fe(this,Zt)[t])&&(yield[fe(this,jn)[t],fe(this,Zt)[t]])}*keys(){for(const t of Mt(this,dl,ls).call(this)){const n=fe(this,jn)[t];n!==void 0&&!Mt(this,Nn,Ln).call(this,fe(this,Zt)[t])&&(yield n)}}*rkeys(){for(const t of Mt(this,pl,cs).call(this)){const n=fe(this,jn)[t];n!==void 0&&!Mt(this,Nn,Ln).call(this,fe(this,Zt)[t])&&(yield n)}}*values(){for(const t of Mt(this,dl,ls).call(this))fe(this,Zt)[t]!==void 0&&!Mt(this,Nn,Ln).call(this,fe(this,Zt)[t])&&(yield fe(this,Zt)[t])}*rvalues(){for(const t of Mt(this,pl,cs).call(this))fe(this,Zt)[t]!==void 0&&!Mt(this,Nn,Ln).call(this,fe(this,Zt)[t])&&(yield fe(this,Zt)[t])}[Symbol.iterator](){return this.entries()}find(t,n={}){for(const a of Mt(this,dl,ls).call(this)){const o=fe(this,Zt)[a],r=Mt(this,Nn,Ln).call(this,o)?o.__staleWhileFetching:o;if(r!==void 0&&t(r,fe(this,jn)[a],this))return this.get(fe(this,jn)[a],n)}}forEach(t,n=this){for(const a of Mt(this,dl,ls).call(this)){const o=fe(this,Zt)[a],r=Mt(this,Nn,Ln).call(this,o)?o.__staleWhileFetching:o;r!==void 0&&t.call(n,r,fe(this,jn)[a],this)}}rforEach(t,n=this){for(const a of Mt(this,pl,cs).call(this)){const o=fe(this,Zt)[a],r=Mt(this,Nn,Ln).call(this,o)?o.__staleWhileFetching:o;r!==void 0&&t.call(n,r,fe(this,jn)[a],this)}}purgeStale(){let t=!1;for(const n of Mt(this,pl,cs).call(this,{allowStale:!0}))fe(this,Bo).call(this,n)&&(Mt(this,Sl,ws).call(this,fe(this,jn)[n],"expire"),t=!0);return t}info(t){const n=fe(this,ha).get(t);if(n===void 0)return;const a=fe(this,Zt)[n],o=Mt(this,Nn,Ln).call(this,a)?a.__staleWhileFetching:a;if(o===void 0)return;const r={value:o};if(fe(this,Do)&&fe(this,zr)){const l=fe(this,Do)[n],s=fe(this,zr)[n];if(l&&s){const i=l-(Ru.now()-s);r.ttl=i,r.start=Date.now()}}return fe(this,Br)&&(r.size=fe(this,Br)[n]),r}dump(){const t=[];for(const n of Mt(this,dl,ls).call(this,{allowStale:!0})){const a=fe(this,jn)[n],o=fe(this,Zt)[n],r=Mt(this,Nn,Ln).call(this,o)?o.__staleWhileFetching:o;if(r===void 0||a===void 0)continue;const l={value:r};if(fe(this,Do)&&fe(this,zr)){l.ttl=fe(this,Do)[n];const s=Ru.now()-fe(this,zr)[n];l.start=Math.floor(Date.now()-s)}fe(this,Br)&&(l.size=fe(this,Br)[n]),t.unshift([a,l])}return t}load(t){this.clear();for(const[n,a]of t){if(a.start){const o=Date.now()-a.start;a.start=Ru.now()-o}this.set(n,a.value,a)}}set(t,n,a={}){var o,r,l,s,i;if(n===void 0)return this.delete(t),this;const{ttl:u=this.ttl,start:c,noDisposeOnSet:f=this.noDisposeOnSet,sizeCalculation:p=this.sizeCalculation,status:m}=a;let{noUpdateTTL:h=this.noUpdateTTL}=a;const v=fe(this,Yh).call(this,t,n,a.size||0,p);if(this.maxEntrySize&&v>this.maxEntrySize)return m&&(m.set="miss",m.maxEntrySizeExceeded=!0),Mt(this,Sl,ws).call(this,t,"set"),this;let g=fe(this,Ca)===0?void 0:fe(this,ha).get(t);if(g===void 0)g=fe(this,Ca)===0?fe(this,Ma):fe(this,Wr).length!==0?fe(this,Wr).pop():fe(this,Ca)===fe(this,Fr)?Mt(this,hd,Gh).call(this,!1):fe(this,Ca),fe(this,jn)[g]=t,fe(this,Zt)[g]=n,fe(this,ha).set(t,g),fe(this,so)[fe(this,Ma)]=g,fe(this,Fo)[g]=fe(this,Ma),Bt(this,Ma,g),hg(this,Ca)._++,fe(this,pd).call(this,g,v,m),m&&(m.set="add"),h=!1;else{Mt(this,uu,qc).call(this,g);const b=fe(this,Zt)[g];if(n!==b){if(fe(this,pi)&&Mt(this,Nn,Ln).call(this,b)){b.__abortController.abort(new Error("replaced"));const{__staleWhileFetching:y}=b;y!==void 0&&!f&&(fe(this,Hr)&&((o=fe(this,Dr))==null||o.call(this,y,t,"set")),fe(this,io)&&((r=fe(this,Oa))==null||r.push([y,t,"set"])))}else f||(fe(this,Hr)&&((l=fe(this,Dr))==null||l.call(this,b,t,"set")),fe(this,io)&&((s=fe(this,Oa))==null||s.push([b,t,"set"])));if(fe(this,hu).call(this,g),fe(this,pd).call(this,g,v,m),fe(this,Zt)[g]=n,m){m.set="replace";const y=b&&Mt(this,Nn,Ln).call(this,b)?b.__staleWhileFetching:b;y!==void 0&&(m.oldValue=y)}}else m&&(m.set="update")}if(u!==0&&!fe(this,Do)&&Mt(this,Wp,bg).call(this),fe(this,Do)&&(h||fe(this,Uh).call(this,g,u,c),m&&fe(this,us).call(this,m,g)),!f&&fe(this,io)&&fe(this,Oa)){const b=fe(this,Oa);let y;for(;y=b==null?void 0:b.shift();)(i=fe(this,Nr))==null||i.call(this,...y)}return this}pop(){var t;try{for(;fe(this,Ca);){const n=fe(this,Zt)[fe(this,Ga)];if(Mt(this,hd,Gh).call(this,!0),Mt(this,Nn,Ln).call(this,n)){if(n.__staleWhileFetching)return n.__staleWhileFetching}else if(n!==void 0)return n}}finally{if(fe(this,io)&&fe(this,Oa)){const n=fe(this,Oa);let a;for(;a=n==null?void 0:n.shift();)(t=fe(this,Nr))==null||t.call(this,...a)}}}has(t,n={}){const{updateAgeOnHas:a=this.updateAgeOnHas,status:o}=n,r=fe(this,ha).get(t);if(r!==void 0){const l=fe(this,Zt)[r];if(Mt(this,Nn,Ln).call(this,l)&&l.__staleWhileFetching===void 0)return!1;if(fe(this,Bo).call(this,r))o&&(o.has="stale",fe(this,us).call(this,o,r));else return a&&fe(this,pu).call(this,r),o&&(o.has="hit",fe(this,us).call(this,o,r)),!0}else o&&(o.has="miss");return!1}peek(t,n={}){const{allowStale:a=this.allowStale}=n,o=fe(this,ha).get(t);if(o===void 0||!a&&fe(this,Bo).call(this,o))return;const r=fe(this,Zt)[o];return Mt(this,Nn,Ln).call(this,r)?r.__staleWhileFetching:r}async fetch(t,n={}){const{allowStale:a=this.allowStale,updateAgeOnGet:o=this.updateAgeOnGet,noDeleteOnStaleGet:r=this.noDeleteOnStaleGet,ttl:l=this.ttl,noDisposeOnSet:s=this.noDisposeOnSet,size:i=0,sizeCalculation:u=this.sizeCalculation,noUpdateTTL:c=this.noUpdateTTL,noDeleteOnFetchRejection:f=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:p=this.allowStaleOnFetchRejection,ignoreFetchAbort:m=this.ignoreFetchAbort,allowStaleOnFetchAbort:h=this.allowStaleOnFetchAbort,context:v,forceRefresh:g=!1,status:b,signal:y}=n;if(!fe(this,pi))return b&&(b.fetch="get"),this.get(t,{allowStale:a,updateAgeOnGet:o,noDeleteOnStaleGet:r,status:b});const w={allowStale:a,updateAgeOnGet:o,noDeleteOnStaleGet:r,ttl:l,noDisposeOnSet:s,size:i,sizeCalculation:u,noUpdateTTL:c,noDeleteOnFetchRejection:f,allowStaleOnFetchRejection:p,allowStaleOnFetchAbort:h,ignoreFetchAbort:m,status:b,signal:y};let _=fe(this,ha).get(t);if(_===void 0){b&&(b.fetch="miss");const S=Mt(this,Wc,Up).call(this,t,_,w,v);return S.__returned=S}else{const S=fe(this,Zt)[_];if(Mt(this,Nn,Ln).call(this,S)){const E=a&&S.__staleWhileFetching!==void 0;return b&&(b.fetch="inflight",E&&(b.returnedStale=!0)),E?S.__staleWhileFetching:S.__returned=S}const k=fe(this,Bo).call(this,_);if(!g&&!k)return b&&(b.fetch="hit"),Mt(this,uu,qc).call(this,_),o&&fe(this,pu).call(this,_),b&&fe(this,us).call(this,b,_),S;const T=Mt(this,Wc,Up).call(this,t,_,w,v),R=T.__staleWhileFetching!==void 0&&a;return b&&(b.fetch=k?"stale":"refresh",R&&k&&(b.returnedStale=!0)),R?T.__staleWhileFetching:T.__returned=T}}async forceFetch(t,n={}){const a=await this.fetch(t,n);if(a===void 0)throw new Error("fetch() returned undefined");return a}memo(t,n={}){const a=fe(this,Kc);if(!a)throw new Error("no memoMethod provided to constructor");const{context:o,forceRefresh:r,...l}=n,s=this.get(t,l);if(!r&&s!==void 0)return s;const i=a(t,s,{options:l,context:o});return this.set(t,i,l),i}get(t,n={}){const{allowStale:a=this.allowStale,updateAgeOnGet:o=this.updateAgeOnGet,noDeleteOnStaleGet:r=this.noDeleteOnStaleGet,status:l}=n,s=fe(this,ha).get(t);if(s!==void 0){const i=fe(this,Zt)[s],u=Mt(this,Nn,Ln).call(this,i);return l&&fe(this,us).call(this,l,s),fe(this,Bo).call(this,s)?(l&&(l.get="stale"),u?(l&&a&&i.__staleWhileFetching!==void 0&&(l.returnedStale=!0),a?i.__staleWhileFetching:void 0):(r||Mt(this,Sl,ws).call(this,t,"expire"),l&&a&&(l.returnedStale=!0),a?i:void 0)):(l&&(l.get="hit"),u?i.__staleWhileFetching:(Mt(this,uu,qc).call(this,s),o&&fe(this,pu).call(this,s),i))}else l&&(l.get="miss")}delete(t){return Mt(this,Sl,ws).call(this,t,"delete")}clear(){return Mt(this,Xh,wg).call(this,"delete")}};I7=Symbol.toStringTag,Fr=new WeakMap,Io=new WeakMap,Dr=new WeakMap,Nr=new WeakMap,fd=new WeakMap,Kc=new WeakMap,Ca=new WeakMap,Vo=new WeakMap,ha=new WeakMap,jn=new WeakMap,Zt=new WeakMap,so=new WeakMap,Fo=new WeakMap,Ga=new WeakMap,Ma=new WeakMap,Wr=new WeakMap,Oa=new WeakMap,Br=new WeakMap,zr=new WeakMap,Do=new WeakMap,Hr=new WeakMap,pi=new WeakMap,io=new WeakMap,Wp=new WeakSet,bg=function(){const e=new Kp(fe(this,Fr)),t=new Kp(fe(this,Fr));Bt(this,Do,e),Bt(this,zr,t),Bt(this,Uh,(o,r,l=Ru.now())=>{if(t[o]=r!==0?l:0,e[o]=r,r!==0&&this.ttlAutopurge){const s=setTimeout(()=>{fe(this,Bo).call(this,o)&&Mt(this,Sl,ws).call(this,fe(this,jn)[o],"expire")},r+1);s.unref&&s.unref()}}),Bt(this,pu,o=>{t[o]=e[o]!==0?Ru.now():0}),Bt(this,us,(o,r)=>{if(e[r]){const l=e[r],s=t[r];if(!l||!s)return;o.ttl=l,o.start=s,o.now=n||a();const i=o.now-s;o.remainingTTL=l-i}});let n=0;const a=()=>{const o=Ru.now();if(this.ttlResolution>0){n=o;const r=setTimeout(()=>n=0,this.ttlResolution);r.unref&&r.unref()}return o};this.getRemainingTTL=o=>{const r=fe(this,ha).get(o);if(r===void 0)return 0;const l=e[r],s=t[r];if(!l||!s)return 1/0;const i=(n||a())-s;return l-i},Bt(this,Bo,o=>{const r=t[o],l=e[o];return!!l&&!!r&&(n||a())-r>l})},pu=new WeakMap,us=new WeakMap,Uh=new WeakMap,Bo=new WeakMap,yg=new WeakSet,N7=function(){const e=new Kp(fe(this,Fr));Bt(this,Vo,0),Bt(this,Br,e),Bt(this,hu,t=>{Bt(this,Vo,fe(this,Vo)-e[t]),e[t]=0}),Bt(this,Yh,(t,n,a,o)=>{if(Mt(this,Nn,Ln).call(this,n))return 0;if(!ps(a))if(o){if(typeof o!="function")throw new TypeError("sizeCalculation must be a function");if(a=o(n,t),!ps(a))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return a}),Bt(this,pd,(t,n,a)=>{if(e[t]=n,fe(this,Io)){const o=fe(this,Io)-e[t];for(;fe(this,Vo)>o;)Mt(this,hd,Gh).call(this,!0)}Bt(this,Vo,fe(this,Vo)+e[t]),a&&(a.entrySize=n,a.totalCalculatedSize=fe(this,Vo))})},hu=new WeakMap,pd=new WeakMap,Yh=new WeakMap,dl=new WeakSet,ls=function*({allowStale:e=this.allowStale}={}){if(fe(this,Ca))for(let t=fe(this,Ma);!(!Mt(this,qp,mv).call(this,t)||((e||!fe(this,Bo).call(this,t))&&(yield t),t===fe(this,Ga)));)t=fe(this,Fo)[t]},pl=new WeakSet,cs=function*({allowStale:e=this.allowStale}={}){if(fe(this,Ca))for(let t=fe(this,Ga);!(!Mt(this,qp,mv).call(this,t)||((e||!fe(this,Bo).call(this,t))&&(yield t),t===fe(this,Ma)));)t=fe(this,so)[t]},qp=new WeakSet,mv=function(e){return e!==void 0&&fe(this,ha).get(fe(this,jn)[e])===e},hd=new WeakSet,Gh=function(e){var t,n;const a=fe(this,Ga),o=fe(this,jn)[a],r=fe(this,Zt)[a];return fe(this,pi)&&Mt(this,Nn,Ln).call(this,r)?r.__abortController.abort(new Error("evicted")):(fe(this,Hr)||fe(this,io))&&(fe(this,Hr)&&((t=fe(this,Dr))==null||t.call(this,r,o,"evict")),fe(this,io)&&((n=fe(this,Oa))==null||n.push([r,o,"evict"]))),fe(this,hu).call(this,a),e&&(fe(this,jn)[a]=void 0,fe(this,Zt)[a]=void 0,fe(this,Wr).push(a)),fe(this,Ca)===1?(Bt(this,Ga,Bt(this,Ma,0)),fe(this,Wr).length=0):Bt(this,Ga,fe(this,so)[a]),fe(this,ha).delete(o),hg(this,Ca)._--,a},Wc=new WeakSet,Up=function(e,t,n,a){const o=t===void 0?void 0:fe(this,Zt)[t];if(Mt(this,Nn,Ln).call(this,o))return o;const r=new qh,{signal:l}=n;l==null||l.addEventListener("abort",()=>r.abort(l.reason),{signal:r.signal});const s={signal:r.signal,options:n,context:a},i=(h,v=!1)=>{const{aborted:g}=r.signal,b=n.ignoreFetchAbort&&h!==void 0;if(n.status&&(g&&!v?(n.status.fetchAborted=!0,n.status.fetchError=r.signal.reason,b&&(n.status.fetchAbortIgnored=!0)):n.status.fetchResolved=!0),g&&!b&&!v)return c(r.signal.reason);const y=p;return fe(this,Zt)[t]===p&&(h===void 0?y.__staleWhileFetching?fe(this,Zt)[t]=y.__staleWhileFetching:Mt(this,Sl,ws).call(this,e,"fetch"):(n.status&&(n.status.fetchUpdated=!0),this.set(e,h,s.options))),h},u=h=>(n.status&&(n.status.fetchRejected=!0,n.status.fetchError=h),c(h)),c=h=>{const{aborted:v}=r.signal,g=v&&n.allowStaleOnFetchAbort,b=g||n.allowStaleOnFetchRejection,y=b||n.noDeleteOnFetchRejection,w=p;if(fe(this,Zt)[t]===p&&(!y||w.__staleWhileFetching===void 0?Mt(this,Sl,ws).call(this,e,"fetch"):g||(fe(this,Zt)[t]=w.__staleWhileFetching)),b)return n.status&&w.__staleWhileFetching!==void 0&&(n.status.returnedStale=!0),w.__staleWhileFetching;if(w.__returned===w)throw h},f=(h,v)=>{var g;const b=(g=fe(this,fd))==null?void 0:g.call(this,e,o,s);b&&b instanceof Promise&&b.then(y=>h(y===void 0?void 0:y),v),r.signal.addEventListener("abort",()=>{(!n.ignoreFetchAbort||n.allowStaleOnFetchAbort)&&(h(void 0),n.allowStaleOnFetchAbort&&(h=y=>i(y,!0)))})};n.status&&(n.status.fetchDispatched=!0);const p=new Promise(f).then(i,u),m=Object.assign(p,{__abortController:r,__staleWhileFetching:o,__returned:void 0});return t===void 0?(this.set(e,m,{...s.options,status:void 0}),t=fe(this,ha).get(e)):fe(this,Zt)[t]=m,m},Nn=new WeakSet,Ln=function(e){if(!fe(this,pi))return!1;const t=e;return!!t&&t instanceof Promise&&t.hasOwnProperty("__staleWhileFetching")&&t.__abortController instanceof qh},Yp=new WeakSet,vv=function(e,t){fe(this,Fo)[t]=e,fe(this,so)[e]=t},uu=new WeakSet,qc=function(e){e!==fe(this,Ma)&&(e===fe(this,Ga)?Bt(this,Ga,fe(this,so)[e]):Mt(this,Yp,vv).call(this,fe(this,Fo)[e],fe(this,so)[e]),Mt(this,Yp,vv).call(this,fe(this,Ma),e),Bt(this,Ma,e))},Sl=new WeakSet,ws=function(e,t){var n,a,o,r;let l=!1;if(fe(this,Ca)!==0){const s=fe(this,ha).get(e);if(s!==void 0)if(l=!0,fe(this,Ca)===1)Mt(this,Xh,wg).call(this,t);else{fe(this,hu).call(this,s);const i=fe(this,Zt)[s];if(Mt(this,Nn,Ln).call(this,i)?i.__abortController.abort(new Error("deleted")):(fe(this,Hr)||fe(this,io))&&(fe(this,Hr)&&((n=fe(this,Dr))==null||n.call(this,i,e,t)),fe(this,io)&&((a=fe(this,Oa))==null||a.push([i,e,t]))),fe(this,ha).delete(e),fe(this,jn)[s]=void 0,fe(this,Zt)[s]=void 0,s===fe(this,Ma))Bt(this,Ma,fe(this,Fo)[s]);else if(s===fe(this,Ga))Bt(this,Ga,fe(this,so)[s]);else{const u=fe(this,Fo)[s];fe(this,so)[u]=fe(this,so)[s];const c=fe(this,so)[s];fe(this,Fo)[c]=fe(this,Fo)[s]}hg(this,Ca)._--,fe(this,Wr).push(s)}}if(fe(this,io)&&(o=fe(this,Oa))!=null&&o.length){const s=fe(this,Oa);let i;for(;i=s==null?void 0:s.shift();)(r=fe(this,Nr))==null||r.call(this,...i)}return l},Xh=new WeakSet,wg=function(e){var t,n,a;for(const o of Mt(this,pl,cs).call(this,{allowStale:!0})){const r=fe(this,Zt)[o];if(Mt(this,Nn,Ln).call(this,r))r.__abortController.abort(new Error("deleted"));else{const l=fe(this,jn)[o];fe(this,Hr)&&((t=fe(this,Dr))==null||t.call(this,r,l,e)),fe(this,io)&&((n=fe(this,Oa))==null||n.push([r,l,e]))}}if(fe(this,ha).clear(),fe(this,Zt).fill(void 0),fe(this,jn).fill(void 0),fe(this,Do)&&fe(this,zr)&&(fe(this,Do).fill(0),fe(this,zr).fill(0)),fe(this,Br)&&fe(this,Br).fill(0),Bt(this,Ga,0),Bt(this,Ma,0),fe(this,Wr).length=0,Bt(this,Vo,0),Bt(this,Ca,0),fe(this,io)&&fe(this,Oa)){const o=fe(this,Oa);let r;for(;r=o==null?void 0:o.shift();)(a=fe(this,Nr))==null||a.call(this,...r)}};let Cbe=wbe;const fp=new Cbe({max:500,maxSize:5e3,ttl:1e3*60*30,sizeCalculation:(e,t)=>1}),{UnMergeable:_be}=_n();function Sbe(e){L7=e}let L7=async e=>(Lt.warn("请配置 app.use(FsCrud,{dictRequest:(context)=>{ 你的字典请求方法 }})"),[]);class F7 extends _be{constructor(t){super(),$t(this,"cache",!1),$t(this,"prototype",!1),$t(this,"immediate",!0),$t(this,"url"),$t(this,"getData"),$t(this,"value","value"),$t(this,"label","label"),$t(this,"labelBuilder"),$t(this,"children","children"),$t(this,"color","color"),$t(this,"isTree",!1),$t(this,"_data",null),$t(this,"originalData"),$t(this,"dataMap",{}),$t(this,"loading",!1),$t(this,"custom",{}),$t(this,"getNodesByValues"),$t(this,"onReady"),$t(this,"notifies",[]),$t(this,"_unfetchValues",{}),Object.defineProperty(this,"loading",{value:!1,enumerable:!1}),Object.defineProperty(this,"notifies",{value:!1,enumerable:!1}),Object.defineProperty(this,"originalData",{value:null,enumerable:!1}),this.loading=!1,Fs(this,t),t.data!=null&&(this.originalData=t.data,this.setData(t.data)),this.toMap()}get data(){return this._data}set data(t){this._data=t,this.toMap()}isDynamic(){return this.url instanceof Function||this.getData instanceof Function||this.prototype}setData(t){this.data=t}async _loadDict(t){if(this.data&&!t.reload)return this.data;if(this.loading)return this._registerNotify();let n=null;if(this.getNodesByValues){if(t.value){let a=null;this.cache&&this.url&&(a=this.url+t.value);let o=null;if(a&&(o=fp.get(a)),o)n=o;else{const r=Array.isArray(t.value)?t.value:[t.value];if(n=await this.getNodesByValues(r,t),n!=null&&!(n instanceof Array)){Lt.error("getNodesByValues需要返回数组,当前返回值:",n);return}a&&fp.set(a,n)}}}else if(this.originalData)n=this.originalData;else{this.loading=!0;try{n=await this.getRemoteDictData(t)}finally{this.loading=!1}}this.data=n,this.onReady&&this.onReady({dict:this,...t}),this._triggerNotify()}_triggerNotify(){this.notifies&&this.notifies.length>0&&(dt(this.notifies,t=>{t(this.data)}),this.notifies.length=0)}_registerNotify(){let t=null;const n=new Promise(a=>{t=o=>{a(o)}});return this.notifies||(this.notifies=[]),this.notifies.push(t),n}async loadDict(t){return await this._loadDict({...t})}async reloadDict(t){return await this.loadDict({...t,reload:!0})}async appendByValues(t){if(this.getNodesByValues==null){Lt.warn("请配置getNodesByValues");return}for(const a of t)this.dataMap[a]||this._unfetchValues[a]||(this._unfetchValues[a]={loading:!1,value:a});await Oe(),await Oe(),await Oe();const n=[];if(dt(this._unfetchValues,a=>{a.loading||(a.loading=!0,n.push(a.value))}),n.length>0){const a=await this.getNodesByValues(n);this.setData([...this.data||[],...a]);for(const o of n)delete this._unfetchValues[o];return Object.keys(this._unfetchValues).length===0&&this._triggerNotify(),this.data}else return this._registerNotify()}clear(){this.originalData=null,this.setData(null)}async getRemoteDictData(t){let n,a,o;if(this.url&&(o=this.url,o instanceof Function&&(o=o({...t,dict:this})),a=o),this.getData!=null)n=async()=>{const r=await this.getData({url:o,dict:this,...t});return Array.isArray(r)?r:[]};else if(o)n=async()=>{const r=await L7({url:o,dict:this});return Array.isArray(r)?r:[]};else return[];if(this.cache&&a){let r=fp.get(a);if(r==null)r={loaded:!1,loading:!0,data:void 0,callback:[]},fp.set(a,r);else{if(r.loaded)return r.data;if(r.loading)return new Promise(l=>{const s=i=>{l(i)};r.callback.push(s)})}try{r.loaded=!1,r.loading=!0;let l=await n();l=l||[],l instanceof Array||Lt.warn("dict data 格式有误,期望格式为数组,实际格式为:",l),r.data=l,r.loaded=!0,r.loading=!1;for(const s of r.callback)s(l);return r.callback=[],l}catch(l){r.loading=!1,r.loaded=!1,Lt.error("load dict error:",l)}}return await n()}toMap(){if(this._data==null){this.dataMap={};return}const t={};this.data&&this.buildMap(t,this.data||[]),this.dataMap=t}buildMap(t,n){dt(n,a=>{t[this.getValue(a)]=a,this.isTree&&this.getChildren(a)&&this.buildMap(t,this.getChildren(a))})}getValue(t){return t[this.value]}getLabel(t){return this.labelBuilder?this.labelBuilder(t):t[this.label]}getChildren(t){return t[this.children]}getColor(t){return t[this.color]}getDictData(){return this.data}getDictMap(){return this.dataMap}getNodeByValue(t){return this.dataMap[t]}getNodesFromDataMap(t){if(t==null)return[];Un(t)||(t=[t]);const n=[];return dt(t,a=>{const o=this.dataMap[a];o?n.push(o):n.push({[this.value]:a})}),n}}function xbe(e){const t=Os(new F7(e));return!t.prototype&&t.immediate&&t.loadDict(),t}function kbe(){return{dict:xbe,setDictRequest:Sbe,Dict:F7}}async function Ebe(e){await Oe();const t=e.getModal();if(t==null)return;const n=t.querySelector(".ant-modal-header");if(n==null)return;const a=t,o=t.style;n.style.cursor="move",n.onmousedown=r=>{const l=r.clientX,s=r.clientY;a.style.transform="translate(0px, 0px)";let i,u;o.left.includes("%")?(i=+document.body.clientWidth*(+o.left.replace(/%/g,"")/100),u=+document.body.clientHeight*(+o.top.replace(/%/g,"")/100)):(i=+o.left.replace(/px/g,""),u=+o.top.replace(/px/g,""),u=u===0?100:u),document.onmousemove=function(c){const f=c.clientX-l,p=c.clientY-s;a.style.left=`${f+i}px`,a.style.top=`${p+u}px`},document.onmouseup=function(c){document.onmousemove=null,document.onmouseup=null}}}async function Tbe(e){await Oe();const t=e.getModal();if(t==null)return;const n=t.querySelector(".n-card-header");if(n==null)return;const a=t,o=t.style;n.style.cursor="move",n.onmousedown=r=>{const l=r.clientX,s=r.clientY;a.style.transform="translate(0px, 0px)";let i,u;o.left.includes("%")?(i=+document.body.clientWidth*(+o.left.replace(/%/g,"")/100),u=+document.body.clientHeight*(+o.top.replace(/%/g,"")/100)):(i=+o.left.replace(/px/g,""),u=+o.top.replace(/px/g,"")),document.onmousemove=async function(c){if(c.clientX==0&&c.clientY==0)return;const f=c.clientX-l,p=c.clientY-s;a.style.left=`${f+i}px`,a.style.top=`${p+u}px`},document.onmouseup=function(c){document.onmousemove=null,document.onmouseup=null}}}async function Mbe(e){const{ui:t}=sn();t.type==="antdv"?await Ebe(e):t.type==="element"||await Tbe(e)}function Obe(){return{dragModal:Mbe}}const Rbe={logger:{off:{tableColumns:!1}}},Abe=K({name:"FsContainer",props:{fixedHeight:{type:Boolean,default:!0},bodyStyle:{type:Object,default:()=>({})},innerStyle:{type:Object,default:()=>({})}},setup(e,t){const{merge:n}=_n(),a=x(()=>e.fixedHeight===!1?n({position:"relative"},e.innerStyle):e.innerStyle),o=x(()=>e.fixedHeight===!1?n({flex:"unset"},e.bodyStyle):e.bodyStyle);return{computedInnerStyle:a,computedBodyStyle:o}}}),$be={class:"fs-container"},Pbe={class:"box"},Nbe={class:"header"},Ibe={class:"footer"};function Vbe(e,t,n,a,o,r){return C(),A("div",$be,[M("div",Pbe,[M("div",{class:"inner",style:Ue(e.computedInnerStyle)},[M("div",Nbe,[re(e.$slots,"header")]),M("div",{class:"body",style:Ue(e.computedBodyStyle)},[re(e.$slots,"default")],4),M("div",Ibe,[re(e.$slots,"footer")])],4)]),re(e.$slots,"box")])}const Lbe=Rn(Abe,[["render",Vbe]]),Fbe=K({name:"FsLayoutDefault"}),Dbe={class:"fs-crud-header"},Bbe={class:"fs-header-top"},zbe={class:"fs-header-middle"},Hbe={class:"fs-header-bottom"},jbe={class:"fs-crud-footer"};function Kbe(e,t,n,a,o,r){const l=He("fs-container");return C(),ae(l,{class:"fs-layout-default"},{header:te(()=>[M("div",Dbe,[M("div",Bbe,[re(e.$slots,"header-top")]),re(e.$slots,"search"),M("div",zbe,[re(e.$slots,"header-middle")]),re(e.$slots,"actionbar"),re(e.$slots,"toolbar"),M("div",Hbe,[re(e.$slots,"header-bottom")]),re(e.$slots,"tabs")])]),footer:te(()=>[M("div",jbe,[re(e.$slots,"footer-top"),re(e.$slots,"pagination"),re(e.$slots,"footer-bottom")])]),default:te(()=>[re(e.$slots,"default"),re(e.$slots,"table"),re(e.$slots,"form")]),_:3})}const Wbe=Rn(Fbe,[["render",Kbe]]),qbe=K({name:"FsLayoutCard",setup(){const e=Fe("get:crudBinding"),t=x(()=>{var o,r;return e==null?!0:(r=(o=e())==null?void 0:o.search)==null?void 0:r.show}),{ui:n}=sn(),a=F(n.card.name);return{searchShow:t,cardComponentName:a}}}),Ube={class:"fs-header-top"},Ybe={class:"fs-header-bottom"},Gbe={class:"top-bar"},Xbe={class:"top-bar"},Jbe={class:"fs-crud-footer"};function Zbe(e,t,n,a,o,r){const l=He("fs-container");return C(),ae(l,{class:"fs-layout-card"},{header:te(()=>[M("div",Ube,[re(e.$slots,"header-top")]),e.searchShow?(C(),ae(Me(e.cardComponentName),{key:0},{default:te(()=>[re(e.$slots,"search")]),_:3})):le("",!0),M("div",Ybe,[re(e.$slots,"header-bottom")])]),default:te(()=>[J(l,null,{header:te(()=>[re(e.$slots,"tabs")]),default:te(()=>[(C(),ae(Me(e.cardComponentName),{class:"fs-layout-card-body"},{title:te(()=>[M("div",Gbe,[re(e.$slots,"actionbar"),re(e.$slots,"toolbar")])]),header:te(()=>[M("div",Xbe,[re(e.$slots,"actionbar"),re(e.$slots,"toolbar")])]),default:te(()=>[J(l,null,{footer:te(()=>[M("div",Jbe,[re(e.$slots,"footer-top"),re(e.$slots,"pagination"),re(e.$slots,"footer-bottom")])]),default:te(()=>[re(e.$slots,"default"),re(e.$slots,"table"),re(e.$slots,"form")]),_:3})]),_:3}))]),_:3})]),_:3})}const Qbe=Rn(qbe,[["render",Zbe]]);function J8(e){return typeof e=="function"||Object.prototype.toString.call(e)==="[object Object]"&&!rn(e)}const eye=K({name:"FsButton",inheritAttrs:!1,props:{text:{type:String,default:"",required:!1},icon:{type:[String,Object,Function],default:"",required:!1},iconRight:{type:[String,Object,Function],default:"",required:!1},circle:{type:Boolean,default:!1,required:!1},tooltip:{type:Object,default:void 0},badge:{type:Object,default:null,required:!1},buttonProps:{type:Object,default:void 0},className:{},loading:{type:Boolean,default:void 0,required:!1}},emits:["click"],setup(e,t){const{ui:n}=sn(),{merge:a}=_n(),o=F(!1),r=x(()=>e.loading??o.value??!1),l=(m,h="fs-button-icon")=>{if(m!=null)return typeof m=="string"?J(He("fs-icon"),{icon:m,class:h},null):typeof m=="function"?m():J(He("fs-icon"),Re(m,{class:h}),null)};let s=()=>{const m=e.icon,h=e.iconRight,v=n.type!=="element",g=!v;let b;const y={...t.slots};(m&&!v&&!g||t.slots.default||e.text||h)&&(y.default=()=>{const T=[];return m&&!v&&!g&&T.push(l(m)),t.slots.default&&T.push(t.slots.default()),e.text&&T.push(e.text),h&&T.push(l(h,"fs-button-icon-right")),T}),m&&(v&&!y.icon?y.icon=()=>l(m):g&&!y.icon&&(b=l(m)));const w=e.circle?n.button.circle:{},_=Me(n.button.name),S=T=>{T.loadingRef=o,t.emit("click",T)},k=a({...w,class:{"fs-button":!0,"is-thin":!e.text&&!t.slots.default},loading:r.value,onClick:S},{class:e.className,...t.attrs,...e.buttonProps});return b&&(k.icon=b),Je(_,k,y)};const i=s,u=Me(n.badge.name);if(e.badge&&(s=()=>{let m;return J(u,e.badge,J8(m=i())?m:{default:()=>[m]})}),!e.tooltip)return s;const c=Me(n.tooltip.name),f=x(()=>Uo(e.tooltip,"slots")),p=n.tooltip.trigger;return()=>{var m;const h={...(m=e.tooltip)==null?void 0:m.slots,[p]:s};return J(c,f.value,J8(h)?h:{default:()=>[h]})}}}),tye=K({name:"FsIcon",inheritAttrs:!1,props:{icon:{type:String,default:void 0,require:!0},baseUrl:{type:String,default:""}},setup(e,t){const{ui:n}=sn(),a=x(()=>{var o;if(e.icon&&((o=e.icon)==null?void 0:o.indexOf(":"))>=0){if(e.icon.startsWith("http:")||e.icon.startsWith("https:")){let c=null;return e.icon.startsWith("http://")||e.icon.startsWith("https://")?c=e.icon:c=e.baseUrl+e.icon.replace("http:","").replace("https:",""),()=>J("img",Re({class:"fs-icon-image",src:c},t.attrs),null)}if(e.icon.startsWith("svg:")){const c=Me("FsIconSvg");return()=>{const f=e.icon.replace("svg:","");return J(c,Re({class:"fs-icon",icon:f},t.attrs),null)}}const l=Me("FsIconify"),s=e.icon.split(":");let i={},u=e.icon;return s.length>=3&&(i={color:s[2]},u=s[0]+":"+s[1]),()=>J(l,Re({class:"fs-icon",icon:u,style:i},t.attrs),null)}const r=Me(e.icon);return typeof r=="string"?()=>J("span",{title:"error icon name"},[r]):n.icon.isComponent?()=>J(r,Re({class:"fs-icon"},t.attrs),null):()=>J(He("el-icon"),Re({class:"fs-icon"},t.attrs),{default:()=>[J(r,null,null)]})});return()=>a.value()}}),nye=K({name:"FsIconify",components:{Icon:pge},props:{icon:{type:String},spin:{type:Boolean,default:!1}},setup(e,t){return{iconifyRef:F(null)}}});function aye(e,t,n,a,o,r){const l=He("Icon");return C(),A("span",{class:L(["fs-iconify",{"fs-iconify-spin":e.spin}])},[J(l,{ref:"iconifyRef",icon:e.icon,inline:!0},null,8,["icon"])],2)}const oye=Rn(nye,[["render",aye]]),rye=K({name:"FsSvgIcon",props:{icon:{type:String,required:!0},size:{type:[Number,String],default:16},spin:{type:Boolean,default:!1}},setup(e){const t=x(()=>`#${e.icon}`),n=x(()=>{const{size:a}=e;let o=`${a}`;return o=`${o.replace("px","")}px`,{width:o,height:o}});return{symbolId:t,getStyle:n}}}),lye={class:"fs-icon-svg-content","aria-hidden":"true"},sye=["xlink:href"];function iye(e,t,n,a,o,r){return C(),A("span",{class:L(["fs-icon-svg",e.spin&&"fs-icon-spin"])},[(C(),A("svg",lye,[M("use",{"xlink:href":e.symbolId},null,8,sye)]))],2)}const uye=Rn(rye,[["render",iye]]),cye=K({name:"FsLabel",props:{label:{type:String,default:""},labelAttrs:{type:Object,default:()=>({})},contentAttrs:{type:Object,default:()=>({})}}}),dye={class:"fs-label"};function fye(e,t,n,a,o,r){return C(),A("div",dye,[M("div",Re({class:"label"},e.labelAttrs),[Ct(ye(e.label)+" ",1),re(e.$slots,"label")],16),M("div",Re({class:"content"},e.contentAttrs),[re(e.$slots,"default")],16)])}const pye=Rn(cye,[["render",fye]]),hye={key:0,class:"fs-loading"},mye={key:0},vye=K({name:"FsLoading"}),gye=K({...vye,props:{loading:{type:Boolean},icon:{},text:{}},setup(e){const{ui:t}=sn();return(n,a)=>{const o=He("fs-icon");return n.loading?(C(),A("div",hye,[J(o,{class:"fs-icon-spin",icon:n.icon??d(t).icons.refresh},null,8,["icon"]),n.text?(C(),A("span",mye,ye(n.text),1)):le("",!0)])):le("",!0)}}}),bye=K({name:"FsBox"}),yye={class:"fs-box"};function wye(e,t,n,a,o,r){return C(),A("div",yye,[re(e.$slots,"default")])}const Cye=Rn(bye,[["render",wye]]);function _ye(e){return typeof e=="function"||Object.prototype.toString.call(e)==="[object Object]"&&!rn(e)}function Z8(e,t){if(e[t]instanceof Array){const n=e[t];e[t]=a=>{for(const o of n)o(a)}}}const Sye=["div","span","a","p","pre","li","ol","ul"],xye=K({name:"FsComponentRender",inheritAttrs:!1,props:{modelValue:{},name:{},slots:{type:Object},children:{type:Object},on:{type:Object},events:{type:Object},scope:{type:Object},vModel:{type:[String,Object]},props:{},render:{},undefineToNull:{type:Boolean,default:!0}},emits:["update:dict","update:modelValue","mounted"],setup(e,t){const{ui:n}=sn(),{merge:a}=_n();_t("get:scope",()=>e.scope),gt(()=>{t.emit("mounted",e.scope)});const o=F(),r=x(()=>{const m={name:"modelValue",trim:!1,number:!1,transform:void 0};e.vModel&&(typeof e.vModel=="string"?m.name=e.vModel:a(m,e.vModel));const h=e.modelValue??(n.type==="antdv"?void 0:null),v="onUpdate:"+m.name,g={ref:o,[m.name]:h,[v]:y=>{if(y&&(m.trim&&(y=y.trim()),m.number)){const w=Number(y);isNaN(w)||(y=w)}m.transform&&(y=m.transform(y)),y===void 0&&e.undefineToNull&&(y=null),t.emit("update:modelValue",y)},...e.props},b={...e.events,...e.on};return dt(b,(y,w)=>{const _=y;w.startsWith("on")||(w=_N("on_"+w)),g[w]=S=>_({...e.scope,$event:S})}),g}),l=()=>{const m={},h=(v,g)=>{v instanceof Function?m[g]=b=>v({...e.scope,scope:b}):m[g]=()=>v};return dt(e.children,h),dt(e.slots,h),m},s=x(()=>{e.name;let m=d(e.name)||n.input.name;typeof m=="function"&&(m=m());const h={isAsyncComponent:!1,component:m};let v=h.component;return Sye.includes(v)||(typeof v=="string"&&(v=He(v)),(v==null?void 0:v.name)==="AsyncComponentWrapper"&&(h.isAsyncComponent=!0)),h.component=v,h}),i=l;function u(){return s.value.isAsyncComponent?f():c()}function c(){return o.value}async function f(){return c()??new Promise((h,v)=>{p(h,v,0)})}function p(m,h,v){setTimeout(()=>{const g=c();if(g!=null){m(g);return}if(v++,v>20){h(new Error("异步组件加载超时"));return}p(m,h,v)},200)}return t.expose({props:e,getTargetRefSync:c,getTargetRef:u,getTargetRefAsync:f}),()=>{let m;const h=Re(r.value,t.attrs);return Z8(h,"onChange"),Z8(h,"onBlur"),e.render?e.render({...e.scope,attrs:h}):J(s.value.component,h,_ye(m=i())?m:{default:()=>[m]})}}}),kye=K({name:"FsSlotRender",inheritAttrs:!1,props:{slots:{type:Function},scope:{type:Object}},setup(e){return()=>e.slots(e.scope)}}),D7=K({name:"FsRender",functional:!0,props:{renderFunc:{type:Function},scope:{type:Object}},setup(){},render(){return this.renderFunc(this.scope)}}),Eye=K({name:"FsForm",props:{initialForm:{type:Object,default(){return{}}},columns:{type:Object,default:void 0},group:{type:Object,default:void 0},doReset:{type:Function,default:void 0},beforeValidate:{type:Function,default:void 0},beforeSubmit:{type:Function,default:void 0},doSubmit:{type:Function,default:void 0},afterSubmit:{type:Function,default:void 0},slots:{type:Object,default:()=>({})},display:{type:String,default:"flex"},index:{type:Number,default:void 0},mode:{type:String,default:void 0},row:{type:Object,default:void 0},col:{type:Object,default:void 0},formItem:{type:Object,default:void 0},helper:{type:Object},watch:{type:Function,default:null}},emits:["reset","submit","success","validationError","value-change","init"],setup(e,t){var n,a;const{merge:o}=_n(),{ui:r}=sn(),{AsyncComputeValue:l,doComputed:s}=kr(),i=F(),u=Nt({}),{proxy:c}=bt();dt(e.columns,B=>{B.value!=null&&(B.value instanceof l||B.value instanceof am)&&Lt.warn("form.value配置不支持Compute/AsyncCompute类型的动态计算")});function f(){const B={};return dt(e.columns,(U,X)=>{const ce=d(U.value);ce!==void 0&&Zn(B,X,ce)}),o(B,Kn(e.initialForm)),B}const p=f();y(p);const m=x(()=>({row:p,form:u,index:e.index,mode:e.mode||"add",attrs:t.attrs,getComponentRef:R}));function h(){return m.value}const v=x(()=>e.columns);function g(B){B!=null&&dt(e.columns,(U,X)=>{let ce=on(B,X);if(U.valueBuilder){const ne=U.valueBuilder({value:ce,key:X,row:p,form:B,index:e.index,mode:e.mode});ne!=null&&!(ne instanceof Promise)&&Zn(B,X,ne)}})}function b(){return u}function y(B,U={}){if(g(B),U.mergeForm===!1)for(const ce in u)delete u[ce];o(u,B);const{valueChange:X}=U;X&&dt(e.columns,(ce,ne)=>{const ue=u[ne];S(ne,ue)})}function w(...B){return o({},e.col,...B)}function _(B){return{key:B.key,...m.value}}function S(B,U){const X={key:B,value:U,formRef:c,...m.value,immediate:!1};t.emit("value-change",X);let ce=e.columns[B].valueChange;ce&&(ce instanceof Function?ce(X):ce.handle&&ce.handle(X))}const k=F({});function T(B){return k.value[B].getFormItemRef()}function R(B,U=!1){var X;return(X=T(B))==null?void 0:X.getComponentRef(U)}const E=F([]);dt((n=e.group)==null?void 0:n.groups,(B,U)=>{B.collapsed!==!0&&E.value.push(U)}),((a=e.group)==null?void 0:a.groupType)==="tabs"&&(E.value=E.value.length>0?E.value[0]:null);const O=s(()=>e.group,h,null,(B={})=>{const U={};dt(B==null?void 0:B.groups,(ne,ue)=>{dt(ne.columns,ie=>{if(v.value[ie]==null){ys.logger.warn("无效的分组字段:"+ie);return}U[ie]=ue})});const X=B.groupType;let ce={parent:r.collapse.name,child:r.collapseItem.name};return X==="tabs"&&(ce.parent=r.tabs.name,ce.child=r.tabPane.name),o({wrapper:ce,groupedKeys:U},B)}),I=x(()=>{const B=[];return dt(v.value,(U,X)=>{var ce,ne;const ue=Kn(e.formItem||{});U=o(ue,U),U.key=X,U.order==null&&(U.order=Bs.orderDefault),(((ce=O.value)==null?void 0:ce.groupedKeys)==null||((ne=O.value)==null?void 0:ne.groupedKeys[X])==null)&&B.push(U),U.col=w(U.col)}),B.sort((U,X)=>U.order-X.order),B});function $(){return i.value}async function z(){const B=f(),U=k1(u);for(const X of U){const ce=on(B,X[0]);ce==null?bh(u,X[0]):Zn(u,X[0],ce)}e.doReset&&await e.doReset(m.value),t.emit("reset")}const q=F(),W=F({});function j(B){var U,X;if((U=O.value)!=null&&U.groupedKeys)for(let ce in B){const ne=(X=O.value)==null?void 0:X.groupedKeys[ce];ne!=null&&(B["group."+ne]=!0)}}async function N(){const B={...m.value,form:u};if(B.mode!=="view"){if(e.beforeValidate&&await e.beforeValidate(B)===!1)return!1;try{W.value={},await r.form.validateWrap(i.value),q.value=!0}catch(U){q.value=!1;const X=r.form.transformValidateErrors(U);throw j(X),W.value=X,t.emit("validationError",m.value),U}}}async function V(){await N();const B=Kn(Qt(u)),U={...m.value,form:B};if(Lt.debug("form submit",JSON.stringify(u)),dt(e.columns,(X,ce)=>{let ne=on(B,ce);if(X.valueResolve){const ue=X.valueResolve({value:ne,key:ce,...U});ue!=null&&!(ue instanceof Promise)&&Zn(B,ce,ue)}}),e.beforeSubmit&&await e.beforeSubmit(U)===!1)return!1;if(dt(e.columns,(X,ce)=>{X.submit===!1?bh(B,ce):X.submit===!0&&Zn(B,ce,B[ce])}),e.doSubmit){const X=await e.doSubmit(U);if(U.res=X,X===!1)return!1}return t.emit("submit",U),e.afterSubmit&&await e.afterSubmit(U)===!1?!1:(t.emit("success",U),U)}gt(()=>{dt(v.value,(B,U)=>{if(B.valueChange==null)return;let X=B.valueChange;if(X&&X.immediate===!0&&X.handle){const ce={key:U,value:u[U],formRef:c,...m.value,immediate:!0};X.handle&&X.handle(ce)}})});function H(B){return!!(B&&d(B.show)!==!1)}function Y(B){if(!B.columns||d(B.show)===!1)return!1;for(let U of B.columns)if(v.value[U]!=null&&H(v.value[U]))return!0;return!1}e.watch&&pe(()=>u,(B,U)=>{e.watch&&e.watch(m.value)},{deep:!0,immediate:!0});function P(){const B=JSON.stringify(p),U=JSON.stringify(u);return B!==U}const D=x(()=>o({},e.slots,t.slots));return t.emit("init",m.value),{get:(B,U)=>on(B,U),set:(B,U,X)=>{Zn(B,U,X),S(U,X)},ui:r,validRef:q,errorsRef:W,formRef:i,computedColumns:v,computedDefaultColumns:I,submit:V,reset:z,getFormRef:$,scope:m,buildItemScope:_,groupActiveKey:E,form:u,formItemRefs:k,getFormData:b,setFormData:y,getComponentRef:R,mergeCol:w,validate:N,computedGroup:O,getContextFn:h,formItemShow:H,groupItemShow:Y,isDirty:P,mergedSlots:D}}});function Tye(e,t,n,a,o,r){const l=He("fs-form-item-col"),s=He("fs-render");return C(),ae(Me(e.ui.form.name),{ref:"formRef",class:L(["fs-form",{"fs-form-grid":e.display==="grid","fs-form-flex":e.display==="flex","fs-form-invalid":e.validRef===!1}]),onsubmit:"event.preventDefault();",model:e.form},{default:te(()=>[(C(),ae(Me(e.ui.row.name),Re({class:"fs-row"},e.row),{default:te(()=>[(C(!0),A(Ae,null,it(e.computedDefaultColumns,i=>(C(),ae(l,{key:i==null?void 0:i.key,ref_for:!0,ref:u=>{u&&(e.formItemRefs[i.key]=u)},col:e.mergeCol(i.col),item:i,helper:e.helper,"model-value":e.get(e.form,i.key),slots:e.mergedSlots["form_"+i.key],"get-context-fn":e.getContextFn,"onUpdate:modelValue":u=>e.set(e.form,i.key,u)},null,8,["col","item","helper","model-value","slots","get-context-fn","onUpdate:modelValue"]))),128))]),_:1},16)),e.computedGroup.wrapper?(C(),ae(Me(e.computedGroup.wrapper.parent),Re({key:0,[e.ui.collapse.modelValue]:e.groupActiveKey,["onUpdate:"+e.ui.collapse.modelValue]:t[0]||(t[0]=i=>e.groupActiveKey=i),style:{width:"100%"}},e.computedGroup),{default:te(()=>[(C(!0),A(Ae,null,it(e.computedGroup.groups,(i,u)=>(C(),A(Ae,{key:u},[e.groupItemShow(i)?(C(),ae(Me(e.computedGroup.wrapper.child),Re({key:0,[e.ui.collapse.keyName||""]:u},{ref_for:!0},i,{class:{"fs-form-group-error":e.errorsRef["group."+u]}}),xa({default:te(()=>[(C(),ae(Me(e.ui.row.name),Re({class:"fs-row"},{ref_for:!0},e.row),{default:te(()=>[(C(!0),A(Ae,null,it(i.columns,c=>(C(),A(Ae,{key:c},[e.computedColumns[c]?(C(),ae(l,{key:0,ref_for:!0,ref:f=>{f&&(e.formItemRefs[c]=f)},col:e.mergeCol(e.computedColumns[c].col),item:e.computedColumns[c],"model-value":e.get(e.form,c),slots:e.mergedSlots["form_"+c],"get-context-fn":e.getContextFn,helper:e.helper,"onUpdate:modelValue":f=>e.set(e.form,c,f)},null,8,["col","item","model-value","slots","get-context-fn","helper","onUpdate:modelValue"])):le("",!0)],64))),128))]),_:2},1040))]),_:2},[it(i.slots,(c,f)=>({name:f,fn:te(p=>[J(s,{"render-func":c,scope:{...p,hasError:e.errorsRef["group."+u]}},null,8,["render-func","scope"])])}))]),1040,["class"])):le("",!0)],64))),128))]),_:1},16)):le("",!0)]),_:1},8,["class","model"])}const Mye=Rn(Eye,[["render",Tye]]),Oye=K({name:"FsFormItem",components:{FsRender:D7},props:{modelValue:{},item:{type:Object,default:void 0},formSlot:{type:Function,default:void 0},getContextFn:{type:Function,default:void 0},helper:{type:[String,Object]}},emits:["update:modelValue"],setup(e,t){const{ui:n}=sn(),{merge:a}=_n(),o=F(),r=()=>{const h=e.getContextFn?e.getContextFn():{};return{value:e.modelValue,key:e.item.key,...h}};function l(h){t.emit("update:modelValue",h)}function s(h=!1){var v,g;return h?(v=o.value)==null?void 0:v.getTargetRefAsync():(g=o.value)==null?void 0:g.getTargetRef()}const i=x(()=>{const h={...e.item};return delete h.title,delete h.label,h}),u=x(()=>{var h,v,g;return((v=(h=e.item)==null?void 0:h.helper)==null?void 0:v.position)||((g=e.helper)==null?void 0:g.position)}),c=x(()=>{var h,v;return a({},(h=e.item.helper)==null?void 0:h.tooltip,(v=e.helper)==null?void 0:v.tooltip)}),f=x(()=>{if(e.item!=null)return e.item.key.indexOf(".")>=0?e.item.key.split("."):e.item.key}),p=x(()=>e.item.label||e.item.title),m=x(()=>p.value instanceof Function);return{ui:n,updateModelValue:l,scopeFunc:r,getComponentRef:s,componentRenderRef:o,computedHelperPosition:u,computedHelperTooltip:c,computedKey:f,computedLabelIsRender:m,computedLabel:p,computedLabelRender:()=>p.value(r()),computedItem:i}}}),Rye={key:0,class:"fs-form-item-label-text"},Aye=["title"],$ye={class:"fs-form-helper-tooltip"},Pye={class:"fs-form-item-label-icon"},Nye={class:"fs-form-item-content"},Iye={class:"fs-form-item-render"},Vye={class:"fs-form-item-component"};function Lye(e,t,n,a,o,r){const l=He("fs-render"),s=He("fs-form-helper"),i=He("fs-icon"),u=He("fs-slot-render"),c=He("fs-component-render");return e.computedItem?(C(),ae(Me(e.ui.formItem.name),Re({key:0,class:"fs-form-item",[e.ui.formItem.prop||""]:e.computedKey},e.computedItem,{path:e.computedItem.key,"rule-path":e.computedItem.key}),{label:te(()=>[e.computedLabelIsRender?(C(),A("span",Rye,[J(l,{"render-func":e.computedLabelRender},null,8,["render-func"])])):(C(),A("span",{key:1,class:"fs-form-item-label-text",title:e.computedLabel},ye(e.computedLabel),9,Aye)),e.computedItem.helper&&e.computedHelperPosition==="label"?(C(),ae(Me(e.ui.tooltip.name),gn(Re({key:2},e.computedHelperTooltip)),{[e.ui.tooltip.content]:te(()=>[M("span",$ye,[J(s,{helper:e.computedItem.helper,scope:e.scopeFunc()},null,8,["helper","scope"])])]),[e.ui.tooltip.trigger]:te(()=>[M("span",Pye,[J(i,{class:"fs-form-item-label-icon-inner",icon:e.ui.icons.question},null,8,["icon"])])]),_:2},1040)):le("",!0)]),default:te(()=>{var f;return[M("div",Nye,[e.computedItem.topRender?(C(),ae(l,{key:0,"render-func":e.computedItem.topRender,scope:e.scopeFunc()},null,8,["render-func","scope"])):le("",!0),M("div",Iye,[e.computedItem.prefixRender?(C(),ae(l,{key:0,"render-func":e.computedItem.prefixRender,scope:e.scopeFunc()},null,8,["render-func","scope"])):le("",!0),M("div",Vye,[e.formSlot?(C(),ae(u,{key:0,slots:e.formSlot,scope:e.scopeFunc()},null,8,["slots","scope"])):((f=e.computedItem.component)==null?void 0:f.show)!==!1?(C(),A(Ae,{key:1},[e.computedItem.conditionalRender&&e.computedItem.conditionalRender.match&&e.computedItem.conditionalRender.match(e.scopeFunc())?(C(),ae(l,{key:0,"render-func":e.computedItem.conditionalRender.render,scope:e.scopeFunc()},null,8,["render-func","scope"])):e.computedItem.render?(C(),ae(l,{key:1,"render-func":e.computedItem.render,scope:e.scopeFunc()},null,8,["render-func","scope"])):(C(),ae(c,Re({key:2,ref:"componentRenderRef"},e.computedItem.component,{"model-value":e.modelValue,scope:e.scopeFunc(),"onUpdate:modelValue":e.updateModelValue}),null,16,["model-value","scope","onUpdate:modelValue"]))],64)):le("",!0)]),e.computedItem.suffixRender?(C(),ae(l,{key:1,"render-func":e.computedItem.suffixRender,scope:e.scopeFunc()},null,8,["render-func","scope"])):le("",!0)]),e.computedItem.bottomRender?(C(),ae(l,{key:1,"render-func":e.computedItem.bottomRender,scope:e.scopeFunc()},null,8,["render-func","scope"])):le("",!0),e.computedItem.helper&&e.computedHelperPosition!=="label"?(C(),ae(s,{key:2,helper:e.computedItem.helper,scope:e.scopeFunc()},null,8,["helper","scope"])):le("",!0)])]}),_:1},16,["path","rule-path"])):le("",!0)}const Fye=Rn(Oye,[["render",Lye]]),Dye=K({__name:"fs-form-item-col",props:{item:{type:Object,default:void 0},slots:{type:Function,default:void 0},getContextFn:{type:Function,default:void 0},col:{type:Object,default:()=>({})},helper:{type:[String,Object],default:void 0}},setup(e,{expose:t}){const{ui:n}=sn(),a=e,{doComputed:o}=kr(),r=o(()=>a.item,()=>a.getContextFn()),{merge:l}=_n(),s=Ro(),i=F();function u(){return i.value}return t({getFormItemRef:u}),(c,f)=>{var p;const m=He("fs-form-item");return d(r)&&d(r).show!==!1?(C(),ae(Me(d(n).col.name),Re({key:0,class:"fs-col"},d(l)(e.col,(p=d(r))==null?void 0:p.col)),{default:te(()=>{var h;return[d(r)&&((h=d(r))==null?void 0:h.blank)!==!0?(C(),ae(m,Re({key:0,ref_key:"formItemRef",ref:i,item:d(r),"form-slot":e.slots,"get-context-fn":e.getContextFn,helper:e.helper},d(s)),null,16,["item","form-slot","get-context-fn","helper"])):le("",!0)]}),_:1},16)):le("",!0)}}}),Bye=K({name:"FsFormHelper",props:{helper:{type:[Object,String]},scope:{}},setup(e){}}),zye={class:"fs-form-helper"},Hye={key:0},jye={key:2};function Kye(e,t,n,a,o,r){const l=He("fs-render");return C(),A("div",zye,[typeof e.helper=="string"?(C(),A("pre",Hye,ye(e.helper),1)):e.helper.render?(C(),ae(l,{key:1,"render-func":e.helper.render,scope:e.scope},null,8,["render-func","scope"])):e.helper.text?(C(),A("pre",jye,ye(e.helper.text),1)):le("",!0)])}const Wye=Rn(Bye,[["render",Kye]]);function qye(e){return typeof e=="function"||Object.prototype.toString.call(e)==="[object Object]"&&!rn(e)}const ef=K({name:"FsFormWrapper",props:{options:{},slots:{},inner:{},innerWrapper:{},id:{},zIndex:{}},emits:["reset","submit","validationError","value-change","open","opened","mounted","closed","inner-change"],setup(e,t){var n;const{t:a}=ao(),{merge:o}=_n(),r=F(!1),l=F(),s=F(),i=F(),u=F(),c=F(),f=F(!1),p=F(),m=F(),h=F(),v=F(),g=e.id||Math.floor(Math.random()*1e6)+"",b="fs-form-wrapper_"+g,y=F({});function w(Q={}){var se;return{formWrapperId:g,formWrapperIdClass:b,close:q,doClose:W,onClosed:j,onOpened:N,open:_,title:v,fullscreenEnabled:ue,fullscreen:ne,formWrapperIs:l,formWrapperOpen:r,formWrapperBind:i,computedButtons:ce,onValueChange:V,innerBind:ee,formWrapperSlots:y,wrapper:i.value,options:s.value,formRef:c.value,form:P(),wrapperBindRef:i,formOptionsRef:s,setFormData:D,getFormData:P,reset:Y,loading:f,toggleFullscreen:ie,submit:H,mode:(se=s.value)==null?void 0:se.mode,...Q}}const _=async Q=>{var se,de;const{wrapper:he}=Q;he.onOpen&&he.onOpen(Q),v.value=d(he.title),l.value=Q.wrapper.is,u.value=he,s.value={...Uo(Q,"wrapper","slots"),slots:{...e.slots,...Q.slots,...t.slots}};const ve=Z.formWrapper.customClass(l.value),Ie=`fs-form-wrapper fs-form-wrapper-${(se=s.value)==null?void 0:se.mode} ${b} ${he[ve]||""} `;return i.value={...Uo(he,"title","onOpen","onClosed","onOpened","is","inner","beforeClose"),[ve]:Ie},y.value={...e.slots,...(de=Q.wrapper)==null?void 0:de.slots,...t.slots},t.emit("open",w()),p.value=()=>{he.onClosed&&he.onClosed(w())},m.value=()=>{he.onOpened&&he.onOpened(w())},h.value=he.beforeClose,he.fullscreen!=null&&(ne.value=he.fullscreen),t.emit("inner-change",!!u.value.inner),await Oe(),r.value=!0,await Oe(),N(),w()};async function S(){var Q;const se=u.value.saveRemind;if((Q=c.value)!=null&&Q.isDirty()&&se){let de=!1;if(se instanceof Function)de=await se();else try{await Z.messageBox.confirm({title:a("fs.form.saveRemind.title"),message:a("fs.form.saveRemind.content"),confirmButtonText:a("fs.form.saveRemind.ok"),cancelButtonText:a("fs.form.saveRemind.cancel")}),de=!0}catch{de=!1}de&&await H()}}const k=s7();let T=null;function R(){return u.value.saveDraft?(T==null&&(T=new u7({$router:k,tableName:"addFormDraft",keyType:e.id||"0"})),T):null}async function E(){var Q;const se=u.value.saveDraft,de=(Q=c.value)==null?void 0:Q.isDirty(),he=s.value.mode=="add";return de&&se&&he?(await R().updateTableValue(P()),!0):!1}async function O(){const Q=R();Q&&await Q.clearTableValue()}async function I(){const Q=R();if(Q){const se=await Q.getTableValue();se&&D(se,{mergeForm:!0})}}async function $(){let Q=!1;return u.value.saveDraft&&(Q=await E()),h.value&&h.value(w())==!1?!1:(Q||await S(),!0)}const z=x(()=>Z.type=="element"?{beforeClose:Q=>{W()}}:{}),q=async()=>{r.value=!1},W=async()=>await $()==!1?!1:(q(),!0),j=()=>{p.value&&p.value(),t.emit("closed"),s.value=null},N=()=>{if(u.value.saveDraft&&I(),t.emit("opened"),m.value&&m.value(),i.value.draggable||i.value.dragenabled){const{dragModal:Q}=Obe();Q({getModal:()=>document.querySelector(`.${b}`)})}},V=Q=>{t.emit("value-change",Q)};async function H(){f.value=!0;try{if(await c.value.submit()===!1)return;await O(),q()}finally{f.value=!1}}async function Y(){await c.value.reset()}function P(){var Q;return(Q=c.value)==null?void 0:Q.getFormData()}function D(Q,se){var de;(de=c.value)==null||de.setFormData(Q,se)}const{doComputed:B}=kr();function U(){var Q,se,de;return{row:(Q=s.value)==null?void 0:Q.initialForm,form:P(),index:(se=s.value)==null?void 0:se.index,mode:(de=s.value)==null?void 0:de.mode,attrs:s.value,getComponentRef(...he){var ve;(ve=c.value)==null||ve.getComponentRef(...he)}}}const X=B(()=>{var Q;return(Q=i.value)==null?void 0:Q.buttons},U),ce=x(()=>{const Q={cancel:{},reset:{},ok:{loading:f.value}},se=o(Q,X.value),de=[];return dt(se,(he,ve)=>{he.key=ve,de.push(he),he.onClick==null&&he.click!=null&&(he.onClick=Ie=>{he.click(w({loadingRef:Ie==null?void 0:Ie.loadingRef}))})}),Bi(de,he=>he.order??Bs.orderDefault)});gt(async()=>{e.options!=null&&await _(e.options),t.emit("mounted",bt().exposed)});const ne=F(!1),ue=x(()=>{var Q;return!((Q=l.value)!=null&&Q.endsWith("drawer"))});function ie(){ne.value=!ne.value}const Z=zn.get(),ee=x(()=>u.value.inner?Z.formWrapper.buildInnerBind({getInnerWrapper(){if(u.value.innerContainerSelector){const Q=document.querySelector(u.value.innerContainerSelector);if(Q)return Q.classList.add("fs-form-inner-wrapper"),Q;console.error(`找不到选择器为${u.value.innerContainerSelector}的元素`)}return e.innerWrapper}}):{});t.expose({formWrapperId:g,formWrapperIdClass:b,close:q,doClose:W,onClosed:j,onOpened:N,open:_,title:v,fullscreenEnabled:ue,fullscreen:ne,toggleFullscreen:ie,formOptions:s,formWrapperIs:l,formWrapperOpen:r,formWrapperBind:i,formRef:c,submit:H,reset:Y,computedButtons:ce,loading:f,getFormData:P,setFormData:D,onValueChange:V,innerBind:ee,formWrapperSlots:y,form:P(),wrapperBindRef:i,formOptionsRef:s,mode:(n=s.value)==null?void 0:n.mode});const G=Tn();return()=>{if(!i.value)return null;const Q=zn.get();let se={};const de={...G,...y.value},he=(et,rt,ke=de)=>ke[et]?ke[et](rt):null,ve=l.value||"el-dialog";if(s.value){const{index:et,mode:rt}=s.value||{},ke={_self:this,index:et,mode:rt,getFormData:P};se={[Q.formWrapper.titleSlotName]:()=>{let Qe=null;return ue.value&&(Qe=J(He("fs-icon"),{class:"fs-fullscreen-icon",onClick:ie,icon:ne.value?Q.icons.fullScreen:Q.icons.unFullScreen},null)),J("div",{class:"fs-form-header"},[J("div",{class:"fs-form-header-left"},[he("form-header-left",ke),v.value,he("form-header-right",ke)]),J("div",{class:"fs-form-header-action"},[he("form-header-action-left",ke),Qe,he("form-header-action-right",ke)])])},default:()=>{const Qe=[];return dt(ce.value,ft=>{ft.show!==!1&&Qe.push(J(He("fs-button"),ft,null))}),J("div",{class:"fs-form-wrapper-body"},[J("div",{class:"fs-form-body"},[he("form-body-top",ke),J("div",{class:"fs-form-content"},[he("form-body-left",ke),J(He("fs-form"),Re({ref:c},s.value,{onValueChange:V}),null),he("form-body-right",ke)]),he("form-body-bottom",ke)]),J("div",{class:"fs-form-footer-btns"},[he("form-footer-left",ke),Qe,he("form-footer-right",ke)])])}}}if(Q.formWrapper.hasContentWrap){const et=Q.formWrapper.hasContentWrap(ve),rt=se;if(et){const ke=Me(et);se={default:()=>J(ke,Re({closable:!0},u.value.contentProps),qye(rt)?rt:{default:()=>[rt]})}}}const Ie=Q.formWrapper.visible,De={[Ie]:r.value,["onUpdate:"+Ie]:async et=>{if(et===!1&&r.value)return await W();r.value=et}},Le=Q.formWrapper.buildOnClosedBind(ve,j),we=Q.formWrapper.customClass(ve),$e=`${ne.value?"fs-fullscreen":""} ${i.value[we]||""}`,_e={[we]:$e},Be={fullscreen:ne.value},Ke={zIndex:i.value.zIndex||e.zIndex},ot=Me(ve);return J(ot,Re(i.value,_e,De,Le,Be,ee.value,Ke,z.value),se)}}}),Uye=K({name:"FsFormProvider"}),Yye=K({...Uye,setup(e){const t=F({}),n=F({});return _t("get:form:wrapper:context",a=>n.value[a]),_t("use:form:wrapper",()=>({setContext(a,o){n.value[a]=o},open(a){const o=a.id||Math.floor(Math.random()*1e6)+"";return new Promise((r,l)=>{t.value[o]={id:o,async onMounted(s){await s.open(a),r(s)},onClosed(){a.id||delete t.value[o]}}})}})),(a,o)=>(C(),A(Ae,null,[re(a.$slots,"default"),(C(!0),A(Ae,null,it(t.value,r=>(C(),ae(d(ef),Re({key:r.id},{ref_for:!0},r),null,16))),128))],64))}});function Gye(e,t){_t("get:columns",()=>e.table.columns),_t("update:columns",n=>{t.emit("update:columns",n)}),_t("get:crudBinding",()=>e)}function Xye(e,t){const n=F(),a=()=>n.value,o=()=>n.value?n.value.getForm():(Lt.warn("请使用expose.getSearchFormData代替"),{}),r=()=>n.value?n.value.getValidatedForm():(Lt.warn("请使用expose.getSearchValidatedFormData代替"),{});function l({form:s,mergeForm:i=!1}){n.value&&n.value.setForm(s,i)}return{searchRef:n,getSearchRef:a,getSearchFormData:o,setSearchFormData:l,getSearchValidatedFormData:r}}function Jye(e,t,n){return{tabsBinding:x(()=>{var a,o,r,l,s,i,u;if(t.tabs&&t.tabs.show&&t.tabs.name){let c=null;const f={...t.tabs};return(a=t.search)!=null&&a.columns&&(l=(r=(o=t.search)==null?void 0:o.columns[t.tabs.name])==null?void 0:r.component)!=null&&l.dict&&(c=(u=(i=(s=t.search)==null?void 0:s.columns[t.tabs.name])==null?void 0:i.component)==null?void 0:u.dict,f.value==null&&(f.value=c.value),f.label==null&&(f.label=c.label),f.options==null&&(f.options=c.data||[])),{...f,modelValue:t.search.validatedForm&&t.search.validatedForm[t.tabs.name],"onUpdate:modelValue":p=>{n.emit("tab-change",{[t.tabs.name]:p})}}}return{show:!1}})}}function pp(e,t){if(!e)return{};const n={};return dt(e,(a,o)=>{o.startsWith(t)&&(n[o]=a)}),n}function Zye(e,t,{tableRef:n,containerRef:a}){var o;const r=zn.get();let l=r.table;if(((o=e.table)==null?void 0:o.tableVersion)==="v2"&&(l=r.tableV2),l.hasMaxHeight(e.table))return{};if(!l.fixedHeaderNeedComputeBodyHeight)return{};const s=F(null);function i(){var c;const f=(c=n==null?void 0:n.value)==null?void 0:c.$el;if(f==null||f.querySelector==null)return;const p=f.querySelector(l.headerDomSelector);if(p==null)return;const m=f.getBoundingClientRect().height,h=p.getBoundingClientRect().height;s.value=m-h-2+(e.table.maxHeightAdjust||0),Lt.debug("table max height recomputed ",s.value)}function u(){var c;const f=(c=n==null?void 0:n.value)==null?void 0:c.$el;if(f==null)return;const p=f.parentNode;new ResizeObserver(function(m){Lt.debug("table resized",m),m.length>0&&m[0].contentRect.height>0&&(i(),setTimeout(()=>{i()},200),setTimeout(()=>{i()},500))}).observe(p)}return gt(async()=>{await Oe(),await Oe(),u()}),{maxHeightRef:s,computeBodyHeight:i}}function Qye(e,t){const n=zn.get(),a=F(),o=F(),r=F(),{maxHeightRef:l,computeBodyHeight:s}=Zye(e,t,{tableRef:a,containerRef:r}),{merge:i}=_n(),u=Wt(e,"table"),c=x(()=>{var _;let S={};if((l==null?void 0:l.value)!=null){let T=n.table;((_=e.table)==null?void 0:_.tableVersion)==="v2"&&(T=n.tableV2),S=T.buildMaxHeight(l.value)}const k=ys.dash.omit(u,"loading","columns","columnsMap");return i(S,{...t.attrs,...k})}),f=Wt(e,"toolbar"),p=x(()=>pp(t.slots,"cell")),m=x(()=>pp(t.slots,"form")),h=x(()=>pp(t.slots,"search")),v=x(()=>pp(t.slots,"toolbar")),g=F(),b=x(()=>{const _={compact:e.toolbar.compact!==!1};return e.customClass&&(_[e.customClass]=!0),_}),y=F(),w=F(!1);return{tableRef:a,containerRef:r,toolbarRef:o,computedTable:c,computedToolbar:f,computedCellSlots:p,formWrapperRef:g,isFormInner:w,onFormInnerChange:_=>{w.value=_},computedFormSlots:m,computedSearchSlots:h,computedToolbarSlots:v,computeBodyHeight:s,computedClass:b,innerWrapperRef:y}}const e3e=K({name:"FsCrud",inheritAttrs:!1,props:{id:{type:String,default:""},table:{type:Object,default(){return{}}},data:{type:Array},rowHandle:{type:Object,default(){return{}}},search:{type:Object,default(){return{}}},toolbar:{type:Object,default(){return{}}},actionbar:{type:Object,default(){return{}}},tabs:{type:Object,default(){return{}}},addForm:{type:Object,default(){return{}}},editForm:{type:Object,default(){return{}}},viewForm:{type:Object,default(){return{}}},pagination:{type:Object,default(){return{show:!1}}},container:{type:Object,default(){return{}}},customClass:{},form:{type:Object,default(){return{}}},selection:{type:Object,default(){return{show:!1}}}},emits:["update:search","update:compact","update:columns","form-value-change","update:modelValue","tab-change"],setup(e,t){const{ui:n}=sn();Gye(e,t);const a=Xye(),o=Jye(a,e,t),r=Qye(e,t);return{ui:n,...a,...r,...o}}}),t3e={class:"fs-crud-search"},n3e={key:0,class:"fs-crud-actionbar"},a3e={key:0,class:"fs-crud-toolbar"},o3e={class:"fs-crud-pagination"},r3e={class:"fs-pagination-left"},l3e={class:"fs-pagination"},s3e={class:"fs-pagination-right"};function i3e(e,t,n,a,o,r){var l;const s=He("fs-actionbar"),i=He("fs-toolbar"),u=He("fs-tabs-filter"),c=He("fs-table"),f=He("fs-form-wrapper");return C(),ae(Me(((l=e.container)==null?void 0:l.is)||"fs-layout-default"),Re({ref:"containerRef",class:"fs-crud-container"},e.container,{class:e.computedClass}),{"header-top":te(()=>[re(e.$slots,"header-top")]),"header-bottom":te(()=>[re(e.$slots,"header-bottom")]),"header-middle":te(()=>[re(e.$slots,"header-middle")]),search:te(()=>[M("div",t3e,[(C(),ae(Me(e.search.is||"fs-search"),Re({ref:"searchRef"},e.search,{slots:e.computedSearchSlots}),null,16,["slots"]))])]),actionbar:te(()=>[e.actionbar&&e.actionbar.show!==!1?(C(),A("div",n3e,[re(e.$slots,"actionbar-left"),J(s,gn(va(e.actionbar)),null,16),re(e.$slots,"actionbar-right")])):le("",!0)]),toolbar:te(()=>[e.toolbar&&e.toolbar.show!==!1?(C(),A("div",a3e,[re(e.$slots,"toolbar-left"),J(i,Re({ref:"toolbarRef"},e.toolbar,{slots:e.computedToolbarSlots,columns:e.table.columns}),null,16,["slots","columns"]),re(e.$slots,"toolbar-right")])):le("",!0)]),tabs:te(()=>[e.tabsBinding.show?(C(),ae(u,Re({key:0,ref:"tabsRef",class:"fs-tabs"},e.tabsBinding),null,16)):le("",!0)]),table:te(()=>[J(c,Re({ref:"tableRef",class:"fs-crud-table"},e.computedTable,{columns:e.table.columns,loading:e.table.loading,"row-handle":e.rowHandle,data:e.data,"cell-slots":e.computedCellSlots}),null,16,["columns","loading","row-handle","data","cell-slots"])]),form:te(()=>[M("div",{ref:"innerWrapperRef",class:L(["fs-form-wrapper-container",{"fs-form-inner-wrapper":e.isFormInner}])},[J(f,{ref:"formWrapperRef",slots:e.computedFormSlots,"inner-wrapper":e.innerWrapperRef,onInnerChange:e.onFormInnerChange,onValueChange:t[0]||(t[0]=p=>e.$emit("form-value-change",p))},null,8,["slots","inner-wrapper","onInnerChange"])],2)]),pagination:te(()=>[M("div",o3e,[M("div",r3e,[re(e.$slots,"pagination-left")]),M("div",l3e,[e.pagination.show!==!1?(C(),ae(Me(e.ui.pagination.name),gn(Re({key:0},e.pagination)),null,16)):le("",!0)]),M("div",s3e,[re(e.$slots,"pagination-right")])])]),"footer-top":te(()=>[re(e.$slots,"footer-top")]),"footer-bottom":te(()=>[re(e.$slots,"footer-bottom")]),default:te(()=>[re(e.$slots,"default")]),_:3},16,["class"])}const u3e=Rn(e3e,[["render",i3e]]),c3e=K({name:"FsRowHandle",props:{dropdown:{type:Object},buttons:{type:Object},group:{type:Object},active:{type:String,default:"default"},scope:{type:Object,default:()=>({})}},emits:["handle"],setup(e,t){const{ui:n}=sn(),{merge:a}=_n(),{t:o}=ao(),r=x(()=>({...e.scope,row:e.scope[n.tableColumn.row],index:e.scope[n.tableColumn.index]})),l=(g,b)=>{const y=e.scope[n.tableColumn.index],w=e.scope[n.tableColumn.row],_={key:g.key,row:w,btn:g,index:y,...e.scope,loadingRef:b==null?void 0:b.loadingRef};if(g.click)return g.click(_);t.emit("handle",_)},{doComputed:s}=kr(),i=x(()=>({dropdown:e.dropdown,buttons:e.buttons,active:e.active,group:e.group})),u=s(()=>i.value,()=>{const g=e.scope[n.tableColumn.index],b=e.scope[n.tableColumn.row];return{...e.scope,index:g,row:b}}),c=x(()=>{let g=null;if(u.value.active==null||u.value.active==="default"){const y={view:{key:"view",text:o("fs.rowHandle.view.text"),title:o("fs.rowHandle.view.text")},copy:{key:"copy",text:o("fs.rowHandle.copy.text"),title:o("fs.rowHandle.copy.text")},edit:{key:"edit",type:"primary",text:o("fs.rowHandle.edit.text"),title:o("fs.rowHandle.edit.text")},remove:{key:"remove",...n.button.colors("danger"),text:o("fs.rowHandle.remove.text"),title:o("fs.rowHandle.remove.text")}};g=a(y,u.value.buttons)}else g=u.value.group[u.value.active];const b=[];return dt(g,(y,w)=>{y.key=w,y.show!==!1&&b.push(y)}),Bi(b,y=>y.order??Bs.orderDefault)}),f=x(()=>u.value.dropdown==null||u.value.dropdown.atLeast==null||u.value.dropdown.atLeast<=0||c.value.length<=u.value.dropdown.atLeast?0:u.value.dropdown.atLeast||0);function p(g,b){return g.dropdown===!0||f.value>0&&f.value{let g=0;for(const b of c.value){if(p(b,g))return!0;g++}return!1});function h(g){for(let b of c.value)if(g===b.key){l(b);return}}const v=x(()=>{const g={};if(n.dropdown.renderMode!=="slot"){const b=c.value,y=[];dt(b,(w,_)=>{w.show!==!1&&p(w,_)&&y.push({[n.dropdown.value]:w.key,[n.dropdown.label]:w.text,title:w.title})}),g.options=y}return{...Uo(e.dropdown,"more","atLeast"),...n.dropdown.command(h),...g}});return{ui:n,hasDropdownBtn:m,computedHandleBtns:c,doDropdownItemClick:h,computedDropdownAtLeast:f,doClick:l,isDropdownBtn:p,scopeRef:r,computedDropdownBinding:v}}}),d3e={class:"fs-row-handle"},f3e={key:0,class:"row-handle-btn fs-handle-row-dropdown"};function p3e(e,t,n,a,o,r){const l=He("fs-render"),s=He("fs-button"),i=He("fs-icon");return C(),A("div",d3e,[re(e.$slots,"cell-rowHandle-left",gn(va(e.scopeRef))),(C(!0),A(Ae,null,it(e.computedHandleBtns,(u,c)=>(C(),A(Ae,{key:c},[u.show!==!1&&!e.isDropdownBtn(u,c)?(C(),A(Ae,{key:0},[u.render?(C(),ae(l,{key:0,"render-func":u.render,scope:e.scopeRef},null,8,["render-func","scope"])):(C(),ae(s,Re({key:1,class:"row-handle-btn"},{ref_for:!0},u,{onClick:nt(f=>e.doClick(u,f),["stop"])}),null,16,["onClick"]))],64)):le("",!0)],64))),128)),re(e.$slots,"cell-rowHandle-middle",gn(va(e.scope))),e.hasDropdownBtn?(C(),A("span",f3e,[(C(),ae(Me(e.ui.dropdown.name),gn(va(e.computedDropdownBinding)),{[e.ui.dropdown.slotName]:te(()=>[e.ui.dropdown.renderMode==="slot"?(C(),ae(Me(e.ui.dropdownMenu.name),gn(Re({key:0},e.ui.dropdownMenu.command(e.doDropdownItemClick))),{default:te(()=>[(C(!0),A(Ae,null,it(e.computedHandleBtns,(u,c)=>(C(),A(Ae,{key:c},[u.show!==!1&&e.isDropdownBtn(u,c)?(C(),ae(Me(e.ui.dropdownItem.name),Re({key:0,[e.ui.dropdownItem.command||""]:u.key},{ref_for:!0},u.dropdownItem,{disabled:u.disabled}),{default:te(()=>[M("div",Re({class:"fs-row-handle-dropdown-item"},{ref_for:!0},u),[u.icon?(C(),ae(i,{key:0,icon:u.icon},null,8,["icon"])):le("",!0),Ct(" "+ye(u.text||u.title),1)],16)]),_:2},1040,["disabled"])):le("",!0)],64))),128))]),_:1},16)):le("",!0)]),default:te(()=>[J(s,gn(va(e.dropdown.more)),null,16)]),_:2},1040))])):le("",!0),re(e.$slots,"cell-rowHandle-right",gn(va(e.scope)))])}const h3e=Rn(c3e,[["render",p3e]]);function hi(){return hi=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function Gp(e,t,n){return v3e()?Gp=Reflect.construct.bind():Gp=function(a,o,r){var l=[null];l.push.apply(l,o);var s=Function.bind.apply(a,l),i=new s;return r&&tf(i,r.prototype),i},Gp.apply(null,arguments)}function g3e(e){return Function.toString.call(e).indexOf("[native code]")!==-1}function _g(e){var t=typeof Map=="function"?new Map:void 0;return _g=function(n){if(n===null||!g3e(n))return n;if(typeof n!="function")throw new TypeError("Super expression must either be null or a function");if(typeof t<"u"){if(t.has(n))return t.get(n);t.set(n,a)}function a(){return Gp(n,arguments,Cg(this).constructor)}return a.prototype=Object.create(n.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),tf(a,n)},_g(e)}var b3e=/%[sdj%]/g,y3e=function(){};function Sg(e){if(!e||!e.length)return null;var t={};return e.forEach(function(n){var a=n.field;t[a]=t[a]||[],t[a].push(n)}),t}function ko(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),a=1;a=r)return s;switch(s){case"%s":return String(n[o++]);case"%d":return Number(n[o++]);case"%j":try{return JSON.stringify(n[o++])}catch{return"[Circular]"}break;default:return s}});return l}return e}function w3e(e){return e==="string"||e==="url"||e==="hex"||e==="email"||e==="date"||e==="pattern"}function ya(e,t){return!!(e==null||t==="array"&&Array.isArray(e)&&!e.length||w3e(t)&&typeof e=="string"&&!e)}function C3e(e,t,n){var a=[],o=0,r=e.length;function l(s){a.push.apply(a,s||[]),o++,o===r&&n(a)}e.forEach(function(s){t(s,l)})}function Q8(e,t,n){var a=0,o=e.length;function r(l){if(l&&l.length){n(l);return}var s=a;a=a+1,s=0;l--)r.childrenPath[l]=jL(r.strChildrenPath[l])}return t({value:a,callback:o,options:r,obj:a}),a}return n}const z1e=B1e({isString:Nd}),H1e={forEachDeep:z1e},j1e={omit(e,...t){const n=Object.keys(e.value),a={};for(const o of n)o!=="loading"&&(t.indexOf(o)>=0||(a[o]=e.value[o]));return a}};function q8(e){const t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.top="0",t.style.left="0",t.style.opacity="0",t.style.pointerEvents="none",t.style.zIndex="-1",document.body.appendChild(t);try{t.select(),t.setSelectionRange(0,99999);const n=document.execCommand("copy");return document.body.removeChild(t),n?!0:(console.error("传统复制方法失败"),!1)}catch(n){return console.error("传统复制方法出错: ",n),document.body.removeChild(t),!1}}async function K1e(e){try{return!navigator.clipboard||!navigator.clipboard.writeText?(console.warn("Clipboard API not supported, falling back to traditional method"),q8(e)):(await navigator.clipboard.writeText(e),!0)}catch(t){return console.error("复制失败: ",t),q8(e)}}async function W1e(){return new Promise((e,t)=>{const n=document.createElement("textarea");n.style.position="fixed",n.style.top="0",n.style.left="0",n.style.opacity="0",document.body.appendChild(n);try{if(n.focus(),document.execCommand("paste")){const a=n.value;document.body.removeChild(n),e(a)}else document.body.removeChild(n),t(new Error("传统读取方法失败"))}finally{document.body.removeChild(n)}})}async function q1e(){try{if(!navigator.clipboard||!navigator.clipboard.readText)throw console.warn("Clipboard API not supported for reading"),new Error("浏览器不支持读取剪贴板");if(navigator.permissions&&(await navigator.permissions.query({name:"clipboard-read"})).state==="denied")throw new Error("剪贴板读取权限被拒绝");return await navigator.clipboard.readText()}catch(e){return console.error("读取剪贴板失败: ",e),await W1e()}}const sb=Nt({store:{}});function U1e(e,t="__default__"){sb.store[t]=e}function Y1e(e="__default__"){return sb.store[e]}function G1e(e="__default__"){sb.store[e]=""}const X1e=Object.freeze(Object.defineProperty({__proto__:null,clearMemoryClipboard:G1e,copyToClipboard:K1e,copyToMemory:U1e,readToClipboard:q1e,readToMemory:Y1e},Symbol.toStringTag,{value:"Module"})),ys={logger:Lt,dash:j1e,clipboard:X1e},Zd={commonOptions(e){return{}},defaultOptions(e){const{t,crudOptionsRef:n}=e,a=r=>x(()=>t(r)),o=zn.get();return{settings:{plugins:{mobile:{enabled:!0,props:{isMobile:x(()=>window.innerWidth<768)}}}},mode:{},status:{},search:{container:{is:"fs-search-layout-default",collapse:!0,col:{span:4}},formItem:{wrapperCol:{style:{}}},options:{...o.form.inlineLayout,showFeedback:!1},onValidateError({trigger:r}){r==="search"&&o.notification.error({message:t("fs.search.error.message")})},collapse:!0,show:!0,buttons:{search:{className:{"fs-search-btn-search":!0},icon:o.icons.search},reset:{className:{"fs-search-btn-reset":!0},icon:o.icons.refresh}}},form:{pasteKey:"__default__",labelPlacement:"left",labelPosition:"right",labelWidth:"120px",style:{"grid-template-columns":"50% 50%"},row:{gutter:10},col:{span:12},labelAlign:"right",labelCol:{span:4},wrapperCol:{span:18},wrapper:{is:o.dialog.name,...o.formWrapper.buildWidthBind(o.dialog.name,"960px"),...o.formWrapper.buildInitBind(o.dialog.name),dragenabled:!0,destroyOnClose:!0,...o.dialog.footer(),buttons:{copy:{text:a("fs.form.copy"),order:1,click:async({form:r})=>{var l,s;const i=(s=(l=n.value)==null?void 0:l.form)==null?void 0:s.pasteKey;ys.clipboard.copyToMemory(JSON.stringify(r),i),o.message.success(t("fs.form.copySuccess"))}},paste:{text:a("fs.form.paste"),order:2,badge:x(()=>{var r,l;const s=(l=(r=n.value)==null?void 0:r.form)==null?void 0:l.pasteKey,i=ys.clipboard.readToMemory(s);return{[o.badge.value]:i?1:0,[o.badge.dot]:!!i}}),click:async({form:r})=>{var l,s;const i=(s=(l=n.value)==null?void 0:l.form)==null?void 0:s.pasteKey,u=ys.clipboard.readToMemory(i);if(u)try{const c=JSON.parse(u);Fs(r,c)}catch(c){console.error(c)}finally{ys.clipboard.clearMemoryClipboard(i)}}},cancel:{text:a("fs.form.cancel"),order:4,click:({doClose:r})=>{r()}},reset:{text:a("fs.form.reset"),order:3,click:({reset:r})=>{r()}},ok:{text:a("fs.form.ok"),order:5,type:"primary",click:async({submit:r})=>{await r()}}}}},addForm:{mode:"add",wrapper:{title:a("fs.addForm.title")}},editForm:{mode:"edit",wrapper:{title:a("fs.editForm.title")}},viewForm:{mode:"view",wrapper:{title:a("fs.viewForm.title"),buttons:{reset:{show:!1},cancel:{show:!1}}}},rowHandle:{width:250,title:a("fs.rowHandle.title"),order:1e3,dropdown:{more:{text:null,type:"primary",icon:o.icons.more}}},pagination:{background:!0,pageSize:20,[o.pagination.currentPage]:1,[o.pagination.total]:1,pageSizes:[5,10,20,50],layout:"total, sizes, prev, pager, next, jumper",showSizeChanger:!0,showQuickJumper:!0,showSizePicker:!0,showTotal:r=>t("fs.pagination.showTotal",[r])},table:{show:!0,height:"100%",rowKey:o.table.defaultRowKey,stripe:!0,border:!0,bordered:!0,singleLine:!1,scrollTopOnRefreshed:!0,editable:{enabled:!1,rowKey:"$editable_id"},pagination:!1},toolbar:{compact:!0,buttons:{search:{className:{"fs-toolbar-btn-search":!0}},compact:{className:{"fs-toolbar-btn-compact":!0}},refresh:{className:{"fs-toolbar-btn-refresh":!0}},export:{className:{"fs-toolbar-btn-export":!0}},columns:{className:{"fs-toolbar-btn-columns":!0}}}},actionbar:{buttons:{add:{className:{"fs-actionbar-btn-add":!0},type:"primary",text:a("fs.actionbar.add")}}}}}};function fv(e,t){return e.type!=="antdv"?{}:{labelCol:{span:t},wrapperCol:{span:23-t}}}function J1e(){const{ui:e}=sn();return{colspan:{form:{col:{span:24},...fv(e,2)}},colspan3:{form:{col:{span:24},...fv(e,3)}},colspan4:{form:{col:{span:24},...fv(e,4)}}}}const Z1e=Object.freeze(Object.defineProperty({__proto__:null,default:J1e},Symbol.toStringTag,{value:"Module"}));function Q1e(){const e=zn.get();return{button:{form:{component:{name:e.input.name,vModel:e.input.modelValue,[e.input.clearable]:!0}},column:{component:{name:"fs-button",vModel:"text"}}},link:{form:{component:{name:e.input.name,vModel:e.input.modelValue,[e.input.clearable]:!0}},column:{component:{name:"fs-button",vModel:"text",...e.button.linkType}}}}}const e4e=Object.freeze(Object.defineProperty({__proto__:null,default:Q1e},Symbol.toStringTag,{value:"Module"}));function t4e(){const e=zn.get();return{"dict-cascader":{search:{component:{clearable:!0}},form:{component:{name:"fs-dict-cascader",vModel:e.cascader.modelValue,[e.cascader.clearable]:!0}},column:{component:{name:"fs-dict-cascader-format"}}}}}const n4e=Object.freeze(Object.defineProperty({__proto__:null,default:t4e},Symbol.toStringTag,{value:"Module"})),f7={name:"zh-cn",fs:{component:{select:{placeholder:"请选择"}},addForm:{title:"添加"},editForm:{title:"编辑"},viewForm:{title:"查看"},rowHandle:{title:"操作",remove:{text:"删除",confirmTitle:"删除提示",confirmMessage:"您确定要删除该记录吗?",success:"删除成功!",confirmText:"确定",cancelText:"取消"},copy:{text:"复制"},edit:{text:"编辑"},view:{text:"查看"}},form:{cancel:"取消",ok:"确定",reset:"重置",saveRemind:{title:"提示",content:"表单数据有变更,是否保存",cancel:"不保存",ok:"保存"},copy:"复制",paste:"粘贴",copySuccess:"表单数据已复制,您可以在添加对话框中粘贴"},actionbar:{add:"添加"},toolbar:{columnFilter:{title:"列设置",fixed:"固定",order:"排序",reset:"还原",confirm:"确定",unnamed:"未命名"},search:{title:"查询显示"},refresh:{title:"刷新"},compact:{title:"紧凑模式"},export:{title:"导出"},columns:{title:"列设置"}},search:{container:{collapseButton:{text:{collapse:"收起",expand:"展开"}}},search:{text:"查询"},reset:{text:"重置"},error:{message:"查询表单校验失败"}},pagination:{showTotal:"共 {0} 条"},date:{formatter:{to:"至"}},extends:{tableSelect:{view:"查看",select:"选择",ok:"确定",cancel:"取消"},cropper:{title:"图片裁剪",preview:"预览",reChoose:"重新选择",flipX:"左右翻转",flipY:"上下翻转",reset:"重置",cancel:"取消",confirm:"确定",chooseImage:"+ 选择图片",onlySupport:"仅支持",sizeLimit:"大小不能超过",sizeNoLimit:"大小不限制"},fileUploader:{text:"文件上传",limitTip:"文件数量不能超过 {0}",sizeLimitTip:"文件大小不能超过 {0},当前大小:{1}",loadError:"图片加载失败",pixelLimitTip:"图片像素尺寸不能超过 宽:{0},高:{1}",hasUploading:"还有文件正在上传,请等待上传完成,或删除它"}}}},a4e={fs:{component:{select:{placeholder:"please select"}},addForm:{title:"add"},editForm:{title:"edit"},viewForm:{title:"view"},rowHandle:{title:"handle",remove:{text:"remove",confirmTitle:"remove tip",confirmMessage:"Are you sure you want to delete this record?",success:"delete success!",confirmText:"confirm",cancelText:"cancel"},copy:{text:"copy"},edit:{text:"edit"},view:{text:"view"}},form:{cancel:"cancel",ok:"ok",reset:"reset",saveRemind:{title:"save remind",content:"The form data has changed, whether to save",cancel:"don't save",ok:"save"},copy:"copy",paste:"paste"},actionbar:{add:"add"},toolbar:{columnFilter:{title:"columns set",fixed:"fixed",order:"sort",reset:"reset",confirm:"ok",unnamed:"unnamed"},search:{title:"show search bar"},refresh:{title:"refresh"},compact:{title:"compact mode"},export:{title:"export"},columns:{title:"columns set"}},search:{container:{collapseButton:{text:{collapse:"collapse",expand:"expand"}}},search:{text:"search"},reset:{text:"reset"},error:{message:"form valid error"}},pagination:{showTotal:"Total {0} items"},date:{formatter:{to:"to"}},extends:{tableSelect:{view:"view",select:"select"},cropper:{title:"image crop",preview:"preview",reChoose:"reChoose",flipX:"flipX",flipY:"flipY",reset:"reset",cancel:"cancel",confirm:"confirm",chooseImage:"+ choose image",onlySupport:"only",sizeLimit:"size limit",sizeNoLimit:" no limit"},fileUploader:{text:"fileUpload",limitTip:"file count limit: {0}",sizeLimitTip:"file size limit: {0}, current size: {1}",loadError:"image load error",pixelLimitTip:"pixel limit : width:{0},height:{1}",hasUploading:"The file is being uploaded, please wait for the upload to complete or delete"}}}};function o4e(e,t){let n=on(f7,e);return n==null?e:t instanceof Array?(dt(t,(a,o)=>{n=n.replace("{"+o+"}",a)}),n):n.replace("{n}",t)}class r4e{constructor(){$t(this,"vueI18nInstance",null)}t(t,n){return o4e(t,n)}setVueI18n(t){if(!t)return;t.global&&(t=t.global);const n=t.availableLocales;for(const a of n){if(a.startsWith("zh")){const o=t.getLocaleMessage(a),r=Kn(o.fs||{});t.mergeLocaleMessage(a,{fs:f7.fs}),t.mergeLocaleMessage(a,{fs:r})}else if(a.startsWith("en")){const o=t.getLocaleMessage(a),r=Kn(o.fs||{});t.mergeLocaleMessage(a,{fs:a4e.fs}),t.mergeLocaleMessage(a,{fs:r})}Lt.debug("i18n",t.getLocaleMessage(a))}this.vueI18nInstance=t}}const jp=new r4e;function ao(){return jp.vueI18nInstance!=null?{t:jp.vueI18nInstance.t}:{t:jp.t}}var tm=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function nm(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var p7={exports:{}};(function(e,t){(function(n,a){e.exports=a()})(tm,function(){return function(n,a){var o=a.prototype,r=o.format;o.format=function(l){var s=this,i=this.$locale();if(!this.isValid())return r.bind(this)(l);var u=this.$utils(),c=(l||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,function(f){switch(f){case"Q":return Math.ceil((s.$M+1)/3);case"Do":return i.ordinal(s.$D);case"gggg":return s.weekYear();case"GGGG":return s.isoWeekYear();case"wo":return i.ordinal(s.week(),"W");case"w":case"ww":return u.s(s.week(),f==="w"?1:2,"0");case"W":case"WW":return u.s(s.isoWeek(),f==="W"?1:2,"0");case"k":case"kk":return u.s(String(s.$H===0?24:s.$H),f==="k"?1:2,"0");case"X":return Math.floor(s.$d.getTime()/1e3);case"x":return s.$d.getTime();case"z":return"["+s.offsetName()+"]";case"zzz":return"["+s.offsetName("long")+"]";default:return f}});return r.bind(this)(c)}}})})(p7);var l4e=p7.exports;const s4e=nm(l4e);tt.extend(s4e);function pv(e,t){if(!i7.isEmpty(e))return tt(e).format(t)}function h7(e,t="YYYY-MM-DD HH:mm:ss"){if(e!=null&&e instanceof Array&&e.length>1){if(i7.hasEmpty(e))return;const{t:n}=ao();return`${pv(e[0],t)} ${n("fs.date.formatter.to")} ${pv(e[1],t)}`}return pv(e,t)}function i4e(e){const{value:t}=e;return h7(t,"YYYY-MM-DD")}function u4e(e){const{value:t}=e;return h7(t,"YYYY-MM-DD HH:mm:ss")}var m7={exports:{}};(function(e,t){(function(n,a){e.exports=a()})(tm,function(){var n="week",a="year";return function(o,r,l){var s=r.prototype;s.week=function(i){if(i===void 0&&(i=null),i!==null)return this.add(7*(i-this.week()),"day");var u=this.$locale().yearStart||1;if(this.month()===11&&this.date()>25){var c=l(this).startOf(a).add(1,a).date(u),f=l(this).endOf(n);if(c.isBefore(f))return 1}var p=l(this).startOf(a).date(u).startOf(n).subtract(1,"millisecond"),m=this.diff(p,n,!0);return m<0?l(this).startOf("week").week():Math.ceil(m)},s.weeks=function(i){return i===void 0&&(i=null),this.week(i)}}})})(m7);var c4e=m7.exports;const d4e=nm(c4e);var v7={exports:{}};(function(e,t){(function(n,a){e.exports=a()})(tm,function(){return function(n,a){a.prototype.weekday=function(o){var r=this.$locale().weekStart||0,l=this.$W,s=(l{b7.push(e.default)});const Qd={};function P4e(){return Qd}function N4e(e){return Qd[e]}function I4e(e){for(const t in e)Qd[t]=e[t]}const y7={getType:N4e,addTypes:I4e,getTypes:P4e,install(){for(const e of b7)dt(e(),(t,n)=>{Qd[n]=t});Lt.debug("types installed:",Qd)}},V4e=K({name:"FsPage",setup(){const e=F();return gt(()=>{window.getComputedStyle(e.value.parentNode).getPropertyValue("position")!=="relative"&&ys.logger.warn("fs-page父节点的position建议为relative,因为fs-page为相对定位(position:absolute),如果样式没有异常,你可以忽略此警告")}),{pageRef:e}}}),Rn=(e,t)=>{const n=e.__vccOpts||e;for(const[a,o]of t)n[a]=o;return n},L4e={ref:"pageRef",class:"fs-page"},F4e={key:0,class:"fs-page-header"},D4e={class:"fs-page-content"},B4e={key:1,class:"fs-page-footer"};function z4e(e,t,n,a,o,r){return C(),A("div",L4e,[e.$slots.header!=null?(C(),A("div",F4e,[re(e.$slots,"header")])):le("",!0),M("div",D4e,[re(e.$slots,"default")]),e.$slots.footer!=null?(C(),A("div",B4e,[re(e.$slots,"footer")])):le("",!0)],512)}const H4e=Rn(V4e,[["render",z4e]]);function vg(e){return e!=null&&(e instanceof w7||nn(e)||Qa(e))}function U8(e){return vg(e)&&!e.cloneable}function j4e(e,...t){function n(o,r){if(r!=null&&(Un(o)||vg(r)))return r}let a=null;for(const o of t)vg(o)&&(a=o);return a||UV(e,...t,n)}function K4e(e){if(U8(e))return e;function t(n){if(U8(n))return n}return eV(e,t)}let w7=class{constructor(){$t(this,"cloneable",!1)}setCloneable(e){this.cloneable=e}};function _n(){return{merge:j4e,cloneDeep:K4e,UnMergeable:w7}}const{cloneDeep:W4e}=_n();function q4e(e){return e instanceof ib}function U4e(e){return e instanceof am}function Y8(e,t,n){const a={};if(e==null)return a;const o=n?q4e:U4e;return H1e.forEachDeep(e,(r,l,s,i)=>{if(r==null)return!1;if(o(r)){const u=i.path;if(t){for(const c of t)if(typeof c=="string"){if(u.startsWith(c))return!1}else if(c instanceof RegExp&&c.test(u))return!0}return a[u]=r,!1}return!Qa(r)},{checkCircular:!0}),a}function Y4e(e,t){if(e==null||Object.keys(e).length<=0)return null;const n={};return dt(e,(a,o)=>{n[o]=a.buildAsyncRef(t)}),n}function G4e(e,t){t==null||Object.keys(t).length<=0||dt(t,(n,a)=>{Zn(e,a,n.value==null?null:n.value)})}function X4e(e,t,n,a){const o=x(()=>{const s=e();return Y8(s,n,!1)}),r=x(()=>{const s=e();return Y8(s,n,!0)}),l=Y4e(r.value,t);return x(()=>{let s=e();const i=Object.keys(r.value).length,u=Object.keys(o.value).length;if(i>0||u>0){if(s=W4e(s),u>0){const c=t?t():{};dt(o.value,(f,p)=>{Zn(s,p,f.computeFn(c))})}i>0&&G4e(s,l)}return a?a(s):s})}class am{constructor(t){$t(this,"computeFn"),this.computeFn=t}}function J4e(e){return new am(e)}class ib{constructor(t){$t(this,"watch"),$t(this,"asyncFn"),$t(this,"defaultValue");const{asyncFn:n,defaultValue:a}=t;this.watch=t.watch,this.asyncFn=n,this.defaultValue=a}buildAsyncRef(t){t=t||function(){};const n=F(this.defaultValue),a=x(()=>this.watch?this.watch(t()):null);return pe(()=>a.value,async o=>{n.value=await this.asyncFn(o,t())},{immediate:!0}),n}}function Z4e(e){return new ib(e)}function kr(){return{ComputeValue:am,compute:J4e,AsyncComputeValue:ib,asyncCompute:Z4e,doComputed:X4e}}const Bs={orderDefault:1},{merge:or,cloneDeep:Tl}=_n(),zc=[];function C7(e){I_(zc,t=>t.name===e.name),zc.push(e),zc.sort((t,n)=>t.order-n.order),Lt.debug("mergeColumnPlugin register success: current:",e,"registered:",zc)}function Q4e(e){var t,n;if(e.dict){if((t=e.column)!=null&&t.component){const a=Os(Tl(e.dict));a.cloneable&&(a.cloneable=!1),e.column.component.dict=or(a,e.column.component.dict)}if((n=e.form)!=null&&n.component){const a=Os(Tl(e.dict));a.cloneable&&(a.cloneable=!1),e.form.component.dict=or(a,e.form.component.dict)}}return e}function ebe(e){if(!e.type)return e;let t=[];typeof e.type=="string"?t=[e.type]:e.type instanceof Array&&(t=e.type);const n={};for(const a of t){const o=y7.getType(a);o&&or(n,o)}return e=or(n,e),e}const hc=[];hc.push({name:"type",handle:ebe,order:-2});hc.push({name:"dict",handle:Q4e,order:-1});hc.push({name:"viewFormUseCellComponent",order:10,handle:(e={},t={})=>{var n,a;if(!((n=t.settings)!=null&&n.viewFormUseCellComponent))return e;const o={component:((a=e.column)==null?void 0:a.component)||{}};return(e.type==="text"||e.type instanceof Array&&e.type.includes("text"))&&(o.render||(o.render=r=>{const{value:l}=r;return J("span",null,[l])})),or(e,{viewForm:o}),e}});hc.push({name:"NaiveFormRuleFix",order:10,handle:(e={},t={})=>{var n,a,o,r,l;const{ui:s}=sn();return s.type!=="naive"||((n=e.addForm)!=null&&n.rules&&(e.addForm.rule=e.addForm.rules),(a=e.editForm)!=null&&a.rules&&(e.editForm.rule=e.editForm.rules),(o=e.viewForm)!=null&&o.rules&&(e.viewForm.rule=e.viewForm.rules),(r=e.form)!=null&&r.rules&&(e.form.rule=e.form.rules),(l=e.search)!=null&&l.rules&&(e.search.rule=e.search.rules)),e}});hc.push({name:"DefaultOrder",order:0,handle:(e={},t={},n)=>(on(e,"column.order")==null&&Zn(e,"column.order",n),on(e,"form.order")==null&&Zn(e,"form.order",n),e)});for(const e of hc)C7(e);function ub(e,t){const n={};let a=0;return dt(e,(o,r)=>{if(o.key=r,o.children)o.children=ub(o.children,t);else for(const l of zc)o=l.handle(o,t,a);n[r]=o,a++}),n}function cb(e={},t){return dt(t,(n,a)=>{n.children?cb(e,n.children):e[a]=n}),e}function db(e={},t){return dt(t,(n,a)=>{n.children?db(e,n.children):e[a]=n}),e}function tbe(e){const t=e,n=t.column||{};return n.title==null&&(n.title=t.title),n.key=t.key,t.children&&(n.children=S7(t.children)),_7(n),Nt(n)}function _7(e){var t;e&&(t=e.component)!=null&&t.name&&typeof e.component.name!="string"&&(nn(e.component.name)||(e.component.name=un(e.component.name)))}function S7(e){let t={};return dt(e,(n,a)=>{t[a]=tbe(n)}),t=fb(t),t}function nbe(e){return Bi(e,t=>t.order??Bs.orderDefault)}function fb(e){const t=[];for(const o in e){const r=e[o];r.key=o,r.children&&zL(r.children)>0&&(r.children=fb(r.children)),t.push(r)}const n=nbe(t),a={};for(const o of n)a[o.key]=o;return a}function x7(e,t){const n={};return dt(e,a=>{const o=Tl(a[t])||{};t==="form"&&o.title==null&&(o.title=a.title),o.key=a.key,n[a.key]=o,_7(o)}),n}function Hc(e,t,n,a){const o=x7(n,t),r=or(Tl(e.form),e[t],{columns:o});return a&&a(r),r}function abe(e,t="search",n){var a;const o=x7(n,t),r={},l=((a=e.settings)==null?void 0:a.searchCopyFormProps)??["component","valueChange","title","key","label","render"];function s(i,u,c){if(sL(l,c)&&e.columns[u]){const f=e.columns[u][c];f&&(i[c]=f)}}return dt(Tl(e.form.columns),(i,u)=>{const c={};s(c,u,"valueResolve"),s(c,u,"valueBuilder"),r[u]=or(c,ur(i,l))}),or({columns:r},{columns:o},e.search)}function obe(e,t,n="form"){const{t:a}=ao(),{merge:o}=_n();t=t||{};const r={value:null},l=o(Zd.defaultOptions({t:a,crudOptionsRef:r}),Zd.commonOptions({crudOptions:e,context:t,crudExpose:null}),e);r.value=l;const s=ub(Tl(l.columns),l),i=cb({},s),u=n==="form"?"form":`${n}Form`;return Hc(l,u,i)}function rbe(e){dt(e.columns,(a,o)=>{a.key=o});const t=ub(Tl(e.columns),e);e.columns=t;const n=cb({},t);return e.table.columns=S7(Tl(t)),e.table.columnsMap=db({},e.table.columns),or(e.toolbar,{columnsFilter:{originalColumns:Tl(e.table.columns)}}),e.form=Hc(e,"form",n),e.addForm=Hc(e,"addForm",n),e.editForm=Hc(e,"editForm",n),e.viewForm=Hc(e,"viewForm",n,a=>{dt(a.columns,o=>{o.component||(o.component={}),o.component.disabled=!0})}),e.search=abe(e,"search",n),e.table.editable&&(e.table.editable.addForm=or(e.addForm.columns,e.table.editable.addForm),e.table.editable.editForm=or(e.editForm.columns,e.table.editable.editForm)),e}function Kh(e,t){dt(e,(n,a)=>{n.key||(n.key=a),n.children?Kh(n.children,t):t(n,a)})}function Wh(e,t){dt(e,(n,a)=>{n.key||(n.key=a),n.children?Wh(n.children,t):t(n,a)})}function pb(){return{buildFormOptions:obe,buildColumns:rbe,registerMergeColumnPlugin:C7,forEachColumns:Wh,doColumnsSort:fb,forEachTableColumns:Kh}}let lbe=0;const hv={};async function sbe(e){const t=e.id||`${lbe++}`,n=document.createElement("div");return new Promise((a,o)=>{let r=hv[t];r!=null&&(r.vm.exposed.open(e),a(r));const l=J(ef,{id:t,onClosed(){e.id||delete hv[t]}});l.appContext=ef._context,$l(l,n),document.body.appendChild(n);const s=l.component;r={id:t,vNode:l,vm:s,props:l.component.props},hv[t]=r,r.vm.exposed.open(e),a(r.vm.exposed)})}function ibe(){let e=null;try{e=Fe("use:form:wrapper",()=>{})()}catch(a){Lt.warn("cant inject use:form:wrapper,建议在App.vue中使用组件包裹",a)}let t=null;e==null?t=async a=>await sbe(a):t=async a=>await e.open(a);async function n(a){const{buildFormOptions:o}=pb(),r=o(a.crudOptions,a.context);return await t(r)}return{openDialog:t,openCrudFormDialog:n}}const{merge:k7}=_n(),ube=k7;function cbe(e){const{crudExpose:t}=e,{crudBinding:n}=t;sn(),ao();const{merge:a}=_n();pe(()=>{var r,l,s;return(s=(l=(r=n.value)==null?void 0:r.table)==null?void 0:l.editable)==null?void 0:s.enabled},r=>{var l,s,i,u,c;const f=(i=(s=(l=n.value)==null?void 0:l.table)==null?void 0:s.editable)==null?void 0:i.customRowHandleActive;if(f){f({enabled:r,mode:(u=n.value.table.editable)==null?void 0:u.mode,rowHandle:n.value.rowHandle});return}r?((c=n.value.table.editable)==null?void 0:c.mode)==="row"?n.value.rowHandle.active="editRow":n.value.rowHandle.active="editable":n.value.rowHandle.active="default"});const o={async enable(r,l){const s=n.value.table.editable;a(s,{enabled:!0},r),l&&l({editable:s})},disable(){var r;(r=t.getTableRef())==null||r.editable.resume(),n.value.table.editable.enabled=!1,n.value.rowHandle.active="default"},active(r){t.getTableRef().editable.active(r)},inactive(){t.getTableRef().editable.inactive()},addRow(r){t.getTableRef().editable.addRow(r)},activeCols(r){t.getTableRef().editable.activeCols(r)},resume(){t.getTableRef().editable.resume()},cancel(){t.getTableRef().editable.cancelAll()},persist(){t.getTableRef().editable.persist()},removeRow(r){t.getTableRef().editable.removeRow(r)},getEditableRow(r){var l,s;return(s=(l=t.getTableRef())==null?void 0:l.editable)==null?void 0:s.getEditableRow(r)},getActiveRows(){var r,l;return(l=(r=t.getTableRef())==null?void 0:r.editable)==null?void 0:l.getActiveRows()},async doSaveRow(r){let l=r.editableId;l||(l=r.row[n.value.table.editable.rowKey]);const s=o.getEditableRow(l);await s.save({async doSave(i){var u,c;const{isAdd:f,row:p,setData:m}=i,h=p;if(((c=(u=n.value)==null?void 0:u.mode)==null?void 0:c.name)!=="local")try{if(s.loading=!0,f){const v=await n.value.request.addRequest({form:h});m(v)}else await n.value.request.editRequest({form:h,row:h})}finally{s.loading=!1}}})},async doCancelRow(r){let l=r.editableId;l||(l=r.row[n.value.table.editable.rowKey]);const s=o.getEditableRow(l);if(s.isAdd){o.removeRow(l);return}s.cancel()},async doRemoveRow(r){let l=r.editableId;l||(l=r.row[n.value.table.editable.rowKey]);const s=o.getEditableRow(l);return await t.doRemove(r,{async handle(){return s.isAdd?(o.removeRow(l),!1):n.value.mode.name==="local"?(o.removeRow(l),{isLocal:!0}):await n.value.request.delRequest(r)}})},getInstance(){t.getTableRef().editable},eachCells(r){var l;(l=t.getTableRef().editable)==null||l.eachCells(r)},eachRows(r){var l;(l=t.getTableRef().editable)==null||l.eachRows(r)},async validate(){var r;return await((r=t.getTableRef().editable)==null?void 0:r.validate())},getTableData(r){var l;return(l=t.getTableRef().editable)==null?void 0:l.getCleanTableData(r)},getCleanTableData(r){var l;return(l=t.getTableRef().editable)==null?void 0:l.getCleanTableData(r)}};return o}function E7(e){const{crudRef:t,crudBinding:n}=e,{ui:a}=sn(),{t:o}=ao(),r=ibe();function l(){t.value==null&&Lt.warn("crudRef还未初始化,请在onMounted之后调用")}function s(){n.value==null&&Lt.warn("crudBinding还未初始化,请在useFs或useCrud之后调用")}const i={crudRef:t,crudBinding:n,getFormWrapperRef(){return t.value.formWrapperRef},getFormRef:()=>{const u=i.getFormWrapperRef();if(u==null||(u==null?void 0:u.formRef)==null){Lt.error("当前无法获取FormRef,请在编辑对话框已打开的状态下调用此方法,如果是在打开对话框时调用,可以尝试先nextTick");return}return u==null?void 0:u.formRef},getFormData:()=>{const u=i.getFormRef();return u==null?void 0:u.getFormData()},setFormData:(u,c)=>{var f;(f=i.getFormRef())==null||f.setFormData(u,c)},getFormComponentRef(u,c=!1){const f=i.getFormRef();return f==null?void 0:f.getComponentRef(u,c)},doValueBuilder(u,c){c==null&&(c=Qt(n.value.columns)),Lt.debug("doValueBuilder ,columns=",c);const f=[];Wh(c,p=>{p.valueBuilder!=null&&f.push(p)}),f.length!==0&&(dt(u,(p,m)=>{dt(f,h=>{const v=h.valueBuilder({value:on(p,h.key),row:p,form:p,index:m,key:h.key,column:h});v!=null&&!(v instanceof Promise)&&Zn(p,h.key,v)}),p.children&&Un(p.children)&&i.doValueBuilder(p.children,c)}),Lt.debug("valueBuilder success:",u))},doValueResolve({form:u},c){c==null&&(c=Qt(n.value.columns));const f=[];Wh(c,p=>{p.valueResolve!=null&&f.push(p)}),f.length!==0&&(Lt.debug("doValueResolve ,columns=",c),dt(f,p=>{const m=p.key,h=p.valueResolve({value:on(u,m),row:u,form:u,key:m,column:p});h!=null&&!(h instanceof Promise)&&Zn(u,m,h)}),Lt.debug("valueResolve success:",u))},doSearchValidate(){i.getSearchRef().doValidate()},getSearchFormData(){return n.value.search.validatedForm},getSearchValidatedFormData(){return n.value.search.validatedForm},setSearchFormData(u){if(t.value&&t.value.setSearchFormData({form:u.form,mergeForm:u.mergeForm}),u.mergeForm===!1)for(const f in n.value.search.validatedForm)delete n.value.search.validatedForm[f];const{merge:c}=_n();c(n.value.search.validatedForm,u.form),u.triggerSearch&&i.doRefresh()},getSearchRef(){var u;return l(),(u=t.value)==null?void 0:u.getSearchRef()},buildPageQuery(u){var c,f;const p=u.page;let m=u.form;m==null&&(m=Kn(i.getSearchValidatedFormData())||{},(f=(c=n.value)==null?void 0:c.search)!=null&&f.columns&&i.doValueResolve({form:m},Qt(n.value.search.columns)));let h=u.sort;h==null&&(h=n.value.table.sort||{});const v={page:p,form:m,sort:h};let g=v;return n.value.request.transformQuery&&(g=n.value.request.transformQuery(v)),g},async search(u,c={}){const f=i.buildPageQuery(u);let p;const m=d(n.value.table.disableLoading);try{c.silence!==!0&&m!==!0&&(n.value.table.loading=!0),Lt.debug("pageRequest",f),p=await n.value.request.pageRequest(f)}finally{n.value.table.loading=!1}if(p==null){Lt.warn("pageRequest返回结果不能为空");return}let h=p;return n.value.request.transformRes&&(h=n.value.request.transformRes({res:p,query:f})),h.records&&i.doValueBuilder(h.records),h},getPage(){let u={currentPage:1,pageSize:10};return n.value.pagination&&(u={currentPage:n.value.pagination[a.pagination.currentPage],pageSize:n.value.pagination.pageSize}),u},async doRefresh(u){var c,f;if(n.value.request.pageRequest==null)return;Lt.debug("do refresh:",u),n.value.pagination&&u!=null&&u.goFirstPage&&(n.value.pagination[a.pagination.currentPage]=1);const p=i.getPage(),m=await i.search({page:p},{silence:u==null?void 0:u.silence});if(m==null){Lt.error("pageRequest返回结构不正确,请配置正确的request.transformRes,期望:{currentPage>0, pageSize>0, total, records:[]},实际返回:",m);return}const{currentPage:h=p.currentPage||1,pageSize:v=p.pageSize,total:g}=m,{records:b}=m;if(b==null||!(b instanceof Array)||g==null||h==null||h<=0||isNaN(h)||v==null||v<=0||isNaN(v)){Lt.error("pageRequest返回结构不正确,请配置正确的request.transformRes,期望:{currentPage>0, pageSize>0, total, records:[]},实际返回:",m),Lt.info("如果你的不需要分页,也需要按照上面的格式返回,可以让pageSize=99999,然后配置crudOptions.pagination.show=false来隐藏分页组件");return}if(n.value.data=b,n.value.pagination&&(n.value.pagination[a.pagination.currentPage]=h,n.value.pagination.pageSize=v,n.value.pagination[a.pagination.total]=g||b.length),(u==null?void 0:u.scrollTop)??n.value.table.scrollTopOnRefreshed){const y=i.getTableRef();y==null||y.scrollTo(0)}(f=(c=n.value)==null?void 0:c.table)!=null&&f.onRefreshed&&n.value.table.onRefreshed({data:b})},getToolbarRef:()=>t.value.toolbarRef,getColumnsFilterRef:()=>i.getToolbarRef().columnsFilterRef,getColumnsFilterOriginalColumnsRef:()=>i.getColumnsFilterRef().original,getColumnsFilterColumnsRef:()=>i.getColumnsFilterRef().columns,doPageTurn(u){n.value.pagination[a.pagination.currentPage]=u},async doSearch(u){Lt.debug("do search:",u),u=k7({goFirstPage:!0},u),u.goFirstPage&&i.doPageTurn(1),u.form&&t.value&&i.setSearchFormData({form:u.form,mergeForm:u.mergeForm,refWarning:!1,triggerSearch:!1}),await i.doRefresh()},getTableRef(){var u;return l(),(u=t.value)==null?void 0:u.tableRef},getBaseTableRef(){const u=this.getTableRef();if(u==null){Lt.warn("fs-table还未挂载");return}return u.tableRef},getTableData(){return s(),n.value.data},setTableData(u){s(),n.value.data=u},insertTableRow(u,c){s(),n.value.data.splice(u,0,c)},updateTableRow(u,c,f=!0){f?n.value.data[u]=ube(n.value.data[u],c):n.value.data[u]=c},removeTableRow(u){s(),n.value.data.splice(u,1)},removeTableRowByRowKey:(u,c)=>{s(),c==null&&(c=n.value.data);for(let f=0;fAr(()=>import("./index-64865240-B3tEj8Ws.js"),[])});let t=null;return dt(e,n=>{t=n}),(await t()).exportUtil}function fbe({originalRow:e,row:t,key:n,col:a}){var o;const r=e[n],l=(o=a.component)==null?void 0:o.dict;if(l&&r!=null){const s=l.getNodesFromDataMap(r);if(s!=null&&s.length>0){const i=E_(s,u=>l.getLabel(u)||l.getValue(u)).join("|");i!=null&&i!==""&&(t[n]=i)}}return t}async function pbe(e,t={}){if(t.server){const u=e.getPage(),c=e.buildPageQuery({page:u});await t.server(c);return}const n=e.crudBinding;let a=t.columns;a==null&&(a=[],dt(n.value.table.columnsMap,u=>{if(!(t.columnFilter&&t.columnFilter(u)===!1)&&!(t.onlyShow&&d(u.show)===!1)&&u.exportable!==!1&&u.key!=="_index"){const c={key:u.key,title:u.title};a.push(c)}}));for(const u of a){const c=n.value.table.columnsMap[u.key];u.columnProps=c||{},t.columnBuilder&&t.columnBuilder({col:u})}const{merge:o}=_n(),r=await dbe(),l=[];let s=n.value.data;if(t.dataFrom==="search"){const u=o({page:{currentPage:1,pageSize:99999999}},n.value.toolbar.export.searchParams);s=(await e.search(u,{silence:!0})).records}for(const u of s){const c=Kn(u);dt(a,f=>{const p=f.columnProps,m={row:c,originalRow:u,key:f.key,col:p,exportCol:f};t.autoUseDictLabel!==!1&&fbe(m),t.dataFormatter&&t.dataFormatter(m)}),l.push(c)}const i=o({columns:a,data:l,filename:"table",noHeader:!1,separator:",",quoted:!1},{...t});t.fileType==="excel"?await r.excel(i):await r.csv(i)}const T7={};function M7(e,t,n={}){T7[e]={handle:t,opts:n}}function hbe(e){return T7[e]}M7("rowSelection",(e,t,n)=>{const a=t.crudExpose.crudBinding;function o(){var s,i;return((i=(s=a.value)==null?void 0:s.table)==null?void 0:i.rowKey)||"id"}const{ui:r}=sn();if(!e){Lt.warn("请配置settings.plugins.rowSelection.props参数");return}let l=r.table;return(n==null?void 0:n.table.tableVersion)=="v2"&&(l=r.tableV2),l.buildSelectionCrudOptions({crossPage:e.crossPage,getRowKey:o,getPageData(){return a.value.data},useCompute:()=>kr(),selectionFixed:e.selectionFixed,multiple:e.multiple,selectedRowKeys:e.selectedRowKeys,onSelectedKeysChanged:async s=>{const i=e.selectedRowKeys instanceof Function?e.selectedRowKeys():e.selectedRowKeys;i.value=[...s],await Oe(),e.onSelectedChanged&&e.onSelectedChanged(i.value)}})},{before:!0,order:-2});M7("mobile",(e,t,n)=>{const a=n.rowHandle,o=a.buttons;let r={};for(const s in o){const i=o[s];nn(i.dropdown)?r=i:r[s]={...i,dropdown:x(()=>e.isMobile.value?!0:i.dropdown)}}let l=a.width;return(l==null||!nn(l))&&(l=x(()=>{var s;return e.isMobile.value?((s=e==null?void 0:e.rowHandle)==null?void 0:s.width)||60:a.width||250})),{rowHandle:{width:l,buttons:r}}},{before:!1,order:-2});const{merge:rs}=_n();function mbe(e){e.context==null&&(e.context={});const t=zn.get(),{t:n}=ao(),a=E=>x(()=>n(E));let o=e.crudOptions;const r=e.expose||e.crudExpose;if(!r)throw new Error("crudExpose不能为空,请给useCrud传入{crudExpose}参数");const l=r,{crudBinding:s}=l,{doRefresh:i,doValueResolve:u}=l;function c(){return{pagination:{...t.pagination.onChange({setCurrentPage(E){s.value.pagination[t.pagination.currentPage]=E,s.value.pagination._onCurrentChange&&s.value.pagination._onCurrentChange({current:E,pagination:s.value.pagination})},setPageSize(E){s.value.pagination.pageSize=E,s.value.pagination[t.pagination.currentPage]=1,s.value.pagination._onPageSizeChange&&s.value.pagination._onPageSizeChange({pageSize:E,current:1,pagination:s.value.pagination})},async doAfterChange(){return await i()}})}}}function f(){return{form:{async doSubmit(E){var O,I,$,z;if(E.mode==="edit")if(u(E),((O=o.mode)==null?void 0:O.name)==="local")l.updateTableRow(E.index,E.form,o.mode.isMergeWhenUpdate);else return(I=s.value.request)!=null&&I.editRequest||Lt.warn("request.editRequest 未定义,无法保存"),await s.value.request.editRequest(E);else if(E.mode==="add")if(u(E),(($=o.mode)==null?void 0:$.name)==="local"){const q=o.mode.isAppendWhenAdd?l.getTableData().length:0;l.insertTableRow(q,E.form)}else return(z=s.value.request)!=null&&z.addRequest||Lt.warn("request.addRequest 未定义,无法保存"),await s.value.request.addRequest(E)},async onSuccess({mode:E}){E==="edit"?await i({scrollTop:!1}):E==="add"?await i({scrollTop:!0,goFirstPage:!0}):await i()}}}}function p(){return{rowHandle:{buttons:{remove:{click:async E=>{E.row=E[t.tableColumn.row],await l.doRemove(E)}},copy:{show:!1,click:async E=>{E.row=E[t.tableColumn.row],await l.openCopy({row:E.row,index:E.index})}},edit:{click:async E=>{E.row=E[t.tableColumn.row],await l.openEdit({row:E.row,index:E.index})}},view:{click:async E=>{E.row=E[t.tableColumn.row],await l.openView({row:E.row,index:E.index})}}}}}}function m(){return{search:{buttons:{search:{loading:x(()=>{var E,O;return(O=(E=s.value)==null?void 0:E.table)==null?void 0:O.loading})}},on_reset(){s.value.table.sort={},Kh(s.value.table.columns,O=>{O.sortOrder=!1});const E=r.getBaseTableRef();E!=null&&E.clearSort&&E.clearSort()},on_search(){r.doRefresh({goFirstPage:!0})},"onUpdate:form":E=>{s.value.search.form=E},"onUpdate:validatedForm":E=>{s.value.search.validatedForm=E},"onUpdate:collapse":E=>{s.value.search.collapse=E},container:{collapse:!0,"onUpdate:collapse":E=>{s.value.search.container.collapse=E}}}}}function h(){return{tabs:{},onTabChange(E){r.setSearchFormData({form:E,mergeForm:!0}),i()}}}function v(){const E=F(!1);return{toolbar:{buttons:{refresh:{type:"primary",icon:t.icons.refresh,title:a("fs.toolbar.refresh.title"),order:1,circle:!0,click:async()=>{await r.doRefresh({scrollTop:!1})}},search:{type:x(()=>s.value.search.show!==!1?"primary":"default"),icon:t.icons.search,title:a("fs.toolbar.search.title"),order:2,circle:!0,click:()=>{s.value.search.show=!s.value.search.show}},compact:{type:x(()=>s.value.toolbar.compact?"primary":"default"),icon:t.icons.compact,title:a("fs.toolbar.compact.title"),order:3,circle:!0,click:()=>{s.value.toolbar.compact=!s.value.toolbar.compact}},export:{show:!0,type:"primary",icon:t.icons.export,order:4,loading:E,title:a("fs.toolbar.export.title"),circle:!0,click:async()=>{E.value=!0;try{await pbe(r,s.value.toolbar.export)}finally{E.value=!1}}},columns:{type:"primary",icon:t.icons.columnsFilter,title:a("fs.toolbar.columns.title"),circle:!0,order:5}},"onUpdate:columns"(O){const I=s.value.table.columns;function $(q,W){const j={};return dt(W,N=>{const V=q[N.key];if(V){if(V.columnSetShow===!1){j[N.key]=V;return}delete V.order;const H=rs({...V},N);j[N.key]=H,V.children&&(H.children=$(V.children,N.children))}}),j}const z=$(I,O);s.value.table.columns=z,s.value.table.columnsMap=db({},z)}}}}function g(){return{table:{onSortChange(E){const{isServerSort:O,prop:I,asc:$,order:z}=E;Kh(s.value.table.columns,W=>{W.key===I?W.sortOrder=z:W.sortOrder=!1});const q=s.value.table.sort;s.value.table.sort=O?{prop:I,order:z,asc:$}:null,(O||q!=null)&&l.doRefresh()}}}}function b(){return{actionbar:{buttons:{add:{click(){l.openAdd({})}}}}}}function y(){const{compute:E}=kr();return{actionbar:{buttons:{addRow:{show:!1,text:a("fs.actionbar.add"),type:"primary",click:()=>{l.editable.addRow()}}}},rowHandle:{group:{editable:{remove:{text:"删除",...t.button.colors("danger"),click:async O=>{const{index:I,row:$}=O,z=$[s.value.table.editable.rowKey];await l.editable.doRemoveRow({editableId:z,row:$})}}},editRow:{edit:{text:"编辑",loading:E(O=>{const{index:I,row:$}=O,z=$[s.value.table.editable.rowKey],q=l.editable.getEditableRow(z);return!!(q!=null&&q.loading)}),click:async O=>{var I;const{index:$,row:z}=O,q=z[s.value.table.editable.rowKey];if(s.value.table.editable.exclusive){const W=l.editable.getActiveRows();dt(W,j=>{s.value.table.editable.exclusiveEffect==="save"?l.editable.doSaveRow({row:j.rowData}):l.editable.doCancelRow({row:j.rowData})})}(I=l.editable.getEditableRow(q))==null||I.active()},show:E(O=>{var I,$;const{index:z,row:q}=O,W=q[s.value.table.editable.rowKey];return!(($=(I=l.editable)==null?void 0:I.getEditableRow(W))!=null&&$.isEditing)})},save:{text:"保存",loading:!1,click:async O=>{const{index:I,row:$}=O;await l.editable.doSaveRow({row:$})},show:E(O=>{var I,$;const{index:z,row:q}=O,W=q[s.value.table.editable.rowKey];return!!(($=(I=l.editable)==null?void 0:I.getEditableRow(W))!=null&&$.isEditing)})},cancel:{text:"取消",click:async O=>{var I;const{index:$,row:z}=O;await((I=l.editable)==null?void 0:I.doCancelRow({row:z}))},show:E(O=>{var I,$;const{index:z,row:q}=O,W=q[s.value.table.editable.rowKey];return!!(($=(I=l.editable)==null?void 0:I.getEditableRow(W))!=null&&$.isEditing)})},remove:{text:"删除",...t.button.colors("danger"),click:async O=>{var I;const{index:$,row:z}=O,q=z[s.value.table.editable.rowKey];await((I=l.editable)==null?void 0:I.doRemoveRow({row:z,editableId:q}))}}}}}}}const{cloneDeep:w}=_n();function _(E){E.search.validatedForm=w(E.search.initialForm)}function S(E){var O;const I={value:null};let $=w(E);const z=Zd.commonOptions(e),q=Zd.defaultOptions({t:n,crudOptionsRef:I});o=rs({},q,z,$),I.value=o;const W=d(o.settings);if(W){const H=d(W.plugins);dt(H,(Y,P)=>{if(Y.enabled===!1)return;let D=Y.handle,B={};if(D==null){const ce=hbe(P);ce!=null&&(D=ce.handle,B=ce.opts)}if(D==null)return;const U=Y.before??B.before,X=D(Y.props,e,o);U!==!1?$=rs(X,$):$=rs($,X)})}const j=rs(q,c(),f(),p(),m(),h(),v(),g(),b(),y(),z,$),{buildColumns:N}=pb(),V=N(j);return _(V),(O=V==null?void 0:V.settings)!=null&&O.onUseCrud&&V.settings.onUseCrud(V),V}function k(E){s.value=S(E),Lt.info("fast-crud inited, crudBinding=",s.value)}function T(E){const O=rs({},o,E);return k(O),o=O,O}k(o);function R(E){rs(s.value,E)}return{appendCrudOptions:T,resetCrudOptions:k,appendCrudBinding:R,rebuildCrudBindings:S}}function O7(e){const{createCrudOptions:t,crudExposeRef:n}=e,a=e.crudRef||F(),o=e.crudBinding||F({});let r=e.crudExpose;r||(r=E7({crudRef:a,crudBinding:o}).crudExpose),n&&!n.value&&(n.value=r),e.context==null&&(e.context={});const l=e.context;e.onExpose&&e.onExpose({crudRef:a,crudBinding:o,crudExpose:r,context:l});const s=t({...e,crudExpose:r,expose:r,context:l});function i(u){const c={crudExpose:r,...u,context:l};rs(u.crudOptions,e.crudOptionsOverride);const f=mbe(c);return{...u,...f,crudRef:a,crudExpose:r,crudBinding:o,context:l}}return s instanceof Promise?s.then(u=>i(u)):i(s)}function r_e(e){return O7(e)}function vbe(e){return O7(e)}function gbe(){const e=F(),t=F(),n={},{crudExpose:a}=E7({crudBinding:t,crudRef:e});return{crudRef:e,crudBinding:t,context:n,crudExpose:a}}function zs(e,t,n="modelValue"){const a=zn.get();let o=e.dict;o&&o.prototype&&(o.clear(),o=Os(Kn(e.dict)),o.cloneable=!1,o.clear());function r(){return x(()=>{let _=[];if(e.options?_=e.options:o&&o.data!=null&&(o.data instanceof Array||ys.logger.warn("dict.data类型错误,期望为数组,实际:",o.data),_=o.data,e.transformDictData&&(_=e.transformDictData(Kn(o.data)))),a.type==="naive"||a.type==="element"){const S=[];for(const k of _)S.push({...k,value:b(k),label:w(k)});return S}return _})}function l(){return o}const s=Fe("get:scope",function(){});function i(){const _=e[n]||t.attrs[n];return{...s(),componentRef:u,value:_}}const{proxy:u}=bt(),c=async(_=!1)=>{if(!o)return;if(o.getNodesByValues){const k=i();if(k.value==null)return;let T=k.value;Array.isArray(k.value)||(T=[k.value]),await o.appendByValues(T);return}if(o.loading)return;const S=i();if(_){await o.reloadDict(S);return}await o.loadDict(S)};c();const f=async()=>{await c(!0)},p=()=>{o&&o.clear()},m=()=>{o!=null&&(!o.prototype&&!o.cloneable||pe(()=>e[n],()=>{f()}))};pe(()=>o==null?void 0:o.data,()=>{const _=i();t.attrs.onDictChange,t.emit("dict-change",{dict:o,..._})},{immediate:!0});const h=()=>{var _;return(_=l())==null?void 0:_.data},v=(_,S)=>{let k=S;return l()&&(k=l()[S]),_[k]},g=(_,S)=>{let k=S;l()&&(k=l()[S]),delete _[k]},b=_=>v(_,"value"),y=_=>v(_,"children"),w=_=>{if(e.labelFormatter)return e.labelFormatter(_);const S=v(_,"label");return S==null?"":String(S)};return{createComputedOptions:r,loadDict:c,reloadDict:f,clearDict:p,getDictData:h,getDict:l,watchValue:m,getValue:b,getLabel:w,getChildren:y,getColor:_=>v(_,"color"),removePropValue:g,curDict:o}}const Ru=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,R7=new Set,gg=typeof process=="object"&&process?process:{},A7=(e,t,n,a)=>{typeof gg.emitWarning=="function"?gg.emitWarning(e,t,n,a):console.error(`[${n}] ${t}: ${e}`)};let qh=globalThis.AbortController,G8=globalThis.AbortSignal;var X8;if(typeof qh>"u"){G8=class{constructor(){$t(this,"onabort"),$t(this,"_onabort",[]),$t(this,"reason"),$t(this,"aborted",!1)}addEventListener(n,a){this._onabort.push(a)}},qh=class{constructor(){$t(this,"signal",new G8),t()}abort(n){var a,o;if(!this.signal.aborted){this.signal.reason=n,this.signal.aborted=!0;for(const r of this.signal._onabort)r(n);(o=(a=this.signal).onabort)==null||o.call(a,n)}}};let e=((X8=gg.env)==null?void 0:X8.LRU_CACHE_IGNORE_AC_WARNING)!=="1";const t=()=>{e&&(e=!1,A7("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",t))}}const bbe=e=>!R7.has(e),ps=e=>e&&e===Math.floor(e)&&e>0&&isFinite(e),$7=e=>ps(e)?e<=Math.pow(2,8)?Uint8Array:e<=Math.pow(2,16)?Uint16Array:e<=Math.pow(2,32)?Uint32Array:e<=Number.MAX_SAFE_INTEGER?Kp:null:null;class Kp extends Array{constructor(t){super(t),this.fill(0)}}var dd;const P7=class jc{constructor(t,n){if($t(this,"heap"),$t(this,"length"),!fe(jc,dd))throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new n(t),this.length=0}static create(t){const n=$7(t);if(!n)return[];Bt(jc,dd,!0);const a=new jc(t,n);return Bt(jc,dd,!1),a}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}};dd=new WeakMap,Jt(P7,dd,!1);let ybe=P7;var Fr,Io,Dr,Nr,fd,Kc,Ca,Vo,ha,jn,Zt,so,Fo,Ga,Ma,Wr,Oa,Br,zr,Do,Hr,pi,io,Wp,bg,pu,us,Uh,Bo,yg,N7,hu,pd,Yh,dl,ls,pl,cs,qp,mv,I7,hd,Gh,Wc,Up,Nn,Ln,Yp,vv,uu,qc,Sl,ws,Xh,wg;const wbe=class V7{constructor(t){Jt(this,Wp),Jt(this,yg),Jt(this,dl),Jt(this,pl),Jt(this,qp),Jt(this,hd),Jt(this,Wc),Jt(this,Nn),Jt(this,Yp),Jt(this,uu),Jt(this,Sl),Jt(this,Xh),Jt(this,Fr,void 0),Jt(this,Io,void 0),Jt(this,Dr,void 0),Jt(this,Nr,void 0),Jt(this,fd,void 0),Jt(this,Kc,void 0),$t(this,"ttl"),$t(this,"ttlResolution"),$t(this,"ttlAutopurge"),$t(this,"updateAgeOnGet"),$t(this,"updateAgeOnHas"),$t(this,"allowStale"),$t(this,"noDisposeOnSet"),$t(this,"noUpdateTTL"),$t(this,"maxEntrySize"),$t(this,"sizeCalculation"),$t(this,"noDeleteOnFetchRejection"),$t(this,"noDeleteOnStaleGet"),$t(this,"allowStaleOnFetchAbort"),$t(this,"allowStaleOnFetchRejection"),$t(this,"ignoreFetchAbort"),Jt(this,Ca,void 0),Jt(this,Vo,void 0),Jt(this,ha,void 0),Jt(this,jn,void 0),Jt(this,Zt,void 0),Jt(this,so,void 0),Jt(this,Fo,void 0),Jt(this,Ga,void 0),Jt(this,Ma,void 0),Jt(this,Wr,void 0),Jt(this,Oa,void 0),Jt(this,Br,void 0),Jt(this,zr,void 0),Jt(this,Do,void 0),Jt(this,Hr,void 0),Jt(this,pi,void 0),Jt(this,io,void 0),Jt(this,pu,()=>{}),Jt(this,us,()=>{}),Jt(this,Uh,()=>{}),Jt(this,Bo,()=>!1),Jt(this,hu,R=>{}),Jt(this,pd,(R,E,O)=>{}),Jt(this,Yh,(R,E,O,I)=>{if(O||I)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0}),$t(this,I7,"LRUCache");const{max:n=0,ttl:a,ttlResolution:o=1,ttlAutopurge:r,updateAgeOnGet:l,updateAgeOnHas:s,allowStale:i,dispose:u,disposeAfter:c,noDisposeOnSet:f,noUpdateTTL:p,maxSize:m=0,maxEntrySize:h=0,sizeCalculation:v,fetchMethod:g,memoMethod:b,noDeleteOnFetchRejection:y,noDeleteOnStaleGet:w,allowStaleOnFetchRejection:_,allowStaleOnFetchAbort:S,ignoreFetchAbort:k}=t;if(n!==0&&!ps(n))throw new TypeError("max option must be a nonnegative integer");const T=n?$7(n):Array;if(!T)throw new Error("invalid max value: "+n);if(Bt(this,Fr,n),Bt(this,Io,m),this.maxEntrySize=h||fe(this,Io),this.sizeCalculation=v,this.sizeCalculation){if(!fe(this,Io)&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(b!==void 0&&typeof b!="function")throw new TypeError("memoMethod must be a function if defined");if(Bt(this,Kc,b),g!==void 0&&typeof g!="function")throw new TypeError("fetchMethod must be a function if specified");if(Bt(this,fd,g),Bt(this,pi,!!g),Bt(this,ha,new Map),Bt(this,jn,new Array(n).fill(void 0)),Bt(this,Zt,new Array(n).fill(void 0)),Bt(this,so,new T(n)),Bt(this,Fo,new T(n)),Bt(this,Ga,0),Bt(this,Ma,0),Bt(this,Wr,ybe.create(n)),Bt(this,Ca,0),Bt(this,Vo,0),typeof u=="function"&&Bt(this,Dr,u),typeof c=="function"?(Bt(this,Nr,c),Bt(this,Oa,[])):(Bt(this,Nr,void 0),Bt(this,Oa,void 0)),Bt(this,Hr,!!fe(this,Dr)),Bt(this,io,!!fe(this,Nr)),this.noDisposeOnSet=!!f,this.noUpdateTTL=!!p,this.noDeleteOnFetchRejection=!!y,this.allowStaleOnFetchRejection=!!_,this.allowStaleOnFetchAbort=!!S,this.ignoreFetchAbort=!!k,this.maxEntrySize!==0){if(fe(this,Io)!==0&&!ps(fe(this,Io)))throw new TypeError("maxSize must be a positive integer if specified");if(!ps(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");Mt(this,yg,N7).call(this)}if(this.allowStale=!!i,this.noDeleteOnStaleGet=!!w,this.updateAgeOnGet=!!l,this.updateAgeOnHas=!!s,this.ttlResolution=ps(o)||o===0?o:1,this.ttlAutopurge=!!r,this.ttl=a||0,this.ttl){if(!ps(this.ttl))throw new TypeError("ttl must be a positive integer if specified");Mt(this,Wp,bg).call(this)}if(fe(this,Fr)===0&&this.ttl===0&&fe(this,Io)===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!fe(this,Fr)&&!fe(this,Io)){const R="LRU_CACHE_UNBOUNDED";bbe(R)&&(R7.add(R),A7("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",R,V7))}}static unsafeExposeInternals(t){return{starts:fe(t,zr),ttls:fe(t,Do),sizes:fe(t,Br),keyMap:fe(t,ha),keyList:fe(t,jn),valList:fe(t,Zt),next:fe(t,so),prev:fe(t,Fo),get head(){return fe(t,Ga)},get tail(){return fe(t,Ma)},free:fe(t,Wr),isBackgroundFetch:n=>{var a;return Mt(a=t,Nn,Ln).call(a,n)},backgroundFetch:(n,a,o,r)=>{var l;return Mt(l=t,Wc,Up).call(l,n,a,o,r)},moveToTail:n=>{var a;return Mt(a=t,uu,qc).call(a,n)},indexes:n=>{var a;return Mt(a=t,dl,ls).call(a,n)},rindexes:n=>{var a;return Mt(a=t,pl,cs).call(a,n)},isStale:n=>{var a;return fe(a=t,Bo).call(a,n)}}}get max(){return fe(this,Fr)}get maxSize(){return fe(this,Io)}get calculatedSize(){return fe(this,Vo)}get size(){return fe(this,Ca)}get fetchMethod(){return fe(this,fd)}get memoMethod(){return fe(this,Kc)}get dispose(){return fe(this,Dr)}get disposeAfter(){return fe(this,Nr)}getRemainingTTL(t){return fe(this,ha).has(t)?1/0:0}*entries(){for(const t of Mt(this,dl,ls).call(this))fe(this,Zt)[t]!==void 0&&fe(this,jn)[t]!==void 0&&!Mt(this,Nn,Ln).call(this,fe(this,Zt)[t])&&(yield[fe(this,jn)[t],fe(this,Zt)[t]])}*rentries(){for(const t of Mt(this,pl,cs).call(this))fe(this,Zt)[t]!==void 0&&fe(this,jn)[t]!==void 0&&!Mt(this,Nn,Ln).call(this,fe(this,Zt)[t])&&(yield[fe(this,jn)[t],fe(this,Zt)[t]])}*keys(){for(const t of Mt(this,dl,ls).call(this)){const n=fe(this,jn)[t];n!==void 0&&!Mt(this,Nn,Ln).call(this,fe(this,Zt)[t])&&(yield n)}}*rkeys(){for(const t of Mt(this,pl,cs).call(this)){const n=fe(this,jn)[t];n!==void 0&&!Mt(this,Nn,Ln).call(this,fe(this,Zt)[t])&&(yield n)}}*values(){for(const t of Mt(this,dl,ls).call(this))fe(this,Zt)[t]!==void 0&&!Mt(this,Nn,Ln).call(this,fe(this,Zt)[t])&&(yield fe(this,Zt)[t])}*rvalues(){for(const t of Mt(this,pl,cs).call(this))fe(this,Zt)[t]!==void 0&&!Mt(this,Nn,Ln).call(this,fe(this,Zt)[t])&&(yield fe(this,Zt)[t])}[Symbol.iterator](){return this.entries()}find(t,n={}){for(const a of Mt(this,dl,ls).call(this)){const o=fe(this,Zt)[a],r=Mt(this,Nn,Ln).call(this,o)?o.__staleWhileFetching:o;if(r!==void 0&&t(r,fe(this,jn)[a],this))return this.get(fe(this,jn)[a],n)}}forEach(t,n=this){for(const a of Mt(this,dl,ls).call(this)){const o=fe(this,Zt)[a],r=Mt(this,Nn,Ln).call(this,o)?o.__staleWhileFetching:o;r!==void 0&&t.call(n,r,fe(this,jn)[a],this)}}rforEach(t,n=this){for(const a of Mt(this,pl,cs).call(this)){const o=fe(this,Zt)[a],r=Mt(this,Nn,Ln).call(this,o)?o.__staleWhileFetching:o;r!==void 0&&t.call(n,r,fe(this,jn)[a],this)}}purgeStale(){let t=!1;for(const n of Mt(this,pl,cs).call(this,{allowStale:!0}))fe(this,Bo).call(this,n)&&(Mt(this,Sl,ws).call(this,fe(this,jn)[n],"expire"),t=!0);return t}info(t){const n=fe(this,ha).get(t);if(n===void 0)return;const a=fe(this,Zt)[n],o=Mt(this,Nn,Ln).call(this,a)?a.__staleWhileFetching:a;if(o===void 0)return;const r={value:o};if(fe(this,Do)&&fe(this,zr)){const l=fe(this,Do)[n],s=fe(this,zr)[n];if(l&&s){const i=l-(Ru.now()-s);r.ttl=i,r.start=Date.now()}}return fe(this,Br)&&(r.size=fe(this,Br)[n]),r}dump(){const t=[];for(const n of Mt(this,dl,ls).call(this,{allowStale:!0})){const a=fe(this,jn)[n],o=fe(this,Zt)[n],r=Mt(this,Nn,Ln).call(this,o)?o.__staleWhileFetching:o;if(r===void 0||a===void 0)continue;const l={value:r};if(fe(this,Do)&&fe(this,zr)){l.ttl=fe(this,Do)[n];const s=Ru.now()-fe(this,zr)[n];l.start=Math.floor(Date.now()-s)}fe(this,Br)&&(l.size=fe(this,Br)[n]),t.unshift([a,l])}return t}load(t){this.clear();for(const[n,a]of t){if(a.start){const o=Date.now()-a.start;a.start=Ru.now()-o}this.set(n,a.value,a)}}set(t,n,a={}){var o,r,l,s,i;if(n===void 0)return this.delete(t),this;const{ttl:u=this.ttl,start:c,noDisposeOnSet:f=this.noDisposeOnSet,sizeCalculation:p=this.sizeCalculation,status:m}=a;let{noUpdateTTL:h=this.noUpdateTTL}=a;const v=fe(this,Yh).call(this,t,n,a.size||0,p);if(this.maxEntrySize&&v>this.maxEntrySize)return m&&(m.set="miss",m.maxEntrySizeExceeded=!0),Mt(this,Sl,ws).call(this,t,"set"),this;let g=fe(this,Ca)===0?void 0:fe(this,ha).get(t);if(g===void 0)g=fe(this,Ca)===0?fe(this,Ma):fe(this,Wr).length!==0?fe(this,Wr).pop():fe(this,Ca)===fe(this,Fr)?Mt(this,hd,Gh).call(this,!1):fe(this,Ca),fe(this,jn)[g]=t,fe(this,Zt)[g]=n,fe(this,ha).set(t,g),fe(this,so)[fe(this,Ma)]=g,fe(this,Fo)[g]=fe(this,Ma),Bt(this,Ma,g),hg(this,Ca)._++,fe(this,pd).call(this,g,v,m),m&&(m.set="add"),h=!1;else{Mt(this,uu,qc).call(this,g);const b=fe(this,Zt)[g];if(n!==b){if(fe(this,pi)&&Mt(this,Nn,Ln).call(this,b)){b.__abortController.abort(new Error("replaced"));const{__staleWhileFetching:y}=b;y!==void 0&&!f&&(fe(this,Hr)&&((o=fe(this,Dr))==null||o.call(this,y,t,"set")),fe(this,io)&&((r=fe(this,Oa))==null||r.push([y,t,"set"])))}else f||(fe(this,Hr)&&((l=fe(this,Dr))==null||l.call(this,b,t,"set")),fe(this,io)&&((s=fe(this,Oa))==null||s.push([b,t,"set"])));if(fe(this,hu).call(this,g),fe(this,pd).call(this,g,v,m),fe(this,Zt)[g]=n,m){m.set="replace";const y=b&&Mt(this,Nn,Ln).call(this,b)?b.__staleWhileFetching:b;y!==void 0&&(m.oldValue=y)}}else m&&(m.set="update")}if(u!==0&&!fe(this,Do)&&Mt(this,Wp,bg).call(this),fe(this,Do)&&(h||fe(this,Uh).call(this,g,u,c),m&&fe(this,us).call(this,m,g)),!f&&fe(this,io)&&fe(this,Oa)){const b=fe(this,Oa);let y;for(;y=b==null?void 0:b.shift();)(i=fe(this,Nr))==null||i.call(this,...y)}return this}pop(){var t;try{for(;fe(this,Ca);){const n=fe(this,Zt)[fe(this,Ga)];if(Mt(this,hd,Gh).call(this,!0),Mt(this,Nn,Ln).call(this,n)){if(n.__staleWhileFetching)return n.__staleWhileFetching}else if(n!==void 0)return n}}finally{if(fe(this,io)&&fe(this,Oa)){const n=fe(this,Oa);let a;for(;a=n==null?void 0:n.shift();)(t=fe(this,Nr))==null||t.call(this,...a)}}}has(t,n={}){const{updateAgeOnHas:a=this.updateAgeOnHas,status:o}=n,r=fe(this,ha).get(t);if(r!==void 0){const l=fe(this,Zt)[r];if(Mt(this,Nn,Ln).call(this,l)&&l.__staleWhileFetching===void 0)return!1;if(fe(this,Bo).call(this,r))o&&(o.has="stale",fe(this,us).call(this,o,r));else return a&&fe(this,pu).call(this,r),o&&(o.has="hit",fe(this,us).call(this,o,r)),!0}else o&&(o.has="miss");return!1}peek(t,n={}){const{allowStale:a=this.allowStale}=n,o=fe(this,ha).get(t);if(o===void 0||!a&&fe(this,Bo).call(this,o))return;const r=fe(this,Zt)[o];return Mt(this,Nn,Ln).call(this,r)?r.__staleWhileFetching:r}async fetch(t,n={}){const{allowStale:a=this.allowStale,updateAgeOnGet:o=this.updateAgeOnGet,noDeleteOnStaleGet:r=this.noDeleteOnStaleGet,ttl:l=this.ttl,noDisposeOnSet:s=this.noDisposeOnSet,size:i=0,sizeCalculation:u=this.sizeCalculation,noUpdateTTL:c=this.noUpdateTTL,noDeleteOnFetchRejection:f=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:p=this.allowStaleOnFetchRejection,ignoreFetchAbort:m=this.ignoreFetchAbort,allowStaleOnFetchAbort:h=this.allowStaleOnFetchAbort,context:v,forceRefresh:g=!1,status:b,signal:y}=n;if(!fe(this,pi))return b&&(b.fetch="get"),this.get(t,{allowStale:a,updateAgeOnGet:o,noDeleteOnStaleGet:r,status:b});const w={allowStale:a,updateAgeOnGet:o,noDeleteOnStaleGet:r,ttl:l,noDisposeOnSet:s,size:i,sizeCalculation:u,noUpdateTTL:c,noDeleteOnFetchRejection:f,allowStaleOnFetchRejection:p,allowStaleOnFetchAbort:h,ignoreFetchAbort:m,status:b,signal:y};let _=fe(this,ha).get(t);if(_===void 0){b&&(b.fetch="miss");const S=Mt(this,Wc,Up).call(this,t,_,w,v);return S.__returned=S}else{const S=fe(this,Zt)[_];if(Mt(this,Nn,Ln).call(this,S)){const E=a&&S.__staleWhileFetching!==void 0;return b&&(b.fetch="inflight",E&&(b.returnedStale=!0)),E?S.__staleWhileFetching:S.__returned=S}const k=fe(this,Bo).call(this,_);if(!g&&!k)return b&&(b.fetch="hit"),Mt(this,uu,qc).call(this,_),o&&fe(this,pu).call(this,_),b&&fe(this,us).call(this,b,_),S;const T=Mt(this,Wc,Up).call(this,t,_,w,v),R=T.__staleWhileFetching!==void 0&&a;return b&&(b.fetch=k?"stale":"refresh",R&&k&&(b.returnedStale=!0)),R?T.__staleWhileFetching:T.__returned=T}}async forceFetch(t,n={}){const a=await this.fetch(t,n);if(a===void 0)throw new Error("fetch() returned undefined");return a}memo(t,n={}){const a=fe(this,Kc);if(!a)throw new Error("no memoMethod provided to constructor");const{context:o,forceRefresh:r,...l}=n,s=this.get(t,l);if(!r&&s!==void 0)return s;const i=a(t,s,{options:l,context:o});return this.set(t,i,l),i}get(t,n={}){const{allowStale:a=this.allowStale,updateAgeOnGet:o=this.updateAgeOnGet,noDeleteOnStaleGet:r=this.noDeleteOnStaleGet,status:l}=n,s=fe(this,ha).get(t);if(s!==void 0){const i=fe(this,Zt)[s],u=Mt(this,Nn,Ln).call(this,i);return l&&fe(this,us).call(this,l,s),fe(this,Bo).call(this,s)?(l&&(l.get="stale"),u?(l&&a&&i.__staleWhileFetching!==void 0&&(l.returnedStale=!0),a?i.__staleWhileFetching:void 0):(r||Mt(this,Sl,ws).call(this,t,"expire"),l&&a&&(l.returnedStale=!0),a?i:void 0)):(l&&(l.get="hit"),u?i.__staleWhileFetching:(Mt(this,uu,qc).call(this,s),o&&fe(this,pu).call(this,s),i))}else l&&(l.get="miss")}delete(t){return Mt(this,Sl,ws).call(this,t,"delete")}clear(){return Mt(this,Xh,wg).call(this,"delete")}};I7=Symbol.toStringTag,Fr=new WeakMap,Io=new WeakMap,Dr=new WeakMap,Nr=new WeakMap,fd=new WeakMap,Kc=new WeakMap,Ca=new WeakMap,Vo=new WeakMap,ha=new WeakMap,jn=new WeakMap,Zt=new WeakMap,so=new WeakMap,Fo=new WeakMap,Ga=new WeakMap,Ma=new WeakMap,Wr=new WeakMap,Oa=new WeakMap,Br=new WeakMap,zr=new WeakMap,Do=new WeakMap,Hr=new WeakMap,pi=new WeakMap,io=new WeakMap,Wp=new WeakSet,bg=function(){const e=new Kp(fe(this,Fr)),t=new Kp(fe(this,Fr));Bt(this,Do,e),Bt(this,zr,t),Bt(this,Uh,(o,r,l=Ru.now())=>{if(t[o]=r!==0?l:0,e[o]=r,r!==0&&this.ttlAutopurge){const s=setTimeout(()=>{fe(this,Bo).call(this,o)&&Mt(this,Sl,ws).call(this,fe(this,jn)[o],"expire")},r+1);s.unref&&s.unref()}}),Bt(this,pu,o=>{t[o]=e[o]!==0?Ru.now():0}),Bt(this,us,(o,r)=>{if(e[r]){const l=e[r],s=t[r];if(!l||!s)return;o.ttl=l,o.start=s,o.now=n||a();const i=o.now-s;o.remainingTTL=l-i}});let n=0;const a=()=>{const o=Ru.now();if(this.ttlResolution>0){n=o;const r=setTimeout(()=>n=0,this.ttlResolution);r.unref&&r.unref()}return o};this.getRemainingTTL=o=>{const r=fe(this,ha).get(o);if(r===void 0)return 0;const l=e[r],s=t[r];if(!l||!s)return 1/0;const i=(n||a())-s;return l-i},Bt(this,Bo,o=>{const r=t[o],l=e[o];return!!l&&!!r&&(n||a())-r>l})},pu=new WeakMap,us=new WeakMap,Uh=new WeakMap,Bo=new WeakMap,yg=new WeakSet,N7=function(){const e=new Kp(fe(this,Fr));Bt(this,Vo,0),Bt(this,Br,e),Bt(this,hu,t=>{Bt(this,Vo,fe(this,Vo)-e[t]),e[t]=0}),Bt(this,Yh,(t,n,a,o)=>{if(Mt(this,Nn,Ln).call(this,n))return 0;if(!ps(a))if(o){if(typeof o!="function")throw new TypeError("sizeCalculation must be a function");if(a=o(n,t),!ps(a))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return a}),Bt(this,pd,(t,n,a)=>{if(e[t]=n,fe(this,Io)){const o=fe(this,Io)-e[t];for(;fe(this,Vo)>o;)Mt(this,hd,Gh).call(this,!0)}Bt(this,Vo,fe(this,Vo)+e[t]),a&&(a.entrySize=n,a.totalCalculatedSize=fe(this,Vo))})},hu=new WeakMap,pd=new WeakMap,Yh=new WeakMap,dl=new WeakSet,ls=function*({allowStale:e=this.allowStale}={}){if(fe(this,Ca))for(let t=fe(this,Ma);!(!Mt(this,qp,mv).call(this,t)||((e||!fe(this,Bo).call(this,t))&&(yield t),t===fe(this,Ga)));)t=fe(this,Fo)[t]},pl=new WeakSet,cs=function*({allowStale:e=this.allowStale}={}){if(fe(this,Ca))for(let t=fe(this,Ga);!(!Mt(this,qp,mv).call(this,t)||((e||!fe(this,Bo).call(this,t))&&(yield t),t===fe(this,Ma)));)t=fe(this,so)[t]},qp=new WeakSet,mv=function(e){return e!==void 0&&fe(this,ha).get(fe(this,jn)[e])===e},hd=new WeakSet,Gh=function(e){var t,n;const a=fe(this,Ga),o=fe(this,jn)[a],r=fe(this,Zt)[a];return fe(this,pi)&&Mt(this,Nn,Ln).call(this,r)?r.__abortController.abort(new Error("evicted")):(fe(this,Hr)||fe(this,io))&&(fe(this,Hr)&&((t=fe(this,Dr))==null||t.call(this,r,o,"evict")),fe(this,io)&&((n=fe(this,Oa))==null||n.push([r,o,"evict"]))),fe(this,hu).call(this,a),e&&(fe(this,jn)[a]=void 0,fe(this,Zt)[a]=void 0,fe(this,Wr).push(a)),fe(this,Ca)===1?(Bt(this,Ga,Bt(this,Ma,0)),fe(this,Wr).length=0):Bt(this,Ga,fe(this,so)[a]),fe(this,ha).delete(o),hg(this,Ca)._--,a},Wc=new WeakSet,Up=function(e,t,n,a){const o=t===void 0?void 0:fe(this,Zt)[t];if(Mt(this,Nn,Ln).call(this,o))return o;const r=new qh,{signal:l}=n;l==null||l.addEventListener("abort",()=>r.abort(l.reason),{signal:r.signal});const s={signal:r.signal,options:n,context:a},i=(h,v=!1)=>{const{aborted:g}=r.signal,b=n.ignoreFetchAbort&&h!==void 0;if(n.status&&(g&&!v?(n.status.fetchAborted=!0,n.status.fetchError=r.signal.reason,b&&(n.status.fetchAbortIgnored=!0)):n.status.fetchResolved=!0),g&&!b&&!v)return c(r.signal.reason);const y=p;return fe(this,Zt)[t]===p&&(h===void 0?y.__staleWhileFetching?fe(this,Zt)[t]=y.__staleWhileFetching:Mt(this,Sl,ws).call(this,e,"fetch"):(n.status&&(n.status.fetchUpdated=!0),this.set(e,h,s.options))),h},u=h=>(n.status&&(n.status.fetchRejected=!0,n.status.fetchError=h),c(h)),c=h=>{const{aborted:v}=r.signal,g=v&&n.allowStaleOnFetchAbort,b=g||n.allowStaleOnFetchRejection,y=b||n.noDeleteOnFetchRejection,w=p;if(fe(this,Zt)[t]===p&&(!y||w.__staleWhileFetching===void 0?Mt(this,Sl,ws).call(this,e,"fetch"):g||(fe(this,Zt)[t]=w.__staleWhileFetching)),b)return n.status&&w.__staleWhileFetching!==void 0&&(n.status.returnedStale=!0),w.__staleWhileFetching;if(w.__returned===w)throw h},f=(h,v)=>{var g;const b=(g=fe(this,fd))==null?void 0:g.call(this,e,o,s);b&&b instanceof Promise&&b.then(y=>h(y===void 0?void 0:y),v),r.signal.addEventListener("abort",()=>{(!n.ignoreFetchAbort||n.allowStaleOnFetchAbort)&&(h(void 0),n.allowStaleOnFetchAbort&&(h=y=>i(y,!0)))})};n.status&&(n.status.fetchDispatched=!0);const p=new Promise(f).then(i,u),m=Object.assign(p,{__abortController:r,__staleWhileFetching:o,__returned:void 0});return t===void 0?(this.set(e,m,{...s.options,status:void 0}),t=fe(this,ha).get(e)):fe(this,Zt)[t]=m,m},Nn=new WeakSet,Ln=function(e){if(!fe(this,pi))return!1;const t=e;return!!t&&t instanceof Promise&&t.hasOwnProperty("__staleWhileFetching")&&t.__abortController instanceof qh},Yp=new WeakSet,vv=function(e,t){fe(this,Fo)[t]=e,fe(this,so)[e]=t},uu=new WeakSet,qc=function(e){e!==fe(this,Ma)&&(e===fe(this,Ga)?Bt(this,Ga,fe(this,so)[e]):Mt(this,Yp,vv).call(this,fe(this,Fo)[e],fe(this,so)[e]),Mt(this,Yp,vv).call(this,fe(this,Ma),e),Bt(this,Ma,e))},Sl=new WeakSet,ws=function(e,t){var n,a,o,r;let l=!1;if(fe(this,Ca)!==0){const s=fe(this,ha).get(e);if(s!==void 0)if(l=!0,fe(this,Ca)===1)Mt(this,Xh,wg).call(this,t);else{fe(this,hu).call(this,s);const i=fe(this,Zt)[s];if(Mt(this,Nn,Ln).call(this,i)?i.__abortController.abort(new Error("deleted")):(fe(this,Hr)||fe(this,io))&&(fe(this,Hr)&&((n=fe(this,Dr))==null||n.call(this,i,e,t)),fe(this,io)&&((a=fe(this,Oa))==null||a.push([i,e,t]))),fe(this,ha).delete(e),fe(this,jn)[s]=void 0,fe(this,Zt)[s]=void 0,s===fe(this,Ma))Bt(this,Ma,fe(this,Fo)[s]);else if(s===fe(this,Ga))Bt(this,Ga,fe(this,so)[s]);else{const u=fe(this,Fo)[s];fe(this,so)[u]=fe(this,so)[s];const c=fe(this,so)[s];fe(this,Fo)[c]=fe(this,Fo)[s]}hg(this,Ca)._--,fe(this,Wr).push(s)}}if(fe(this,io)&&(o=fe(this,Oa))!=null&&o.length){const s=fe(this,Oa);let i;for(;i=s==null?void 0:s.shift();)(r=fe(this,Nr))==null||r.call(this,...i)}return l},Xh=new WeakSet,wg=function(e){var t,n,a;for(const o of Mt(this,pl,cs).call(this,{allowStale:!0})){const r=fe(this,Zt)[o];if(Mt(this,Nn,Ln).call(this,r))r.__abortController.abort(new Error("deleted"));else{const l=fe(this,jn)[o];fe(this,Hr)&&((t=fe(this,Dr))==null||t.call(this,r,l,e)),fe(this,io)&&((n=fe(this,Oa))==null||n.push([r,l,e]))}}if(fe(this,ha).clear(),fe(this,Zt).fill(void 0),fe(this,jn).fill(void 0),fe(this,Do)&&fe(this,zr)&&(fe(this,Do).fill(0),fe(this,zr).fill(0)),fe(this,Br)&&fe(this,Br).fill(0),Bt(this,Ga,0),Bt(this,Ma,0),fe(this,Wr).length=0,Bt(this,Vo,0),Bt(this,Ca,0),fe(this,io)&&fe(this,Oa)){const o=fe(this,Oa);let r;for(;r=o==null?void 0:o.shift();)(a=fe(this,Nr))==null||a.call(this,...r)}};let Cbe=wbe;const fp=new Cbe({max:500,maxSize:5e3,ttl:1e3*60*30,sizeCalculation:(e,t)=>1}),{UnMergeable:_be}=_n();function Sbe(e){L7=e}let L7=async e=>(Lt.warn("请配置 app.use(FsCrud,{dictRequest:(context)=>{ 你的字典请求方法 }})"),[]);class F7 extends _be{constructor(t){super(),$t(this,"cache",!1),$t(this,"prototype",!1),$t(this,"immediate",!0),$t(this,"url"),$t(this,"getData"),$t(this,"value","value"),$t(this,"label","label"),$t(this,"labelBuilder"),$t(this,"children","children"),$t(this,"color","color"),$t(this,"isTree",!1),$t(this,"_data",null),$t(this,"originalData"),$t(this,"dataMap",{}),$t(this,"loading",!1),$t(this,"custom",{}),$t(this,"getNodesByValues"),$t(this,"onReady"),$t(this,"notifies",[]),$t(this,"_unfetchValues",{}),Object.defineProperty(this,"loading",{value:!1,enumerable:!1}),Object.defineProperty(this,"notifies",{value:!1,enumerable:!1}),Object.defineProperty(this,"originalData",{value:null,enumerable:!1}),this.loading=!1,Fs(this,t),t.data!=null&&(this.originalData=t.data,this.setData(t.data)),this.toMap()}get data(){return this._data}set data(t){this._data=t,this.toMap()}isDynamic(){return this.url instanceof Function||this.getData instanceof Function||this.prototype}setData(t){this.data=t}async _loadDict(t){if(this.data&&!t.reload)return this.data;if(this.loading)return this._registerNotify();let n=null;if(this.getNodesByValues){if(t.value){let a=null;this.cache&&this.url&&(a=this.url+t.value);let o=null;if(a&&(o=fp.get(a)),o)n=o;else{const r=Array.isArray(t.value)?t.value:[t.value];if(n=await this.getNodesByValues(r,t),n!=null&&!(n instanceof Array)){Lt.error("getNodesByValues需要返回数组,当前返回值:",n);return}a&&fp.set(a,n)}}}else if(this.originalData)n=this.originalData;else{this.loading=!0;try{n=await this.getRemoteDictData(t)}finally{this.loading=!1}}this.data=n,this.onReady&&this.onReady({dict:this,...t}),this._triggerNotify()}_triggerNotify(){this.notifies&&this.notifies.length>0&&(dt(this.notifies,t=>{t(this.data)}),this.notifies.length=0)}_registerNotify(){let t=null;const n=new Promise(a=>{t=o=>{a(o)}});return this.notifies||(this.notifies=[]),this.notifies.push(t),n}async loadDict(t){return await this._loadDict({...t})}async reloadDict(t){return await this.loadDict({...t,reload:!0})}async appendByValues(t){if(this.getNodesByValues==null){Lt.warn("请配置getNodesByValues");return}for(const a of t)this.dataMap[a]||this._unfetchValues[a]||(this._unfetchValues[a]={loading:!1,value:a});await Oe(),await Oe(),await Oe();const n=[];if(dt(this._unfetchValues,a=>{a.loading||(a.loading=!0,n.push(a.value))}),n.length>0){const a=await this.getNodesByValues(n);this.setData([...this.data||[],...a]);for(const o of n)delete this._unfetchValues[o];return Object.keys(this._unfetchValues).length===0&&this._triggerNotify(),this.data}else return this._registerNotify()}clear(){this.originalData=null,this.setData(null)}async getRemoteDictData(t){let n,a,o;if(this.url&&(o=this.url,o instanceof Function&&(o=o({...t,dict:this})),a=o),this.getData!=null)n=async()=>{const r=await this.getData({url:o,dict:this,...t});return Array.isArray(r)?r:[]};else if(o)n=async()=>{const r=await L7({url:o,dict:this});return Array.isArray(r)?r:[]};else return[];if(this.cache&&a){let r=fp.get(a);if(r==null)r={loaded:!1,loading:!0,data:void 0,callback:[]},fp.set(a,r);else{if(r.loaded)return r.data;if(r.loading)return new Promise(l=>{const s=i=>{l(i)};r.callback.push(s)})}try{r.loaded=!1,r.loading=!0;let l=await n();l=l||[],l instanceof Array||Lt.warn("dict data 格式有误,期望格式为数组,实际格式为:",l),r.data=l,r.loaded=!0,r.loading=!1;for(const s of r.callback)s(l);return r.callback=[],l}catch(l){r.loading=!1,r.loaded=!1,Lt.error("load dict error:",l)}}return await n()}toMap(){if(this._data==null){this.dataMap={};return}const t={};this.data&&this.buildMap(t,this.data||[]),this.dataMap=t}buildMap(t,n){dt(n,a=>{t[this.getValue(a)]=a,this.isTree&&this.getChildren(a)&&this.buildMap(t,this.getChildren(a))})}getValue(t){return t[this.value]}getLabel(t){return this.labelBuilder?this.labelBuilder(t):t[this.label]}getChildren(t){return t[this.children]}getColor(t){return t[this.color]}getDictData(){return this.data}getDictMap(){return this.dataMap}getNodeByValue(t){return this.dataMap[t]}getNodesFromDataMap(t){if(t==null)return[];Un(t)||(t=[t]);const n=[];return dt(t,a=>{const o=this.dataMap[a];o?n.push(o):n.push({[this.value]:a})}),n}}function xbe(e){const t=Os(new F7(e));return!t.prototype&&t.immediate&&t.loadDict(),t}function kbe(){return{dict:xbe,setDictRequest:Sbe,Dict:F7}}async function Ebe(e){await Oe();const t=e.getModal();if(t==null)return;const n=t.querySelector(".ant-modal-header");if(n==null)return;const a=t,o=t.style;n.style.cursor="move",n.onmousedown=r=>{const l=r.clientX,s=r.clientY;a.style.transform="translate(0px, 0px)";let i,u;o.left.includes("%")?(i=+document.body.clientWidth*(+o.left.replace(/%/g,"")/100),u=+document.body.clientHeight*(+o.top.replace(/%/g,"")/100)):(i=+o.left.replace(/px/g,""),u=+o.top.replace(/px/g,""),u=u===0?100:u),document.onmousemove=function(c){const f=c.clientX-l,p=c.clientY-s;a.style.left=`${f+i}px`,a.style.top=`${p+u}px`},document.onmouseup=function(c){document.onmousemove=null,document.onmouseup=null}}}async function Tbe(e){await Oe();const t=e.getModal();if(t==null)return;const n=t.querySelector(".n-card-header");if(n==null)return;const a=t,o=t.style;n.style.cursor="move",n.onmousedown=r=>{const l=r.clientX,s=r.clientY;a.style.transform="translate(0px, 0px)";let i,u;o.left.includes("%")?(i=+document.body.clientWidth*(+o.left.replace(/%/g,"")/100),u=+document.body.clientHeight*(+o.top.replace(/%/g,"")/100)):(i=+o.left.replace(/px/g,""),u=+o.top.replace(/px/g,"")),document.onmousemove=async function(c){if(c.clientX==0&&c.clientY==0)return;const f=c.clientX-l,p=c.clientY-s;a.style.left=`${f+i}px`,a.style.top=`${p+u}px`},document.onmouseup=function(c){document.onmousemove=null,document.onmouseup=null}}}async function Mbe(e){const{ui:t}=sn();t.type==="antdv"?await Ebe(e):t.type==="element"||await Tbe(e)}function Obe(){return{dragModal:Mbe}}const Rbe={logger:{off:{tableColumns:!1}}},Abe=K({name:"FsContainer",props:{fixedHeight:{type:Boolean,default:!0},bodyStyle:{type:Object,default:()=>({})},innerStyle:{type:Object,default:()=>({})}},setup(e,t){const{merge:n}=_n(),a=x(()=>e.fixedHeight===!1?n({position:"relative"},e.innerStyle):e.innerStyle),o=x(()=>e.fixedHeight===!1?n({flex:"unset"},e.bodyStyle):e.bodyStyle);return{computedInnerStyle:a,computedBodyStyle:o}}}),$be={class:"fs-container"},Pbe={class:"box"},Nbe={class:"header"},Ibe={class:"footer"};function Vbe(e,t,n,a,o,r){return C(),A("div",$be,[M("div",Pbe,[M("div",{class:"inner",style:Ue(e.computedInnerStyle)},[M("div",Nbe,[re(e.$slots,"header")]),M("div",{class:"body",style:Ue(e.computedBodyStyle)},[re(e.$slots,"default")],4),M("div",Ibe,[re(e.$slots,"footer")])],4)]),re(e.$slots,"box")])}const Lbe=Rn(Abe,[["render",Vbe]]),Fbe=K({name:"FsLayoutDefault"}),Dbe={class:"fs-crud-header"},Bbe={class:"fs-header-top"},zbe={class:"fs-header-middle"},Hbe={class:"fs-header-bottom"},jbe={class:"fs-crud-footer"};function Kbe(e,t,n,a,o,r){const l=He("fs-container");return C(),ae(l,{class:"fs-layout-default"},{header:te(()=>[M("div",Dbe,[M("div",Bbe,[re(e.$slots,"header-top")]),re(e.$slots,"search"),M("div",zbe,[re(e.$slots,"header-middle")]),re(e.$slots,"actionbar"),re(e.$slots,"toolbar"),M("div",Hbe,[re(e.$slots,"header-bottom")]),re(e.$slots,"tabs")])]),footer:te(()=>[M("div",jbe,[re(e.$slots,"footer-top"),re(e.$slots,"pagination"),re(e.$slots,"footer-bottom")])]),default:te(()=>[re(e.$slots,"default"),re(e.$slots,"table"),re(e.$slots,"form")]),_:3})}const Wbe=Rn(Fbe,[["render",Kbe]]),qbe=K({name:"FsLayoutCard",setup(){const e=Fe("get:crudBinding"),t=x(()=>{var o,r;return e==null?!0:(r=(o=e())==null?void 0:o.search)==null?void 0:r.show}),{ui:n}=sn(),a=F(n.card.name);return{searchShow:t,cardComponentName:a}}}),Ube={class:"fs-header-top"},Ybe={class:"fs-header-bottom"},Gbe={class:"top-bar"},Xbe={class:"top-bar"},Jbe={class:"fs-crud-footer"};function Zbe(e,t,n,a,o,r){const l=He("fs-container");return C(),ae(l,{class:"fs-layout-card"},{header:te(()=>[M("div",Ube,[re(e.$slots,"header-top")]),e.searchShow?(C(),ae(Me(e.cardComponentName),{key:0},{default:te(()=>[re(e.$slots,"search")]),_:3})):le("",!0),M("div",Ybe,[re(e.$slots,"header-bottom")])]),default:te(()=>[J(l,null,{header:te(()=>[re(e.$slots,"tabs")]),default:te(()=>[(C(),ae(Me(e.cardComponentName),{class:"fs-layout-card-body"},{title:te(()=>[M("div",Gbe,[re(e.$slots,"actionbar"),re(e.$slots,"toolbar")])]),header:te(()=>[M("div",Xbe,[re(e.$slots,"actionbar"),re(e.$slots,"toolbar")])]),default:te(()=>[J(l,null,{footer:te(()=>[M("div",Jbe,[re(e.$slots,"footer-top"),re(e.$slots,"pagination"),re(e.$slots,"footer-bottom")])]),default:te(()=>[re(e.$slots,"default"),re(e.$slots,"table"),re(e.$slots,"form")]),_:3})]),_:3}))]),_:3})]),_:3})}const Qbe=Rn(qbe,[["render",Zbe]]);function J8(e){return typeof e=="function"||Object.prototype.toString.call(e)==="[object Object]"&&!rn(e)}const eye=K({name:"FsButton",inheritAttrs:!1,props:{text:{type:String,default:"",required:!1},icon:{type:[String,Object,Function],default:"",required:!1},iconRight:{type:[String,Object,Function],default:"",required:!1},circle:{type:Boolean,default:!1,required:!1},tooltip:{type:Object,default:void 0},badge:{type:Object,default:null,required:!1},buttonProps:{type:Object,default:void 0},className:{},loading:{type:Boolean,default:void 0,required:!1}},emits:["click"],setup(e,t){const{ui:n}=sn(),{merge:a}=_n(),o=F(!1),r=x(()=>e.loading??o.value??!1),l=(m,h="fs-button-icon")=>{if(m!=null)return typeof m=="string"?J(He("fs-icon"),{icon:m,class:h},null):typeof m=="function"?m():J(He("fs-icon"),Re(m,{class:h}),null)};let s=()=>{const m=e.icon,h=e.iconRight,v=n.type!=="element",g=!v;let b;const y={...t.slots};(m&&!v&&!g||t.slots.default||e.text||h)&&(y.default=()=>{const T=[];return m&&!v&&!g&&T.push(l(m)),t.slots.default&&T.push(t.slots.default()),e.text&&T.push(e.text),h&&T.push(l(h,"fs-button-icon-right")),T}),m&&(v&&!y.icon?y.icon=()=>l(m):g&&!y.icon&&(b=l(m)));const w=e.circle?n.button.circle:{},_=Me(n.button.name),S=T=>{T.loadingRef=o,t.emit("click",T)},k=a({...w,class:{"fs-button":!0,"is-thin":!e.text&&!t.slots.default},loading:r.value,onClick:S},{class:e.className,...t.attrs,...e.buttonProps});return b&&(k.icon=b),Je(_,k,y)};const i=s,u=Me(n.badge.name);if(e.badge&&(s=()=>{let m;return J(u,e.badge,J8(m=i())?m:{default:()=>[m]})}),!e.tooltip)return s;const c=Me(n.tooltip.name),f=x(()=>Uo(e.tooltip,"slots")),p=n.tooltip.trigger;return()=>{var m;const h={...(m=e.tooltip)==null?void 0:m.slots,[p]:s};return J(c,f.value,J8(h)?h:{default:()=>[h]})}}}),tye=K({name:"FsIcon",inheritAttrs:!1,props:{icon:{type:String,default:void 0,require:!0},baseUrl:{type:String,default:""}},setup(e,t){const{ui:n}=sn(),a=x(()=>{var o;if(e.icon&&((o=e.icon)==null?void 0:o.indexOf(":"))>=0){if(e.icon.startsWith("http:")||e.icon.startsWith("https:")){let c=null;return e.icon.startsWith("http://")||e.icon.startsWith("https://")?c=e.icon:c=e.baseUrl+e.icon.replace("http:","").replace("https:",""),()=>J("img",Re({class:"fs-icon-image",src:c},t.attrs),null)}if(e.icon.startsWith("svg:")){const c=Me("FsIconSvg");return()=>{const f=e.icon.replace("svg:","");return J(c,Re({class:"fs-icon",icon:f},t.attrs),null)}}const l=Me("FsIconify"),s=e.icon.split(":");let i={},u=e.icon;return s.length>=3&&(i={color:s[2]},u=s[0]+":"+s[1]),()=>J(l,Re({class:"fs-icon",icon:u,style:i},t.attrs),null)}const r=Me(e.icon);return typeof r=="string"?()=>J("span",{title:"error icon name"},[r]):n.icon.isComponent?()=>J(r,Re({class:"fs-icon"},t.attrs),null):()=>J(He("el-icon"),Re({class:"fs-icon"},t.attrs),{default:()=>[J(r,null,null)]})});return()=>a.value()}}),nye=K({name:"FsIconify",components:{Icon:pge},props:{icon:{type:String},spin:{type:Boolean,default:!1}},setup(e,t){return{iconifyRef:F(null)}}});function aye(e,t,n,a,o,r){const l=He("Icon");return C(),A("span",{class:L(["fs-iconify",{"fs-iconify-spin":e.spin}])},[J(l,{ref:"iconifyRef",icon:e.icon,inline:!0},null,8,["icon"])],2)}const oye=Rn(nye,[["render",aye]]),rye=K({name:"FsSvgIcon",props:{icon:{type:String,required:!0},size:{type:[Number,String],default:16},spin:{type:Boolean,default:!1}},setup(e){const t=x(()=>`#${e.icon}`),n=x(()=>{const{size:a}=e;let o=`${a}`;return o=`${o.replace("px","")}px`,{width:o,height:o}});return{symbolId:t,getStyle:n}}}),lye={class:"fs-icon-svg-content","aria-hidden":"true"},sye=["xlink:href"];function iye(e,t,n,a,o,r){return C(),A("span",{class:L(["fs-icon-svg",e.spin&&"fs-icon-spin"])},[(C(),A("svg",lye,[M("use",{"xlink:href":e.symbolId},null,8,sye)]))],2)}const uye=Rn(rye,[["render",iye]]),cye=K({name:"FsLabel",props:{label:{type:String,default:""},labelAttrs:{type:Object,default:()=>({})},contentAttrs:{type:Object,default:()=>({})}}}),dye={class:"fs-label"};function fye(e,t,n,a,o,r){return C(),A("div",dye,[M("div",Re({class:"label"},e.labelAttrs),[Ct(ye(e.label)+" ",1),re(e.$slots,"label")],16),M("div",Re({class:"content"},e.contentAttrs),[re(e.$slots,"default")],16)])}const pye=Rn(cye,[["render",fye]]),hye={key:0,class:"fs-loading"},mye={key:0},vye=K({name:"FsLoading"}),gye=K({...vye,props:{loading:{type:Boolean},icon:{},text:{}},setup(e){const{ui:t}=sn();return(n,a)=>{const o=He("fs-icon");return n.loading?(C(),A("div",hye,[J(o,{class:"fs-icon-spin",icon:n.icon??d(t).icons.refresh},null,8,["icon"]),n.text?(C(),A("span",mye,ye(n.text),1)):le("",!0)])):le("",!0)}}}),bye=K({name:"FsBox"}),yye={class:"fs-box"};function wye(e,t,n,a,o,r){return C(),A("div",yye,[re(e.$slots,"default")])}const Cye=Rn(bye,[["render",wye]]);function _ye(e){return typeof e=="function"||Object.prototype.toString.call(e)==="[object Object]"&&!rn(e)}function Z8(e,t){if(e[t]instanceof Array){const n=e[t];e[t]=a=>{for(const o of n)o(a)}}}const Sye=["div","span","a","p","pre","li","ol","ul"],xye=K({name:"FsComponentRender",inheritAttrs:!1,props:{modelValue:{},name:{},slots:{type:Object},children:{type:Object},on:{type:Object},events:{type:Object},scope:{type:Object},vModel:{type:[String,Object]},props:{},render:{},undefineToNull:{type:Boolean,default:!0}},emits:["update:dict","update:modelValue","mounted"],setup(e,t){const{ui:n}=sn(),{merge:a}=_n();_t("get:scope",()=>e.scope),gt(()=>{t.emit("mounted",e.scope)});const o=F(),r=x(()=>{const m={name:"modelValue",trim:!1,number:!1,transform:void 0};e.vModel&&(typeof e.vModel=="string"?m.name=e.vModel:a(m,e.vModel));const h=e.modelValue??(n.type==="antdv"?void 0:null),v="onUpdate:"+m.name,g={ref:o,[m.name]:h,[v]:y=>{if(y&&(m.trim&&(y=y.trim()),m.number)){const w=Number(y);isNaN(w)||(y=w)}m.transform&&(y=m.transform(y)),y===void 0&&e.undefineToNull&&(y=null),t.emit("update:modelValue",y)},...e.props},b={...e.events,...e.on};return dt(b,(y,w)=>{const _=y;w.startsWith("on")||(w=_N("on_"+w)),g[w]=S=>_({...e.scope,$event:S})}),g}),l=()=>{const m={},h=(v,g)=>{v instanceof Function?m[g]=b=>v({...e.scope,scope:b}):m[g]=()=>v};return dt(e.children,h),dt(e.slots,h),m},s=x(()=>{e.name;let m=d(e.name)||n.input.name;typeof m=="function"&&(m=m());const h={isAsyncComponent:!1,component:m};let v=h.component;return Sye.includes(v)||(typeof v=="string"&&(v=He(v)),(v==null?void 0:v.name)==="AsyncComponentWrapper"&&(h.isAsyncComponent=!0)),h.component=v,h}),i=l;function u(){return s.value.isAsyncComponent?f():c()}function c(){return o.value}async function f(){return c()??new Promise((h,v)=>{p(h,v,0)})}function p(m,h,v){setTimeout(()=>{const g=c();if(g!=null){m(g);return}if(v++,v>20){h(new Error("异步组件加载超时"));return}p(m,h,v)},200)}return t.expose({props:e,getTargetRefSync:c,getTargetRef:u,getTargetRefAsync:f}),()=>{let m;const h=Re(r.value,t.attrs);return Z8(h,"onChange"),Z8(h,"onBlur"),e.render?e.render({...e.scope,attrs:h}):J(s.value.component,h,_ye(m=i())?m:{default:()=>[m]})}}}),kye=K({name:"FsSlotRender",inheritAttrs:!1,props:{slots:{type:Function},scope:{type:Object}},setup(e){return()=>e.slots(e.scope)}}),D7=K({name:"FsRender",functional:!0,props:{renderFunc:{type:Function},scope:{type:Object}},setup(){},render(){return this.renderFunc(this.scope)}}),Eye=K({name:"FsForm",props:{initialForm:{type:Object,default(){return{}}},columns:{type:Object,default:void 0},group:{type:Object,default:void 0},doReset:{type:Function,default:void 0},beforeValidate:{type:Function,default:void 0},beforeSubmit:{type:Function,default:void 0},doSubmit:{type:Function,default:void 0},afterSubmit:{type:Function,default:void 0},slots:{type:Object,default:()=>({})},display:{type:String,default:"flex"},index:{type:Number,default:void 0},mode:{type:String,default:void 0},row:{type:Object,default:void 0},col:{type:Object,default:void 0},formItem:{type:Object,default:void 0},helper:{type:Object},watch:{type:Function,default:null}},emits:["reset","submit","success","validationError","value-change","init"],setup(e,t){var n,a;const{merge:o}=_n(),{ui:r}=sn(),{AsyncComputeValue:l,doComputed:s}=kr(),i=F(),u=Nt({}),{proxy:c}=bt();dt(e.columns,B=>{B.value!=null&&(B.value instanceof l||B.value instanceof am)&&Lt.warn("form.value配置不支持Compute/AsyncCompute类型的动态计算")});function f(){const B={};return dt(e.columns,(U,X)=>{const ce=d(U.value);ce!==void 0&&Zn(B,X,ce)}),o(B,Kn(e.initialForm)),B}const p=f();y(p);const m=x(()=>({row:p,form:u,index:e.index,mode:e.mode||"add",attrs:t.attrs,getComponentRef:R}));function h(){return m.value}const v=x(()=>e.columns);function g(B){B!=null&&dt(e.columns,(U,X)=>{let ce=on(B,X);if(U.valueBuilder){const ne=U.valueBuilder({value:ce,key:X,row:p,form:B,index:e.index,mode:e.mode});ne!=null&&!(ne instanceof Promise)&&Zn(B,X,ne)}})}function b(){return u}function y(B,U={}){if(g(B),U.mergeForm===!1)for(const ce in u)delete u[ce];o(u,B);const{valueChange:X}=U;X&&dt(e.columns,(ce,ne)=>{const ue=u[ne];S(ne,ue)})}function w(...B){return o({},e.col,...B)}function _(B){return{key:B.key,...m.value}}function S(B,U){const X={key:B,value:U,formRef:c,...m.value,immediate:!1};t.emit("value-change",X);let ce=e.columns[B].valueChange;ce&&(ce instanceof Function?ce(X):ce.handle&&ce.handle(X))}const k=F({});function T(B){return k.value[B].getFormItemRef()}function R(B,U=!1){var X;return(X=T(B))==null?void 0:X.getComponentRef(U)}const E=F([]);dt((n=e.group)==null?void 0:n.groups,(B,U)=>{B.collapsed!==!0&&E.value.push(U)}),((a=e.group)==null?void 0:a.groupType)==="tabs"&&(E.value=E.value.length>0?E.value[0]:null);const O=s(()=>e.group,h,null,(B={})=>{const U={};dt(B==null?void 0:B.groups,(ne,ue)=>{dt(ne.columns,ie=>{if(v.value[ie]==null){ys.logger.warn("无效的分组字段:"+ie);return}U[ie]=ue})});const X=B.groupType;let ce={parent:r.collapse.name,child:r.collapseItem.name};return X==="tabs"&&(ce.parent=r.tabs.name,ce.child=r.tabPane.name),o({wrapper:ce,groupedKeys:U},B)}),I=x(()=>{const B=[];return dt(v.value,(U,X)=>{var ce,ne;const ue=Kn(e.formItem||{});U=o(ue,U),U.key=X,U.order==null&&(U.order=Bs.orderDefault),(((ce=O.value)==null?void 0:ce.groupedKeys)==null||((ne=O.value)==null?void 0:ne.groupedKeys[X])==null)&&B.push(U),U.col=w(U.col)}),B.sort((U,X)=>U.order-X.order),B});function $(){return i.value}async function z(){const B=f(),U=k1(u);for(const X of U){const ce=on(B,X[0]);ce==null?bh(u,X[0]):Zn(u,X[0],ce)}e.doReset&&await e.doReset(m.value),t.emit("reset")}const q=F(),W=F({});function j(B){var U,X;if((U=O.value)!=null&&U.groupedKeys)for(let ce in B){const ne=(X=O.value)==null?void 0:X.groupedKeys[ce];ne!=null&&(B["group."+ne]=!0)}}async function N(){const B={...m.value,form:u};if(B.mode!=="view"){if(e.beforeValidate&&await e.beforeValidate(B)===!1)return!1;try{W.value={},await r.form.validateWrap(i.value),q.value=!0}catch(U){q.value=!1;const X=r.form.transformValidateErrors(U);throw j(X),W.value=X,t.emit("validationError",m.value),U}}}async function V(){await N();const B=Kn(Qt(u)),U={...m.value,form:B};if(Lt.debug("form submit",JSON.stringify(u)),dt(e.columns,(X,ce)=>{let ne=on(B,ce);if(X.valueResolve){const ue=X.valueResolve({value:ne,key:ce,...U});ue!=null&&!(ue instanceof Promise)&&Zn(B,ce,ue)}}),e.beforeSubmit&&await e.beforeSubmit(U)===!1)return!1;if(dt(e.columns,(X,ce)=>{X.submit===!1?bh(B,ce):X.submit===!0&&Zn(B,ce,B[ce])}),e.doSubmit){const X=await e.doSubmit(U);if(U.res=X,X===!1)return!1}return t.emit("submit",U),e.afterSubmit&&await e.afterSubmit(U)===!1?!1:(t.emit("success",U),U)}gt(()=>{dt(v.value,(B,U)=>{if(B.valueChange==null)return;let X=B.valueChange;if(X&&X.immediate===!0&&X.handle){const ce={key:U,value:u[U],formRef:c,...m.value,immediate:!0};X.handle&&X.handle(ce)}})});function H(B){return!!(B&&d(B.show)!==!1)}function Y(B){if(!B.columns||d(B.show)===!1)return!1;for(let U of B.columns)if(v.value[U]!=null&&H(v.value[U]))return!0;return!1}e.watch&&pe(()=>u,(B,U)=>{e.watch&&e.watch(m.value)},{deep:!0,immediate:!0});function P(){const B=JSON.stringify(p),U=JSON.stringify(u);return B!==U}const D=x(()=>o({},e.slots,t.slots));return t.emit("init",m.value),{get:(B,U)=>on(B,U),set:(B,U,X)=>{Zn(B,U,X),S(U,X)},ui:r,validRef:q,errorsRef:W,formRef:i,computedColumns:v,computedDefaultColumns:I,submit:V,reset:z,getFormRef:$,scope:m,buildItemScope:_,groupActiveKey:E,form:u,formItemRefs:k,getFormData:b,setFormData:y,getComponentRef:R,mergeCol:w,validate:N,computedGroup:O,getContextFn:h,formItemShow:H,groupItemShow:Y,isDirty:P,mergedSlots:D}}});function Tye(e,t,n,a,o,r){const l=He("fs-form-item-col"),s=He("fs-render");return C(),ae(Me(e.ui.form.name),{ref:"formRef",class:L(["fs-form",{"fs-form-grid":e.display==="grid","fs-form-flex":e.display==="flex","fs-form-invalid":e.validRef===!1}]),onsubmit:"event.preventDefault();",model:e.form},{default:te(()=>[(C(),ae(Me(e.ui.row.name),Re({class:"fs-row"},e.row),{default:te(()=>[(C(!0),A(Ae,null,it(e.computedDefaultColumns,i=>(C(),ae(l,{key:i==null?void 0:i.key,ref_for:!0,ref:u=>{u&&(e.formItemRefs[i.key]=u)},col:e.mergeCol(i.col),item:i,helper:e.helper,"model-value":e.get(e.form,i.key),slots:e.mergedSlots["form_"+i.key],"get-context-fn":e.getContextFn,"onUpdate:modelValue":u=>e.set(e.form,i.key,u)},null,8,["col","item","helper","model-value","slots","get-context-fn","onUpdate:modelValue"]))),128))]),_:1},16)),e.computedGroup.wrapper?(C(),ae(Me(e.computedGroup.wrapper.parent),Re({key:0,[e.ui.collapse.modelValue]:e.groupActiveKey,["onUpdate:"+e.ui.collapse.modelValue]:t[0]||(t[0]=i=>e.groupActiveKey=i),style:{width:"100%"}},e.computedGroup),{default:te(()=>[(C(!0),A(Ae,null,it(e.computedGroup.groups,(i,u)=>(C(),A(Ae,{key:u},[e.groupItemShow(i)?(C(),ae(Me(e.computedGroup.wrapper.child),Re({key:0,[e.ui.collapse.keyName||""]:u},{ref_for:!0},i,{class:{"fs-form-group-error":e.errorsRef["group."+u]}}),xa({default:te(()=>[(C(),ae(Me(e.ui.row.name),Re({class:"fs-row"},{ref_for:!0},e.row),{default:te(()=>[(C(!0),A(Ae,null,it(i.columns,c=>(C(),A(Ae,{key:c},[e.computedColumns[c]?(C(),ae(l,{key:0,ref_for:!0,ref:f=>{f&&(e.formItemRefs[c]=f)},col:e.mergeCol(e.computedColumns[c].col),item:e.computedColumns[c],"model-value":e.get(e.form,c),slots:e.mergedSlots["form_"+c],"get-context-fn":e.getContextFn,helper:e.helper,"onUpdate:modelValue":f=>e.set(e.form,c,f)},null,8,["col","item","model-value","slots","get-context-fn","helper","onUpdate:modelValue"])):le("",!0)],64))),128))]),_:2},1040))]),_:2},[it(i.slots,(c,f)=>({name:f,fn:te(p=>[J(s,{"render-func":c,scope:{...p,hasError:e.errorsRef["group."+u]}},null,8,["render-func","scope"])])}))]),1040,["class"])):le("",!0)],64))),128))]),_:1},16)):le("",!0)]),_:1},8,["class","model"])}const Mye=Rn(Eye,[["render",Tye]]),Oye=K({name:"FsFormItem",components:{FsRender:D7},props:{modelValue:{},item:{type:Object,default:void 0},formSlot:{type:Function,default:void 0},getContextFn:{type:Function,default:void 0},helper:{type:[String,Object]}},emits:["update:modelValue"],setup(e,t){const{ui:n}=sn(),{merge:a}=_n(),o=F(),r=()=>{const h=e.getContextFn?e.getContextFn():{};return{value:e.modelValue,key:e.item.key,...h}};function l(h){t.emit("update:modelValue",h)}function s(h=!1){var v,g;return h?(v=o.value)==null?void 0:v.getTargetRefAsync():(g=o.value)==null?void 0:g.getTargetRef()}const i=x(()=>{const h={...e.item};return delete h.title,delete h.label,h}),u=x(()=>{var h,v,g;return((v=(h=e.item)==null?void 0:h.helper)==null?void 0:v.position)||((g=e.helper)==null?void 0:g.position)}),c=x(()=>{var h,v;return a({},(h=e.item.helper)==null?void 0:h.tooltip,(v=e.helper)==null?void 0:v.tooltip)}),f=x(()=>{if(e.item!=null)return e.item.key.indexOf(".")>=0?e.item.key.split("."):e.item.key}),p=x(()=>e.item.label||e.item.title),m=x(()=>p.value instanceof Function);return{ui:n,updateModelValue:l,scopeFunc:r,getComponentRef:s,componentRenderRef:o,computedHelperPosition:u,computedHelperTooltip:c,computedKey:f,computedLabelIsRender:m,computedLabel:p,computedLabelRender:()=>p.value(r()),computedItem:i}}}),Rye={key:0,class:"fs-form-item-label-text"},Aye=["title"],$ye={class:"fs-form-helper-tooltip"},Pye={class:"fs-form-item-label-icon"},Nye={class:"fs-form-item-content"},Iye={class:"fs-form-item-render"},Vye={class:"fs-form-item-component"};function Lye(e,t,n,a,o,r){const l=He("fs-render"),s=He("fs-form-helper"),i=He("fs-icon"),u=He("fs-slot-render"),c=He("fs-component-render");return e.computedItem?(C(),ae(Me(e.ui.formItem.name),Re({key:0,class:"fs-form-item",[e.ui.formItem.prop||""]:e.computedKey},e.computedItem,{path:e.computedItem.key,"rule-path":e.computedItem.key}),{label:te(()=>[e.computedLabelIsRender?(C(),A("span",Rye,[J(l,{"render-func":e.computedLabelRender},null,8,["render-func"])])):(C(),A("span",{key:1,class:"fs-form-item-label-text",title:e.computedLabel},ye(e.computedLabel),9,Aye)),e.computedItem.helper&&e.computedHelperPosition==="label"?(C(),ae(Me(e.ui.tooltip.name),gn(Re({key:2},e.computedHelperTooltip)),{[e.ui.tooltip.content]:te(()=>[M("span",$ye,[J(s,{helper:e.computedItem.helper,scope:e.scopeFunc()},null,8,["helper","scope"])])]),[e.ui.tooltip.trigger]:te(()=>[M("span",Pye,[J(i,{class:"fs-form-item-label-icon-inner",icon:e.ui.icons.question},null,8,["icon"])])]),_:2},1040)):le("",!0)]),default:te(()=>{var f;return[M("div",Nye,[e.computedItem.topRender?(C(),ae(l,{key:0,"render-func":e.computedItem.topRender,scope:e.scopeFunc()},null,8,["render-func","scope"])):le("",!0),M("div",Iye,[e.computedItem.prefixRender?(C(),ae(l,{key:0,"render-func":e.computedItem.prefixRender,scope:e.scopeFunc()},null,8,["render-func","scope"])):le("",!0),M("div",Vye,[e.formSlot?(C(),ae(u,{key:0,slots:e.formSlot,scope:e.scopeFunc()},null,8,["slots","scope"])):((f=e.computedItem.component)==null?void 0:f.show)!==!1?(C(),A(Ae,{key:1},[e.computedItem.conditionalRender&&e.computedItem.conditionalRender.match&&e.computedItem.conditionalRender.match(e.scopeFunc())?(C(),ae(l,{key:0,"render-func":e.computedItem.conditionalRender.render,scope:e.scopeFunc()},null,8,["render-func","scope"])):e.computedItem.render?(C(),ae(l,{key:1,"render-func":e.computedItem.render,scope:e.scopeFunc()},null,8,["render-func","scope"])):(C(),ae(c,Re({key:2,ref:"componentRenderRef"},e.computedItem.component,{"model-value":e.modelValue,scope:e.scopeFunc(),"onUpdate:modelValue":e.updateModelValue}),null,16,["model-value","scope","onUpdate:modelValue"]))],64)):le("",!0)]),e.computedItem.suffixRender?(C(),ae(l,{key:1,"render-func":e.computedItem.suffixRender,scope:e.scopeFunc()},null,8,["render-func","scope"])):le("",!0)]),e.computedItem.bottomRender?(C(),ae(l,{key:1,"render-func":e.computedItem.bottomRender,scope:e.scopeFunc()},null,8,["render-func","scope"])):le("",!0),e.computedItem.helper&&e.computedHelperPosition!=="label"?(C(),ae(s,{key:2,helper:e.computedItem.helper,scope:e.scopeFunc()},null,8,["helper","scope"])):le("",!0)])]}),_:1},16,["path","rule-path"])):le("",!0)}const Fye=Rn(Oye,[["render",Lye]]),Dye=K({__name:"fs-form-item-col",props:{item:{type:Object,default:void 0},slots:{type:Function,default:void 0},getContextFn:{type:Function,default:void 0},col:{type:Object,default:()=>({})},helper:{type:[String,Object],default:void 0}},setup(e,{expose:t}){const{ui:n}=sn(),a=e,{doComputed:o}=kr(),r=o(()=>a.item,()=>a.getContextFn()),{merge:l}=_n(),s=Ro(),i=F();function u(){return i.value}return t({getFormItemRef:u}),(c,f)=>{var p;const m=He("fs-form-item");return d(r)&&d(r).show!==!1?(C(),ae(Me(d(n).col.name),Re({key:0,class:"fs-col"},d(l)(e.col,(p=d(r))==null?void 0:p.col)),{default:te(()=>{var h;return[d(r)&&((h=d(r))==null?void 0:h.blank)!==!0?(C(),ae(m,Re({key:0,ref_key:"formItemRef",ref:i,item:d(r),"form-slot":e.slots,"get-context-fn":e.getContextFn,helper:e.helper},d(s)),null,16,["item","form-slot","get-context-fn","helper"])):le("",!0)]}),_:1},16)):le("",!0)}}}),Bye=K({name:"FsFormHelper",props:{helper:{type:[Object,String]},scope:{}},setup(e){}}),zye={class:"fs-form-helper"},Hye={key:0},jye={key:2};function Kye(e,t,n,a,o,r){const l=He("fs-render");return C(),A("div",zye,[typeof e.helper=="string"?(C(),A("pre",Hye,ye(e.helper),1)):e.helper.render?(C(),ae(l,{key:1,"render-func":e.helper.render,scope:e.scope},null,8,["render-func","scope"])):e.helper.text?(C(),A("pre",jye,ye(e.helper.text),1)):le("",!0)])}const Wye=Rn(Bye,[["render",Kye]]);function qye(e){return typeof e=="function"||Object.prototype.toString.call(e)==="[object Object]"&&!rn(e)}const ef=K({name:"FsFormWrapper",props:{options:{},slots:{},inner:{},innerWrapper:{},id:{},zIndex:{}},emits:["reset","submit","validationError","value-change","open","opened","mounted","closed","inner-change"],setup(e,t){var n;const{t:a}=ao(),{merge:o}=_n(),r=F(!1),l=F(),s=F(),i=F(),u=F(),c=F(),f=F(!1),p=F(),m=F(),h=F(),v=F(),g=e.id||Math.floor(Math.random()*1e6)+"",b="fs-form-wrapper_"+g,y=F({});function w(Q={}){var se;return{formWrapperId:g,formWrapperIdClass:b,close:q,doClose:W,onClosed:j,onOpened:N,open:_,title:v,fullscreenEnabled:ue,fullscreen:ne,formWrapperIs:l,formWrapperOpen:r,formWrapperBind:i,computedButtons:ce,onValueChange:V,innerBind:ee,formWrapperSlots:y,wrapper:i.value,options:s.value,formRef:c.value,form:P(),wrapperBindRef:i,formOptionsRef:s,setFormData:D,getFormData:P,reset:Y,loading:f,toggleFullscreen:ie,submit:H,mode:(se=s.value)==null?void 0:se.mode,...Q}}const _=async Q=>{var se,de;const{wrapper:he}=Q;he.onOpen&&he.onOpen(Q),v.value=d(he.title),l.value=Q.wrapper.is,u.value=he,s.value={...Uo(Q,"wrapper","slots"),slots:{...e.slots,...Q.slots,...t.slots}};const ve=Z.formWrapper.customClass(l.value),Ie=`fs-form-wrapper fs-form-wrapper-${(se=s.value)==null?void 0:se.mode} ${b} ${he[ve]||""} `;return i.value={...Uo(he,"title","onOpen","onClosed","onOpened","is","inner","beforeClose"),[ve]:Ie},y.value={...e.slots,...(de=Q.wrapper)==null?void 0:de.slots,...t.slots},t.emit("open",w()),p.value=()=>{he.onClosed&&he.onClosed(w())},m.value=()=>{he.onOpened&&he.onOpened(w())},h.value=he.beforeClose,he.fullscreen!=null&&(ne.value=he.fullscreen),t.emit("inner-change",!!u.value.inner),await Oe(),r.value=!0,await Oe(),N(),w()};async function S(){var Q;const se=u.value.saveRemind;if((Q=c.value)!=null&&Q.isDirty()&&se){let de=!1;if(se instanceof Function)de=await se();else try{await Z.messageBox.confirm({title:a("fs.form.saveRemind.title"),message:a("fs.form.saveRemind.content"),confirmButtonText:a("fs.form.saveRemind.ok"),cancelButtonText:a("fs.form.saveRemind.cancel")}),de=!0}catch{de=!1}de&&await H()}}const k=s7();let T=null;function R(){return u.value.saveDraft?(T==null&&(T=new u7({$router:k,tableName:"addFormDraft",keyType:e.id||"0"})),T):null}async function E(){var Q;const se=u.value.saveDraft,de=(Q=c.value)==null?void 0:Q.isDirty(),he=s.value.mode=="add";return de&&se&&he?(await R().updateTableValue(P()),!0):!1}async function O(){const Q=R();Q&&await Q.clearTableValue()}async function I(){const Q=R();if(Q){const se=await Q.getTableValue();se&&D(se,{mergeForm:!0})}}async function $(){let Q=!1;return u.value.saveDraft&&(Q=await E()),h.value&&h.value(w())==!1?!1:(Q||await S(),!0)}const z=x(()=>Z.type=="element"?{beforeClose:Q=>{W()}}:{}),q=async()=>{r.value=!1},W=async()=>await $()==!1?!1:(q(),!0),j=()=>{p.value&&p.value(),t.emit("closed"),s.value=null},N=()=>{if(u.value.saveDraft&&I(),t.emit("opened"),m.value&&m.value(),i.value.draggable||i.value.dragenabled){const{dragModal:Q}=Obe();Q({getModal:()=>document.querySelector(`.${b}`)})}},V=Q=>{t.emit("value-change",Q)};async function H(){f.value=!0;try{if(await c.value.submit()===!1)return;await O(),q()}finally{f.value=!1}}async function Y(){await c.value.reset()}function P(){var Q;return(Q=c.value)==null?void 0:Q.getFormData()}function D(Q,se){var de;(de=c.value)==null||de.setFormData(Q,se)}const{doComputed:B}=kr();function U(){var Q,se,de;return{row:(Q=s.value)==null?void 0:Q.initialForm,form:P(),index:(se=s.value)==null?void 0:se.index,mode:(de=s.value)==null?void 0:de.mode,attrs:s.value,getComponentRef(...he){var ve;(ve=c.value)==null||ve.getComponentRef(...he)}}}const X=B(()=>{var Q;return(Q=i.value)==null?void 0:Q.buttons},U),ce=x(()=>{const Q={cancel:{},reset:{},ok:{loading:f.value}},se=o(Q,X.value),de=[];return dt(se,(he,ve)=>{he.key=ve,de.push(he),he.onClick==null&&he.click!=null&&(he.onClick=Ie=>{he.click(w({loadingRef:Ie==null?void 0:Ie.loadingRef}))})}),Bi(de,he=>he.order??Bs.orderDefault)});gt(async()=>{e.options!=null&&await _(e.options),t.emit("mounted",bt().exposed)});const ne=F(!1),ue=x(()=>{var Q;return!((Q=l.value)!=null&&Q.endsWith("drawer"))});function ie(){ne.value=!ne.value}const Z=zn.get(),ee=x(()=>u.value.inner?Z.formWrapper.buildInnerBind({getInnerWrapper(){if(u.value.innerContainerSelector){const Q=document.querySelector(u.value.innerContainerSelector);if(Q)return Q.classList.add("fs-form-inner-wrapper"),Q;console.error(`找不到选择器为${u.value.innerContainerSelector}的元素`)}return e.innerWrapper}}):{});t.expose({formWrapperId:g,formWrapperIdClass:b,close:q,doClose:W,onClosed:j,onOpened:N,open:_,title:v,fullscreenEnabled:ue,fullscreen:ne,toggleFullscreen:ie,formOptions:s,formWrapperIs:l,formWrapperOpen:r,formWrapperBind:i,formRef:c,submit:H,reset:Y,computedButtons:ce,loading:f,getFormData:P,setFormData:D,onValueChange:V,innerBind:ee,formWrapperSlots:y,form:P(),wrapperBindRef:i,formOptionsRef:s,mode:(n=s.value)==null?void 0:n.mode});const G=Tn();return()=>{if(!i.value)return null;const Q=zn.get();let se={};const de={...G,...y.value},he=(et,rt,ke=de)=>ke[et]?ke[et](rt):null,ve=l.value||"el-dialog";if(s.value){const{index:et,mode:rt}=s.value||{},ke={_self:this,index:et,mode:rt,getFormData:P};se={[Q.formWrapper.titleSlotName]:()=>{let Qe=null;return ue.value&&(Qe=J(He("fs-icon"),{class:"fs-fullscreen-icon",onClick:ie,icon:ne.value?Q.icons.fullScreen:Q.icons.unFullScreen},null)),J("div",{class:"fs-form-header"},[J("div",{class:"fs-form-header-left"},[he("form-header-left",ke),v.value,he("form-header-right",ke)]),J("div",{class:"fs-form-header-action"},[he("form-header-action-left",ke),Qe,he("form-header-action-right",ke)])])},default:()=>{const Qe=[];return dt(ce.value,ft=>{ft.show!==!1&&Qe.push(J(He("fs-button"),ft,null))}),J("div",{class:"fs-form-wrapper-body"},[J("div",{class:"fs-form-body"},[he("form-body-top",ke),J("div",{class:"fs-form-content"},[he("form-body-left",ke),J(He("fs-form"),Re({ref:c},s.value,{onValueChange:V}),null),he("form-body-right",ke)]),he("form-body-bottom",ke)]),J("div",{class:"fs-form-footer-btns"},[he("form-footer-left",ke),Qe,he("form-footer-right",ke)])])}}}if(Q.formWrapper.hasContentWrap){const et=Q.formWrapper.hasContentWrap(ve),rt=se;if(et){const ke=Me(et);se={default:()=>J(ke,Re({closable:!0},u.value.contentProps),qye(rt)?rt:{default:()=>[rt]})}}}const Ie=Q.formWrapper.visible,De={[Ie]:r.value,["onUpdate:"+Ie]:async et=>{if(et===!1&&r.value)return await W();r.value=et}},Le=Q.formWrapper.buildOnClosedBind(ve,j),we=Q.formWrapper.customClass(ve),$e=`${ne.value?"fs-fullscreen":""} ${i.value[we]||""}`,_e={[we]:$e},Be={fullscreen:ne.value},Ke={zIndex:i.value.zIndex||e.zIndex},ot=Me(ve);return J(ot,Re(i.value,_e,De,Le,Be,ee.value,Ke,z.value),se)}}}),Uye=K({name:"FsFormProvider"}),Yye=K({...Uye,setup(e){const t=F({}),n=F({});return _t("get:form:wrapper:context",a=>n.value[a]),_t("use:form:wrapper",()=>({setContext(a,o){n.value[a]=o},open(a){const o=a.id||Math.floor(Math.random()*1e6)+"";return new Promise((r,l)=>{t.value[o]={id:o,async onMounted(s){await s.open(a),r(s)},onClosed(){a.id||delete t.value[o]}}})}})),(a,o)=>(C(),A(Ae,null,[re(a.$slots,"default"),(C(!0),A(Ae,null,it(t.value,r=>(C(),ae(d(ef),Re({key:r.id},{ref_for:!0},r),null,16))),128))],64))}});function Gye(e,t){_t("get:columns",()=>e.table.columns),_t("update:columns",n=>{t.emit("update:columns",n)}),_t("get:crudBinding",()=>e)}function Xye(e,t){const n=F(),a=()=>n.value,o=()=>n.value?n.value.getForm():(Lt.warn("请使用expose.getSearchFormData代替"),{}),r=()=>n.value?n.value.getValidatedForm():(Lt.warn("请使用expose.getSearchValidatedFormData代替"),{});function l({form:s,mergeForm:i=!1}){n.value&&n.value.setForm(s,i)}return{searchRef:n,getSearchRef:a,getSearchFormData:o,setSearchFormData:l,getSearchValidatedFormData:r}}function Jye(e,t,n){return{tabsBinding:x(()=>{var a,o,r,l,s,i,u;if(t.tabs&&t.tabs.show&&t.tabs.name){let c=null;const f={...t.tabs};return(a=t.search)!=null&&a.columns&&(l=(r=(o=t.search)==null?void 0:o.columns[t.tabs.name])==null?void 0:r.component)!=null&&l.dict&&(c=(u=(i=(s=t.search)==null?void 0:s.columns[t.tabs.name])==null?void 0:i.component)==null?void 0:u.dict,f.value==null&&(f.value=c.value),f.label==null&&(f.label=c.label),f.options==null&&(f.options=c.data||[])),{...f,modelValue:t.search.validatedForm&&t.search.validatedForm[t.tabs.name],"onUpdate:modelValue":p=>{n.emit("tab-change",{[t.tabs.name]:p})}}}return{show:!1}})}}function pp(e,t){if(!e)return{};const n={};return dt(e,(a,o)=>{o.startsWith(t)&&(n[o]=a)}),n}function Zye(e,t,{tableRef:n,containerRef:a}){var o;const r=zn.get();let l=r.table;if(((o=e.table)==null?void 0:o.tableVersion)==="v2"&&(l=r.tableV2),l.hasMaxHeight(e.table))return{};if(!l.fixedHeaderNeedComputeBodyHeight)return{};const s=F(null);function i(){var c;const f=(c=n==null?void 0:n.value)==null?void 0:c.$el;if(f==null||f.querySelector==null)return;const p=f.querySelector(l.headerDomSelector);if(p==null)return;const m=f.getBoundingClientRect().height,h=p.getBoundingClientRect().height;s.value=m-h-2+(e.table.maxHeightAdjust||0),Lt.debug("table max height recomputed ",s.value)}function u(){var c;const f=(c=n==null?void 0:n.value)==null?void 0:c.$el;if(f==null)return;const p=f.parentNode;new ResizeObserver(function(m){Lt.debug("table resized",m),m.length>0&&m[0].contentRect.height>0&&(i(),setTimeout(()=>{i()},200),setTimeout(()=>{i()},500))}).observe(p)}return gt(async()=>{await Oe(),await Oe(),u()}),{maxHeightRef:s,computeBodyHeight:i}}function Qye(e,t){const n=zn.get(),a=F(),o=F(),r=F(),{maxHeightRef:l,computeBodyHeight:s}=Zye(e,t,{tableRef:a,containerRef:r}),{merge:i}=_n(),u=Wt(e,"table"),c=x(()=>{var _;let S={};if((l==null?void 0:l.value)!=null){let T=n.table;((_=e.table)==null?void 0:_.tableVersion)==="v2"&&(T=n.tableV2),S=T.buildMaxHeight(l.value)}const k=ys.dash.omit(u,"loading","columns","columnsMap");return i(S,{...t.attrs,...k})}),f=Wt(e,"toolbar"),p=x(()=>pp(t.slots,"cell")),m=x(()=>pp(t.slots,"form")),h=x(()=>pp(t.slots,"search")),v=x(()=>pp(t.slots,"toolbar")),g=F(),b=x(()=>{const _={compact:e.toolbar.compact!==!1};return e.customClass&&(_[e.customClass]=!0),_}),y=F(),w=F(!1);return{tableRef:a,containerRef:r,toolbarRef:o,computedTable:c,computedToolbar:f,computedCellSlots:p,formWrapperRef:g,isFormInner:w,onFormInnerChange:_=>{w.value=_},computedFormSlots:m,computedSearchSlots:h,computedToolbarSlots:v,computeBodyHeight:s,computedClass:b,innerWrapperRef:y}}const e3e=K({name:"FsCrud",inheritAttrs:!1,props:{id:{type:String,default:""},table:{type:Object,default(){return{}}},data:{type:Array},rowHandle:{type:Object,default(){return{}}},search:{type:Object,default(){return{}}},toolbar:{type:Object,default(){return{}}},actionbar:{type:Object,default(){return{}}},tabs:{type:Object,default(){return{}}},addForm:{type:Object,default(){return{}}},editForm:{type:Object,default(){return{}}},viewForm:{type:Object,default(){return{}}},pagination:{type:Object,default(){return{show:!1}}},container:{type:Object,default(){return{}}},customClass:{},form:{type:Object,default(){return{}}},selection:{type:Object,default(){return{show:!1}}}},emits:["update:search","update:compact","update:columns","form-value-change","update:modelValue","tab-change"],setup(e,t){const{ui:n}=sn();Gye(e,t);const a=Xye(),o=Jye(a,e,t),r=Qye(e,t);return{ui:n,...a,...r,...o}}}),t3e={class:"fs-crud-search"},n3e={key:0,class:"fs-crud-actionbar"},a3e={key:0,class:"fs-crud-toolbar"},o3e={class:"fs-crud-pagination"},r3e={class:"fs-pagination-left"},l3e={class:"fs-pagination"},s3e={class:"fs-pagination-right"};function i3e(e,t,n,a,o,r){var l;const s=He("fs-actionbar"),i=He("fs-toolbar"),u=He("fs-tabs-filter"),c=He("fs-table"),f=He("fs-form-wrapper");return C(),ae(Me(((l=e.container)==null?void 0:l.is)||"fs-layout-default"),Re({ref:"containerRef",class:"fs-crud-container"},e.container,{class:e.computedClass}),{"header-top":te(()=>[re(e.$slots,"header-top")]),"header-bottom":te(()=>[re(e.$slots,"header-bottom")]),"header-middle":te(()=>[re(e.$slots,"header-middle")]),search:te(()=>[M("div",t3e,[(C(),ae(Me(e.search.is||"fs-search"),Re({ref:"searchRef"},e.search,{slots:e.computedSearchSlots}),null,16,["slots"]))])]),actionbar:te(()=>[e.actionbar&&e.actionbar.show!==!1?(C(),A("div",n3e,[re(e.$slots,"actionbar-left"),J(s,gn(va(e.actionbar)),null,16),re(e.$slots,"actionbar-right")])):le("",!0)]),toolbar:te(()=>[e.toolbar&&e.toolbar.show!==!1?(C(),A("div",a3e,[re(e.$slots,"toolbar-left"),J(i,Re({ref:"toolbarRef"},e.toolbar,{slots:e.computedToolbarSlots,columns:e.table.columns}),null,16,["slots","columns"]),re(e.$slots,"toolbar-right")])):le("",!0)]),tabs:te(()=>[e.tabsBinding.show?(C(),ae(u,Re({key:0,ref:"tabsRef",class:"fs-tabs"},e.tabsBinding),null,16)):le("",!0)]),table:te(()=>[J(c,Re({ref:"tableRef",class:"fs-crud-table"},e.computedTable,{columns:e.table.columns,loading:e.table.loading,"row-handle":e.rowHandle,data:e.data,"cell-slots":e.computedCellSlots}),null,16,["columns","loading","row-handle","data","cell-slots"])]),form:te(()=>[M("div",{ref:"innerWrapperRef",class:L(["fs-form-wrapper-container",{"fs-form-inner-wrapper":e.isFormInner}])},[J(f,{ref:"formWrapperRef",slots:e.computedFormSlots,"inner-wrapper":e.innerWrapperRef,onInnerChange:e.onFormInnerChange,onValueChange:t[0]||(t[0]=p=>e.$emit("form-value-change",p))},null,8,["slots","inner-wrapper","onInnerChange"])],2)]),pagination:te(()=>[M("div",o3e,[M("div",r3e,[re(e.$slots,"pagination-left")]),M("div",l3e,[e.pagination.show!==!1?(C(),ae(Me(e.ui.pagination.name),gn(Re({key:0},e.pagination)),null,16)):le("",!0)]),M("div",s3e,[re(e.$slots,"pagination-right")])])]),"footer-top":te(()=>[re(e.$slots,"footer-top")]),"footer-bottom":te(()=>[re(e.$slots,"footer-bottom")]),default:te(()=>[re(e.$slots,"default")]),_:3},16,["class"])}const u3e=Rn(e3e,[["render",i3e]]),c3e=K({name:"FsRowHandle",props:{dropdown:{type:Object},buttons:{type:Object},group:{type:Object},active:{type:String,default:"default"},scope:{type:Object,default:()=>({})}},emits:["handle"],setup(e,t){const{ui:n}=sn(),{merge:a}=_n(),{t:o}=ao(),r=x(()=>({...e.scope,row:e.scope[n.tableColumn.row],index:e.scope[n.tableColumn.index]})),l=(g,b)=>{const y=e.scope[n.tableColumn.index],w=e.scope[n.tableColumn.row],_={key:g.key,row:w,btn:g,index:y,...e.scope,loadingRef:b==null?void 0:b.loadingRef};if(g.click)return g.click(_);t.emit("handle",_)},{doComputed:s}=kr(),i=x(()=>({dropdown:e.dropdown,buttons:e.buttons,active:e.active,group:e.group})),u=s(()=>i.value,()=>{const g=e.scope[n.tableColumn.index],b=e.scope[n.tableColumn.row];return{...e.scope,index:g,row:b}}),c=x(()=>{let g=null;if(u.value.active==null||u.value.active==="default"){const y={view:{key:"view",text:o("fs.rowHandle.view.text"),title:o("fs.rowHandle.view.text")},copy:{key:"copy",text:o("fs.rowHandle.copy.text"),title:o("fs.rowHandle.copy.text")},edit:{key:"edit",type:"primary",text:o("fs.rowHandle.edit.text"),title:o("fs.rowHandle.edit.text")},remove:{key:"remove",...n.button.colors("danger"),text:o("fs.rowHandle.remove.text"),title:o("fs.rowHandle.remove.text")}};g=a(y,u.value.buttons)}else g=u.value.group[u.value.active];const b=[];return dt(g,(y,w)=>{y.key=w,y.show!==!1&&b.push(y)}),Bi(b,y=>y.order??Bs.orderDefault)}),f=x(()=>u.value.dropdown==null||u.value.dropdown.atLeast==null||u.value.dropdown.atLeast<=0||c.value.length<=u.value.dropdown.atLeast?0:u.value.dropdown.atLeast||0);function p(g,b){return g.dropdown===!0||f.value>0&&f.value{let g=0;for(const b of c.value){if(p(b,g))return!0;g++}return!1});function h(g){for(let b of c.value)if(g===b.key){l(b);return}}const v=x(()=>{const g={};if(n.dropdown.renderMode!=="slot"){const b=c.value,y=[];dt(b,(w,_)=>{w.show!==!1&&p(w,_)&&y.push({[n.dropdown.value]:w.key,[n.dropdown.label]:w.text,title:w.title})}),g.options=y}return{...Uo(e.dropdown,"more","atLeast"),...n.dropdown.command(h),...g}});return{ui:n,hasDropdownBtn:m,computedHandleBtns:c,doDropdownItemClick:h,computedDropdownAtLeast:f,doClick:l,isDropdownBtn:p,scopeRef:r,computedDropdownBinding:v}}}),d3e={class:"fs-row-handle"},f3e={key:0,class:"row-handle-btn fs-handle-row-dropdown"};function p3e(e,t,n,a,o,r){const l=He("fs-render"),s=He("fs-button"),i=He("fs-icon");return C(),A("div",d3e,[re(e.$slots,"cell-rowHandle-left",gn(va(e.scopeRef))),(C(!0),A(Ae,null,it(e.computedHandleBtns,(u,c)=>(C(),A(Ae,{key:c},[u.show!==!1&&!e.isDropdownBtn(u,c)?(C(),A(Ae,{key:0},[u.render?(C(),ae(l,{key:0,"render-func":u.render,scope:e.scopeRef},null,8,["render-func","scope"])):(C(),ae(s,Re({key:1,class:"row-handle-btn"},{ref_for:!0},u,{onClick:nt(f=>e.doClick(u,f),["stop"])}),null,16,["onClick"]))],64)):le("",!0)],64))),128)),re(e.$slots,"cell-rowHandle-middle",gn(va(e.scope))),e.hasDropdownBtn?(C(),A("span",f3e,[(C(),ae(Me(e.ui.dropdown.name),gn(va(e.computedDropdownBinding)),{[e.ui.dropdown.slotName]:te(()=>[e.ui.dropdown.renderMode==="slot"?(C(),ae(Me(e.ui.dropdownMenu.name),gn(Re({key:0},e.ui.dropdownMenu.command(e.doDropdownItemClick))),{default:te(()=>[(C(!0),A(Ae,null,it(e.computedHandleBtns,(u,c)=>(C(),A(Ae,{key:c},[u.show!==!1&&e.isDropdownBtn(u,c)?(C(),ae(Me(e.ui.dropdownItem.name),Re({key:0,[e.ui.dropdownItem.command||""]:u.key},{ref_for:!0},u.dropdownItem,{disabled:u.disabled}),{default:te(()=>[M("div",Re({class:"fs-row-handle-dropdown-item"},{ref_for:!0},u),[u.icon?(C(),ae(i,{key:0,icon:u.icon},null,8,["icon"])):le("",!0),Ct(" "+ye(u.text||u.title),1)],16)]),_:2},1040,["disabled"])):le("",!0)],64))),128))]),_:1},16)):le("",!0)]),default:te(()=>[J(s,gn(va(e.dropdown.more)),null,16)]),_:2},1040))])):le("",!0),re(e.$slots,"cell-rowHandle-right",gn(va(e.scope)))])}const h3e=Rn(c3e,[["render",p3e]]);function hi(){return hi=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function Gp(e,t,n){return v3e()?Gp=Reflect.construct.bind():Gp=function(a,o,r){var l=[null];l.push.apply(l,o);var s=Function.bind.apply(a,l),i=new s;return r&&tf(i,r.prototype),i},Gp.apply(null,arguments)}function g3e(e){return Function.toString.call(e).indexOf("[native code]")!==-1}function _g(e){var t=typeof Map=="function"?new Map:void 0;return _g=function(n){if(n===null||!g3e(n))return n;if(typeof n!="function")throw new TypeError("Super expression must either be null or a function");if(typeof t<"u"){if(t.has(n))return t.get(n);t.set(n,a)}function a(){return Gp(n,arguments,Cg(this).constructor)}return a.prototype=Object.create(n.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),tf(a,n)},_g(e)}var b3e=/%[sdj%]/g,y3e=function(){};function Sg(e){if(!e||!e.length)return null;var t={};return e.forEach(function(n){var a=n.field;t[a]=t[a]||[],t[a].push(n)}),t}function ko(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),a=1;a=r)return s;switch(s){case"%s":return String(n[o++]);case"%d":return Number(n[o++]);case"%j":try{return JSON.stringify(n[o++])}catch{return"[Circular]"}break;default:return s}});return l}return e}function w3e(e){return e==="string"||e==="url"||e==="hex"||e==="email"||e==="date"||e==="pattern"}function ya(e,t){return!!(e==null||t==="array"&&Array.isArray(e)&&!e.length||w3e(t)&&typeof e=="string"&&!e)}function C3e(e,t,n){var a=[],o=0,r=e.length;function l(s){a.push.apply(a,s||[]),o++,o===r&&n(a)}e.forEach(function(s){t(s,l)})}function Q8(e,t,n){var a=0,o=e.length;function r(l){if(l&&l.length){n(l);return}var s=a;a=a+1,s{delete r[h]}),n.headers=eo.concat(l,r);const s=[];let i=!0;this.interceptors.request.forEach(function(v){if(typeof v.runWhen=="function"&&v.runWhen(n)===!1)return;i=i&&v.synchronous;const g=n.transitional||yb;g&&g.legacyInterceptorReqResOrdering?s.unshift(v.fulfilled,v.rejected):s.push(v.fulfilled,v.rejected)});const u=[];this.interceptors.response.forEach(function(v){u.push(v.fulfilled,v.rejected)});let c,f=0,p;if(!i){const h=[Pw.bind(this),void 0];for(h.unshift(...s),h.push(...u),p=h.length,c=Promise.resolve(n);f{if(!a._listeners)return;let r=a._listeners.length;for(;r-- >0;)a._listeners[r](o);a._listeners=null}),this.promise.then=o=>{let r;const l=new Promise(s=>{a.subscribe(s),r=s}).then(o);return l.cancel=function(){a.unsubscribe(r)},l},t(function(r,l,s){a.reason||(a.reason=new Bf(r,l,s),n(a.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=a=>{t.abort(a)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new AT(function(o){t=o}),cancel:t}}};function Q5e(e){return function(n){return e.apply(null,n)}}function e_e(e){return Ee.isObject(e)&&e.isAxiosError===!0}const Vg={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(Vg).forEach(([e,t])=>{Vg[t]=e});function $T(e){const t=new Ci(e),n=fT(Ci.prototype.request,t);return Ee.extend(n,Ci.prototype,t,{allOwnKeys:!0}),Ee.extend(n,t,null,{allOwnKeys:!0}),n.create=function(o){return $T(Ni(e,o))},n}const aa=$T(Df);aa.Axios=Ci;aa.CanceledError=Bf;aa.CancelToken=Z5e;aa.isCancel=kT;aa.VERSION=Cb;aa.toFormData=um;aa.AxiosError=Ot;aa.Cancel=aa.CanceledError;aa.all=function(t){return Promise.all(t)};aa.spread=Q5e;aa.isAxiosError=e_e;aa.mergeConfig=Ni;aa.AxiosHeaders=eo;aa.formToJSON=e=>xT(Ee.isHTMLForm(e)?new FormData(e):e);aa.getAdapter=RT.getAdapter;aa.HttpStatusCode=Vg;aa.default=aa;const{Axios:u_e,AxiosError:c_e,CanceledError:d_e,isCancel:f_e,CancelToken:p_e,VERSION:h_e,all:m_e,Cancel:v_e,isAxiosError:g_e,spread:b_e,toFormData:y_e,AxiosHeaders:w_e,HttpStatusCode:C_e,formToJSON:__e,getAdapter:S_e,mergeConfig:x_e,create:k_e}=aa,t_e="/api",Cd=aa.create({baseURL:t_e,timeout:3e4});Cd.interceptors.request.use(e=>{const t=localStorage.getItem("access_token");return t&&(e.headers.Authorization=`Bearer ${t}`),e});Cd.interceptors.response.use(e=>e,e=>{var t;if(((t=e.response)==null?void 0:t.status)===401){localStorage.removeItem("access_token");const n=window.location.pathname;n.startsWith("/admin/login")||(window.location.href=`/admin/login?redirect=${encodeURIComponent(n+window.location.search)}`)}return Promise.reject(e)});const n_e=pR("auth",()=>{const e=F(localStorage.getItem("access_token")||""),t=F(null),n=F([]),a=F([]),o=x(()=>!!e.value),r=x(()=>n.value.map(m=>m.code));function l(m){e.value=m,m?localStorage.setItem("access_token",m):localStorage.removeItem("access_token")}async function s(){const{data:m}=await Cd.get("/users/me");return t.value=m,m}async function i(){const{data:m}=await Cd.get("/permissions/user/me");return n.value=m.permissions||[],a.value=m.menu||[],{permissions:n.value,menu:a.value}}async function u(){await s(),await i()}function c(m){return r.value.includes(m)}function f(m){return m.some(h=>r.value.includes(h))}async function p(){try{await Cd.post("/users/logout")}catch{}t.value=null,n.value=[],a.value=[],l("")}return{token:e,user:t,permissions:n,menu:a,permissionCodes:r,isAuthenticated:o,setToken:l,fetchProfile:s,fetchPermissions:i,loginAndFetchData:u,hasPermission:c,hasAnyPermission:f,logout:p}}),PT=y1e({history:Jge("/"),routes:[{path:"/",name:"public-home",meta:{title:"首页"},component:()=>Ar(()=>import("./PublicHome-BE6848HM.js"),__vite__mapDeps([0,1]))},{path:"/admin/login",name:"admin-login",meta:{title:"管理后台登录",guestOnly:!0},component:()=>Ar(()=>import("./LoginView-CL6FqBfI.js"),__vite__mapDeps([2,3]))},{path:"/admin",component:()=>Ar(()=>import("./AdminLayout-C8hRi9x-.js"),__vite__mapDeps([4,5])),meta:{requiresAuth:!0},children:[{path:"",redirect:{name:"admin-users"}},{path:"users",name:"admin-users",meta:{title:"用户管理",permission:"perm:user"},component:()=>Ar(()=>import("./UserManage-DExq8OEE.js"),__vite__mapDeps([6,7]))},{path:"roles",name:"admin-roles",meta:{title:"角色管理",permission:"perm:role"},component:()=>Ar(()=>import("./RoleManage-C7cZ0SSm.js"),__vite__mapDeps([8,7,9]))},{path:"menu",name:"admin-menu",meta:{title:"菜单管理",permission:"perm:menu"},component:()=>Ar(()=>import("./MenuManage-J689-0Rz.js"),__vite__mapDeps([10,7]))},{path:"settings",name:"admin-settings",meta:{title:"系统设置",permission:"system:"},component:()=>Ar(()=>import("./SettingManage-DbOShH1j.js"),__vite__mapDeps([11,12]))},{path:"login-logs",name:"admin-login-logs",meta:{title:"登录日志",permission:"log:"},component:()=>Ar(()=>import("./LoginLogManage-CQqltd1Y.js"),[])},{path:"operation-logs",name:"admin-operation-logs",meta:{title:"操作日志",permission:"log:"},component:()=>Ar(()=>import("./OperationLogManage-CrJsIKz-.js"),[])}]}]});PT.beforeEach(async(e,t,n)=>{const a=n_e(),o=e.meta.title||"BookSystem";if(document.title=`${o} · BookSystem`,e.meta.requiresAuth&&!a.isAuthenticated){n({name:"admin-login",query:{redirect:e.fullPath}});return}if(e.meta.guestOnly&&a.isAuthenticated){if(!a.user||a.permissions.length===0)try{await a.fetchProfile(),await a.fetchPermissions()}catch{a.logout(),n({name:"admin-login"});return}n({name:"admin-users"});return}const r=e.meta.permission;if(r&&a.isAuthenticated&&a.permissions.length>0&&!a.permissions.some(s=>s.code.startsWith(r))){n({name:"admin-users"});return}n()});const vc=o5(pCe);vc.use(sR());vc.use(i2e,{locale:u2e});vc.use(dT);vc.use(oCe,{ui:dT.set(),commonOptions:()=>({search:{container:{layout:"multi-line"}}})});vc.use(PT);vc.mount("#app");export{Me as A,d as B,x as C,RK as D,AE as E,Ae as F,tt as G,r_e as H,Re as I,Oe as J,g_e as K,wt as L,QC as M,a_e as N,xbe as O,$E as P,tm as Z,cCe as _,M as a,Ct as b,A as c,J as d,nm as e,K as f,gt as g,aa as h,F as i,Nt as j,s7 as k,o_e as l,nt as m,Cd as n,C as o,jo as p,ae as q,He as r,HS as s,ye as t,n_e as u,VY as v,te as w,LW as x,le as y,it as z}; +`+r)}}catch{}}throw a}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=Ni(this.defaults,n);const{transitional:a,paramsSerializer:o,headers:r}=n;a!==void 0&&ah.assertOptions(a,{silentJSONParsing:Po.transitional(Po.boolean),forcedJSONParsing:Po.transitional(Po.boolean),clarifyTimeoutError:Po.transitional(Po.boolean),legacyInterceptorReqResOrdering:Po.transitional(Po.boolean)},!1),o!=null&&(Ee.isFunction(o)?n.paramsSerializer={serialize:o}:ah.assertOptions(o,{encode:Po.function,serialize:Po.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),ah.assertOptions(n,{baseUrl:Po.spelling("baseURL"),withXsrfToken:Po.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let l=r&&Ee.merge(r.common,r[n.method]);r&&Ee.forEach(["delete","get","head","post","put","patch","query","common"],h=>{delete r[h]}),n.headers=eo.concat(l,r);const s=[];let i=!0;this.interceptors.request.forEach(function(v){if(typeof v.runWhen=="function"&&v.runWhen(n)===!1)return;i=i&&v.synchronous;const g=n.transitional||yb;g&&g.legacyInterceptorReqResOrdering?s.unshift(v.fulfilled,v.rejected):s.push(v.fulfilled,v.rejected)});const u=[];this.interceptors.response.forEach(function(v){u.push(v.fulfilled,v.rejected)});let c,f=0,p;if(!i){const h=[Pw.bind(this),void 0];for(h.unshift(...s),h.push(...u),p=h.length,c=Promise.resolve(n);f{if(!a._listeners)return;let r=a._listeners.length;for(;r-- >0;)a._listeners[r](o);a._listeners=null}),this.promise.then=o=>{let r;const l=new Promise(s=>{a.subscribe(s),r=s}).then(o);return l.cancel=function(){a.unsubscribe(r)},l},t(function(r,l,s){a.reason||(a.reason=new Bf(r,l,s),n(a.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=a=>{t.abort(a)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new AT(function(o){t=o}),cancel:t}}};function Q5e(e){return function(n){return e.apply(null,n)}}function e_e(e){return Ee.isObject(e)&&e.isAxiosError===!0}const Vg={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(Vg).forEach(([e,t])=>{Vg[t]=e});function $T(e){const t=new Ci(e),n=fT(Ci.prototype.request,t);return Ee.extend(n,Ci.prototype,t,{allOwnKeys:!0}),Ee.extend(n,t,null,{allOwnKeys:!0}),n.create=function(o){return $T(Ni(e,o))},n}const aa=$T(Df);aa.Axios=Ci;aa.CanceledError=Bf;aa.CancelToken=Z5e;aa.isCancel=kT;aa.VERSION=Cb;aa.toFormData=um;aa.AxiosError=Ot;aa.Cancel=aa.CanceledError;aa.all=function(t){return Promise.all(t)};aa.spread=Q5e;aa.isAxiosError=e_e;aa.mergeConfig=Ni;aa.AxiosHeaders=eo;aa.formToJSON=e=>xT(Ee.isHTMLForm(e)?new FormData(e):e);aa.getAdapter=RT.getAdapter;aa.HttpStatusCode=Vg;aa.default=aa;const{Axios:u_e,AxiosError:c_e,CanceledError:d_e,isCancel:f_e,CancelToken:p_e,VERSION:h_e,all:m_e,Cancel:v_e,isAxiosError:g_e,spread:b_e,toFormData:y_e,AxiosHeaders:w_e,HttpStatusCode:C_e,formToJSON:__e,getAdapter:S_e,mergeConfig:x_e,create:k_e}=aa,t_e="/api",Cd=aa.create({baseURL:t_e,timeout:3e4});Cd.interceptors.request.use(e=>{const t=localStorage.getItem("access_token");return t&&(e.headers.Authorization=`Bearer ${t}`),e});Cd.interceptors.response.use(e=>e,e=>{var t;if(((t=e.response)==null?void 0:t.status)===401){localStorage.removeItem("access_token");const n=window.location.pathname;n.startsWith("/admin/login")||(window.location.href=`/admin/login?redirect=${encodeURIComponent(n+window.location.search)}`)}return Promise.reject(e)});const n_e=pR("auth",()=>{const e=F(localStorage.getItem("access_token")||""),t=F(null),n=F([]),a=F([]),o=x(()=>!!e.value),r=x(()=>n.value.map(m=>m.code));function l(m){e.value=m,m?localStorage.setItem("access_token",m):localStorage.removeItem("access_token")}async function s(){const{data:m}=await Cd.get("/users/me");return t.value=m,m}async function i(){const{data:m}=await Cd.get("/permissions/user/me");return n.value=m.permissions||[],a.value=m.menu||[],{permissions:n.value,menu:a.value}}async function u(){await s(),await i()}function c(m){return r.value.includes(m)}function f(m){return m.some(h=>r.value.includes(h))}async function p(){try{await Cd.post("/users/logout")}catch{}t.value=null,n.value=[],a.value=[],l("")}return{token:e,user:t,permissions:n,menu:a,permissionCodes:r,isAuthenticated:o,setToken:l,fetchProfile:s,fetchPermissions:i,loginAndFetchData:u,hasPermission:c,hasAnyPermission:f,logout:p}}),PT=y1e({history:Jge("/"),routes:[{path:"/",name:"public-home",meta:{title:"首页"},component:()=>Ar(()=>import("./PublicHome-4L60krmd.js"),__vite__mapDeps([0,1]))},{path:"/admin/login",name:"admin-login",meta:{title:"管理后台登录",guestOnly:!0},component:()=>Ar(()=>import("./LoginView-CdDWJNab.js"),__vite__mapDeps([2,3]))},{path:"/admin",component:()=>Ar(()=>import("./AdminLayout-ltF-ui71.js"),__vite__mapDeps([4,5])),meta:{requiresAuth:!0},children:[{path:"",redirect:{name:"admin-users"}},{path:"users",name:"admin-users",meta:{title:"用户管理",permission:"perm:user"},component:()=>Ar(()=>import("./UserManage-DDgTVhjY.js"),__vite__mapDeps([6,7]))},{path:"roles",name:"admin-roles",meta:{title:"角色管理",permission:"perm:role"},component:()=>Ar(()=>import("./RoleManage-7Ni_fgq0.js"),__vite__mapDeps([8,7,9]))},{path:"menu",name:"admin-menu",meta:{title:"菜单管理",permission:"perm:menu"},component:()=>Ar(()=>import("./MenuManage-BEleckEE.js"),__vite__mapDeps([10,7]))},{path:"settings",name:"admin-settings",meta:{title:"系统设置",permission:"system:"},component:()=>Ar(()=>import("./SettingManage-D3eSU6jo.js"),__vite__mapDeps([11,12]))},{path:"login-logs",name:"admin-login-logs",meta:{title:"登录日志",permission:"log:"},component:()=>Ar(()=>import("./LoginLogManage-COZ7cyEH.js"),[])},{path:"operation-logs",name:"admin-operation-logs",meta:{title:"操作日志",permission:"log:"},component:()=>Ar(()=>import("./OperationLogManage-BIONNQB8.js"),[])}]}]});PT.beforeEach(async(e,t,n)=>{const a=n_e(),o=e.meta.title||"BookSystem";if(document.title=`${o} · BookSystem`,e.meta.requiresAuth&&!a.isAuthenticated){n({name:"admin-login",query:{redirect:e.fullPath}});return}if(e.meta.guestOnly&&a.isAuthenticated){if(!a.user||a.permissions.length===0)try{await a.fetchProfile(),await a.fetchPermissions()}catch{a.logout(),n({name:"admin-login"});return}n({name:"admin-users"});return}const r=e.meta.permission;if(r&&a.isAuthenticated&&a.permissions.length>0&&!a.permissions.some(s=>s.code.startsWith(r))){n({name:"admin-users"});return}n()});const vc=o5(pCe);vc.use(sR());vc.use(i2e,{locale:u2e});vc.use(dT);vc.use(oCe,{ui:dT.set(),commonOptions:()=>({search:{container:{layout:"multi-line"}}})});vc.use(PT);vc.mount("#app");export{Me as A,d as B,x as C,RK as D,AE as E,Ae as F,tt as G,r_e as H,Re as I,Oe as J,g_e as K,wt as L,QC as M,a_e as N,xbe as O,$E as P,tm as Z,cCe as _,M as a,Ct as b,A as c,J as d,nm as e,K as f,gt as g,aa as h,F as i,Nt as j,s7 as k,o_e as l,nt as m,Cd as n,C as o,jo as p,ae as q,He as r,HS as s,ye as t,n_e as u,VY as v,te as w,LW as x,le as y,it as z}; diff --git a/frontend/dist/index.html b/frontend/dist/index.html index 28a2433..e96c187 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -4,7 +4,7 @@ BookSystem - +