diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/awesomeProject.iml b/.idea/awesomeProject.iml
new file mode 100644
index 0000000..5e764c4
--- /dev/null
+++ b/.idea/awesomeProject.iml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..cc47053
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/a_business_help.sql b/a_business_help.sql
new file mode 100644
index 0000000..b67b4c4
--- /dev/null
+++ b/a_business_help.sql
@@ -0,0 +1,502 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server : local
+ Source Server Type : MySQL
+ Source Server Version : 80041 (8.0.41)
+ Source Host : localhost:3306
+ Source Schema : a_business_help
+
+ Target Server Type : MySQL
+ Target Server Version : 80041 (8.0.41)
+ File Encoding : 65001
+
+ Date: 27/12/2025 17:18:06
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for banners
+-- ----------------------------
+DROP TABLE IF EXISTS `banners`;
+CREATE TABLE `banners` (
+ `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
+ `title` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '轮播图标题',
+ `image_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '轮播图图片URL',
+ `link_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '点击跳转链接',
+ `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '描述信息',
+ `sort_order` bigint NOT NULL DEFAULT 0 COMMENT '排序序号',
+ `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:0禁用,1启用',
+ `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+ `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of banners
+-- ----------------------------
+INSERT INTO `banners` VALUES (1, '1', '/back/file/20250916110937_f2a179bd.png', '', '', 0, 1, '2025-09-16 11:09:41', '2025-09-16 11:09:41');
+INSERT INTO `banners` VALUES (2, '2', '/back/file/20250916111002_09ee01c2.png', '', '', 1, 1, '2025-09-16 11:10:03', '2025-09-16 11:11:24');
+
+-- ----------------------------
+-- Table structure for config_changes
+-- ----------------------------
+DROP TABLE IF EXISTS `config_changes`;
+CREATE TABLE `config_changes` (
+ `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
+ `config_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '配置键',
+ `old_value` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '旧值',
+ `new_value` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '新值',
+ `change_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '变更类型',
+ `changed_by` bigint NOT NULL COMMENT '修改人ID',
+ `changed_at` bigint NOT NULL COMMENT '修改时间戳',
+ `extra` json NULL COMMENT '额外信息',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of config_changes
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for order_messages
+-- ----------------------------
+DROP TABLE IF EXISTS `order_messages`;
+CREATE TABLE `order_messages` (
+ `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
+ `order_id` bigint UNSIGNED NOT NULL,
+ `order_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'purchase',
+ `user_id` bigint UNSIGNED NOT NULL,
+ `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
+ `created_at` datetime(3) NULL DEFAULT NULL,
+ `updated_at` datetime(3) NULL DEFAULT NULL,
+ `images` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL,
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `idx_order_messages_order_id`(`order_id` ASC) USING BTREE,
+ INDEX `idx_order_messages_user_id`(`user_id` ASC) USING BTREE,
+ CONSTRAINT `fk_order_messages_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
+) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of order_messages
+-- ----------------------------
+INSERT INTO `order_messages` VALUES (1, 13, 'purchase', 8, '你好', '2025-09-13 14:04:51.529', '2025-09-13 14:04:51.529', NULL);
+INSERT INTO `order_messages` VALUES (2, 6, 'sales', 8, '已完成', '2025-09-13 14:07:19.470', '2025-09-13 14:07:19.470', NULL);
+INSERT INTO `order_messages` VALUES (3, 17, 'purchase', 7, '尽快确认', '2025-09-13 14:22:25.648', '2025-09-13 14:22:25.648', NULL);
+INSERT INTO `order_messages` VALUES (4, 7, 'sales', 8, '了解', '2025-09-13 15:19:49.892', '2025-09-13 15:19:49.892', NULL);
+INSERT INTO `order_messages` VALUES (5, 21, 'purchase', 1, '完成', '2025-09-13 16:48:34.984', '2025-09-13 16:48:34.984', NULL);
+INSERT INTO `order_messages` VALUES (6, 7, 'purchase', 7, '凭证在此', '2025-09-16 12:31:32.666', '2025-09-16 12:31:32.666', '/back/file/20250916123132_da65b168.png');
+INSERT INTO `order_messages` VALUES (7, 22, 'purchase', 7, '你好', '2025-09-16 12:36:53.652', '2025-09-16 12:36:53.652', '');
+INSERT INTO `order_messages` VALUES (8, 22, 'purchase', 7, '阿斯顿', '2025-09-16 12:43:38.617', '2025-09-16 12:43:38.617', '/back/file/20250916124338_dededd0c.png');
+INSERT INTO `order_messages` VALUES (9, 9, 'sales', 7, '阿萨', '2025-09-16 12:53:47.556', '2025-09-16 12:53:47.556', '/back/file/20250916125347_dededd0c.png');
+
+-- ----------------------------
+-- Table structure for primary_products
+-- ----------------------------
+DROP TABLE IF EXISTS `primary_products`;
+CREATE TABLE `primary_products` (
+ `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
+ `category_id` bigint UNSIGNED NOT NULL COMMENT '分类ID',
+ `product_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品名称',
+ `product_description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '商品描述',
+ `product_images` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '商品图片URLs,逗号分割',
+ `original_price` decimal(10, 2) NOT NULL COMMENT '原价',
+ `current_price` decimal(10, 2) NOT NULL COMMENT '现价',
+ `stock_quantity` bigint NOT NULL DEFAULT 0 COMMENT '库存数量',
+ `sales_count` bigint NOT NULL DEFAULT 0 COMMENT '销量',
+ `view_count` bigint NOT NULL DEFAULT 0 COMMENT '浏览量',
+ `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:0下架,1上架',
+ `sort_order` bigint NOT NULL DEFAULT 0 COMMENT '排序序号',
+ `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+ `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ `is_hot` tinyint NOT NULL DEFAULT 0 COMMENT '是否为热门商品:0否,1是',
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `fk_primary_products_category`(`category_id` ASC) USING BTREE,
+ CONSTRAINT `fk_primary_products_category` FOREIGN KEY (`category_id`) REFERENCES `product_categories` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
+) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of primary_products
+-- ----------------------------
+INSERT INTO `primary_products` VALUES (1, 4, '酒水', '酒水酒水', '/back/file/20250902104133_a0ac0a17.jpeg,/back/file/20250902104136_e18fe0eb.jpeg', 999.00, 888.00, 9976, 29, 32, 1, 0, '2025-09-02 10:41:47', '2025-12-20 16:02:04', 1);
+INSERT INTO `primary_products` VALUES (2, 3, '测试', '啊手动阀手动阀', '/back/file/20250916115526_fc06f62c.png', 99.00, 77.00, 72, 5, 4, 1, 0, '2025-09-16 11:55:34', '2025-12-20 15:30:16', 0);
+
+-- ----------------------------
+-- Table structure for product_categories
+-- ----------------------------
+DROP TABLE IF EXISTS `product_categories`;
+CREATE TABLE `product_categories` (
+ `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
+ `category_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '分类名称',
+ `category_icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '分类图标URL',
+ `sort_order` bigint NOT NULL DEFAULT 0 COMMENT '排序序号',
+ `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:0禁用,1启用',
+ `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+ `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of product_categories
+-- ----------------------------
+INSERT INTO `product_categories` VALUES (1, '学习培训', '/back/file/20250902091924_9b4298ba.png', 0, 1, '2025-09-02 09:19:27', '2025-09-02 10:47:09');
+INSERT INTO `product_categories` VALUES (2, '美食', '/back/file/20250902092108_e056556d.png', 1, 1, '2025-09-02 09:21:20', '2025-09-02 09:21:20');
+INSERT INTO `product_categories` VALUES (3, '酒店', '/back/file/20250902102539_639669b0.png', 0, 1, '2025-09-02 10:25:40', '2025-09-02 10:25:40');
+INSERT INTO `product_categories` VALUES (4, '酒水饮料', '/back/file/20250902102604_883b4677.png', 3, 1, '2025-09-02 10:26:08', '2025-09-02 10:26:08');
+INSERT INTO `product_categories` VALUES (5, 'yi', '/back/file/20250916105653_0b6dc315.png', 0, 1, '2025-09-16 10:57:00', '2025-09-16 10:57:00');
+INSERT INTO `product_categories` VALUES (6, '二', '/back/file/20250916105705_0b6dc315.png', 0, 1, '2025-09-16 10:57:08', '2025-09-16 10:57:08');
+INSERT INTO `product_categories` VALUES (7, '三', '/back/file/20250916105715_0b6dc315.png', 0, 1, '2025-09-16 10:57:15', '2025-09-16 10:57:15');
+INSERT INTO `product_categories` VALUES (8, '四', '/back/file/20250916105722_0b6dc315.png', 0, 1, '2025-09-16 10:57:23', '2025-09-16 10:57:23');
+INSERT INTO `product_categories` VALUES (9, '五', '/back/file/20250916105729_0b6dc315.png', 0, 1, '2025-09-16 10:57:30', '2025-09-16 10:57:30');
+
+-- ----------------------------
+-- Table structure for purchase_orders
+-- ----------------------------
+DROP TABLE IF EXISTS `purchase_orders`;
+CREATE TABLE `purchase_orders` (
+ `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
+ `order_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '订单编号',
+ `buyer_id` bigint UNSIGNED NOT NULL COMMENT '买家用户ID',
+ `seller_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '卖家用户ID(二级商品交易时使用)',
+ `product_id` bigint NOT NULL COMMENT '商品ID',
+ `product_type` tinyint NOT NULL COMMENT '商品类型:1一级商品,2二级商品',
+ `product_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品名称',
+ `product_images` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '商品图片URLs,逗号分割',
+ `unit_price` decimal(10, 2) NOT NULL COMMENT '单价',
+ `quantity` bigint NOT NULL DEFAULT 1 COMMENT '数量',
+ `total_amount` decimal(10, 2) NOT NULL COMMENT '总金额',
+ `address_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '收货地址ID',
+ `order_status` tinyint NOT NULL DEFAULT 0 COMMENT '订单状态:0待付款,1待确认,2已完成,3已取消',
+ `confirm_time` timestamp NULL DEFAULT NULL COMMENT '确认时间',
+ `remark` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '备注',
+ `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+ `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ `payment_proof_image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `idx_purchase_orders_order_no`(`order_no` ASC) USING BTREE,
+ INDEX `fk_purchase_orders_buyer`(`buyer_id` ASC) USING BTREE,
+ INDEX `fk_purchase_orders_seller`(`seller_id` ASC) USING BTREE,
+ INDEX `fk_purchase_orders_address`(`address_id` ASC) USING BTREE,
+ CONSTRAINT `fk_purchase_orders_address` FOREIGN KEY (`address_id`) REFERENCES `user_addresses` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+ CONSTRAINT `fk_purchase_orders_buyer` FOREIGN KEY (`buyer_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+ CONSTRAINT `fk_purchase_orders_seller` FOREIGN KEY (`seller_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
+) ENGINE = InnoDB AUTO_INCREMENT = 34 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of purchase_orders
+-- ----------------------------
+INSERT INTO `purchase_orders` VALUES (1, 'PO17568750558', 8, NULL, 1, 1, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 2, 1776.00, 1, 3, NULL, '', '2025-09-03 12:50:55', '2025-09-03 12:57:31', '');
+INSERT INTO `purchase_orders` VALUES (2, 'PO17568755868', 8, NULL, 1, 1, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 2, 1776.00, 1, 2, '2025-09-03 13:25:21', '完成了', '2025-09-03 12:59:46', '2025-09-03 13:25:21', '/back/file/20250903125954_d771c101.png');
+INSERT INTO `purchase_orders` VALUES (3, 'PO17568780478', 8, NULL, 1, 1, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 1, 888.00, 1, 2, '2025-09-03 13:41:10', '欧克', '2025-09-03 13:40:47', '2025-09-03 13:41:10', '/back/file/20250903134051_ea22e0d9.jpeg');
+INSERT INTO `purchase_orders` VALUES (4, 'PO17568782318', 8, NULL, 1, 1, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 1, 888.00, 1, 2, '2025-09-03 13:44:35', '欧克', '2025-09-03 13:43:51', '2025-09-03 13:44:35', '/back/file/20250903134356_d771c101.png');
+INSERT INTO `purchase_orders` VALUES (5, 'PO17568784918', 8, NULL, 1, 1, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 1, 888.00, 1, 2, '2025-09-03 13:48:41', '完成', '2025-09-03 13:48:11', '2025-09-03 13:48:41', '/back/file/20250903134815_d771c101.png');
+INSERT INTO `purchase_orders` VALUES (6, 'PO17568801536', 6, 8, 1, 2, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 899.00, 1, 899.00, 2, 3, NULL, '', '2025-09-03 14:15:53', '2025-09-03 17:12:32', '');
+INSERT INTO `purchase_orders` VALUES (7, 'PO17568835147', 7, 8, 2, 2, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 1, 888.00, 3, 2, '2025-09-03 15:43:47', '', '2025-09-03 15:11:54', '2025-09-03 15:43:47', '/back/file/20250903153218_ea22e0d9.jpeg');
+INSERT INTO `purchase_orders` VALUES (8, 'PO17569507758', 8, NULL, 1, 1, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 1, 888.00, 1, 3, NULL, '', '2025-09-04 09:52:55', '2025-09-04 09:53:11', '');
+INSERT INTO `purchase_orders` VALUES (9, 'PO17569509006', 6, 8, 5, 2, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 879.00, 1, 879.00, 2, 3, NULL, '', '2025-09-04 09:55:00', '2025-09-04 09:55:18', '');
+INSERT INTO `purchase_orders` VALUES (10, 'PO17569509266', 6, 8, 5, 2, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 879.00, 1, 879.00, 2, 3, NULL, '', '2025-09-04 09:55:26', '2025-09-04 10:27:58', '/back/file/20250904101417_7c6bf467.png');
+INSERT INTO `purchase_orders` VALUES (11, 'PO17577382648', 8, NULL, 1, 1, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 1, 888.00, 1, 3, NULL, '', '2025-09-13 12:37:44', '2025-09-13 13:15:00', '');
+INSERT INTO `purchase_orders` VALUES (12, 'PO17577385698', 8, NULL, 1, 1, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 1, 888.00, 1, 3, NULL, '', '2025-09-13 12:42:49', '2025-09-13 13:15:00', '');
+INSERT INTO `purchase_orders` VALUES (13, 'PO17577389748', 8, NULL, 1, 1, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 1, 888.00, 1, 2, '2025-09-13 12:52:02', '啊', '2025-09-13 12:49:34', '2025-09-13 12:52:02', '/back/file/20250913125113_3657ddb6.jpg');
+INSERT INTO `purchase_orders` VALUES (14, 'PO17577391807', 7, 8, 6, 2, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 879.00, 1, 879.00, 3, 2, '2025-09-13 12:56:18', '', '2025-09-13 12:53:00', '2025-09-13 12:56:18', '/back/file/20250913125535_3657ddb6.jpg');
+INSERT INTO `purchase_orders` VALUES (15, 'PO17577392837', 7, NULL, 1, 1, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 1, 888.00, 3, 3, NULL, '', '2025-09-13 12:54:43', '2025-09-13 13:30:00', '');
+INSERT INTO `purchase_orders` VALUES (16, 'PO17577394497', 7, 8, 5, 2, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 879.00, 1, 879.00, 3, 1, NULL, '', '2025-09-13 12:57:29', '2025-09-13 12:57:34', '/back/file/20250913125733_3657ddb6.jpg');
+INSERT INTO `purchase_orders` VALUES (17, 'PO17577445297', 7, 8, 7, 2, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 879.00, 1, 879.00, 3, 1, NULL, '', '2025-09-13 14:22:09', '2025-09-13 14:22:15', '/back/file/20250913142213_3657ddb6.jpg');
+INSERT INTO `purchase_orders` VALUES (18, 'PO17577518998', 8, NULL, 1, 1, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 5, 4440.00, 1, 1, NULL, '', '2025-09-13 16:24:59', '2025-09-13 16:25:03', '/back/file/20250913162502_3657ddb6.jpg');
+INSERT INTO `purchase_orders` VALUES (19, 'PO17577522668', 8, 7, 8, 2, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 870.00, 1, 870.00, 1, 2, '2025-09-13 16:31:35', '', '2025-09-13 16:31:06', '2025-09-13 16:31:35', '/back/file/20250913163110_3657ddb6.jpg');
+INSERT INTO `purchase_orders` VALUES (20, 'PO17577524237', 7, NULL, 1, 1, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 1, 888.00, 3, 2, '2025-09-13 16:34:03', '啊', '2025-09-13 16:33:43', '2025-09-13 16:34:03', '/back/file/20250913163347_3657ddb6.jpg');
+INSERT INTO `purchase_orders` VALUES (21, 'PO17577524978', 8, 7, 9, 2, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 879.00, 1, 879.00, 1, 2, '2025-09-13 16:35:27', '', '2025-09-13 16:34:57', '2025-09-13 16:35:27', '/back/file/20250913163500_3657ddb6.jpg');
+INSERT INTO `purchase_orders` VALUES (22, 'PO17579957867', 7, NULL, 2, 1, '测试', '/back/file/20250916115526_fc06f62c.png', 77.00, 1, 77.00, 3, 2, '2025-09-16 12:10:09', '完成', '2025-09-16 12:09:46', '2025-09-16 12:10:09', '/back/file/20250916120952_dededd0c.png');
+INSERT INTO `purchase_orders` VALUES (23, 'PO17586830156', 6, 7, 10, 2, '测试', '/back/file/20250916115526_fc06f62c.png', 68.00, 1, 68.00, 2, 2, '2025-09-24 11:05:08', '', '2025-09-24 11:03:35', '2025-09-24 11:05:08', '/back/file/20250924110357_ea22e0d9.jpeg');
+INSERT INTO `purchase_orders` VALUES (24, 'PO17586847026', 6, 8, 4, 2, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 879.00, 1, 879.00, 2, 1, NULL, '', '2025-09-24 11:31:42', '2025-09-24 11:32:21', '/back/file/20250924113219_0b6dc315.png');
+INSERT INTO `purchase_orders` VALUES (25, 'PO17586847646', 6, NULL, 1, 1, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 10, 8880.00, 2, 2, '2025-09-24 11:33:59', '而无法', '2025-09-24 11:32:44', '2025-09-24 11:33:59', '/back/file/20250924113247_883b4677.png');
+INSERT INTO `purchase_orders` VALUES (26, 'PO17586849757', 7, 6, 11, 2, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 879.00, 1, 879.00, 3, 2, '2025-09-24 11:45:30', '', '2025-09-24 11:36:15', '2025-09-24 11:45:30', '/back/file/20250924113618_883b4677.png');
+INSERT INTO `purchase_orders` VALUES (27, 'PO17662156171', 1, NULL, 2, 1, '测试', '/back/file/20250916115526_fc06f62c.png', 77.00, 1, 77.00, 5, 2, '2025-12-20 15:29:00', 'wc1', '2025-12-20 15:26:57', '2025-12-20 15:29:00', '/back/file/20251220152707_b89ec398.png');
+INSERT INTO `purchase_orders` VALUES (28, 'PO17662157691', 1, NULL, 2, 1, '测试', '/back/file/20250916115526_fc06f62c.png', 77.00, 1, 77.00, 5, 2, '2025-12-20 15:30:09', '123', '2025-12-20 15:29:29', '2025-12-20 15:30:09', '/back/file/20251220152938_71cb232a.png');
+INSERT INTO `purchase_orders` VALUES (29, 'PO17662157911', 1, NULL, 2, 1, '测试', '/back/file/20250916115526_fc06f62c.png', 77.00, 1, 77.00, 5, 2, '2025-12-20 15:30:06', ' 123', '2025-12-20 15:29:51', '2025-12-20 15:30:06', '/back/file/20251220152955_2e30c931.png');
+INSERT INTO `purchase_orders` VALUES (30, 'PO17662158151', 1, NULL, 2, 1, '测试', '/back/file/20250916115526_fc06f62c.png', 77.00, 1, 77.00, 5, 1, NULL, '', '2025-12-20 15:30:15', '2025-12-20 15:30:20', '/back/file/20251220153019_2e30c931.png');
+INSERT INTO `purchase_orders` VALUES (31, 'PO17662160932', 2, 1, 14, 2, '测试', '/back/file/20250916115526_fc06f62c.png', 68.00, 1, 68.00, 6, 2, '2025-12-20 16:01:52', '', '2025-12-20 15:34:53', '2025-12-20 16:01:52', '/back/file/20251220153458_02f6f844.png');
+INSERT INTO `purchase_orders` VALUES (32, 'PO17662177231', 1, NULL, 1, 1, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 1, 888.00, 5, 0, NULL, '', '2025-12-20 16:02:03', '2025-12-20 16:02:03', '');
+INSERT INTO `purchase_orders` VALUES (33, 'PO17662179888', 8, 1, 13, 2, '测试', '/back/file/20250916115526_fc06f62c.png', 68.00, 1, 68.00, 4, 0, NULL, '', '2025-12-20 16:06:28', '2025-12-20 16:06:28', '');
+
+-- ----------------------------
+-- Table structure for sales_orders
+-- ----------------------------
+DROP TABLE IF EXISTS `sales_orders`;
+CREATE TABLE `sales_orders` (
+ `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
+ `order_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '订单编号',
+ `seller_id` bigint UNSIGNED NOT NULL COMMENT '卖家用户ID',
+ `buyer_id` bigint UNSIGNED NOT NULL COMMENT '买家用户ID',
+ `secondary_product_id` bigint UNSIGNED NOT NULL COMMENT '二级商品ID',
+ `product_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品名称',
+ `product_images` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '商品图片URLs,逗号分割',
+ `selling_price` decimal(10, 2) NOT NULL COMMENT '出售价格',
+ `quantity` bigint NOT NULL DEFAULT 1 COMMENT '数量',
+ `total_amount` decimal(10, 2) NOT NULL COMMENT '总金额',
+ `address_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '收货地址ID',
+ `order_status` tinyint NOT NULL DEFAULT 0 COMMENT '订单状态:0待付款,1待发货,2确认完成,3已取消',
+ `complete_time` timestamp NULL DEFAULT NULL COMMENT '完成时间',
+ `remark` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '备注',
+ `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+ `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ `payment_proof_image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+ `purchase_order_id` bigint UNSIGNED NULL DEFAULT NULL,
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `idx_sales_orders_order_no`(`order_no` ASC) USING BTREE,
+ INDEX `fk_sales_orders_secondary_product`(`secondary_product_id` ASC) USING BTREE,
+ INDEX `fk_sales_orders_address`(`address_id` ASC) USING BTREE,
+ INDEX `fk_sales_orders_seller`(`seller_id` ASC) USING BTREE,
+ INDEX `fk_sales_orders_buyer`(`buyer_id` ASC) USING BTREE,
+ INDEX `fk_sales_orders_purchase_order`(`purchase_order_id` ASC) USING BTREE,
+ CONSTRAINT `fk_sales_orders_address` FOREIGN KEY (`address_id`) REFERENCES `user_addresses` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+ CONSTRAINT `fk_sales_orders_buyer` FOREIGN KEY (`buyer_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+ CONSTRAINT `fk_sales_orders_purchase_order` FOREIGN KEY (`purchase_order_id`) REFERENCES `purchase_orders` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+ CONSTRAINT `fk_sales_orders_secondary_product` FOREIGN KEY (`secondary_product_id`) REFERENCES `secondary_products` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+ CONSTRAINT `fk_sales_orders_seller` FOREIGN KEY (`seller_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
+) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sales_orders
+-- ----------------------------
+INSERT INTO `sales_orders` VALUES (1, 'SO17568801538', 8, 6, 1, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 899.00, 1, 899.00, 2, 3, NULL, '', '2025-09-03 14:15:53', '2025-12-20 16:04:53', '', 6);
+INSERT INTO `sales_orders` VALUES (2, 'SO17568835148', 8, 7, 2, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 1, 888.00, 3, 2, '2025-09-03 15:43:47', '', '2025-09-03 15:11:54', '2025-09-03 15:43:47', '/back/file/20250903153218_ea22e0d9.jpeg', 7);
+INSERT INTO `sales_orders` VALUES (3, 'SO17569509008', 8, 6, 5, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 879.00, 1, 879.00, 2, 3, NULL, '', '2025-09-04 09:55:00', '2025-12-20 16:04:53', '', 9);
+INSERT INTO `sales_orders` VALUES (4, 'SO17569509268', 8, 6, 5, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 879.00, 1, 879.00, 2, 3, NULL, '不完整', '2025-09-04 09:55:26', '2025-12-20 16:04:53', '/back/file/20250904101417_7c6bf467.png', 10);
+INSERT INTO `sales_orders` VALUES (5, 'SO17577391808', 8, 7, 6, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 879.00, 1, 879.00, 3, 2, '2025-09-13 12:56:18', '', '2025-09-13 12:53:00', '2025-09-13 12:56:18', '/back/file/20250913125535_3657ddb6.jpg', 14);
+INSERT INTO `sales_orders` VALUES (6, 'SO17577394498', 8, 7, 5, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 879.00, 1, 879.00, 3, 2, '2025-09-13 12:57:54', '完成', '2025-09-13 12:57:29', '2025-09-13 12:57:54', '/back/file/20250913125733_3657ddb6.jpg', 16);
+INSERT INTO `sales_orders` VALUES (7, 'SO17577445298', 8, 7, 7, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 879.00, 1, 879.00, 3, 2, '2025-09-13 16:26:39', '完成', '2025-09-13 14:22:09', '2025-09-13 16:26:39', '/back/file/20250913142213_3657ddb6.jpg', 17);
+INSERT INTO `sales_orders` VALUES (8, 'SO17577522667', 7, 8, 8, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 870.00, 1, 870.00, 1, 2, '2025-09-13 16:31:35', '', '2025-09-13 16:31:06', '2025-09-13 16:31:35', '/back/file/20250913163110_3657ddb6.jpg', 19);
+INSERT INTO `sales_orders` VALUES (9, 'SO17577524977', 7, 8, 9, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 879.00, 1, 879.00, 1, 2, '2025-09-13 16:35:27', '', '2025-09-13 16:34:57', '2025-09-13 16:35:27', '/back/file/20250913163500_3657ddb6.jpg', 21);
+INSERT INTO `sales_orders` VALUES (10, 'SO17586830157', 7, 6, 10, '测试', '/back/file/20250916115526_fc06f62c.png', 68.00, 1, 68.00, 2, 2, '2025-09-24 11:05:08', '', '2025-09-24 11:03:35', '2025-09-24 11:05:08', '/back/file/20250924110357_ea22e0d9.jpeg', 23);
+INSERT INTO `sales_orders` VALUES (11, 'SO17586847028', 8, 6, 4, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 879.00, 1, 879.00, 2, 1, NULL, '', '2025-09-24 11:31:42', '2025-09-24 11:32:21', '/back/file/20250924113219_0b6dc315.png', 24);
+INSERT INTO `sales_orders` VALUES (12, 'SO17586849756', 6, 7, 11, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 879.00, 1, 879.00, 3, 2, '2025-09-24 11:45:30', '', '2025-09-24 11:36:15', '2025-09-24 11:45:30', '/back/file/20250924113618_883b4677.png', 26);
+INSERT INTO `sales_orders` VALUES (13, 'SO17662160931', 1, 2, 14, '测试', '/back/file/20250916115526_fc06f62c.png', 68.00, 1, 68.00, 6, 2, '2025-12-20 16:01:52', '', '2025-12-20 15:34:53', '2025-12-20 16:01:52', '/back/file/20251220153458_02f6f844.png', 31);
+INSERT INTO `sales_orders` VALUES (14, 'SO17662179881', 1, 8, 13, '测试', '/back/file/20250916115526_fc06f62c.png', 68.00, 1, 68.00, 4, 0, NULL, '', '2025-12-20 16:06:28', '2025-12-20 16:06:28', '', 33);
+
+-- ----------------------------
+-- Table structure for score_records
+-- ----------------------------
+DROP TABLE IF EXISTS `score_records`;
+CREATE TABLE `score_records` (
+ `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
+ `user_id` bigint UNSIGNED NOT NULL COMMENT '用户编号',
+ `change_number` bigint NOT NULL COMMENT '变化数量',
+ `note` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '说明',
+ `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+ `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `fk_score_records_user`(`user_id` ASC) USING BTREE,
+ CONSTRAINT `fk_score_records_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
+) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of score_records
+-- ----------------------------
+INSERT INTO `score_records` VALUES (1, 4, 5, 'ig', '2025-09-02 09:00:33', '2025-09-02 09:00:33');
+INSERT INTO `score_records` VALUES (3, 5, 5, '赠送', '2025-09-03 16:32:08', '2025-09-03 16:32:08');
+INSERT INTO `score_records` VALUES (4, 8, 3000, '系统充值', '2025-09-03 16:55:00', '2025-09-03 16:55:00');
+INSERT INTO `score_records` VALUES (5, 8, -500, '扣除', '2025-09-03 16:55:14', '2025-09-03 16:55:14');
+INSERT INTO `score_records` VALUES (6, 8, 9, '系统策略', '2025-09-13 12:56:18', '2025-09-13 12:56:18');
+INSERT INTO `score_records` VALUES (7, 7, 9, '系统策略', '2025-09-13 16:31:34', '2025-09-13 16:31:34');
+INSERT INTO `score_records` VALUES (8, 7, 9, '系统策略', '2025-09-13 16:35:27', '2025-09-13 16:35:27');
+INSERT INTO `score_records` VALUES (9, 7, 9, '系统策略', '2025-09-24 11:05:07', '2025-09-24 11:05:07');
+INSERT INTO `score_records` VALUES (10, 6, 9, '系统策略', '2025-09-24 11:38:01', '2025-09-24 11:38:01');
+INSERT INTO `score_records` VALUES (11, 6, 9, '系统策略', '2025-09-24 11:43:59', '2025-09-24 11:43:59');
+INSERT INTO `score_records` VALUES (12, 6, 9, '系统策略', '2025-09-24 11:45:30', '2025-09-24 11:45:30');
+INSERT INTO `score_records` VALUES (13, 1, 9, '系统策略', '2025-12-20 16:01:51', '2025-12-20 16:01:51');
+
+-- ----------------------------
+-- Table structure for secondary_products
+-- ----------------------------
+DROP TABLE IF EXISTS `secondary_products`;
+CREATE TABLE `secondary_products` (
+ `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
+ `seller_id` bigint UNSIGNED NOT NULL COMMENT '卖家用户ID',
+ `original_product_id` bigint NULL DEFAULT NULL COMMENT '原始商品ID(一级商品ID或二级商品ID)',
+ `original_product_type` tinyint NOT NULL COMMENT '原始商品类型:1一级商品,2二级商品',
+ `product_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品名称',
+ `product_description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '商品描述',
+ `product_images` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '商品图片URLs,JSON格式存储',
+ `cost_price` decimal(10, 2) NOT NULL COMMENT '成本价(用户购买时的价格)',
+ `selling_price` decimal(10, 2) NOT NULL COMMENT '出售价格',
+ `quantity` bigint NOT NULL DEFAULT 1 COMMENT '出售数量',
+ `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:0下架,1上架,2已售出',
+ `view_count` bigint NOT NULL DEFAULT 0 COMMENT '浏览量',
+ `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+ `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ `category_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '商品分类ID',
+ `product_condition` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL,
+ `user_warehouse_id` bigint UNSIGNED NOT NULL,
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `fk_secondary_products_seller`(`seller_id` ASC) USING BTREE,
+ INDEX `fk_secondary_products_category`(`category_id` ASC) USING BTREE,
+ INDEX `fk_secondary_products_user_warehouse`(`user_warehouse_id` ASC) USING BTREE,
+ CONSTRAINT `fk_secondary_products_category` FOREIGN KEY (`category_id`) REFERENCES `product_categories` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+ CONSTRAINT `fk_secondary_products_seller` FOREIGN KEY (`seller_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+ CONSTRAINT `fk_secondary_products_user_warehouse` FOREIGN KEY (`user_warehouse_id`) REFERENCES `user_warehouse` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
+) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of secondary_products
+-- ----------------------------
+INSERT INTO `secondary_products` VALUES (1, 8, 1, 1, '酒水', '酒水 - 来自个人仓库', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 899.00, 1, 0, 10, '2025-09-03 14:02:19', '2025-09-04 09:41:59', 1, '九成新', 3);
+INSERT INTO `secondary_products` VALUES (2, 8, 1, 1, '酒水', '酒水 - 来自个人仓库', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 888.00, 0, 1, 11, '2025-09-03 15:09:40', '2025-09-10 13:33:29', 1, '九成新', 2);
+INSERT INTO `secondary_products` VALUES (3, 8, 1, 1, '酒水', '酒水 - 来自个人仓库', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 976.80, 2, 0, 1, '2025-09-04 09:43:30', '2025-09-04 09:51:46', 1, '九成新', 1);
+INSERT INTO `secondary_products` VALUES (4, 8, 1, 1, '酒水', '酒水 - 来自个人仓库', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 879.00, 0, 1, 17, '2025-09-04 09:53:50', '2025-09-24 11:31:43', 1, '九成新', 3);
+INSERT INTO `secondary_products` VALUES (5, 8, 1, 1, '酒水', '酒水 - 来自个人仓库', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 879.00, 0, 1, 12, '2025-09-04 09:53:53', '2025-09-13 12:57:30', 1, '九成新', 1);
+INSERT INTO `secondary_products` VALUES (6, 8, 1, 1, '酒水', '酒水 - 来自个人仓库', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 879.00, 0, 1, 6, '2025-09-13 12:52:30', '2025-09-13 12:57:23', 1, '九成新', 1);
+INSERT INTO `secondary_products` VALUES (7, 8, 1, 1, '酒水', '酒水 - 来自个人仓库', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 879.00, 0, 1, 5, '2025-09-13 14:18:51', '2025-09-13 15:23:16', 1, '九成新', 4);
+INSERT INTO `secondary_products` VALUES (8, 7, 7, 2, '酒水', '酒水 - 来自个人仓库', '/back/file/20250902104133_a0ac0a17.jpeg', 879.00, 870.00, 0, 1, 4, '2025-09-13 16:28:41', '2025-09-13 16:31:06', 1, '九成新', 5);
+INSERT INTO `secondary_products` VALUES (9, 7, 1, 1, '酒水', '酒水 - 来自个人仓库123', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 879.00, 0, 1, 3, '2025-09-13 16:34:24', '2025-09-13 16:34:58', 1, '九成新', 6);
+INSERT INTO `secondary_products` VALUES (10, 7, 2, 1, '测试', '测试 - 来自个人仓库', '/back/file/20250916115526_fc06f62c.png', 77.00, 68.00, 0, 1, 4, '2025-09-16 12:10:21', '2025-09-24 11:03:36', 3, '九成新', 8);
+INSERT INTO `secondary_products` VALUES (11, 6, 1, 1, '酒水', '酒水 - 来自个人仓库', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 879.00, 0, 1, 4, '2025-09-24 11:35:19', '2025-09-24 11:36:15', 4, '九成新', 9);
+INSERT INTO `secondary_products` VALUES (12, 1, 2, 1, '测试', '测试 - 来自个人仓库', '/back/file/20250916115526_fc06f62c.png', 77.00, 68.00, 1, 1, 1, '2025-12-20 15:30:37', '2025-12-20 16:08:39', 3, '九成新', 11);
+INSERT INTO `secondary_products` VALUES (13, 1, 2, 1, '测试', '测试 - 来自个人仓库', '/back/file/20250916115526_fc06f62c.png', 77.00, 68.00, 0, 1, 3, '2025-12-20 15:30:38', '2025-12-20 16:06:29', 3, '九成新', 13);
+INSERT INTO `secondary_products` VALUES (14, 1, 2, 1, '测试', '测试 - 来自个人仓库', '/back/file/20250916115526_fc06f62c.png', 77.00, 68.00, 0, 1, 3, '2025-12-20 15:30:40', '2025-12-20 15:34:53', 3, '九成新', 12);
+
+-- ----------------------------
+-- Table structure for system_configs
+-- ----------------------------
+DROP TABLE IF EXISTS `system_configs`;
+CREATE TABLE `system_configs` (
+ `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
+ `config_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '配置键',
+ `config_value` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '配置值',
+ `config_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '配置名称',
+ `config_description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '配置描述',
+ `config_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'string' COMMENT '配置类型:string、number、boolean、json',
+ `is_system` tinyint NOT NULL DEFAULT 0 COMMENT '是否系统配置:0否,1是',
+ `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+ `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `idx_system_configs_config_key`(`config_key` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of system_configs
+-- ----------------------------
+INSERT INTO `system_configs` VALUES (1, 'warehouse_price_rate', '-9', '入库价格增值(负数为减少,正数为增加)', '商品进入用户仓库时的价格增值', 'number', 1, '2025-09-02 08:16:52', '2025-09-10 12:28:33');
+INSERT INTO `system_configs` VALUES (6, 'order_over_time', '25', '订单超时时间', '订单超时时间(分钟)', 'number', 1, '2025-09-03 15:50:15', '2025-09-04 08:59:19');
+INSERT INTO `system_configs` VALUES (7, 'phone', '12345678913', '客服电话', '', 'string', 1, '2025-09-03 15:53:02', '2025-09-04 08:58:54');
+INSERT INTO `system_configs` VALUES (8, 'limit_days', '0', '买家限制天数(0 为不限制)', '限制天数(0 为不限制)', 'string', 1, '2025-09-04 08:52:16', '2025-12-20 16:08:15');
+
+-- ----------------------------
+-- Table structure for user_addresses
+-- ----------------------------
+DROP TABLE IF EXISTS `user_addresses`;
+CREATE TABLE `user_addresses` (
+ `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
+ `user_id` bigint UNSIGNED NOT NULL COMMENT '用户ID',
+ `consignee_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '收件人姓名',
+ `consignee_phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '收件人电话',
+ `province` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '省份',
+ `city` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '城市',
+ `district` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '区县',
+ `detail_address` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '详细地址',
+ `postal_code` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '邮政编码',
+ `is_default` tinyint NOT NULL DEFAULT 0 COMMENT '是否默认地址:0否,1是',
+ `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+ `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `fk_user_addresses_user`(`user_id` ASC) USING BTREE,
+ CONSTRAINT `fk_user_addresses_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT
+) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of user_addresses
+-- ----------------------------
+INSERT INTO `user_addresses` VALUES (1, 8, '牛马牛马', '18369004078', '北京市', '北京市', '东城区', '阿斯顿撒旦撒大苏打', '', 0, '2025-09-03 11:13:51', '2025-09-13 20:48:10');
+INSERT INTO `user_addresses` VALUES (2, 6, '牛阿斯顿', '18661900405', '北京市', '北京市', '东城区', 'sadsadsad', '', 1, '2025-09-03 14:15:48', '2025-09-03 14:15:48');
+INSERT INTO `user_addresses` VALUES (3, 7, 'sad', '18361900405', '北京市', '北京市', '东城区', 'sadasd', '', 1, '2025-09-03 15:11:49', '2025-09-03 15:11:49');
+INSERT INTO `user_addresses` VALUES (4, 8, '周天周天', '18961900403', '北京市', '市辖区', '朝阳区', '阿斯顿撒旦撒大苏打', '', 1, '2025-09-13 20:48:10', '2025-09-13 20:48:10');
+INSERT INTO `user_addresses` VALUES (5, 1, '乱说的', '18361940401', '北京市', '市辖区', '东城区', 'asd', 'asdasd', 1, '2025-12-20 15:26:53', '2025-12-20 15:26:53');
+INSERT INTO `user_addresses` VALUES (6, 2, 'wesr', '18361900405', '北京市', '市辖区', '东城区', 'sadf', 'asd', 1, '2025-12-20 15:34:50', '2025-12-20 15:34:50');
+
+-- ----------------------------
+-- Table structure for user_warehouse
+-- ----------------------------
+DROP TABLE IF EXISTS `user_warehouse`;
+CREATE TABLE `user_warehouse` (
+ `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
+ `user_id` bigint UNSIGNED NOT NULL COMMENT '用户ID',
+ `product_id` bigint NOT NULL COMMENT '商品ID',
+ `product_type` tinyint NOT NULL COMMENT '商品类型:1一级商品,2二级商品',
+ `product_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品名称',
+ `product_images` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '商品图片URLs,JSON格式存储',
+ `purchase_price` decimal(10, 2) NOT NULL COMMENT '购买价格',
+ `warehouse_price` decimal(10, 2) NOT NULL COMMENT '入库价格(根据系统常量增值后)',
+ `quantity` bigint NOT NULL DEFAULT 1 COMMENT '数量',
+ `source_order_id` bigint NULL DEFAULT NULL COMMENT '来源订单ID',
+ `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:0已出售,1库存中',
+ `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+ `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `fk_user_warehouse_user`(`user_id` ASC) USING BTREE,
+ CONSTRAINT `fk_user_warehouse_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
+) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of user_warehouse
+-- ----------------------------
+INSERT INTO `user_warehouse` VALUES (1, 8, 1, 1, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 879.00, 1, 2, 1, '2025-09-03 13:25:20', '2025-09-13 12:52:31');
+INSERT INTO `user_warehouse` VALUES (2, 8, 1, 1, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 888.00, 0, 4, 0, '2025-09-03 13:44:35', '2025-09-03 15:09:40');
+INSERT INTO `user_warehouse` VALUES (3, 8, 1, 1, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 879.00, 3, 5, 1, '2025-09-03 13:48:40', '2025-09-04 09:53:50');
+INSERT INTO `user_warehouse` VALUES (4, 8, 1, 1, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 879.00, 0, 13, 0, '2025-09-13 12:52:02', '2025-09-13 14:18:52');
+INSERT INTO `user_warehouse` VALUES (5, 7, 7, 2, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 879.00, 870.00, 0, 17, 0, '2025-09-13 16:26:38', '2025-09-13 16:28:42');
+INSERT INTO `user_warehouse` VALUES (6, 7, 1, 1, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 879.00, 0, 20, 0, '2025-09-13 16:34:03', '2025-09-13 16:34:25');
+INSERT INTO `user_warehouse` VALUES (7, 8, 9, 2, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 879.00, 870.00, 1, 21, 1, '2025-09-13 16:35:27', '2025-09-13 16:35:27');
+INSERT INTO `user_warehouse` VALUES (8, 7, 2, 1, '测试', '/back/file/20250916115526_fc06f62c.png', 77.00, 68.00, 0, 22, 0, '2025-09-16 12:10:09', '2025-09-16 12:10:21');
+INSERT INTO `user_warehouse` VALUES (9, 6, 1, 1, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 888.00, 879.00, 9, 25, 1, '2025-09-24 11:33:58', '2025-09-24 11:35:19');
+INSERT INTO `user_warehouse` VALUES (10, 7, 11, 2, '酒水', '/back/file/20250902104133_a0ac0a17.jpeg', 879.00, 870.00, 1, 26, 1, '2025-09-24 11:45:30', '2025-09-24 11:45:30');
+INSERT INTO `user_warehouse` VALUES (11, 1, 2, 1, '测试', '/back/file/20250916115526_fc06f62c.png', 77.00, 68.00, 0, 27, 0, '2025-12-20 15:29:00', '2025-12-20 15:30:37');
+INSERT INTO `user_warehouse` VALUES (12, 1, 2, 1, '测试', '/back/file/20250916115526_fc06f62c.png', 77.00, 68.00, 0, 29, 0, '2025-12-20 15:30:05', '2025-12-20 15:30:40');
+INSERT INTO `user_warehouse` VALUES (13, 1, 2, 1, '测试', '/back/file/20250916115526_fc06f62c.png', 77.00, 68.00, 0, 28, 0, '2025-12-20 15:30:08', '2025-12-20 15:30:39');
+INSERT INTO `user_warehouse` VALUES (14, 2, 14, 2, '测试', '/back/file/20250916115526_fc06f62c.png', 68.00, 59.00, 1, 31, 1, '2025-12-20 16:01:51', '2025-12-20 16:01:51');
+
+-- ----------------------------
+-- Table structure for users
+-- ----------------------------
+DROP TABLE IF EXISTS `users`;
+CREATE TABLE `users` (
+ `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
+ `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
+ `system_role` tinyint NOT NULL DEFAULT 2 COMMENT '系统角色:0管理员,1代理商,2普通用户',
+ `customer_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+ `real_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+ `current_points` bigint NOT NULL DEFAULT 0 COMMENT '当前积分',
+ `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+ `company_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+ `personal_intro` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL,
+ `identity_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+ `referrer_identity_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+ `business_license_image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+ `id_card_front_image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+ `id_card_back_image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+ `main_payment_qr_image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+ `sub_payment_qr_image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+ `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+ `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:0禁用,1启用',
+ `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+ `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ `expiry_date` timestamp NULL DEFAULT NULL COMMENT '过期时间,null表示永不过期',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `idx_users_phone`(`phone` ASC) USING BTREE,
+ UNIQUE INDEX `idx_users_identity_code`(`identity_code` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of users
+-- ----------------------------
+INSERT INTO `users` VALUES (1, '13800138000', 0, '系统管理员', 'Administrator', 9, '/back/file/20250902112107_639669b0.png', '', '', 'A00000001', '', '', '', '', '/back/file/20250903115327_af655669.jpeg', '/back/file/20250903115330_ea22e0d9.jpeg', 'e10adc3949ba59abbe56e057f20f883e', 1, '2025-09-02 08:16:52', '2025-12-20 16:01:52', NULL);
+INSERT INTO `users` VALUES (2, '13800138001', 1, '测试代理商', 'Test Agent', 0, '', '', '', 'T00000002', '', '', '', '', '', '', 'e10adc3949ba59abbe56e057f20f883e', 1, '2025-09-02 08:16:52', '2025-09-13 16:51:06', NULL);
+INSERT INTO `users` VALUES (3, '13800138002', 2, '测试用户1', 'Test User 1', 0, '', '', '', 'U00000003', 'T00000002', '', '', '', '', '', '6ad14ba9986e3615423dfca256d04e3f', 1, '2025-09-02 08:16:53', '2025-09-02 08:16:53', NULL);
+INSERT INTO `users` VALUES (4, '13800138003', 2, '测试用户2', 'Test User 2', 5, '', '', '', 'U00000004', 'T00000002', '', '', '', '', '', '6ad14ba9986e3615423dfca256d04e3f', 1, '2025-09-02 08:16:53', '2025-09-02 09:00:34', NULL);
+INSERT INTO `users` VALUES (5, '18361900404', 2, '李白', '李白', 5, '', '里吧科技', '', '', '', '', '', '', '', '', 'e10adc3949ba59abbe56e057f20f883e', 1, '2025-09-02 12:25:42', '2025-09-03 16:32:09', NULL);
+INSERT INTO `users` VALUES (6, '18361900401', 2, '咯i', '年少的', 27, '', '阿三的', '', 'Ud853ac93', '', '', '', '', '', '', 'e10adc3949ba59abbe56e057f20f883e', 1, '2025-09-02 12:25:42', '2025-09-24 11:45:30', NULL);
+INSERT INTO `users` VALUES (7, '18961900405', 1, '牛马', '牛马', 27, '', '阿三的', '', 'U00000007', 'T00000002', '/back/file/20250902150542_3a4a5b13.png', '/back/file/20250902150503_da9e6bd8.jpg', '/back/file/20250902150539_a082ce87.png', '', '', 'e10adc3949ba59abbe56e057f20f883e', 1, '2025-09-02 15:06:29', '2025-10-23 17:46:04', NULL);
+INSERT INTO `users` VALUES (8, '13225208566', 2, '牛马', '张三', 2509, '/back/file/20250916114909_dededd0c.png', '阿三科技', '', 'U7f27a121', 'T00000002', '', '/back/file/20250903085714_da9e6bd8.jpg', '', '', '', 'e10adc3949ba59abbe56e057f20f883e', 1, '2025-09-03 08:57:43', '2025-12-20 16:06:15', '2025-09-30 00:00:00');
+
+SET FOREIGN_KEY_CHECKS = 1;
diff --git a/cmd/server/main.go b/cmd/server/main.go
new file mode 100644
index 0000000..8e94ad2
--- /dev/null
+++ b/cmd/server/main.go
@@ -0,0 +1,142 @@
+package main
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/events"
+ "awesomeProject/internal/handlers"
+ "awesomeProject/internal/models"
+ "awesomeProject/internal/routers"
+ "awesomeProject/internal/tasks"
+ "fmt"
+ "github.com/gin-gonic/gin"
+ "log"
+ "strings"
+)
+
+func main() {
+ // 1. 加载配置文件
+ config, err := common.LoadConfig("./configs/config.yaml")
+ if err != nil {
+ log.Fatalf("加载配置文件失败: %v", err)
+ }
+ log.Printf("配置加载成功: %s v%s", config.App.Name, config.App.Version)
+
+ // 2. 初始化数据库
+ if err := common.InitDatabase(&config.Database); err != nil {
+ log.Fatalf("数据库初始化失败: %v", err)
+ }
+ defer func() {
+ err := common.CloseDatabase()
+ if err != nil {
+ return
+ }
+ }()
+
+ // 4. 自动迁移数据表
+ if err := models.AutoMigrateAll(); err != nil {
+ log.Fatalf("数据表迁移失败: %v", err)
+ }
+ log.Println("数据表迁移完成")
+
+ // 5. 初始化系统配置
+ //configHandler := &handlers.AdminConfigHandler{}
+ //if err := configHandler.InitSystemConfigs(); err != nil {
+ // log.Fatalf("初始化系统配置失败: %v", err)
+ //}
+ //log.Println("系统配置初始化完成")
+
+ // 6. 初始化事件系统
+ events.InitEventSystem()
+
+ // 7. 初始化定时任务
+ tasks.InitCronTasks()
+ log.Println("定时任务初始化完成")
+
+ // 8. 初始化默认用户
+ initHandler := &handlers.InitHandler{}
+ if err := initHandler.InitAll(); err != nil {
+ log.Fatalf("初始化默认用户失败: %v", err)
+ }
+ log.Println("默认用户初始化完成")
+
+ // 9. 设置 Gin 模式
+ if config.App.Env == "production" {
+ gin.SetMode(gin.ReleaseMode)
+ }
+
+ // 10. 创建Gin路由器和设置路由
+ router := routers.SetupRouter()
+
+ // 配置静态资源
+ // 上传文件的静态资源(允许缓存)
+ router.Static("/back/file", "./public/file")
+
+ // H5 静态资源
+ router.Static("/h5/static", "./public/h5/static")
+ router.Static("/h5/assets", "./public/h5/assets")
+
+ // Vue 静态资源(禁用缓存)
+ webGroup := router.Group("/")
+ webGroup.Use(func(c *gin.Context) {
+ // 只对web静态资源禁用缓存
+ if strings.HasPrefix(c.Request.URL.Path, "/assets") ||
+ strings.HasPrefix(c.Request.URL.Path, "/css") ||
+ strings.HasPrefix(c.Request.URL.Path, "/js") {
+ c.Header("Cache-Control", "no-cache, no-store, must-revalidate")
+ c.Header("Pragma", "no-cache")
+ c.Header("Expires", "0")
+ }
+ c.Next()
+ })
+ webGroup.Static("/assets", "./public/web/assets")
+ webGroup.Static("/css", "./public/web/css")
+ webGroup.Static("/js", "./public/web/js")
+
+ // H5 History 路由支持 - /h5 开头的路由返回 H5 的 index.html
+ router.NoRoute(func(c *gin.Context) {
+ path := c.Request.URL.Path
+
+ // 如果是 API 请求(/back 开头),返回 404
+ if strings.HasPrefix(path, "/back") {
+ c.JSON(404, gin.H{"error": "API not found"})
+ return
+ }
+
+ // H5 路由处理
+ if strings.HasPrefix(path, "/h5") {
+ // 检查是否是静态文件(包含文件扩展名)
+ if strings.Contains(path, ".") {
+ // 静态文件应该已经被上面的 Static 路由处理了
+ // 如果到这里说明文件不存在,返回 404
+ c.JSON(404, gin.H{"error": "File not found"})
+ return
+ }
+ // H5 路由返回 H5 的 index.html
+ c.File("./public/h5/index.html")
+ return
+ }
+
+ // 检查是否是静态文件(包含文件扩展名)
+ if strings.Contains(path, ".") {
+ // 设置禁用缓存的响应头
+ c.Header("Cache-Control", "no-cache, no-store, must-revalidate")
+ c.Header("Pragma", "no-cache")
+ c.Header("Expires", "0")
+
+ // 尝试访问 web 目录下的文件
+ c.File("./public/web" + path)
+ return
+ }
+
+ // 其他路由返回 Vue 应用
+ c.File("./public/web/index.html")
+ })
+
+ // 启动服务器
+ port := fmt.Sprintf(":%d", config.App.Port)
+ log.Printf("服务器启动在端口 %s", port)
+ if err := router.Run(port); err != nil {
+ log.Fatalf("服务器启动失败: %v", err)
+ }
+
+}
diff --git a/configs/config.yaml b/configs/config.yaml
new file mode 100644
index 0000000..0d088a2
--- /dev/null
+++ b/configs/config.yaml
@@ -0,0 +1,42 @@
+# 应用配置
+app:
+ name: "AwesomeProject"
+ version: "1.0.0"
+ port: 8090
+ env: "development" # development, production, test
+
+# 数据库配置
+database:
+ driver: "mysql" # mysql, postgres, sqlite
+ host: "localhost"
+ port: 3306
+ username: "root"
+ password: "123456"
+ dbname: "a_business_help"
+ charset: "utf8mb4"
+ # SQLite 配置 (当 driver 为 sqlite 时使用)
+ sqlite_path: "./data/awesome.db"
+ # 连接池配置
+ max_idle_conns: 10
+ max_open_conns: 100
+ conn_max_lifetime: 3600 # 秒
+
+# JWT 配置
+jwt:
+ secret_key: "your-very-secret-key-32-bytes-long-string"
+ expire_hours: 24
+
+# 服务器配置
+server:
+ read_timeout: 60 # 秒
+ write_timeout: 60 # 秒
+ static_path: "./public"
+ upload_max_size: 100 # MB
+
+# 日志配置
+log:
+ level: "info" # debug, info, warn, error
+ file_path: "./logs/app.log"
+ max_size: 100 # MB
+ max_age: 30 # 天
+ max_backups: 10 # 文件数量
\ No newline at end of file
diff --git a/front/.gitignore b/front/.gitignore
new file mode 100644
index 0000000..8ee54e8
--- /dev/null
+++ b/front/.gitignore
@@ -0,0 +1,30 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+coverage
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+*.tsbuildinfo
diff --git a/front/README.md b/front/README.md
new file mode 100644
index 0000000..9e962b1
--- /dev/null
+++ b/front/README.md
@@ -0,0 +1,29 @@
+# untitled
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vite.dev/config/).
+
+## Project Setup
+
+```sh
+npm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+npm run dev
+```
+
+### Compile and Minify for Production
+
+```sh
+npm run build
+```
diff --git a/front/README_ADMIN.md b/front/README_ADMIN.md
new file mode 100644
index 0000000..fb54a34
--- /dev/null
+++ b/front/README_ADMIN.md
@@ -0,0 +1,206 @@
+# 管理员端前端项目
+
+## 项目概述
+
+这是一个基于Vue 3 + Element Plus的管理员端前端项目,用于管理虚拟商品交易平台。
+
+## 技术栈
+
+- **框架**: Vue 3 (Composition API)
+- **UI库**: Element Plus
+- **状态管理**: Pinia
+- **路由**: Vue Router 4
+- **HTTP客户端**: Axios
+- **图表**: ECharts
+- **构建工具**: Vite
+- **样式**: CSS3 + Tailwind CSS
+
+## 项目结构
+
+```
+src/
+├── layouts/ # 布局组件
+│ └── AdminLayout.vue # 管理端主布局
+├── views/ # 页面组件
+│ ├── Login.vue # 登录页面
+│ └── admin/ # 管理端页面
+│ ├── Dashboard.vue # 仪表盘
+│ ├── Users.vue # 用户管理
+│ ├── Scores.vue # 积分管理
+│ └── orders/ # 订单管理
+│ ├── PurchaseOrders.vue # 买单管理
+│ └── SalesOrders.vue # 卖单管理
+├── stores/ # Pinia状态管理
+│ └── auth.js # 认证状态
+├── router/ # 路由配置
+│ └── index.js # 主路由文件
+└── main.js # 应用入口
+```
+
+## 功能特性
+
+### 🔐 认证系统
+- 支持管理员和代理商登录
+- JWT Token认证
+- 自动路由守卫
+- 权限控制
+
+### 👥 用户管理
+- 用户列表查看(支持搜索、筛选、分页)
+- 用户详情查看
+- 用户创建、编辑、删除(仅管理员)
+- 用户状态管理
+- 权限级别显示
+
+### 📋 订单管理
+- 买单管理(查看、处理订单状态)
+- 卖单管理(查看、处理订单状态)
+- 订单详情查看
+- 支持多条件筛选
+- 订单状态流转
+
+### ⭐ 积分管理
+- 积分记录查看(支持搜索、筛选)
+- 积分记录创建、编辑、删除(仅管理员)
+- 积分变化统计
+- 用户积分查询
+
+### 📊 数据统计
+- 仪表盘数据概览
+- 用户角色分布图表
+- 订单趋势图表
+- 实时统计数据
+
+### 🎨 界面特性
+- 响应式设计,支持移动端
+- 现代化UI设计
+- 暗色侧边栏
+- 面包屑导航
+- 页面切换动画
+- 数据加载状态
+
+## 权限说明
+
+### 管理员权限(system_role=0)
+- ✅ 访问所有功能模块
+- ✅ 用户管理(查看、创建、编辑、删除)
+- ✅ 订单管理(查看、处理)
+- ✅ 积分管理(查看、创建、编辑、删除)
+- ✅ 商品管理(计划中)
+- ✅ 系统配置(计划中)
+
+### 代理商权限(system_role=1)
+- ✅ 仪表盘查看(仅自己邀请的用户数据)
+- ✅ 用户管理(仅查看自己邀请的用户)
+- ✅ 订单管理(仅查看相关用户的订单)
+- ✅ 积分管理(仅查看相关用户的积分记录)
+- ❌ 无创建、编辑、删除权限
+- ❌ 无商品管理权限
+- ❌ 无系统配置权限
+
+## 安装和运行
+
+### 1. 安装依赖
+```bash
+cd front
+npm install
+```
+
+### 2. 启动开发服务器
+```bash
+npm run dev
+```
+
+### 3. 构建生产版本
+```bash
+npm run build
+```
+
+## 默认测试账户
+
+### 管理员账户
+- 手机号:`13800138000`
+- 密码:`admin123`
+- 权限:全部功能
+
+### 代理商账户
+- 手机号:`13800138001`
+- 密码:`agent123`
+- 权限:受限查看
+
+## API配置
+
+项目已配置axios默认baseURL为`/back`,确保后端API正确运行在对应端口。
+
+请求拦截器会自动添加token到请求头:
+```javascript
+headers: {
+ token: localStorage.getItem('token')
+}
+```
+
+响应拦截器会自动处理401未授权错误,跳转到登录页面。
+
+## 开发规范
+
+### 组件命名
+- 页面组件:PascalCase(如:`Users.vue`)
+- 布局组件:PascalCase + Layout后缀(如:`AdminLayout.vue`)
+- 通用组件:PascalCase(如:`DataTable.vue`)
+
+### 状态管理
+- 使用Pinia进行状态管理
+- 按功能模块划分store
+- 使用Composition API风格
+
+### 样式规范
+- 优先使用Element Plus组件样式
+- 使用scoped CSS避免样式污染
+- 响应式设计,移动端适配
+- 使用CSS变量统一主题色彩
+
+### 代码规范
+- 使用Composition API
+- 使用TypeScript类型注解(计划中)
+- 函数和变量使用camelCase命名
+- 常量使用UPPER_SNAKE_CASE命名
+
+## 待开发功能
+
+- [ ] 商品管理页面
+- [ ] 系统配置管理
+- [ ] 数据导出功能
+- [ ] 批量操作功能
+- [ ] 个人信息管理
+- [ ] 操作日志记录
+- [ ] 系统通知功能
+- [ ] 文件上传组件
+- [ ] 富文本编辑器
+- [ ] 国际化支持
+
+## 注意事项
+
+1. **权限控制**:代理商只能看到自己邀请的用户相关数据
+2. **数据过滤**:前端路由守卫 + 后端API权限双重保护
+3. **错误处理**:统一的错误提示和处理机制
+4. **性能优化**:按需加载、虚拟滚动等优化措施
+5. **安全性**:Token自动过期处理、XSS防护
+
+## 浏览器支持
+
+- Chrome >= 87
+- Firefox >= 78
+- Safari >= 14
+- Edge >= 88
+
+## 贡献指南
+
+1. Fork项目
+2. 创建特性分支
+3. 提交更改
+4. 推送到分支
+5. 创建Pull Request
+
+## 许可证
+
+MIT License
\ No newline at end of file
diff --git a/front/index.html b/front/index.html
new file mode 100644
index 0000000..0581c6a
--- /dev/null
+++ b/front/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ 后台
+
+
+
+
+
+
diff --git a/front/jsconfig.json b/front/jsconfig.json
new file mode 100644
index 0000000..5a1f2d2
--- /dev/null
+++ b/front/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ },
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/front/package-lock.json b/front/package-lock.json
new file mode 100644
index 0000000..d5fa946
--- /dev/null
+++ b/front/package-lock.json
@@ -0,0 +1,9670 @@
+{
+ "name": "untitled",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "untitled",
+ "version": "0.0.0",
+ "dependencies": {
+ "@amap/amap-jsapi-loader": "^1.0.1",
+ "@antv/g6": "^5.0.47",
+ "@element-plus/icons-vue": "^2.3.1",
+ "@fortawesome/fontawesome-free": "^6.7.2",
+ "@kangc/v-md-editor": "^2.3.18",
+ "axios": "^1.6.7",
+ "chart.js": "^4.4.7",
+ "dayjs": "^1.11.10",
+ "echarts": "^5.6.0",
+ "element-plus": "^2.5.6",
+ "gojs": "^3.0.22",
+ "markdown-it": "^14.0.0",
+ "neo4j-driver": "^5.28.1",
+ "pinia": "^2.1.7",
+ "prismjs": "^1.29.0",
+ "vue": "^3.5.13",
+ "vue-awesome-swiper": "^5.0.1",
+ "vue-chartjs": "^5.3.2",
+ "vue-router": "^4.3.0"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue": "^5.2.3",
+ "autoprefixer": "^10.4.17",
+ "less": "^4.2.0",
+ "postcss": "^8.4.35",
+ "tailwindcss": "^3.4.1",
+ "unplugin-auto-import": "^0.17.5",
+ "unplugin-vue-components": "^0.26.0",
+ "vite": "^6.2.4",
+ "vite-plugin-proxy": "^0.5.0",
+ "vite-plugin-vue-devtools": "^7.7.2"
+ }
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@amap/amap-jsapi-loader": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz",
+ "integrity": "sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw=="
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@antfu/utils": {
+ "version": "0.7.10",
+ "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.10.tgz",
+ "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@antv/algorithm": {
+ "version": "0.1.26",
+ "resolved": "https://registry.npmmirror.com/@antv/algorithm/-/algorithm-0.1.26.tgz",
+ "integrity": "sha512-DVhcFSQ8YQnMNW34Mk8BSsfc61iC1sAnmcfYoXTAshYHuU50p/6b7x3QYaGctDNKWGvi1ub7mPcSY0bK+aN0qg==",
+ "dependencies": {
+ "@antv/util": "^2.0.13",
+ "tslib": "^2.0.0"
+ }
+ },
+ "node_modules/@antv/algorithm/node_modules/@antv/util": {
+ "version": "2.0.17",
+ "resolved": "https://registry.npmmirror.com/@antv/util/-/util-2.0.17.tgz",
+ "integrity": "sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==",
+ "dependencies": {
+ "csstype": "^3.0.8",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/@antv/component": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmmirror.com/@antv/component/-/component-2.1.3.tgz",
+ "integrity": "sha512-TDePMyrx6rvOeUizcKwrNfSb4vL/hcIsIY01dTD1nXKpR3eDf/q558wN4zGH2NmgX/4TOes7UgSH4iCrpB0eMg==",
+ "dependencies": {
+ "@antv/g": "^6.1.11",
+ "@antv/scale": "^0.4.16",
+ "@antv/util": "^3.3.10",
+ "svg-path-parser": "^1.1.0"
+ }
+ },
+ "node_modules/@antv/event-emitter": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmmirror.com/@antv/event-emitter/-/event-emitter-0.1.3.tgz",
+ "integrity": "sha512-4ddpsiHN9Pd4UIlWuKVK1C4IiZIdbwQvy9i7DUSI3xNJ89FPUFt8lxDYj8GzzfdllV0NkJTRxnG+FvLk0llidg=="
+ },
+ "node_modules/@antv/g": {
+ "version": "6.1.24",
+ "resolved": "https://registry.npmmirror.com/@antv/g/-/g-6.1.24.tgz",
+ "integrity": "sha512-UshMiGnnF9CoaIN9pNhg6yWGU4KloKpGqLhEZU2wN5x11nMVX197yurcpU5vMzAbfdWRLcVW7TJatLQ4rKi1vw==",
+ "dependencies": {
+ "@antv/g-camera-api": "2.0.38",
+ "@antv/g-dom-mutation-observer-api": "2.0.35",
+ "@antv/g-lite": "2.2.19",
+ "@antv/g-web-animations-api": "2.1.24",
+ "@babel/runtime": "^7.25.6"
+ }
+ },
+ "node_modules/@antv/g-camera-api": {
+ "version": "2.0.38",
+ "resolved": "https://registry.npmmirror.com/@antv/g-camera-api/-/g-camera-api-2.0.38.tgz",
+ "integrity": "sha512-BgFkUMcTO06Oz37Z+hVqxATwdWFE5DfBgMKlFaMwKKF/8n+7eNhlif1KBfcf2rEfGijS0FD0ZGKCr9uJ06+GIg==",
+ "dependencies": {
+ "@antv/g-lite": "2.2.19",
+ "@antv/util": "^3.3.5",
+ "@babel/runtime": "^7.25.6",
+ "gl-matrix": "^3.4.3",
+ "tslib": "^2.5.3"
+ }
+ },
+ "node_modules/@antv/g-canvas": {
+ "version": "2.0.43",
+ "resolved": "https://registry.npmmirror.com/@antv/g-canvas/-/g-canvas-2.0.43.tgz",
+ "integrity": "sha512-iAMX+b1eEhwddhm7qiQAtNsnwJQDQsiE5/ELgzni0UHF28zMVTlc5FdDMXKLPuaYs9S/dw/MXBtqctRj2IjA1g==",
+ "dependencies": {
+ "@antv/g-lite": "2.2.19",
+ "@antv/g-plugin-canvas-path-generator": "2.1.19",
+ "@antv/g-plugin-canvas-picker": "2.1.22",
+ "@antv/g-plugin-canvas-renderer": "2.2.22",
+ "@antv/g-plugin-dom-interaction": "2.1.24",
+ "@antv/g-plugin-html-renderer": "2.1.24",
+ "@antv/g-plugin-image-loader": "2.1.22",
+ "@antv/util": "^3.3.5",
+ "@babel/runtime": "^7.25.6",
+ "tslib": "^2.5.3"
+ }
+ },
+ "node_modules/@antv/g-dom-mutation-observer-api": {
+ "version": "2.0.35",
+ "resolved": "https://registry.npmmirror.com/@antv/g-dom-mutation-observer-api/-/g-dom-mutation-observer-api-2.0.35.tgz",
+ "integrity": "sha512-bAl3ViXDHvLEbGvGZwZBg4gpoNjUTwVQ3XTmRAkymkFGkUy+KV0ZwFdqEegP25TQGPl85er/hB6MCu6Yt58AJA==",
+ "dependencies": {
+ "@antv/g-lite": "2.2.19",
+ "@babel/runtime": "^7.25.6"
+ }
+ },
+ "node_modules/@antv/g-lite": {
+ "version": "2.2.19",
+ "resolved": "https://registry.npmmirror.com/@antv/g-lite/-/g-lite-2.2.19.tgz",
+ "integrity": "sha512-QfxZsbLGTSGL18NgSOAVQURXC3xMXbmmS125EF7/vCzW2Lw2nF5I8k0KW4N09ty+/FtVpSESJX652g2phIvd5g==",
+ "dependencies": {
+ "@antv/g-math": "3.0.1",
+ "@antv/util": "^3.3.5",
+ "@antv/vendor": "^1.0.3",
+ "@babel/runtime": "^7.25.6",
+ "eventemitter3": "^5.0.1",
+ "gl-matrix": "^3.4.3",
+ "rbush": "^3.0.1",
+ "tslib": "^2.5.3"
+ }
+ },
+ "node_modules/@antv/g-lite/node_modules/eventemitter3": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.1.tgz",
+ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="
+ },
+ "node_modules/@antv/g-math": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/@antv/g-math/-/g-math-3.0.1.tgz",
+ "integrity": "sha512-FvkDBNRpj+HsLINunrL2PW0OlG368MlpHuihbxleuajGim5kra8tgISwCLmAf8Yz2b1CgZ9PvpohqiLzHS7HLg==",
+ "dependencies": {
+ "@antv/util": "^3.3.5",
+ "@babel/runtime": "^7.25.6",
+ "gl-matrix": "^3.4.3",
+ "tslib": "^2.5.3"
+ }
+ },
+ "node_modules/@antv/g-plugin-canvas-path-generator": {
+ "version": "2.1.19",
+ "resolved": "https://registry.npmmirror.com/@antv/g-plugin-canvas-path-generator/-/g-plugin-canvas-path-generator-2.1.19.tgz",
+ "integrity": "sha512-+tc97NLvVYEFQnrLffmyxPpVXwUuTPbXBGy3aUTBYKd3YXhFBIKJYpQR39jsX2skgUvLh/67ZtA9QeUt6U41oQ==",
+ "dependencies": {
+ "@antv/g-lite": "2.2.19",
+ "@antv/g-math": "3.0.1",
+ "@antv/util": "^3.3.5",
+ "@babel/runtime": "^7.25.6",
+ "tslib": "^2.5.3"
+ }
+ },
+ "node_modules/@antv/g-plugin-canvas-picker": {
+ "version": "2.1.22",
+ "resolved": "https://registry.npmmirror.com/@antv/g-plugin-canvas-picker/-/g-plugin-canvas-picker-2.1.22.tgz",
+ "integrity": "sha512-Pm/N+YTFOlXtjPran3wfN7Iuv0i2YglXrByxvBY8IQ3IzmB68+yZr+yPNRqjgbIM0yh45vIxz3SB/7VwYDPXMA==",
+ "dependencies": {
+ "@antv/g-lite": "2.2.19",
+ "@antv/g-math": "3.0.1",
+ "@antv/g-plugin-canvas-path-generator": "2.1.19",
+ "@antv/g-plugin-canvas-renderer": "2.2.22",
+ "@antv/util": "^3.3.5",
+ "@babel/runtime": "^7.25.6",
+ "gl-matrix": "^3.4.3",
+ "tslib": "^2.5.3"
+ }
+ },
+ "node_modules/@antv/g-plugin-canvas-renderer": {
+ "version": "2.2.22",
+ "resolved": "https://registry.npmmirror.com/@antv/g-plugin-canvas-renderer/-/g-plugin-canvas-renderer-2.2.22.tgz",
+ "integrity": "sha512-+KyorG9lmwx5mogYZ6DP6BaiE9bnGUHojUxg+pTq032dx3SkCkLBl+CB5pZz1C2LEiQ+NkYtP3PlEjgSeeR/9A==",
+ "dependencies": {
+ "@antv/g-lite": "2.2.19",
+ "@antv/g-math": "3.0.1",
+ "@antv/g-plugin-canvas-path-generator": "2.1.19",
+ "@antv/g-plugin-image-loader": "2.1.22",
+ "@antv/util": "^3.3.5",
+ "@babel/runtime": "^7.25.6",
+ "gl-matrix": "^3.4.3",
+ "tslib": "^2.5.3"
+ }
+ },
+ "node_modules/@antv/g-plugin-dom-interaction": {
+ "version": "2.1.24",
+ "resolved": "https://registry.npmmirror.com/@antv/g-plugin-dom-interaction/-/g-plugin-dom-interaction-2.1.24.tgz",
+ "integrity": "sha512-1IrsUp2k+4oi2brVNstgxoisdwcdwqSNdEYJBDtVP1Bv5KZabKSs9lxlkxVR0DTb8BJtWBi80gmKQFIJ8znofQ==",
+ "dependencies": {
+ "@antv/g-lite": "2.2.19",
+ "@babel/runtime": "^7.25.6",
+ "tslib": "^2.5.3"
+ }
+ },
+ "node_modules/@antv/g-plugin-dragndrop": {
+ "version": "2.0.35",
+ "resolved": "https://registry.npmmirror.com/@antv/g-plugin-dragndrop/-/g-plugin-dragndrop-2.0.35.tgz",
+ "integrity": "sha512-1ZG+j91uEQAiFN0UqRkYCx3G8WWlKYoCXgTTx6m4YFJESJiab5M1C4OAi7zXclt1maOR154x3L/j3sRmBHFA+A==",
+ "dependencies": {
+ "@antv/g-lite": "2.2.19",
+ "@antv/util": "^3.3.5",
+ "@babel/runtime": "^7.25.6",
+ "tslib": "^2.5.3"
+ }
+ },
+ "node_modules/@antv/g-plugin-html-renderer": {
+ "version": "2.1.24",
+ "resolved": "https://registry.npmmirror.com/@antv/g-plugin-html-renderer/-/g-plugin-html-renderer-2.1.24.tgz",
+ "integrity": "sha512-UPEitSu5F42kRgqy8Cr34aC6O4+0cCnC+avv0ZMXUFOf7AMhMnjQLlHHo+GDfM/0r6m//0ZCsqHpv8vB0A+sUA==",
+ "dependencies": {
+ "@antv/g-lite": "2.2.19",
+ "@antv/util": "^3.3.5",
+ "@babel/runtime": "^7.25.6",
+ "gl-matrix": "^3.4.3",
+ "tslib": "^2.5.3"
+ }
+ },
+ "node_modules/@antv/g-plugin-image-loader": {
+ "version": "2.1.22",
+ "resolved": "https://registry.npmmirror.com/@antv/g-plugin-image-loader/-/g-plugin-image-loader-2.1.22.tgz",
+ "integrity": "sha512-moA+EnV8Gnofj5Kk6btQ6DrufPYiGMvGWXrkBqHNrowfIUD+bFfHPnLm4gV52hHKYEvwnIP2XL+ayHRvzVyffw==",
+ "dependencies": {
+ "@antv/g-lite": "2.2.19",
+ "@antv/util": "^3.3.5",
+ "@babel/runtime": "^7.25.6",
+ "gl-matrix": "^3.4.3",
+ "tslib": "^2.5.3"
+ }
+ },
+ "node_modules/@antv/g-web-animations-api": {
+ "version": "2.1.24",
+ "resolved": "https://registry.npmmirror.com/@antv/g-web-animations-api/-/g-web-animations-api-2.1.24.tgz",
+ "integrity": "sha512-cxRvJblphBw3Mi1YsAZwvQveZlRyNnZ+nidIq/e0HKmQhOLr3dSq3KAwxanV/n84v/a3BqLkWnm3E1CuSKDG3g==",
+ "dependencies": {
+ "@antv/g-lite": "2.2.19",
+ "@antv/util": "^3.3.5",
+ "@babel/runtime": "^7.25.6",
+ "tslib": "^2.5.3"
+ }
+ },
+ "node_modules/@antv/g6": {
+ "version": "5.0.47",
+ "resolved": "https://registry.npmmirror.com/@antv/g6/-/g6-5.0.47.tgz",
+ "integrity": "sha512-BCKKFQhDHxIFS3NAh90A4DsMR9oGqYm68CnhSwFTg/D1wSkkgXJee76f4oDDf4HSHHE6K/zMA6Dtbh4YdKOppQ==",
+ "dependencies": {
+ "@antv/algorithm": "^0.1.26",
+ "@antv/component": "^2.1.3",
+ "@antv/event-emitter": "^0.1.3",
+ "@antv/g": "^6.1.24",
+ "@antv/g-canvas": "^2.0.43",
+ "@antv/g-plugin-dragndrop": "^2.0.35",
+ "@antv/graphlib": "^2.0.4",
+ "@antv/hierarchy": "^0.6.14",
+ "@antv/layout": "1.2.14-beta.9",
+ "@antv/util": "^3.3.10",
+ "bubblesets-js": "^2.3.4"
+ }
+ },
+ "node_modules/@antv/graphlib": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/@antv/graphlib/-/graphlib-2.0.4.tgz",
+ "integrity": "sha512-zc/5oQlsdk42Z0ib1mGklwzhJ5vczLFiPa1v7DgJkTbgJ2YxRh9xdarf86zI49sKVJmgbweRpJs7Nu5bIiwv4w==",
+ "dependencies": {
+ "@antv/event-emitter": "^0.1.3"
+ }
+ },
+ "node_modules/@antv/hierarchy": {
+ "version": "0.6.14",
+ "resolved": "https://registry.npmmirror.com/@antv/hierarchy/-/hierarchy-0.6.14.tgz",
+ "integrity": "sha512-V3uknf7bhynOqQDw2sg+9r9DwZ9pc6k/EcqyTFdfXB1+ydr7urisP0MipIuimucvQKN+Qkd+d6w601r1UIroqQ=="
+ },
+ "node_modules/@antv/layout": {
+ "version": "1.2.14-beta.9",
+ "resolved": "https://registry.npmmirror.com/@antv/layout/-/layout-1.2.14-beta.9.tgz",
+ "integrity": "sha512-wPlwBFMtq2lWZFc89/7Lzb8fjHnyKVZZ9zBb2h+zZIP0YWmVmHRE8+dqCiPKOyOGUXEdDtn813f1g107dCHZlg==",
+ "dependencies": {
+ "@antv/event-emitter": "^0.1.3",
+ "@antv/graphlib": "^2.0.0",
+ "@antv/util": "^3.3.2",
+ "@naoak/workerize-transferable": "^0.1.0",
+ "comlink": "^4.4.1",
+ "d3-force": "^3.0.0",
+ "d3-force-3d": "^3.0.5",
+ "d3-octree": "^1.0.2",
+ "d3-quadtree": "^3.0.1",
+ "dagre": "^0.8.5",
+ "ml-matrix": "^6.10.4",
+ "tslib": "^2.5.0"
+ }
+ },
+ "node_modules/@antv/scale": {
+ "version": "0.4.16",
+ "resolved": "https://registry.npmmirror.com/@antv/scale/-/scale-0.4.16.tgz",
+ "integrity": "sha512-5wg/zB5kXHxpTV5OYwJD3ja6R8yTiqIOkjOhmpEJiowkzRlbEC/BOyMvNUq5fqFIHnMCE9woO7+c3zxEQCKPjw==",
+ "dependencies": {
+ "@antv/util": "^3.3.7",
+ "color-string": "^1.5.5",
+ "fecha": "^4.2.1"
+ }
+ },
+ "node_modules/@antv/util": {
+ "version": "3.3.10",
+ "resolved": "https://registry.npmmirror.com/@antv/util/-/util-3.3.10.tgz",
+ "integrity": "sha512-basGML3DFA3O87INnzvDStjzS+n0JLEhRnRsDzP9keiXz8gT1z/fTdmJAZFOzMMWxy+HKbi7NbSt0+8vz/OsBQ==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "gl-matrix": "^3.3.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@antv/vendor": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmmirror.com/@antv/vendor/-/vendor-1.0.11.tgz",
+ "integrity": "sha512-LmhPEQ+aapk3barntaiIxJ5VHno/Tyab2JnfdcPzp5xONh/8VSfed4bo/9xKo5HcUAEydko38vYLfj6lJliLiw==",
+ "dependencies": {
+ "@types/d3-array": "^3.2.1",
+ "@types/d3-color": "^3.1.3",
+ "@types/d3-dispatch": "^3.0.6",
+ "@types/d3-dsv": "^3.0.7",
+ "@types/d3-ease": "^3.0.2",
+ "@types/d3-fetch": "^3.0.7",
+ "@types/d3-force": "^3.0.10",
+ "@types/d3-format": "^3.0.4",
+ "@types/d3-geo": "^3.1.0",
+ "@types/d3-hierarchy": "^3.1.7",
+ "@types/d3-interpolate": "^3.0.4",
+ "@types/d3-path": "^3.1.0",
+ "@types/d3-quadtree": "^3.0.6",
+ "@types/d3-random": "^3.0.3",
+ "@types/d3-scale": "^4.0.9",
+ "@types/d3-scale-chromatic": "^3.1.0",
+ "@types/d3-shape": "^3.1.7",
+ "@types/d3-time": "^3.0.4",
+ "@types/d3-timer": "^3.0.2",
+ "d3-array": "^3.2.4",
+ "d3-color": "^3.1.0",
+ "d3-dispatch": "^3.0.1",
+ "d3-dsv": "^3.0.1",
+ "d3-ease": "^3.0.1",
+ "d3-fetch": "^3.0.1",
+ "d3-force": "^3.0.0",
+ "d3-force-3d": "^3.0.5",
+ "d3-format": "^3.1.0",
+ "d3-geo": "^3.1.1",
+ "d3-geo-projection": "^4.0.0",
+ "d3-hierarchy": "^3.1.2",
+ "d3-interpolate": "^3.0.1",
+ "d3-path": "^3.1.0",
+ "d3-quadtree": "^3.0.1",
+ "d3-random": "^3.0.1",
+ "d3-regression": "^1.3.10",
+ "d3-scale": "^4.0.2",
+ "d3-scale-chromatic": "^3.1.0",
+ "d3-shape": "^3.2.0",
+ "d3-time": "^3.1.0",
+ "d3-timer": "^3.0.1"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz",
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.27.2.tgz",
+ "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.27.1.tgz",
+ "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.27.1",
+ "@babel/helper-compilation-targets": "^7.27.1",
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helpers": "^7.27.1",
+ "@babel/parser": "^7.27.1",
+ "@babel/template": "^7.27.1",
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.27.1.tgz",
+ "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.27.1",
+ "@babel/types": "^7.27.1",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz",
+ "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
+ "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.27.2",
+ "@babel/helper-validator-option": "^7.27.1",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz",
+ "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-member-expression-to-functions": "^7.27.1",
+ "@babel/helper-optimise-call-expression": "^7.27.1",
+ "@babel/helper-replace-supers": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+ "@babel/traverse": "^7.27.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz",
+ "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
+ "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz",
+ "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz",
+ "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
+ "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz",
+ "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.27.1",
+ "@babel/helper-optimise-call-expression": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz",
+ "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.27.1.tgz",
+ "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.27.2.tgz",
+ "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==",
+ "dependencies": {
+ "@babel/types": "^7.27.1"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-decorators": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.27.1.tgz",
+ "integrity": "sha512-DTxe4LBPrtFdsWzgpmbBKevg3e9PBy+dXRt19kSbucbZvL2uqtdqwwpluL1jfxYE0wIDTFp1nTy/q6gNLsxXrg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/plugin-syntax-decorators": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-decorators": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz",
+ "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz",
+ "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz",
+ "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz",
+ "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typescript": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz",
+ "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+ "@babel/plugin-syntax-typescript": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.27.1.tgz",
+ "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.27.2.tgz",
+ "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/parser": "^7.27.2",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.27.1.tgz",
+ "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.27.1",
+ "@babel/parser": "^7.27.1",
+ "@babel/template": "^7.27.1",
+ "@babel/types": "^7.27.1",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.27.1.tgz",
+ "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@braintree/sanitize-url": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmmirror.com/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz",
+ "integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A=="
+ },
+ "node_modules/@ctrl/tinycolor": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
+ "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@element-plus/icons-vue": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz",
+ "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==",
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz",
+ "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.4.tgz",
+ "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz",
+ "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.4.tgz",
+ "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz",
+ "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz",
+ "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz",
+ "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz",
+ "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz",
+ "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz",
+ "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz",
+ "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz",
+ "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz",
+ "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz",
+ "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz",
+ "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz",
+ "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz",
+ "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz",
+ "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz",
+ "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz",
+ "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz",
+ "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz",
+ "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz",
+ "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz",
+ "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz",
+ "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.7.0.tgz",
+ "integrity": "sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==",
+ "dependencies": {
+ "@floating-ui/utils": "^0.2.9"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.7.0.tgz",
+ "integrity": "sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==",
+ "dependencies": {
+ "@floating-ui/core": "^1.7.0",
+ "@floating-ui/utils": "^0.2.9"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.9.tgz",
+ "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg=="
+ },
+ "node_modules/@fortawesome/fontawesome-free": {
+ "version": "6.7.2",
+ "resolved": "https://registry.npmmirror.com/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz",
+ "integrity": "sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.6.tgz",
+ "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@kangc/v-md-editor": {
+ "version": "2.3.18",
+ "resolved": "https://registry.npmmirror.com/@kangc/v-md-editor/-/v-md-editor-2.3.18.tgz",
+ "integrity": "sha512-wjI9lUQs4Ktn3gYru3C1hauOuOo2na5cF4ycHCgBZmIk08RjQVNbHO169yqkt9PMj6Djnl8W6ZknCBhTQfFbzQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.14.0",
+ "@vuepress/markdown": "^1.8.2",
+ "codemirror": "^5.61.1",
+ "copy-to-clipboard": "^3.3.1",
+ "highlight.js": "^10.7.2",
+ "insert-text-at-cursor": "^0.3.0",
+ "katex": "^0.13.11",
+ "markdown-it": "^12.3.2",
+ "markdown-it-attrs": "^4.0.0",
+ "markdown-it-container": "^3.0.0",
+ "mermaid": "^10.6.1",
+ "prismjs": "^1.23.0",
+ "resize-observer-polyfill": "^1.5.1",
+ "vant": "^3.1.3",
+ "xss": "^1.0.9"
+ },
+ "peerDependencies": {
+ "@vue/compiler-sfc": "^3.0.0",
+ "vue": "^3.0.0"
+ }
+ },
+ "node_modules/@kangc/v-md-editor/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ },
+ "node_modules/@kangc/v-md-editor/node_modules/entities": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/entities/-/entities-2.1.0.tgz",
+ "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/@kangc/v-md-editor/node_modules/linkify-it": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/linkify-it/-/linkify-it-3.0.3.tgz",
+ "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
+ "dependencies": {
+ "uc.micro": "^1.0.1"
+ }
+ },
+ "node_modules/@kangc/v-md-editor/node_modules/markdown-it": {
+ "version": "12.3.2",
+ "resolved": "https://registry.npmmirror.com/markdown-it/-/markdown-it-12.3.2.tgz",
+ "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
+ "dependencies": {
+ "argparse": "^2.0.1",
+ "entities": "~2.1.0",
+ "linkify-it": "^3.0.1",
+ "mdurl": "^1.0.1",
+ "uc.micro": "^1.0.5"
+ },
+ "bin": {
+ "markdown-it": "bin/markdown-it.js"
+ }
+ },
+ "node_modules/@kangc/v-md-editor/node_modules/mdurl": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/mdurl/-/mdurl-1.0.1.tgz",
+ "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g=="
+ },
+ "node_modules/@kangc/v-md-editor/node_modules/uc.micro": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/uc.micro/-/uc.micro-1.0.6.tgz",
+ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
+ },
+ "node_modules/@kurkle/color": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmmirror.com/@kurkle/color/-/color-0.3.4.tgz",
+ "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w=="
+ },
+ "node_modules/@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmmirror.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dependencies": {
+ "call-me-maybe": "^1.0.1",
+ "glob-to-regexp": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@naoak/workerize-transferable": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmmirror.com/@naoak/workerize-transferable/-/workerize-transferable-0.1.0.tgz",
+ "integrity": "sha512-fDLfuP71IPNP5+zSfxFb52OHgtjZvauRJWbVnpzQ7G7BjcbLjTny0OW1d3ZO806XKpLWNKmeeW3MhE0sy8iwYQ==",
+ "peerDependencies": {
+ "workerize-loader": "*"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@polka/url": {
+ "version": "1.0.0-next.29",
+ "resolved": "https://registry.npmmirror.com/@polka/url/-/url-1.0.0-next.29.tgz",
+ "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==",
+ "dev": true
+ },
+ "node_modules/@popperjs/core": {
+ "name": "@sxzz/popperjs-es",
+ "version": "2.11.7",
+ "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
+ "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.4.tgz",
+ "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/pluginutils/node_modules/picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.40.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz",
+ "integrity": "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.40.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz",
+ "integrity": "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.40.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz",
+ "integrity": "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.40.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz",
+ "integrity": "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.40.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz",
+ "integrity": "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.40.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz",
+ "integrity": "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.40.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz",
+ "integrity": "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.40.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz",
+ "integrity": "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.40.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz",
+ "integrity": "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.40.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz",
+ "integrity": "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.40.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz",
+ "integrity": "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.40.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz",
+ "integrity": "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.40.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz",
+ "integrity": "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.40.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz",
+ "integrity": "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.40.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz",
+ "integrity": "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.40.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz",
+ "integrity": "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.40.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz",
+ "integrity": "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.40.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz",
+ "integrity": "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.40.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz",
+ "integrity": "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.40.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz",
+ "integrity": "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@sec-ant/readable-stream": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmmirror.com/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz",
+ "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==",
+ "dev": true
+ },
+ "node_modules/@sindresorhus/merge-streams": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz",
+ "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@types/d3-array": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmmirror.com/@types/d3-array/-/d3-array-3.2.1.tgz",
+ "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg=="
+ },
+ "node_modules/@types/d3-color": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/@types/d3-color/-/d3-color-3.1.3.tgz",
+ "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="
+ },
+ "node_modules/@types/d3-dispatch": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmmirror.com/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz",
+ "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ=="
+ },
+ "node_modules/@types/d3-dsv": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmmirror.com/@types/d3-dsv/-/d3-dsv-3.0.7.tgz",
+ "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g=="
+ },
+ "node_modules/@types/d3-ease": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/@types/d3-ease/-/d3-ease-3.0.2.tgz",
+ "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="
+ },
+ "node_modules/@types/d3-fetch": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmmirror.com/@types/d3-fetch/-/d3-fetch-3.0.7.tgz",
+ "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==",
+ "dependencies": {
+ "@types/d3-dsv": "*"
+ }
+ },
+ "node_modules/@types/d3-force": {
+ "version": "3.0.10",
+ "resolved": "https://registry.npmmirror.com/@types/d3-force/-/d3-force-3.0.10.tgz",
+ "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw=="
+ },
+ "node_modules/@types/d3-format": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmmirror.com/@types/d3-format/-/d3-format-3.0.4.tgz",
+ "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g=="
+ },
+ "node_modules/@types/d3-geo": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/@types/d3-geo/-/d3-geo-3.1.0.tgz",
+ "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==",
+ "dependencies": {
+ "@types/geojson": "*"
+ }
+ },
+ "node_modules/@types/d3-hierarchy": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmmirror.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz",
+ "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg=="
+ },
+ "node_modules/@types/d3-interpolate": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmmirror.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
+ "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
+ "dependencies": {
+ "@types/d3-color": "*"
+ }
+ },
+ "node_modules/@types/d3-path": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/@types/d3-path/-/d3-path-3.1.1.tgz",
+ "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="
+ },
+ "node_modules/@types/d3-quadtree": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmmirror.com/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz",
+ "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg=="
+ },
+ "node_modules/@types/d3-random": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/@types/d3-random/-/d3-random-3.0.3.tgz",
+ "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ=="
+ },
+ "node_modules/@types/d3-scale": {
+ "version": "4.0.9",
+ "resolved": "https://registry.npmmirror.com/@types/d3-scale/-/d3-scale-4.0.9.tgz",
+ "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==",
+ "dependencies": {
+ "@types/d3-time": "*"
+ }
+ },
+ "node_modules/@types/d3-scale-chromatic": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",
+ "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ=="
+ },
+ "node_modules/@types/d3-shape": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmmirror.com/@types/d3-shape/-/d3-shape-3.1.7.tgz",
+ "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==",
+ "dependencies": {
+ "@types/d3-path": "*"
+ }
+ },
+ "node_modules/@types/d3-time": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmmirror.com/@types/d3-time/-/d3-time-3.0.4.tgz",
+ "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="
+ },
+ "node_modules/@types/d3-timer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/@types/d3-timer/-/d3-timer-3.0.2.tgz",
+ "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.12",
+ "resolved": "https://registry.npmmirror.com/@types/debug/-/debug-4.1.12.tgz",
+ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/eslint": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-9.6.1.tgz",
+ "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
+ "peer": true,
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/eslint-scope": {
+ "version": "3.7.7",
+ "resolved": "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+ "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+ "peer": true,
+ "dependencies": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.7.tgz",
+ "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="
+ },
+ "node_modules/@types/geojson": {
+ "version": "7946.0.16",
+ "resolved": "https://registry.npmmirror.com/@types/geojson/-/geojson-7946.0.16.tgz",
+ "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="
+ },
+ "node_modules/@types/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/@types/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==",
+ "dependencies": {
+ "@types/minimatch": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/http-proxy": {
+ "version": "1.17.16",
+ "resolved": "https://registry.npmmirror.com/@types/http-proxy/-/http-proxy-1.17.16.tgz",
+ "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "peer": true
+ },
+ "node_modules/@types/lodash": {
+ "version": "4.17.16",
+ "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.16.tgz",
+ "integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g=="
+ },
+ "node_modules/@types/lodash-es": {
+ "version": "4.17.12",
+ "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz",
+ "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
+ "dependencies": {
+ "@types/lodash": "*"
+ }
+ },
+ "node_modules/@types/mdast": {
+ "version": "3.0.15",
+ "resolved": "https://registry.npmmirror.com/@types/mdast/-/mdast-3.0.15.tgz",
+ "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
+ "dependencies": {
+ "@types/unist": "^2"
+ }
+ },
+ "node_modules/@types/minimatch": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/@types/minimatch/-/minimatch-5.1.2.tgz",
+ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA=="
+ },
+ "node_modules/@types/ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/@types/ms/-/ms-2.1.0.tgz",
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="
+ },
+ "node_modules/@types/node": {
+ "version": "22.15.17",
+ "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.15.17.tgz",
+ "integrity": "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==",
+ "dependencies": {
+ "undici-types": "~6.21.0"
+ }
+ },
+ "node_modules/@types/unist": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmmirror.com/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="
+ },
+ "node_modules/@types/web-bluetooth": {
+ "version": "0.0.16",
+ "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
+ "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ=="
+ },
+ "node_modules/@vant/icons": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmmirror.com/@vant/icons/-/icons-1.8.0.tgz",
+ "integrity": "sha512-sKfEUo2/CkQFuERxvkuF6mGQZDKu3IQdj5rV9Fm0weJXtchDSSQ+zt8qPCNUEhh9Y8shy5PzxbvAfOOkCwlCXg=="
+ },
+ "node_modules/@vant/popperjs": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/@vant/popperjs/-/popperjs-1.3.0.tgz",
+ "integrity": "sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw=="
+ },
+ "node_modules/@vant/use": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmmirror.com/@vant/use/-/use-1.6.0.tgz",
+ "integrity": "sha512-PHHxeAASgiOpSmMjceweIrv2AxDZIkWXyaczksMoWvKV2YAYEhoizRuk/xFnKF+emUIi46TsQ+rvlm/t2BBCfA==",
+ "peerDependencies": {
+ "vue": "^3.0.0"
+ }
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz",
+ "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==",
+ "dev": true,
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0 || ^6.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@vue/babel-helper-vue-transform-on": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.4.0.tgz",
+ "integrity": "sha512-mCokbouEQ/ocRce/FpKCRItGo+013tHg7tixg3DUNS+6bmIchPt66012kBMm476vyEIJPafrvOf4E5OYj3shSw==",
+ "dev": true
+ },
+ "node_modules/@vue/babel-plugin-jsx": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.4.0.tgz",
+ "integrity": "sha512-9zAHmwgMWlaN6qRKdrg1uKsBKHvnUU+Py+MOCTuYZBoZsopa90Di10QRjB+YPnVss0BZbG/H5XFwJY1fTxJWhA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "@babel/plugin-syntax-jsx": "^7.25.9",
+ "@babel/template": "^7.26.9",
+ "@babel/traverse": "^7.26.9",
+ "@babel/types": "^7.26.9",
+ "@vue/babel-helper-vue-transform-on": "1.4.0",
+ "@vue/babel-plugin-resolve-type": "1.4.0",
+ "@vue/shared": "^3.5.13"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.4.0.tgz",
+ "integrity": "sha512-4xqDRRbQQEWHQyjlYSgZsWj44KfiF6D+ktCuXyZ8EnVDYV3pztmXJDf1HveAjUAXxAnR8daCQT51RneWWxtTyQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.26.2",
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "@babel/parser": "^7.26.9",
+ "@vue/compiler-sfc": "^3.5.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.13.tgz",
+ "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==",
+ "dependencies": {
+ "@babel/parser": "^7.25.3",
+ "@vue/shared": "3.5.13",
+ "entities": "^4.5.0",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz",
+ "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==",
+ "dependencies": {
+ "@vue/compiler-core": "3.5.13",
+ "@vue/shared": "3.5.13"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz",
+ "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==",
+ "dependencies": {
+ "@babel/parser": "^7.25.3",
+ "@vue/compiler-core": "3.5.13",
+ "@vue/compiler-dom": "3.5.13",
+ "@vue/compiler-ssr": "3.5.13",
+ "@vue/shared": "3.5.13",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.11",
+ "postcss": "^8.4.48",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "node_modules/@vue/compiler-sfc/node_modules/postcss": {
+ "version": "8.5.3",
+ "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.3.tgz",
+ "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.8",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz",
+ "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.13",
+ "@vue/shared": "3.5.13"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "6.6.4",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="
+ },
+ "node_modules/@vue/devtools-core": {
+ "version": "7.7.6",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-core/-/devtools-core-7.7.6.tgz",
+ "integrity": "sha512-ghVX3zjKPtSHu94Xs03giRIeIWlb9M+gvDRVpIZ/cRIxKHdW6HE/sm1PT3rUYS3aV92CazirT93ne+7IOvGUWg==",
+ "dev": true,
+ "dependencies": {
+ "@vue/devtools-kit": "^7.7.6",
+ "@vue/devtools-shared": "^7.7.6",
+ "mitt": "^3.0.1",
+ "nanoid": "^5.1.0",
+ "pathe": "^2.0.3",
+ "vite-hot-client": "^2.0.4"
+ },
+ "peerDependencies": {
+ "vue": "^3.0.0"
+ }
+ },
+ "node_modules/@vue/devtools-core/node_modules/nanoid": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-5.1.5.tgz",
+ "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.js"
+ },
+ "engines": {
+ "node": "^18 || >=20"
+ }
+ },
+ "node_modules/@vue/devtools-kit": {
+ "version": "7.7.6",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.6.tgz",
+ "integrity": "sha512-geu7ds7tem2Y7Wz+WgbnbZ6T5eadOvozHZ23Atk/8tksHMFOFylKi1xgGlQlVn0wlkEf4hu+vd5ctj1G4kFtwA==",
+ "dev": true,
+ "dependencies": {
+ "@vue/devtools-shared": "^7.7.6",
+ "birpc": "^2.3.0",
+ "hookable": "^5.5.3",
+ "mitt": "^3.0.1",
+ "perfect-debounce": "^1.0.0",
+ "speakingurl": "^14.0.1",
+ "superjson": "^2.2.2"
+ }
+ },
+ "node_modules/@vue/devtools-shared": {
+ "version": "7.7.6",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.6.tgz",
+ "integrity": "sha512-yFEgJZ/WblEsojQQceuyK6FzpFDx4kqrz2ohInxNj5/DnhoX023upTv4OD6lNPLAA5LLkbwPVb10o/7b+Y4FVA==",
+ "dev": true,
+ "dependencies": {
+ "rfdc": "^1.4.1"
+ }
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.13.tgz",
+ "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==",
+ "dependencies": {
+ "@vue/shared": "3.5.13"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.13.tgz",
+ "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==",
+ "dependencies": {
+ "@vue/reactivity": "3.5.13",
+ "@vue/shared": "3.5.13"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz",
+ "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==",
+ "dependencies": {
+ "@vue/reactivity": "3.5.13",
+ "@vue/runtime-core": "3.5.13",
+ "@vue/shared": "3.5.13",
+ "csstype": "^3.1.3"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.13.tgz",
+ "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==",
+ "dependencies": {
+ "@vue/compiler-ssr": "3.5.13",
+ "@vue/shared": "3.5.13"
+ },
+ "peerDependencies": {
+ "vue": "3.5.13"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.13.tgz",
+ "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="
+ },
+ "node_modules/@vuepress/markdown": {
+ "version": "1.9.10",
+ "resolved": "https://registry.npmmirror.com/@vuepress/markdown/-/markdown-1.9.10.tgz",
+ "integrity": "sha512-sXTLjeZzH8SQuAL5AEH0hhsMljjNJbzWbBvzaj5yQCCdf+3sp/dJ0kwnBSnQjFPPnzPg5t3tLKGUYHyW0KiKzA==",
+ "dependencies": {
+ "@vuepress/shared-utils": "1.9.10",
+ "markdown-it": "^8.4.1",
+ "markdown-it-anchor": "^5.0.2",
+ "markdown-it-chain": "^1.3.0",
+ "markdown-it-emoji": "^1.4.0",
+ "markdown-it-table-of-contents": "^0.4.0",
+ "prismjs": "^1.13.0"
+ }
+ },
+ "node_modules/@vuepress/markdown/node_modules/entities": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/entities/-/entities-1.1.2.tgz",
+ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
+ },
+ "node_modules/@vuepress/markdown/node_modules/linkify-it": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/linkify-it/-/linkify-it-2.2.0.tgz",
+ "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==",
+ "dependencies": {
+ "uc.micro": "^1.0.1"
+ }
+ },
+ "node_modules/@vuepress/markdown/node_modules/markdown-it": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmmirror.com/markdown-it/-/markdown-it-8.4.2.tgz",
+ "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "entities": "~1.1.1",
+ "linkify-it": "^2.0.0",
+ "mdurl": "^1.0.1",
+ "uc.micro": "^1.0.5"
+ },
+ "bin": {
+ "markdown-it": "bin/markdown-it.js"
+ }
+ },
+ "node_modules/@vuepress/markdown/node_modules/mdurl": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/mdurl/-/mdurl-1.0.1.tgz",
+ "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g=="
+ },
+ "node_modules/@vuepress/markdown/node_modules/uc.micro": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/uc.micro/-/uc.micro-1.0.6.tgz",
+ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
+ },
+ "node_modules/@vuepress/shared-utils": {
+ "version": "1.9.10",
+ "resolved": "https://registry.npmmirror.com/@vuepress/shared-utils/-/shared-utils-1.9.10.tgz",
+ "integrity": "sha512-M9A3DocPih+V8dKK2Zg9FJQ/f3JZrYsdaM/vQ9F48l8bPlzxw5NvqXIYMK4kKcGEyerQNTWCudoCpLL5uiU0hg==",
+ "dependencies": {
+ "chalk": "^2.3.2",
+ "escape-html": "^1.0.3",
+ "fs-extra": "^7.0.1",
+ "globby": "^9.2.0",
+ "gray-matter": "^4.0.1",
+ "hash-sum": "^1.0.2",
+ "semver": "^6.0.0",
+ "toml": "^3.0.0",
+ "upath": "^1.1.0"
+ }
+ },
+ "node_modules/@vuepress/shared-utils/node_modules/fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/@vuepress/shared-utils/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/@vuepress/shared-utils/node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/@vueuse/core": {
+ "version": "9.13.0",
+ "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz",
+ "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
+ "dependencies": {
+ "@types/web-bluetooth": "^0.0.16",
+ "@vueuse/metadata": "9.13.0",
+ "@vueuse/shared": "9.13.0",
+ "vue-demi": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/metadata": {
+ "version": "9.13.0",
+ "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz",
+ "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared": {
+ "version": "9.13.0",
+ "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz",
+ "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
+ "dependencies": {
+ "vue-demi": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.14.1.tgz",
+ "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/helper-numbers": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
+ "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
+ "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
+ "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-numbers": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
+ "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/floating-point-hex-parser": "1.13.2",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
+ "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
+ "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/wasm-gen": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
+ "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
+ "peer": true,
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
+ "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
+ "peer": true,
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
+ "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
+ "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/helper-wasm-section": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-opt": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1",
+ "@webassemblyjs/wast-printer": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
+ "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
+ "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
+ "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
+ "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "peer": true
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "peer": true
+ },
+ "node_modules/acorn": {
+ "version": "8.14.1",
+ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.1.tgz",
+ "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "peer": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "peer": true,
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "peer": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "dev": true
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==",
+ "dependencies": {
+ "array-uniq": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/async-validator": {
+ "version": "4.2.5",
+ "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz",
+ "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg=="
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/atob": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz",
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+ "bin": {
+ "atob": "bin/atob.js"
+ },
+ "engines": {
+ "node": ">= 4.5.0"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.17",
+ "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.17.tgz",
+ "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "browserslist": "^4.22.2",
+ "caniuse-lite": "^1.0.30001578",
+ "fraction.js": "^4.3.7",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/axios/-/axios-1.9.0.tgz",
+ "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "node_modules/base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmmirror.com/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dependencies": {
+ "cache-base": "^1.0.1",
+ "class-utils": "^0.3.5",
+ "component-emitter": "^1.2.1",
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.1",
+ "mixin-deep": "^1.2.0",
+ "pascalcase": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/base/node_modules/define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
+ "dependencies": {
+ "is-descriptor": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "peer": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/birpc": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.3.0.tgz",
+ "integrity": "sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.24.5",
+ "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.24.5.tgz",
+ "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001716",
+ "electron-to-chromium": "^1.5.149",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/bubblesets-js": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmmirror.com/bubblesets-js/-/bubblesets-js-2.3.4.tgz",
+ "integrity": "sha512-DyMjHmpkS2+xcFNtyN00apJYL3ESdp9fTrkDr5+9Qg/GPqFmcWgGsK1akZnttE1XFxJ/VMy4DNNGMGYtmFp1Sg=="
+ },
+ "node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmmirror.com/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "peer": true
+ },
+ "node_modules/bundle-name": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/bundle-name/-/bundle-name-4.1.0.tgz",
+ "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
+ "dev": true,
+ "dependencies": {
+ "run-applescript": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dependencies": {
+ "collection-visit": "^1.0.0",
+ "component-emitter": "^1.2.1",
+ "get-value": "^2.0.6",
+ "has-value": "^1.0.0",
+ "isobject": "^3.0.1",
+ "set-value": "^2.0.0",
+ "to-object-path": "^0.3.0",
+ "union-value": "^1.0.0",
+ "unset-value": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-me-maybe": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz",
+ "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ=="
+ },
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001717",
+ "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001717.tgz",
+ "integrity": "sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chalk/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chalk/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/chalk/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "node_modules/character-entities": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/character-entities/-/character-entities-2.0.2.tgz",
+ "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chart.js": {
+ "version": "4.4.9",
+ "resolved": "https://registry.npmmirror.com/chart.js/-/chart.js-4.4.9.tgz",
+ "integrity": "sha512-EyZ9wWKgpAU0fLJ43YAEIF8sr5F2W3LqbS40ZJyHIner2lY14ufqv2VMp69MAiZ2rpwxEUxEhIH/0U3xyRynxg==",
+ "dependencies": {
+ "@kurkle/color": "^0.3.0"
+ },
+ "engines": {
+ "pnpm": ">=8"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
+ "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
+ "peer": true,
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmmirror.com/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dependencies": {
+ "arr-union": "^3.1.0",
+ "define-property": "^0.2.5",
+ "isobject": "^3.0.0",
+ "static-extend": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/class-utils/node_modules/define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/class-utils/node_modules/is-descriptor": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz",
+ "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
+ "dependencies": {
+ "is-accessor-descriptor": "^1.0.1",
+ "is-data-descriptor": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/codemirror": {
+ "version": "5.65.19",
+ "resolved": "https://registry.npmmirror.com/codemirror/-/codemirror-5.65.19.tgz",
+ "integrity": "sha512-+aFkvqhaAVr1gferNMuN8vkTSrWIFvzlMV9I2KBLCWS2WpZ2+UAkZjlMZmEuT+gcXTi6RrGQCkWq1/bDtGqhIA=="
+ },
+ "node_modules/collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==",
+ "dependencies": {
+ "map-visit": "^1.0.0",
+ "object-visit": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "node_modules/color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/comlink": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmmirror.com/comlink/-/comlink-4.4.2.tgz",
+ "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g=="
+ },
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/component-emitter": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.1.tgz",
+ "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "node_modules/confbox": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz",
+ "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
+ "dev": true
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true
+ },
+ "node_modules/copy-anything": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-3.0.5.tgz",
+ "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==",
+ "dev": true,
+ "dependencies": {
+ "is-what": "^4.1.8"
+ },
+ "engines": {
+ "node": ">=12.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmmirror.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/copy-to-clipboard": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmmirror.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz",
+ "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==",
+ "dependencies": {
+ "toggle-selection": "^1.0.6"
+ }
+ },
+ "node_modules/cose-base": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/cose-base/-/cose-base-1.0.3.tgz",
+ "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==",
+ "dependencies": {
+ "layout-base": "^1.0.0"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cssfilter": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmmirror.com/cssfilter/-/cssfilter-0.0.10.tgz",
+ "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw=="
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+ },
+ "node_modules/cytoscape": {
+ "version": "3.32.0",
+ "resolved": "https://registry.npmmirror.com/cytoscape/-/cytoscape-3.32.0.tgz",
+ "integrity": "sha512-5JHBC9n75kz5851jeklCPmZWcg3hUe6sjqJvyk3+hVqFaKcHwHgxsjeN1yLmggoUc6STbtm9/NQyabQehfjvWQ==",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/cytoscape-cose-bilkent": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz",
+ "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==",
+ "dependencies": {
+ "cose-base": "^1.0.0"
+ },
+ "peerDependencies": {
+ "cytoscape": "^3.2.0"
+ }
+ },
+ "node_modules/d3": {
+ "version": "7.9.0",
+ "resolved": "https://registry.npmmirror.com/d3/-/d3-7.9.0.tgz",
+ "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==",
+ "dependencies": {
+ "d3-array": "3",
+ "d3-axis": "3",
+ "d3-brush": "3",
+ "d3-chord": "3",
+ "d3-color": "3",
+ "d3-contour": "4",
+ "d3-delaunay": "6",
+ "d3-dispatch": "3",
+ "d3-drag": "3",
+ "d3-dsv": "3",
+ "d3-ease": "3",
+ "d3-fetch": "3",
+ "d3-force": "3",
+ "d3-format": "3",
+ "d3-geo": "3",
+ "d3-hierarchy": "3",
+ "d3-interpolate": "3",
+ "d3-path": "3",
+ "d3-polygon": "3",
+ "d3-quadtree": "3",
+ "d3-random": "3",
+ "d3-scale": "4",
+ "d3-scale-chromatic": "3",
+ "d3-selection": "3",
+ "d3-shape": "3",
+ "d3-time": "3",
+ "d3-time-format": "4",
+ "d3-timer": "3",
+ "d3-transition": "3",
+ "d3-zoom": "3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-array": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmmirror.com/d3-array/-/d3-array-3.2.4.tgz",
+ "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
+ "dependencies": {
+ "internmap": "1 - 2"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-axis": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/d3-axis/-/d3-axis-3.0.0.tgz",
+ "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-binarytree": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/d3-binarytree/-/d3-binarytree-1.0.2.tgz",
+ "integrity": "sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw=="
+ },
+ "node_modules/d3-brush": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/d3-brush/-/d3-brush-3.0.0.tgz",
+ "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==",
+ "dependencies": {
+ "d3-dispatch": "1 - 3",
+ "d3-drag": "2 - 3",
+ "d3-interpolate": "1 - 3",
+ "d3-selection": "3",
+ "d3-transition": "3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-chord": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/d3-chord/-/d3-chord-3.0.1.tgz",
+ "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==",
+ "dependencies": {
+ "d3-path": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-color": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/d3-color/-/d3-color-3.1.0.tgz",
+ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-contour": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/d3-contour/-/d3-contour-4.0.2.tgz",
+ "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==",
+ "dependencies": {
+ "d3-array": "^3.2.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-delaunay": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmmirror.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
+ "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==",
+ "dependencies": {
+ "delaunator": "5"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-dispatch": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
+ "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-drag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/d3-drag/-/d3-drag-3.0.0.tgz",
+ "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
+ "dependencies": {
+ "d3-dispatch": "1 - 3",
+ "d3-selection": "3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-dsv": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/d3-dsv/-/d3-dsv-3.0.1.tgz",
+ "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==",
+ "dependencies": {
+ "commander": "7",
+ "iconv-lite": "0.6",
+ "rw": "1"
+ },
+ "bin": {
+ "csv2json": "bin/dsv2json.js",
+ "csv2tsv": "bin/dsv2dsv.js",
+ "dsv2dsv": "bin/dsv2dsv.js",
+ "dsv2json": "bin/dsv2json.js",
+ "json2csv": "bin/json2dsv.js",
+ "json2dsv": "bin/json2dsv.js",
+ "json2tsv": "bin/json2dsv.js",
+ "tsv2csv": "bin/dsv2dsv.js",
+ "tsv2json": "bin/dsv2json.js"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-dsv/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/d3-ease": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/d3-ease/-/d3-ease-3.0.1.tgz",
+ "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-fetch": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/d3-fetch/-/d3-fetch-3.0.1.tgz",
+ "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==",
+ "dependencies": {
+ "d3-dsv": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-force": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/d3-force/-/d3-force-3.0.0.tgz",
+ "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==",
+ "dependencies": {
+ "d3-dispatch": "1 - 3",
+ "d3-quadtree": "1 - 3",
+ "d3-timer": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-force-3d": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmmirror.com/d3-force-3d/-/d3-force-3d-3.0.6.tgz",
+ "integrity": "sha512-4tsKHUPLOVkyfEffZo1v6sFHvGFwAIIjt/W8IThbp08DYAsXZck+2pSHEG5W1+gQgEvFLdZkYvmJAbRM2EzMnA==",
+ "dependencies": {
+ "d3-binarytree": "1",
+ "d3-dispatch": "1 - 3",
+ "d3-octree": "1",
+ "d3-quadtree": "1 - 3",
+ "d3-timer": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-format": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/d3-format/-/d3-format-3.1.0.tgz",
+ "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-geo": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/d3-geo/-/d3-geo-3.1.1.tgz",
+ "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==",
+ "dependencies": {
+ "d3-array": "2.5.0 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-geo-projection": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/d3-geo-projection/-/d3-geo-projection-4.0.0.tgz",
+ "integrity": "sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==",
+ "dependencies": {
+ "commander": "7",
+ "d3-array": "1 - 3",
+ "d3-geo": "1.12.0 - 3"
+ },
+ "bin": {
+ "geo2svg": "bin/geo2svg.js",
+ "geograticule": "bin/geograticule.js",
+ "geoproject": "bin/geoproject.js",
+ "geoquantize": "bin/geoquantize.js",
+ "geostitch": "bin/geostitch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-geo-projection/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/d3-hierarchy": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
+ "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-interpolate": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+ "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
+ "dependencies": {
+ "d3-color": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-octree": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/d3-octree/-/d3-octree-1.1.0.tgz",
+ "integrity": "sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A=="
+ },
+ "node_modules/d3-path": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/d3-path/-/d3-path-3.1.0.tgz",
+ "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-polygon": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/d3-polygon/-/d3-polygon-3.0.1.tgz",
+ "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-quadtree": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
+ "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-random": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/d3-random/-/d3-random-3.0.1.tgz",
+ "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-regression": {
+ "version": "1.3.10",
+ "resolved": "https://registry.npmmirror.com/d3-regression/-/d3-regression-1.3.10.tgz",
+ "integrity": "sha512-PF8GWEL70cHHWpx2jUQXc68r1pyPHIA+St16muk/XRokETzlegj5LriNKg7o4LR0TySug4nHYPJNNRz/W+/Niw=="
+ },
+ "node_modules/d3-sankey": {
+ "version": "0.12.3",
+ "resolved": "https://registry.npmmirror.com/d3-sankey/-/d3-sankey-0.12.3.tgz",
+ "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==",
+ "dependencies": {
+ "d3-array": "1 - 2",
+ "d3-shape": "^1.2.0"
+ }
+ },
+ "node_modules/d3-sankey/node_modules/d3-array": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmmirror.com/d3-array/-/d3-array-2.12.1.tgz",
+ "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==",
+ "dependencies": {
+ "internmap": "^1.0.0"
+ }
+ },
+ "node_modules/d3-sankey/node_modules/d3-path": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmmirror.com/d3-path/-/d3-path-1.0.9.tgz",
+ "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="
+ },
+ "node_modules/d3-sankey/node_modules/d3-shape": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmmirror.com/d3-shape/-/d3-shape-1.3.7.tgz",
+ "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
+ "dependencies": {
+ "d3-path": "1"
+ }
+ },
+ "node_modules/d3-sankey/node_modules/internmap": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/internmap/-/internmap-1.0.1.tgz",
+ "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="
+ },
+ "node_modules/d3-scale": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/d3-scale/-/d3-scale-4.0.2.tgz",
+ "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
+ "dependencies": {
+ "d3-array": "2.10.0 - 3",
+ "d3-format": "1 - 3",
+ "d3-interpolate": "1.2.0 - 3",
+ "d3-time": "2.1.1 - 3",
+ "d3-time-format": "2 - 4"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-scale-chromatic": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",
+ "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==",
+ "dependencies": {
+ "d3-color": "1 - 3",
+ "d3-interpolate": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-selection": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/d3-selection/-/d3-selection-3.0.0.tgz",
+ "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-shape": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/d3-shape/-/d3-shape-3.2.0.tgz",
+ "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
+ "dependencies": {
+ "d3-path": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-time": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/d3-time/-/d3-time-3.1.0.tgz",
+ "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
+ "dependencies": {
+ "d3-array": "2 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-time-format": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/d3-time-format/-/d3-time-format-4.1.0.tgz",
+ "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
+ "dependencies": {
+ "d3-time": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-timer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/d3-timer/-/d3-timer-3.0.1.tgz",
+ "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-transition": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/d3-transition/-/d3-transition-3.0.1.tgz",
+ "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",
+ "dependencies": {
+ "d3-color": "1 - 3",
+ "d3-dispatch": "1 - 3",
+ "d3-ease": "1 - 3",
+ "d3-interpolate": "1 - 3",
+ "d3-timer": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "d3-selection": "2 - 3"
+ }
+ },
+ "node_modules/d3-zoom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/d3-zoom/-/d3-zoom-3.0.0.tgz",
+ "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",
+ "dependencies": {
+ "d3-dispatch": "1 - 3",
+ "d3-drag": "2 - 3",
+ "d3-interpolate": "1 - 3",
+ "d3-selection": "2 - 3",
+ "d3-transition": "2 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/dagre": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmmirror.com/dagre/-/dagre-0.8.5.tgz",
+ "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==",
+ "dependencies": {
+ "graphlib": "^2.1.8",
+ "lodash": "^4.17.15"
+ }
+ },
+ "node_modules/dagre-d3-es": {
+ "version": "7.0.10",
+ "resolved": "https://registry.npmmirror.com/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz",
+ "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==",
+ "dependencies": {
+ "d3": "^7.8.2",
+ "lodash-es": "^4.17.21"
+ }
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.13",
+ "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
+ "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
+ },
+ "node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decode-named-character-reference": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz",
+ "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==",
+ "dependencies": {
+ "character-entities": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/decode-uri-component": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
+ "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/deepmerge": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-1.5.2.tgz",
+ "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/default-browser": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmmirror.com/default-browser/-/default-browser-5.2.1.tgz",
+ "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==",
+ "dev": true,
+ "dependencies": {
+ "bundle-name": "^4.1.0",
+ "default-browser-id": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/default-browser-id": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/default-browser-id/-/default-browser-id-5.0.0.tgz",
+ "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/define-lazy-prop": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
+ "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dependencies": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/delaunator": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/delaunator/-/delaunator-5.0.1.tgz",
+ "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==",
+ "dependencies": {
+ "robust-predicates": "^3.0.2"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmmirror.com/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "dev": true
+ },
+ "node_modules/diff": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/diff/-/diff-5.2.0.tgz",
+ "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-2.2.2.tgz",
+ "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==",
+ "dependencies": {
+ "path-type": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "dev": true
+ },
+ "node_modules/dom7": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmmirror.com/dom7/-/dom7-4.0.6.tgz",
+ "integrity": "sha512-emjdpPLhpNubapLFdjNL9tP06Sr+GZkrIHEXLWvOGsytACUrkbeIdjO5g77m00BrHTznnlcNqgmn7pCN192TBA==",
+ "peer": true,
+ "dependencies": {
+ "ssr-window": "^4.0.0"
+ }
+ },
+ "node_modules/dompurify": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-3.1.6.tgz",
+ "integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ=="
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true
+ },
+ "node_modules/echarts": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.6.0.tgz",
+ "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==",
+ "dependencies": {
+ "tslib": "2.3.0",
+ "zrender": "5.6.1"
+ }
+ },
+ "node_modules/echarts/node_modules/tslib": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
+ "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.151",
+ "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.151.tgz",
+ "integrity": "sha512-Rl6uugut2l9sLojjS4H4SAr3A4IgACMLgpuEMPYCVcKydzfyPrn5absNRju38IhQOf/NwjJY8OGWjlteqYeBCA=="
+ },
+ "node_modules/element-plus": {
+ "version": "2.9.10",
+ "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.9.10.tgz",
+ "integrity": "sha512-W2v9jWnm1kl/zm4bSvCh8aFCVlxvhG3fmqiDZwyd6WQiWGE595J/mpjcCggEr+49QDgIymhXrpPMOPPSARUbng==",
+ "dependencies": {
+ "@ctrl/tinycolor": "^3.4.1",
+ "@element-plus/icons-vue": "^2.3.1",
+ "@floating-ui/dom": "^1.0.1",
+ "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
+ "@types/lodash": "^4.14.182",
+ "@types/lodash-es": "^4.17.6",
+ "@vueuse/core": "^9.1.0",
+ "async-validator": "^4.2.5",
+ "dayjs": "^1.11.13",
+ "escape-html": "^1.0.3",
+ "lodash": "^4.17.21",
+ "lodash-es": "^4.17.21",
+ "lodash-unified": "^1.0.2",
+ "memoize-one": "^6.0.0",
+ "normalize-wheel-es": "^1.2.0"
+ },
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ },
+ "node_modules/elkjs": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmmirror.com/elkjs/-/elkjs-0.9.3.tgz",
+ "integrity": "sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ=="
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "node_modules/emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "peer": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.18.1",
+ "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz",
+ "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==",
+ "peer": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/errno": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz",
+ "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "prr": "~1.0.1"
+ },
+ "bin": {
+ "errno": "cli.js"
+ }
+ },
+ "node_modules/error-stack-parser-es": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmmirror.com/error-stack-parser-es/-/error-stack-parser-es-0.1.5.tgz",
+ "integrity": "sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
+ "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
+ "peer": true
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.4.tgz",
+ "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.4",
+ "@esbuild/android-arm": "0.25.4",
+ "@esbuild/android-arm64": "0.25.4",
+ "@esbuild/android-x64": "0.25.4",
+ "@esbuild/darwin-arm64": "0.25.4",
+ "@esbuild/darwin-x64": "0.25.4",
+ "@esbuild/freebsd-arm64": "0.25.4",
+ "@esbuild/freebsd-x64": "0.25.4",
+ "@esbuild/linux-arm": "0.25.4",
+ "@esbuild/linux-arm64": "0.25.4",
+ "@esbuild/linux-ia32": "0.25.4",
+ "@esbuild/linux-loong64": "0.25.4",
+ "@esbuild/linux-mips64el": "0.25.4",
+ "@esbuild/linux-ppc64": "0.25.4",
+ "@esbuild/linux-riscv64": "0.25.4",
+ "@esbuild/linux-s390x": "0.25.4",
+ "@esbuild/linux-x64": "0.25.4",
+ "@esbuild/netbsd-arm64": "0.25.4",
+ "@esbuild/netbsd-x64": "0.25.4",
+ "@esbuild/openbsd-arm64": "0.25.4",
+ "@esbuild/openbsd-x64": "0.25.4",
+ "@esbuild/sunos-x64": "0.25.4",
+ "@esbuild/win32-arm64": "0.25.4",
+ "@esbuild/win32-ia32": "0.25.4",
+ "@esbuild/win32-x64": "0.25.4"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "peer": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "peer": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "peer": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "peer": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+ },
+ "node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "peer": true,
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/execa": {
+ "version": "9.5.3",
+ "resolved": "https://registry.npmmirror.com/execa/-/execa-9.5.3.tgz",
+ "integrity": "sha512-QFNnTvU3UjgWFy8Ef9iDHvIdcgZ344ebkwYx4/KLbR+CKQA4xBaHzv+iRpp86QfMHP8faFQLh8iOc57215y4Rg==",
+ "dev": true,
+ "dependencies": {
+ "@sindresorhus/merge-streams": "^4.0.0",
+ "cross-spawn": "^7.0.3",
+ "figures": "^6.1.0",
+ "get-stream": "^9.0.0",
+ "human-signals": "^8.0.0",
+ "is-plain-obj": "^4.1.0",
+ "is-stream": "^4.0.1",
+ "npm-run-path": "^6.0.0",
+ "pretty-ms": "^9.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^4.0.0",
+ "yoctocolors": "^2.0.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.5.0"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==",
+ "dependencies": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-brackets/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/expand-brackets/node_modules/define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-brackets/node_modules/is-descriptor": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz",
+ "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
+ "dependencies": {
+ "is-accessor-descriptor": "^1.0.1",
+ "is-data-descriptor": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/expand-brackets/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "node_modules/exsolve": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.5.tgz",
+ "integrity": "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==",
+ "dev": true
+ },
+ "node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dependencies": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extglob/node_modules/define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
+ "dependencies": {
+ "is-descriptor": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-uri": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmmirror.com/fast-uri/-/fast-uri-3.0.6.tgz",
+ "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "peer": true
+ },
+ "node_modules/fastq": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fecha": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmmirror.com/fecha/-/fecha-4.2.3.tgz",
+ "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw=="
+ },
+ "node_modules/figures": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/figures/-/figures-6.1.0.tgz",
+ "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==",
+ "dev": true,
+ "dependencies": {
+ "is-unicode-supported": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.9",
+ "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.3.1.tgz",
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.6",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.2.tgz",
+ "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==",
+ "dependencies": {
+ "map-cache": "^0.2.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "11.3.0",
+ "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.0.tgz",
+ "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-9.0.1.tgz",
+ "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==",
+ "dev": true,
+ "dependencies": {
+ "@sec-ant/readable-stream": "^0.4.1",
+ "is-stream": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmmirror.com/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/gl-matrix": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmmirror.com/gl-matrix/-/gl-matrix-3.4.3.tgz",
+ "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA=="
+ },
+ "node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmmirror.com/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "dev": true,
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig=="
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globby": {
+ "version": "9.2.0",
+ "resolved": "https://registry.npmmirror.com/globby/-/globby-9.2.0.tgz",
+ "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==",
+ "dependencies": {
+ "@types/glob": "^7.1.1",
+ "array-union": "^1.0.2",
+ "dir-glob": "^2.2.2",
+ "fast-glob": "^2.2.6",
+ "glob": "^7.1.3",
+ "ignore": "^4.0.3",
+ "pify": "^4.0.1",
+ "slash": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/globby/node_modules/@nodelib/fs.stat": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
+ "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/globby/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/globby/node_modules/braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dependencies": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/globby/node_modules/fast-glob": {
+ "version": "2.2.7",
+ "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-2.2.7.tgz",
+ "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
+ "dependencies": {
+ "@mrmlnc/readdir-enhanced": "^2.2.1",
+ "@nodelib/fs.stat": "^1.1.2",
+ "glob-parent": "^3.1.0",
+ "is-glob": "^4.0.0",
+ "merge2": "^1.2.3",
+ "micromatch": "^3.1.10"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/globby/node_modules/fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==",
+ "dependencies": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/globby/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/globby/node_modules/glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==",
+ "dependencies": {
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
+ }
+ },
+ "node_modules/globby/node_modules/glob-parent/node_modules/is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==",
+ "dependencies": {
+ "is-extglob": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/globby/node_modules/is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dependencies": {
+ "is-plain-object": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/globby/node_modules/is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/globby/node_modules/is-number/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/globby/node_modules/micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dependencies": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/globby/node_modules/micromatch/node_modules/extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
+ "dependencies": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/globby/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/globby/node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/globby/node_modules/to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==",
+ "dependencies": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/gojs": {
+ "version": "3.0.22",
+ "resolved": "https://registry.npmmirror.com/gojs/-/gojs-3.0.22.tgz",
+ "integrity": "sha512-hnv8njLcdAsWmoJiQxkXK85vCXx0lNp8k7O8SdMvy1MKkKCBpODZSreHQfkbrQ8LsjPLAYfhhw+vBrtdO8cSMg=="
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+ },
+ "node_modules/graphlib": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmmirror.com/graphlib/-/graphlib-2.1.8.tgz",
+ "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==",
+ "dependencies": {
+ "lodash": "^4.17.15"
+ }
+ },
+ "node_modules/gray-matter": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/gray-matter/-/gray-matter-4.0.3.tgz",
+ "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==",
+ "dependencies": {
+ "js-yaml": "^3.13.1",
+ "kind-of": "^6.0.2",
+ "section-matter": "^1.0.0",
+ "strip-bom-string": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==",
+ "dependencies": {
+ "get-value": "^2.0.6",
+ "has-values": "^1.0.0",
+ "isobject": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==",
+ "dependencies": {
+ "is-number": "^3.0.0",
+ "kind-of": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-values/node_modules/is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-values/node_modules/is-number/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-values/node_modules/kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/hash-sum": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz",
+ "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA=="
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/highlight.js": {
+ "version": "10.7.3",
+ "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-10.7.3.tgz",
+ "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/hookable": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz",
+ "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
+ "dev": true
+ },
+ "node_modules/http-proxy": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmmirror.com/http-proxy/-/http-proxy-1.18.1.tgz",
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "dev": true,
+ "dependencies": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/http-proxy-middleware": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz",
+ "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==",
+ "dev": true,
+ "dependencies": {
+ "@types/http-proxy": "^1.17.5",
+ "http-proxy": "^1.18.1",
+ "is-glob": "^4.0.1",
+ "is-plain-obj": "^3.0.0",
+ "micromatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/http-proxy-middleware/node_modules/is-plain-obj": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
+ "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-8.0.1.tgz",
+ "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmmirror.com/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/image-size": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz",
+ "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "image-size": "bin/image-size.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/insert-text-at-cursor": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmmirror.com/insert-text-at-cursor/-/insert-text-at-cursor-0.3.0.tgz",
+ "integrity": "sha512-/nPtyeX9xPUvxZf+r0518B7uqNKlP+LqNJqSiXFEaa2T71rWIwTVXGH7hB9xO/EVdwa5/pWlFCPwShOW81XIxQ=="
+ },
+ "node_modules/internmap": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/internmap/-/internmap-2.0.3.tgz",
+ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/is-accessor-descriptor": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz",
+ "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==",
+ "dependencies": {
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/is-any-array": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/is-any-array/-/is-any-array-2.0.1.tgz",
+ "integrity": "sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ=="
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-descriptor": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz",
+ "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==",
+ "dependencies": {
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-descriptor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.3.tgz",
+ "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==",
+ "dependencies": {
+ "is-accessor-descriptor": "^1.0.1",
+ "is-data-descriptor": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-3.0.0.tgz",
+ "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
+ "dev": true,
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-inside-container": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/is-inside-container/-/is-inside-container-1.0.0.tgz",
+ "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
+ "dev": true,
+ "dependencies": {
+ "is-docker": "^3.0.0"
+ },
+ "bin": {
+ "is-inside-container": "cli.js"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-4.0.1.tgz",
+ "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz",
+ "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-what": {
+ "version": "4.1.16",
+ "resolved": "https://registry.npmmirror.com/is-what/-/is-what-4.1.16.tgz",
+ "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-3.1.0.tgz",
+ "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==",
+ "dev": true,
+ "dependencies": {
+ "is-inside-container": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmmirror.com/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "dev": true,
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/javascript-stringify": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmmirror.com/javascript-stringify/-/javascript-stringify-1.6.0.tgz",
+ "integrity": "sha512-fnjC0up+0SjEJtgmmG+teeel68kutkvzfctO/KxE3qJlbunkJYAshgH3boU++gSBHP8z5/r0ts0qRIrHf0RTQQ=="
+ },
+ "node_modules/jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "1.21.7",
+ "resolved": "https://registry.npmmirror.com/jiti/-/jiti-1.21.7.tgz",
+ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
+ "dev": true,
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "peer": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "peer": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/katex": {
+ "version": "0.13.24",
+ "resolved": "https://registry.npmmirror.com/katex/-/katex-0.13.24.tgz",
+ "integrity": "sha512-jZxYuKCma3VS5UuxOx/rFV1QyGSl3Uy/i0kTJF3HgQ5xMinCQVF8Zd4bMY/9aI9b9A2pjIBOsjSSm68ykTAr8w==",
+ "funding": [
+ "https://opencollective.com/katex",
+ "https://github.com/sponsors/katex"
+ ],
+ "dependencies": {
+ "commander": "^8.0.0"
+ },
+ "bin": {
+ "katex": "cli.js"
+ }
+ },
+ "node_modules/katex/node_modules/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/khroma": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/khroma/-/khroma-2.1.0.tgz",
+ "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmmirror.com/kleur/-/kleur-4.1.5.tgz",
+ "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/koa2-connect": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/koa2-connect/-/koa2-connect-1.0.2.tgz",
+ "integrity": "sha512-Subc/t9vJaMtorZ/Z/yqjRaZZ4RQ8ew+aacQhYXzL6oVuaYaUGqhh3UMRB5gcpu7t9hu1QBwbJezHohLNohr3g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/kolorist": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmmirror.com/kolorist/-/kolorist-1.8.0.tgz",
+ "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==",
+ "dev": true
+ },
+ "node_modules/layout-base": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/layout-base/-/layout-base-1.0.2.tgz",
+ "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg=="
+ },
+ "node_modules/less": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/less/-/less-4.3.0.tgz",
+ "integrity": "sha512-X9RyH9fvemArzfdP8Pi3irr7lor2Ok4rOttDXBhlwDg+wKQsXOXgHWduAJE1EsF7JJx0w0bcO6BC6tCKKYnXKA==",
+ "dev": true,
+ "dependencies": {
+ "copy-anything": "^2.0.1",
+ "parse-node-version": "^1.0.1",
+ "tslib": "^2.3.0"
+ },
+ "bin": {
+ "lessc": "bin/lessc"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "optionalDependencies": {
+ "errno": "^0.1.1",
+ "graceful-fs": "^4.1.2",
+ "image-size": "~0.5.0",
+ "make-dir": "^2.1.0",
+ "mime": "^1.4.1",
+ "needle": "^3.1.0",
+ "source-map": "~0.6.0"
+ }
+ },
+ "node_modules/less/node_modules/copy-anything": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz",
+ "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
+ "dev": true,
+ "dependencies": {
+ "is-what": "^3.14.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/less/node_modules/is-what": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz",
+ "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
+ "dev": true
+ },
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true
+ },
+ "node_modules/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
+ "dependencies": {
+ "uc.micro": "^2.0.0"
+ }
+ },
+ "node_modules/loader-runner": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz",
+ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+ "peer": true,
+ "engines": {
+ "node": ">=6.11.5"
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+ "peer": true,
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/local-pkg": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.1.tgz",
+ "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==",
+ "dev": true,
+ "dependencies": {
+ "mlly": "^1.7.3",
+ "pkg-types": "^1.2.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/lodash-es": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz",
+ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+ },
+ "node_modules/lodash-unified": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz",
+ "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
+ "peerDependencies": {
+ "@types/lodash-es": "*",
+ "lodash": "*",
+ "lodash-es": "*"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.17",
+ "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz",
+ "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/make-dir/node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmmirror.com/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==",
+ "dependencies": {
+ "object-visit": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/markdown-it": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmmirror.com/markdown-it/-/markdown-it-14.1.0.tgz",
+ "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==",
+ "dependencies": {
+ "argparse": "^2.0.1",
+ "entities": "^4.4.0",
+ "linkify-it": "^5.0.0",
+ "mdurl": "^2.0.0",
+ "punycode.js": "^2.3.1",
+ "uc.micro": "^2.1.0"
+ },
+ "bin": {
+ "markdown-it": "bin/markdown-it.mjs"
+ }
+ },
+ "node_modules/markdown-it-anchor": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmmirror.com/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz",
+ "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==",
+ "peerDependencies": {
+ "markdown-it": "*"
+ }
+ },
+ "node_modules/markdown-it-attrs": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmmirror.com/markdown-it-attrs/-/markdown-it-attrs-4.3.1.tgz",
+ "integrity": "sha512-/ko6cba+H6gdZ0DOw7BbNMZtfuJTRp9g/IrGIuz8lYc/EfnmWRpaR3CFPnNbVz0LDvF8Gf1hFGPqrQqq7De0rg==",
+ "engines": {
+ "node": ">=6"
+ },
+ "peerDependencies": {
+ "markdown-it": ">= 9.0.0"
+ }
+ },
+ "node_modules/markdown-it-chain": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/markdown-it-chain/-/markdown-it-chain-1.3.0.tgz",
+ "integrity": "sha512-XClV8I1TKy8L2qsT9iX3qiV+50ZtcInGXI80CA+DP62sMs7hXlyV/RM3hfwy5O3Ad0sJm9xIwQELgANfESo8mQ==",
+ "dependencies": {
+ "webpack-chain": "^4.9.0"
+ },
+ "engines": {
+ "node": ">=6.9"
+ },
+ "peerDependencies": {
+ "markdown-it": ">=5.0.0"
+ }
+ },
+ "node_modules/markdown-it-container": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/markdown-it-container/-/markdown-it-container-3.0.0.tgz",
+ "integrity": "sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw=="
+ },
+ "node_modules/markdown-it-emoji": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/markdown-it-emoji/-/markdown-it-emoji-1.4.0.tgz",
+ "integrity": "sha512-QCz3Hkd+r5gDYtS2xsFXmBYrgw6KuWcJZLCEkdfAuwzZbShCmCfta+hwAMq4NX/4xPzkSHduMKgMkkPUJxSXNg=="
+ },
+ "node_modules/markdown-it-table-of-contents": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmmirror.com/markdown-it-table-of-contents/-/markdown-it-table-of-contents-0.4.4.tgz",
+ "integrity": "sha512-TAIHTHPwa9+ltKvKPWulm/beozQU41Ab+FIefRaQV1NRnpzwcV9QOe6wXQS5WLivm5Q/nlo0rl6laGkMDZE7Gw==",
+ "engines": {
+ "node": ">6.4.0"
+ }
+ },
+ "node_modules/markdown-it/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/mdast-util-from-markdown": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmmirror.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz",
+ "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==",
+ "dependencies": {
+ "@types/mdast": "^3.0.0",
+ "@types/unist": "^2.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "mdast-util-to-string": "^3.1.0",
+ "micromark": "^3.0.0",
+ "micromark-util-decode-numeric-character-reference": "^1.0.0",
+ "micromark-util-decode-string": "^1.0.0",
+ "micromark-util-normalize-identifier": "^1.0.0",
+ "micromark-util-symbol": "^1.0.0",
+ "micromark-util-types": "^1.0.0",
+ "unist-util-stringify-position": "^3.0.0",
+ "uvu": "^0.5.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-string": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz",
+ "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==",
+ "dependencies": {
+ "@types/mdast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w=="
+ },
+ "node_modules/memoize-one": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz",
+ "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "peer": true
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/mermaid": {
+ "version": "10.9.3",
+ "resolved": "https://registry.npmmirror.com/mermaid/-/mermaid-10.9.3.tgz",
+ "integrity": "sha512-V80X1isSEvAewIL3xhmz/rVmc27CVljcsbWxkxlWJWY/1kQa4XOABqpDl2qQLGKzpKm6WbTfUEKImBlUfFYArw==",
+ "dependencies": {
+ "@braintree/sanitize-url": "^6.0.1",
+ "@types/d3-scale": "^4.0.3",
+ "@types/d3-scale-chromatic": "^3.0.0",
+ "cytoscape": "^3.28.1",
+ "cytoscape-cose-bilkent": "^4.1.0",
+ "d3": "^7.4.0",
+ "d3-sankey": "^0.12.3",
+ "dagre-d3-es": "7.0.10",
+ "dayjs": "^1.11.7",
+ "dompurify": "^3.0.5 <3.1.7",
+ "elkjs": "^0.9.0",
+ "katex": "^0.16.9",
+ "khroma": "^2.0.0",
+ "lodash-es": "^4.17.21",
+ "mdast-util-from-markdown": "^1.3.0",
+ "non-layered-tidy-tree-layout": "^2.0.2",
+ "stylis": "^4.1.3",
+ "ts-dedent": "^2.2.0",
+ "uuid": "^9.0.0",
+ "web-worker": "^1.2.0"
+ }
+ },
+ "node_modules/mermaid/node_modules/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/mermaid/node_modules/katex": {
+ "version": "0.16.22",
+ "resolved": "https://registry.npmmirror.com/katex/-/katex-0.16.22.tgz",
+ "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==",
+ "funding": [
+ "https://opencollective.com/katex",
+ "https://github.com/sponsors/katex"
+ ],
+ "dependencies": {
+ "commander": "^8.3.0"
+ },
+ "bin": {
+ "katex": "cli.js"
+ }
+ },
+ "node_modules/micromark": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/micromark/-/micromark-3.2.0.tgz",
+ "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "micromark-core-commonmark": "^1.0.1",
+ "micromark-factory-space": "^1.0.0",
+ "micromark-util-character": "^1.0.0",
+ "micromark-util-chunked": "^1.0.0",
+ "micromark-util-combine-extensions": "^1.0.0",
+ "micromark-util-decode-numeric-character-reference": "^1.0.0",
+ "micromark-util-encode": "^1.0.0",
+ "micromark-util-normalize-identifier": "^1.0.0",
+ "micromark-util-resolve-all": "^1.0.0",
+ "micromark-util-sanitize-uri": "^1.0.0",
+ "micromark-util-subtokenize": "^1.0.0",
+ "micromark-util-symbol": "^1.0.0",
+ "micromark-util-types": "^1.0.1",
+ "uvu": "^0.5.0"
+ }
+ },
+ "node_modules/micromark-core-commonmark": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz",
+ "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "micromark-factory-destination": "^1.0.0",
+ "micromark-factory-label": "^1.0.0",
+ "micromark-factory-space": "^1.0.0",
+ "micromark-factory-title": "^1.0.0",
+ "micromark-factory-whitespace": "^1.0.0",
+ "micromark-util-character": "^1.0.0",
+ "micromark-util-chunked": "^1.0.0",
+ "micromark-util-classify-character": "^1.0.0",
+ "micromark-util-html-tag-name": "^1.0.0",
+ "micromark-util-normalize-identifier": "^1.0.0",
+ "micromark-util-resolve-all": "^1.0.0",
+ "micromark-util-subtokenize": "^1.0.0",
+ "micromark-util-symbol": "^1.0.0",
+ "micromark-util-types": "^1.0.1",
+ "uvu": "^0.5.0"
+ }
+ },
+ "node_modules/micromark-factory-destination": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz",
+ "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-util-character": "^1.0.0",
+ "micromark-util-symbol": "^1.0.0",
+ "micromark-util-types": "^1.0.0"
+ }
+ },
+ "node_modules/micromark-factory-label": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz",
+ "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-util-character": "^1.0.0",
+ "micromark-util-symbol": "^1.0.0",
+ "micromark-util-types": "^1.0.0",
+ "uvu": "^0.5.0"
+ }
+ },
+ "node_modules/micromark-factory-space": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz",
+ "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-util-character": "^1.0.0",
+ "micromark-util-types": "^1.0.0"
+ }
+ },
+ "node_modules/micromark-factory-title": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz",
+ "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-factory-space": "^1.0.0",
+ "micromark-util-character": "^1.0.0",
+ "micromark-util-symbol": "^1.0.0",
+ "micromark-util-types": "^1.0.0"
+ }
+ },
+ "node_modules/micromark-factory-whitespace": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz",
+ "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-factory-space": "^1.0.0",
+ "micromark-util-character": "^1.0.0",
+ "micromark-util-symbol": "^1.0.0",
+ "micromark-util-types": "^1.0.0"
+ }
+ },
+ "node_modules/micromark-util-character": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz",
+ "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-util-symbol": "^1.0.0",
+ "micromark-util-types": "^1.0.0"
+ }
+ },
+ "node_modules/micromark-util-chunked": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz",
+ "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-util-symbol": "^1.0.0"
+ }
+ },
+ "node_modules/micromark-util-classify-character": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz",
+ "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-util-character": "^1.0.0",
+ "micromark-util-symbol": "^1.0.0",
+ "micromark-util-types": "^1.0.0"
+ }
+ },
+ "node_modules/micromark-util-combine-extensions": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz",
+ "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-util-chunked": "^1.0.0",
+ "micromark-util-types": "^1.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-numeric-character-reference": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz",
+ "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-util-symbol": "^1.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-string": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz",
+ "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "micromark-util-character": "^1.0.0",
+ "micromark-util-decode-numeric-character-reference": "^1.0.0",
+ "micromark-util-symbol": "^1.0.0"
+ }
+ },
+ "node_modules/micromark-util-encode": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz",
+ "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ]
+ },
+ "node_modules/micromark-util-html-tag-name": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz",
+ "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ]
+ },
+ "node_modules/micromark-util-normalize-identifier": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz",
+ "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-util-symbol": "^1.0.0"
+ }
+ },
+ "node_modules/micromark-util-resolve-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz",
+ "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-util-types": "^1.0.0"
+ }
+ },
+ "node_modules/micromark-util-sanitize-uri": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz",
+ "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-util-character": "^1.0.0",
+ "micromark-util-encode": "^1.0.0",
+ "micromark-util-symbol": "^1.0.0"
+ }
+ },
+ "node_modules/micromark-util-subtokenize": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz",
+ "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-util-chunked": "^1.0.0",
+ "micromark-util-symbol": "^1.0.0",
+ "micromark-util-types": "^1.0.0",
+ "uvu": "^0.5.0"
+ }
+ },
+ "node_modules/micromark-util-symbol": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz",
+ "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ]
+ },
+ "node_modules/micromark-util-types": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz",
+ "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ]
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "dev": true,
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/mitt": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz",
+ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
+ "dev": true
+ },
+ "node_modules/mixin-deep": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmmirror.com/mixin-deep/-/mixin-deep-1.3.2.tgz",
+ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+ "dependencies": {
+ "for-in": "^1.0.2",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/mixin-deep/node_modules/is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dependencies": {
+ "is-plain-object": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ml-array-max": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmmirror.com/ml-array-max/-/ml-array-max-1.2.4.tgz",
+ "integrity": "sha512-BlEeg80jI0tW6WaPyGxf5Sa4sqvcyY6lbSn5Vcv44lp1I2GR6AWojfUvLnGTNsIXrZ8uqWmo8VcG1WpkI2ONMQ==",
+ "dependencies": {
+ "is-any-array": "^2.0.0"
+ }
+ },
+ "node_modules/ml-array-min": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmmirror.com/ml-array-min/-/ml-array-min-1.2.3.tgz",
+ "integrity": "sha512-VcZ5f3VZ1iihtrGvgfh/q0XlMobG6GQ8FsNyQXD3T+IlstDv85g8kfV0xUG1QPRO/t21aukaJowDzMTc7j5V6Q==",
+ "dependencies": {
+ "is-any-array": "^2.0.0"
+ }
+ },
+ "node_modules/ml-array-rescale": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmmirror.com/ml-array-rescale/-/ml-array-rescale-1.3.7.tgz",
+ "integrity": "sha512-48NGChTouvEo9KBctDfHC3udWnQKNKEWN0ziELvY3KG25GR5cA8K8wNVzracsqSW1QEkAXjTNx+ycgAv06/1mQ==",
+ "dependencies": {
+ "is-any-array": "^2.0.0",
+ "ml-array-max": "^1.2.4",
+ "ml-array-min": "^1.2.3"
+ }
+ },
+ "node_modules/ml-matrix": {
+ "version": "6.12.1",
+ "resolved": "https://registry.npmmirror.com/ml-matrix/-/ml-matrix-6.12.1.tgz",
+ "integrity": "sha512-TJ+8eOFdp+INvzR4zAuwBQJznDUfktMtOB6g/hUcGh3rcyjxbz4Te57Pgri8Q9bhSQ7Zys4IYOGhFdnlgeB6Lw==",
+ "dependencies": {
+ "is-any-array": "^2.0.1",
+ "ml-array-rescale": "^1.3.7"
+ }
+ },
+ "node_modules/mlly": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.7.4.tgz",
+ "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.14.0",
+ "pathe": "^2.0.1",
+ "pkg-types": "^1.3.0",
+ "ufo": "^1.5.4"
+ }
+ },
+ "node_modules/mri": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/mri/-/mri-1.2.0.tgz",
+ "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mrmime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/mrmime/-/mrmime-2.0.1.tgz",
+ "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/nanomatch": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmmirror.com/nanomatch/-/nanomatch-1.2.13.tgz",
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+ "dependencies": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "fragment-cache": "^0.2.1",
+ "is-windows": "^1.0.2",
+ "kind-of": "^6.0.2",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/nanomatch/node_modules/extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
+ "dependencies": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/nanomatch/node_modules/is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dependencies": {
+ "is-plain-object": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/needle": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/needle/-/needle-3.3.1.tgz",
+ "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "iconv-lite": "^0.6.3",
+ "sax": "^1.2.4"
+ },
+ "bin": {
+ "needle": "bin/needle"
+ },
+ "engines": {
+ "node": ">= 4.4.x"
+ }
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "peer": true
+ },
+ "node_modules/neo4j-driver": {
+ "version": "5.28.1",
+ "resolved": "https://registry.npmmirror.com/neo4j-driver/-/neo4j-driver-5.28.1.tgz",
+ "integrity": "sha512-jbyBwyM0a3RLGcP43q3hIxPUPxA+1bE04RovOKdNAS42EtBMVCKcPSeOvWiHxgXp1ZFd0a8XqK+7LtguInOLUg==",
+ "dependencies": {
+ "neo4j-driver-bolt-connection": "5.28.1",
+ "neo4j-driver-core": "5.28.1",
+ "rxjs": "^7.8.1"
+ }
+ },
+ "node_modules/neo4j-driver-bolt-connection": {
+ "version": "5.28.1",
+ "resolved": "https://registry.npmmirror.com/neo4j-driver-bolt-connection/-/neo4j-driver-bolt-connection-5.28.1.tgz",
+ "integrity": "sha512-nY8GBhjOW7J0rDtpiyJn6kFdk2OiNVZZhZrO8//mwNXnf5VQJ6HqZQTDthH/9pEaX0Jvbastz1xU7ZL8xzqY0w==",
+ "dependencies": {
+ "buffer": "^6.0.3",
+ "neo4j-driver-core": "5.28.1",
+ "string_decoder": "^1.3.0"
+ }
+ },
+ "node_modules/neo4j-driver-core": {
+ "version": "5.28.1",
+ "resolved": "https://registry.npmmirror.com/neo4j-driver-core/-/neo4j-driver-core-5.28.1.tgz",
+ "integrity": "sha512-14vN8TlxC0JvJYfjWic5PwjsZ38loQLOKFTXwk4fWLTbCk6VhrhubB2Jsy9Rz+gM6PtTor4+6ClBEFDp1q/c8g=="
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="
+ },
+ "node_modules/non-layered-tidy-tree-layout": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz",
+ "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw=="
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-wheel-es": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
+ "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
+ },
+ "node_modules/npm-run-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-6.0.0.tgz",
+ "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^4.0.0",
+ "unicorn-magic": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-run-path/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmmirror.com/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==",
+ "dependencies": {
+ "copy-descriptor": "^0.1.0",
+ "define-property": "^0.2.5",
+ "kind-of": "^3.0.3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-copy/node_modules/define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-copy/node_modules/is-descriptor": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz",
+ "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
+ "dependencies": {
+ "is-accessor-descriptor": "^1.0.1",
+ "is-data-descriptor": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object-copy/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==",
+ "dependencies": {
+ "isobject": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==",
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/open": {
+ "version": "10.1.2",
+ "resolved": "https://registry.npmmirror.com/open/-/open-10.1.2.tgz",
+ "integrity": "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==",
+ "dev": true,
+ "dependencies": {
+ "default-browser": "^5.2.1",
+ "define-lazy-prop": "^3.0.0",
+ "is-inside-container": "^1.0.0",
+ "is-wsl": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "dev": true
+ },
+ "node_modules/parse-ms": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/parse-ms/-/parse-ms-4.0.0.tgz",
+ "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse-node-version": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz",
+ "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmmirror.com/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q=="
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmmirror.com/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-type": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/path-type/-/path-type-3.0.0.tgz",
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+ "dependencies": {
+ "pify": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/path-type/node_modules/pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+ "dev": true
+ },
+ "node_modules/perfect-debounce": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
+ "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
+ "dev": true
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pinia": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.3.1.tgz",
+ "integrity": "sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==",
+ "dependencies": {
+ "@vue/devtools-api": "^6.6.3",
+ "vue-demi": "^0.14.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.4.4",
+ "vue": "^2.7.0 || ^3.5.11"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmmirror.com/pirates/-/pirates-4.0.7.tgz",
+ "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pkg-types": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz",
+ "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
+ "dev": true,
+ "dependencies": {
+ "confbox": "^0.1.8",
+ "mlly": "^1.7.4",
+ "pathe": "^2.0.1"
+ }
+ },
+ "node_modules/posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmmirror.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.35",
+ "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.35.tgz",
+ "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmmirror.com/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "dev": true,
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+ "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "lilconfig": "^3.0.0",
+ "yaml": "^2.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-load-config/node_modules/lilconfig": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmmirror.com/postcss-nested/-/postcss-nested-6.2.0.tgz",
+ "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "postcss-selector-parser": "^6.1.1"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "node_modules/pretty-ms": {
+ "version": "9.2.0",
+ "resolved": "https://registry.npmmirror.com/pretty-ms/-/pretty-ms-9.2.0.tgz",
+ "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==",
+ "dev": true,
+ "dependencies": {
+ "parse-ms": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/prismjs": {
+ "version": "1.30.0",
+ "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.30.0.tgz",
+ "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
+ "node_modules/prr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/punycode.js": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/punycode.js/-/punycode.js-2.3.1.tgz",
+ "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/quansync": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmmirror.com/quansync/-/quansync-0.2.10.tgz",
+ "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/antfu"
+ },
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ ]
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/quickselect": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/quickselect/-/quickselect-2.0.0.tgz",
+ "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "peer": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/rbush": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/rbush/-/rbush-3.0.1.tgz",
+ "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==",
+ "dependencies": {
+ "quickselect": "^2.0.0"
+ }
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dependencies": {
+ "extend-shallow": "^3.0.2",
+ "safe-regex": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/regex-not/node_modules/extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
+ "dependencies": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/regex-not/node_modules/is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dependencies": {
+ "is-plain-object": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/repeat-element": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/repeat-element/-/repeat-element-1.1.4.tgz",
+ "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "dev": true
+ },
+ "node_modules/resize-observer-polyfill": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+ },
+ "node_modules/resolve": {
+ "version": "1.22.10",
+ "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.10.tgz",
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.16.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmmirror.com/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==",
+ "deprecated": "https://github.com/lydell/resolve-url#deprecated"
+ },
+ "node_modules/ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmmirror.com/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rfdc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz",
+ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+ "dev": true
+ },
+ "node_modules/robust-predicates": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/robust-predicates/-/robust-predicates-3.0.2.tgz",
+ "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="
+ },
+ "node_modules/rollup": {
+ "version": "4.40.2",
+ "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.40.2.tgz",
+ "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "1.0.7"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.40.2",
+ "@rollup/rollup-android-arm64": "4.40.2",
+ "@rollup/rollup-darwin-arm64": "4.40.2",
+ "@rollup/rollup-darwin-x64": "4.40.2",
+ "@rollup/rollup-freebsd-arm64": "4.40.2",
+ "@rollup/rollup-freebsd-x64": "4.40.2",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.40.2",
+ "@rollup/rollup-linux-arm-musleabihf": "4.40.2",
+ "@rollup/rollup-linux-arm64-gnu": "4.40.2",
+ "@rollup/rollup-linux-arm64-musl": "4.40.2",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.40.2",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2",
+ "@rollup/rollup-linux-riscv64-gnu": "4.40.2",
+ "@rollup/rollup-linux-riscv64-musl": "4.40.2",
+ "@rollup/rollup-linux-s390x-gnu": "4.40.2",
+ "@rollup/rollup-linux-x64-gnu": "4.40.2",
+ "@rollup/rollup-linux-x64-musl": "4.40.2",
+ "@rollup/rollup-win32-arm64-msvc": "4.40.2",
+ "@rollup/rollup-win32-ia32-msvc": "4.40.2",
+ "@rollup/rollup-win32-x64-msvc": "4.40.2",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/run-applescript": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmmirror.com/run-applescript/-/run-applescript-7.0.0.tgz",
+ "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/rw": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmmirror.com/rw/-/rw-1.3.3.tgz",
+ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="
+ },
+ "node_modules/rxjs": {
+ "version": "7.8.2",
+ "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.2.tgz",
+ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/sade": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmmirror.com/sade/-/sade-1.8.1.tgz",
+ "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
+ "dependencies": {
+ "mri": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==",
+ "dependencies": {
+ "ret": "~0.1.10"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "node_modules/sax": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.1.tgz",
+ "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/schema-utils": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.3.2.tgz",
+ "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==",
+ "peer": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/scule": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz",
+ "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==",
+ "dev": true
+ },
+ "node_modules/section-matter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/section-matter/-/section-matter-1.0.0.tgz",
+ "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==",
+ "dependencies": {
+ "extend-shallow": "^2.0.1",
+ "kind-of": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "peer": true,
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/set-value": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/set-value/-/set-value-2.0.1.tgz",
+ "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+ "dependencies": {
+ "extend-shallow": "^2.0.1",
+ "is-extendable": "^0.1.1",
+ "is-plain-object": "^2.0.3",
+ "split-string": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "dependencies": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "node_modules/sirv": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/sirv/-/sirv-3.0.1.tgz",
+ "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==",
+ "dev": true,
+ "dependencies": {
+ "@polka/url": "^1.0.0-next.24",
+ "mrmime": "^2.0.0",
+ "totalist": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/slash": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/slash/-/slash-2.0.0.tgz",
+ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmmirror.com/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dependencies": {
+ "base": "^0.11.1",
+ "debug": "^2.2.0",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "map-cache": "^0.2.2",
+ "source-map": "^0.5.6",
+ "source-map-resolve": "^0.5.0",
+ "use": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dependencies": {
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.0",
+ "snapdragon-util": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon-node/node_modules/define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
+ "dependencies": {
+ "is-descriptor": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dependencies": {
+ "kind-of": "^3.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon-util/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/snapdragon/node_modules/define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon/node_modules/is-descriptor": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz",
+ "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
+ "dependencies": {
+ "is-accessor-descriptor": "^1.0.1",
+ "is-data-descriptor": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/snapdragon/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "node_modules/snapdragon/node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-resolve": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmmirror.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+ "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+ "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated",
+ "dependencies": {
+ "atob": "^2.1.2",
+ "decode-uri-component": "^0.2.0",
+ "resolve-url": "^0.2.1",
+ "source-map-url": "^0.4.0",
+ "urix": "^0.1.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "peer": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/source-map-url": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmmirror.com/source-map-url/-/source-map-url-0.4.1.tgz",
+ "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
+ "deprecated": "See https://github.com/lydell/source-map-url#deprecated"
+ },
+ "node_modules/speakingurl": {
+ "version": "14.0.1",
+ "resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz",
+ "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dependencies": {
+ "extend-shallow": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/split-string/node_modules/extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
+ "dependencies": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/split-string/node_modules/is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dependencies": {
+ "is-plain-object": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
+ },
+ "node_modules/ssr-window": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-4.0.2.tgz",
+ "integrity": "sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ==",
+ "peer": true
+ },
+ "node_modules/static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmmirror.com/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==",
+ "dependencies": {
+ "define-property": "^0.2.5",
+ "object-copy": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/static-extend/node_modules/define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/static-extend/node_modules/is-descriptor": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz",
+ "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
+ "dependencies": {
+ "is-accessor-descriptor": "^1.0.1",
+ "is-data-descriptor": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/string-width-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
+ "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-4.0.0.tgz",
+ "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-literal": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-2.1.1.tgz",
+ "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==",
+ "dev": true,
+ "dependencies": {
+ "js-tokens": "^9.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/strip-literal/node_modules/js-tokens": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.1.tgz",
+ "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
+ "dev": true
+ },
+ "node_modules/stylis": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmmirror.com/stylis/-/stylis-4.3.6.tgz",
+ "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ=="
+ },
+ "node_modules/sucrase": {
+ "version": "3.35.0",
+ "resolved": "https://registry.npmmirror.com/sucrase/-/sucrase-3.35.0.tgz",
+ "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "^10.3.10",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/superjson": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.2.tgz",
+ "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==",
+ "dev": true,
+ "dependencies": {
+ "copy-anything": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/svg-path-parser": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/svg-path-parser/-/svg-path-parser-1.1.0.tgz",
+ "integrity": "sha512-jGCUqcQyXpfe38R7RFfhrMyfXcBmpMNJI/B+4CE9/Unkh98UporAc461GTthv+TVDuZXsBx7/WiwJb1Oh4tt4A=="
+ },
+ "node_modules/swiper": {
+ "version": "8.4.7",
+ "resolved": "https://registry.npmmirror.com/swiper/-/swiper-8.4.7.tgz",
+ "integrity": "sha512-VwO/KU3i9IV2Sf+W2NqyzwWob4yX9Qdedq6vBtS0rFqJ6Fa5iLUJwxQkuD4I38w0WDJwmFl8ojkdcRFPHWD+2g==",
+ "funding": [
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/swiperjs"
+ },
+ {
+ "type": "open_collective",
+ "url": "http://opencollective.com/swiper"
+ }
+ ],
+ "hasInstallScript": true,
+ "peer": true,
+ "dependencies": {
+ "dom7": "^4.0.4",
+ "ssr-window": "^4.0.2"
+ },
+ "engines": {
+ "node": ">= 4.7.0"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.4.1.tgz",
+ "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==",
+ "dev": true,
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.3.0",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.19.1",
+ "lilconfig": "^2.1.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.23",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.1",
+ "postcss-nested": "^6.0.1",
+ "postcss-selector-parser": "^6.0.11",
+ "resolve": "^1.22.2",
+ "sucrase": "^3.32.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tapable": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.2.2.tgz",
+ "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.39.2",
+ "resolved": "https://registry.npmmirror.com/terser/-/terser-5.39.2.tgz",
+ "integrity": "sha512-yEPUmWve+VA78bI71BW70Dh0TuV4HHd+I5SHOAfS1+QBOmvmCiiffgjR8ryyEd3KIfvPGFqoADt8LdQ6XpXIvg==",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.14.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser-webpack-plugin": {
+ "version": "5.3.14",
+ "resolved": "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz",
+ "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^4.3.0",
+ "serialize-javascript": "^6.0.2",
+ "terser": "^5.31.1"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "uglify-js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "peer": true
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmmirror.com/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.13.tgz",
+ "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==",
+ "dev": true,
+ "dependencies": {
+ "fdir": "^6.4.4",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinyglobby/node_modules/fdir": {
+ "version": "6.4.4",
+ "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.4.4.tgz",
+ "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==",
+ "dev": true,
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmmirror.com/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-object-path/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dependencies": {
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "regex-not": "^1.0.2",
+ "safe-regex": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/to-regex/node_modules/extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
+ "dependencies": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-regex/node_modules/is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dependencies": {
+ "is-plain-object": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/toggle-selection": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/toggle-selection/-/toggle-selection-1.0.6.tgz",
+ "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
+ },
+ "node_modules/toml": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/toml/-/toml-3.0.0.tgz",
+ "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w=="
+ },
+ "node_modules/totalist": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/totalist/-/totalist-3.0.1.tgz",
+ "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ts-dedent": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/ts-dedent/-/ts-dedent-2.2.0.tgz",
+ "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==",
+ "engines": {
+ "node": ">=6.10"
+ }
+ },
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmmirror.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "dev": true
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
+ },
+ "node_modules/uc.micro": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/uc.micro/-/uc.micro-2.1.0.tgz",
+ "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="
+ },
+ "node_modules/ufo": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.1.tgz",
+ "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==",
+ "dev": true
+ },
+ "node_modules/undici-types": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz",
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="
+ },
+ "node_modules/unicorn-magic": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmmirror.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
+ "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/unimport": {
+ "version": "3.14.6",
+ "resolved": "https://registry.npmmirror.com/unimport/-/unimport-3.14.6.tgz",
+ "integrity": "sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g==",
+ "dev": true,
+ "dependencies": {
+ "@rollup/pluginutils": "^5.1.4",
+ "acorn": "^8.14.0",
+ "escape-string-regexp": "^5.0.0",
+ "estree-walker": "^3.0.3",
+ "fast-glob": "^3.3.3",
+ "local-pkg": "^1.0.0",
+ "magic-string": "^0.30.17",
+ "mlly": "^1.7.4",
+ "pathe": "^2.0.1",
+ "picomatch": "^4.0.2",
+ "pkg-types": "^1.3.0",
+ "scule": "^1.3.0",
+ "strip-literal": "^2.1.1",
+ "unplugin": "^1.16.1"
+ }
+ },
+ "node_modules/unimport/node_modules/confbox": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.2.tgz",
+ "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==",
+ "dev": true
+ },
+ "node_modules/unimport/node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/unimport/node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/unimport/node_modules/local-pkg": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.1.1.tgz",
+ "integrity": "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==",
+ "dev": true,
+ "dependencies": {
+ "mlly": "^1.7.4",
+ "pkg-types": "^2.0.1",
+ "quansync": "^0.2.8"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/unimport/node_modules/local-pkg/node_modules/pkg-types": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.1.0.tgz",
+ "integrity": "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==",
+ "dev": true,
+ "dependencies": {
+ "confbox": "^0.2.1",
+ "exsolve": "^1.0.1",
+ "pathe": "^2.0.3"
+ }
+ },
+ "node_modules/unimport/node_modules/picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/union-value": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/union-value/-/union-value-1.0.1.tgz",
+ "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+ "dependencies": {
+ "arr-union": "^3.1.0",
+ "get-value": "^2.0.6",
+ "is-extendable": "^0.1.1",
+ "set-value": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
+ "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+ "dependencies": {
+ "@types/unist": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/unplugin": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-1.16.1.tgz",
+ "integrity": "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.14.0",
+ "webpack-virtual-modules": "^0.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/unplugin-auto-import": {
+ "version": "0.17.8",
+ "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-0.17.8.tgz",
+ "integrity": "sha512-CHryj6HzJ+n4ASjzwHruD8arhbdl+UXvhuAIlHDs15Y/IMecG3wrf7FVg4pVH/DIysbq/n0phIjNHAjl7TG7Iw==",
+ "dev": true,
+ "dependencies": {
+ "@antfu/utils": "^0.7.10",
+ "@rollup/pluginutils": "^5.1.0",
+ "fast-glob": "^3.3.2",
+ "local-pkg": "^0.5.0",
+ "magic-string": "^0.30.10",
+ "minimatch": "^9.0.4",
+ "unimport": "^3.7.2",
+ "unplugin": "^1.11.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@nuxt/kit": "^3.2.2",
+ "@vueuse/core": "*"
+ },
+ "peerDependenciesMeta": {
+ "@nuxt/kit": {
+ "optional": true
+ },
+ "@vueuse/core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/unplugin-vue-components": {
+ "version": "0.26.0",
+ "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-0.26.0.tgz",
+ "integrity": "sha512-s7IdPDlnOvPamjunVxw8kNgKNK8A5KM1YpK5j/p97jEKTjlPNrA0nZBiSfAKKlK1gWZuyWXlKL5dk3EDw874LQ==",
+ "dev": true,
+ "dependencies": {
+ "@antfu/utils": "^0.7.6",
+ "@rollup/pluginutils": "^5.0.4",
+ "chokidar": "^3.5.3",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.1",
+ "local-pkg": "^0.4.3",
+ "magic-string": "^0.30.3",
+ "minimatch": "^9.0.3",
+ "resolve": "^1.22.4",
+ "unplugin": "^1.4.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@babel/parser": "^7.15.8",
+ "@nuxt/kit": "^3.2.2",
+ "vue": "2 || 3"
+ },
+ "peerDependenciesMeta": {
+ "@babel/parser": {
+ "optional": true
+ },
+ "@nuxt/kit": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/unplugin-vue-components/node_modules/local-pkg": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.4.3.tgz",
+ "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==",
+ "dependencies": {
+ "has-value": "^0.3.1",
+ "isobject": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/unset-value/node_modules/has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmmirror.com/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==",
+ "dependencies": {
+ "get-value": "^2.0.3",
+ "has-values": "^0.1.4",
+ "isobject": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==",
+ "dependencies": {
+ "isarray": "1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/unset-value/node_modules/has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmmirror.com/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/upath": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/upath/-/upath-1.2.0.tgz",
+ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+ "engines": {
+ "node": ">=4",
+ "yarn": "*"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==",
+ "deprecated": "Please see https://github.com/lydell/urix#deprecated"
+ },
+ "node_modules/use": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/use/-/use-3.1.1.tgz",
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmmirror.com/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/uvu": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmmirror.com/uvu/-/uvu-0.5.6.tgz",
+ "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==",
+ "dependencies": {
+ "dequal": "^2.0.0",
+ "diff": "^5.0.0",
+ "kleur": "^4.0.3",
+ "sade": "^1.7.3"
+ },
+ "bin": {
+ "uvu": "bin.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/vant": {
+ "version": "3.6.16",
+ "resolved": "https://registry.npmmirror.com/vant/-/vant-3.6.16.tgz",
+ "integrity": "sha512-9pZao0NEeZQ0ZEb6N7SZxtqcdTp24o8IizhZS1G+FtStlXeKOFzCl+Nf1pIWRneQ9Kn+K+mNrfi2eiIZjVVppw==",
+ "dependencies": {
+ "@vant/icons": "^1.8.0",
+ "@vant/popperjs": "^1.2.1",
+ "@vant/use": "^1.4.2"
+ },
+ "peerDependencies": {
+ "vue": "^3.0.0"
+ }
+ },
+ "node_modules/vite": {
+ "version": "6.3.5",
+ "resolved": "https://registry.npmmirror.com/vite/-/vite-6.3.5.tgz",
+ "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.25.0",
+ "fdir": "^6.4.4",
+ "picomatch": "^4.0.2",
+ "postcss": "^8.5.3",
+ "rollup": "^4.34.9",
+ "tinyglobby": "^0.2.13"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "jiti": ">=1.21.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-hot-client": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/vite-hot-client/-/vite-hot-client-2.0.4.tgz",
+ "integrity": "sha512-W9LOGAyGMrbGArYJN4LBCdOC5+Zwh7dHvOHC0KmGKkJhsOzaKbpo/jEjpPKVHIW0/jBWj8RZG0NUxfgA8BxgAg==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0"
+ }
+ },
+ "node_modules/vite-plugin-inspect": {
+ "version": "0.8.9",
+ "resolved": "https://registry.npmmirror.com/vite-plugin-inspect/-/vite-plugin-inspect-0.8.9.tgz",
+ "integrity": "sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==",
+ "dev": true,
+ "dependencies": {
+ "@antfu/utils": "^0.7.10",
+ "@rollup/pluginutils": "^5.1.3",
+ "debug": "^4.3.7",
+ "error-stack-parser-es": "^0.1.5",
+ "fs-extra": "^11.2.0",
+ "open": "^10.1.0",
+ "perfect-debounce": "^1.0.0",
+ "picocolors": "^1.1.1",
+ "sirv": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1"
+ },
+ "peerDependenciesMeta": {
+ "@nuxt/kit": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-plugin-proxy": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmmirror.com/vite-plugin-proxy/-/vite-plugin-proxy-0.5.0.tgz",
+ "integrity": "sha512-tyUEHYPftPMiF0c+p6TS7GNEhRgGgIWss4PejfTeyyXZlsprHNFLT+ANcUPsKrlLZjA9N38BcfVYNDdKyMDwCA==",
+ "dev": true,
+ "dependencies": {
+ "http-proxy-middleware": "^1.0.3",
+ "koa2-connect": "^1.0.2"
+ }
+ },
+ "node_modules/vite-plugin-vue-devtools": {
+ "version": "7.7.6",
+ "resolved": "https://registry.npmmirror.com/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-7.7.6.tgz",
+ "integrity": "sha512-L7nPVM5a7lgit/Z+36iwoqHOaP3wxqVi1UvaDJwGCfblS9Y6vNqf32ILlzJVH9c47aHu90BhDXeZc+rgzHRHcw==",
+ "dev": true,
+ "dependencies": {
+ "@vue/devtools-core": "^7.7.6",
+ "@vue/devtools-kit": "^7.7.6",
+ "@vue/devtools-shared": "^7.7.6",
+ "execa": "^9.5.2",
+ "sirv": "^3.0.1",
+ "vite-plugin-inspect": "0.8.9",
+ "vite-plugin-vue-inspector": "^5.3.1"
+ },
+ "engines": {
+ "node": ">=v14.21.3"
+ },
+ "peerDependencies": {
+ "vite": "^3.1.0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0"
+ }
+ },
+ "node_modules/vite-plugin-vue-inspector": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmmirror.com/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.3.1.tgz",
+ "integrity": "sha512-cBk172kZKTdvGpJuzCCLg8lJ909wopwsu3Ve9FsL1XsnLBiRT9U3MePcqrgGHgCX2ZgkqZmAGR8taxw+TV6s7A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.23.0",
+ "@babel/plugin-proposal-decorators": "^7.23.0",
+ "@babel/plugin-syntax-import-attributes": "^7.22.5",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-transform-typescript": "^7.22.15",
+ "@vue/babel-plugin-jsx": "^1.1.5",
+ "@vue/compiler-dom": "^3.3.4",
+ "kolorist": "^1.8.0",
+ "magic-string": "^0.30.4"
+ },
+ "peerDependencies": {
+ "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0"
+ }
+ },
+ "node_modules/vite/node_modules/fdir": {
+ "version": "6.4.4",
+ "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.4.4.tgz",
+ "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==",
+ "dev": true,
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite/node_modules/picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/vite/node_modules/postcss": {
+ "version": "8.5.3",
+ "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.3.tgz",
+ "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.8",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/vue": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.13.tgz",
+ "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.13",
+ "@vue/compiler-sfc": "3.5.13",
+ "@vue/runtime-dom": "3.5.13",
+ "@vue/server-renderer": "3.5.13",
+ "@vue/shared": "3.5.13"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-awesome-swiper": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/vue-awesome-swiper/-/vue-awesome-swiper-5.0.1.tgz",
+ "integrity": "sha512-mWjFJzUqA4lG+DmsmibvMpoiBnl+IH2SSeiiQ3i5M0t1y9FknTxnGT0DsMb2YdJLgjYMEK3sYOWzqgLnZMH8Lg==",
+ "peerDependencies": {
+ "swiper": "^7.0.0 || ^8.0.0",
+ "vue": "3.x"
+ }
+ },
+ "node_modules/vue-chartjs": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmmirror.com/vue-chartjs/-/vue-chartjs-5.3.2.tgz",
+ "integrity": "sha512-NrkbRRoYshbXbWqJkTN6InoDVwVb90C0R7eAVgMWcB9dPikbruaOoTFjFYHE/+tNPdIe6qdLCDjfjPHQ0fw4jw==",
+ "peerDependencies": {
+ "chart.js": "^4.1.1",
+ "vue": "^3.0.0-0 || ^2.7.0"
+ }
+ },
+ "node_modules/vue-demi": {
+ "version": "0.14.10",
+ "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+ "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+ "hasInstallScript": true,
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-router": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.5.1.tgz",
+ "integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==",
+ "dependencies": {
+ "@vue/devtools-api": "^6.6.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ },
+ "node_modules/watchpack": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.3.tgz",
+ "integrity": "sha512-adBYQLivcg1jbdKEJeqScJJFvgm4qY9+3tXw+jdG6lkVeqRJEtiQmSWjmth8GKmDZuX7sYM4YFxQsf0AzMfGGw==",
+ "peer": true,
+ "dependencies": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "peer": true
+ },
+ "node_modules/web-worker": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/web-worker/-/web-worker-1.5.0.tgz",
+ "integrity": "sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw=="
+ },
+ "node_modules/webpack": {
+ "version": "5.99.8",
+ "resolved": "https://registry.npmmirror.com/webpack/-/webpack-5.99.8.tgz",
+ "integrity": "sha512-lQ3CPiSTpfOnrEGeXDwoq5hIGzSjmwD72GdfVzF7CQAI7t47rJG9eDWvcEkEn3CUQymAElVvDg3YNTlCYj+qUQ==",
+ "peer": true,
+ "dependencies": {
+ "@types/eslint-scope": "^3.7.7",
+ "@types/estree": "^1.0.6",
+ "@types/json-schema": "^7.0.15",
+ "@webassemblyjs/ast": "^1.14.1",
+ "@webassemblyjs/wasm-edit": "^1.14.1",
+ "@webassemblyjs/wasm-parser": "^1.14.1",
+ "acorn": "^8.14.0",
+ "browserslist": "^4.24.0",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.17.1",
+ "es-module-lexer": "^1.2.1",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.11",
+ "json-parse-even-better-errors": "^2.3.1",
+ "loader-runner": "^4.2.0",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^4.3.2",
+ "tapable": "^2.1.1",
+ "terser-webpack-plugin": "^5.3.11",
+ "watchpack": "^2.4.1",
+ "webpack-sources": "^3.2.3"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-chain": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmmirror.com/webpack-chain/-/webpack-chain-4.12.1.tgz",
+ "integrity": "sha512-BCfKo2YkDe2ByqkEWe1Rw+zko4LsyS75LVr29C6xIrxAg9JHJ4pl8kaIZ396SUSNp6b4815dRZPSTAS8LlURRQ==",
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+ "dependencies": {
+ "deepmerge": "^1.5.2",
+ "javascript-stringify": "^1.6.0"
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+ "peer": true,
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack-virtual-modules": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
+ "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
+ "dev": true
+ },
+ "node_modules/webpack/node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "peer": true
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/workerize-loader": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/workerize-loader/-/workerize-loader-2.0.2.tgz",
+ "integrity": "sha512-HoZ6XY4sHWxA2w0WpzgBwUiR3dv1oo7bS+oCwIpb6n54MclQ/7KXdXsVIChTCygyuHtVuGBO1+i3HzTt699UJQ==",
+ "peer": true,
+ "dependencies": {
+ "loader-utils": "^2.0.0"
+ },
+ "peerDependencies": {
+ "webpack": "*"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "node_modules/xss": {
+ "version": "1.0.15",
+ "resolved": "https://registry.npmmirror.com/xss/-/xss-1.0.15.tgz",
+ "integrity": "sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==",
+ "dependencies": {
+ "commander": "^2.20.3",
+ "cssfilter": "0.0.10"
+ },
+ "bin": {
+ "xss": "bin/xss"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/xss/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ },
+ "node_modules/yaml": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.7.1.tgz",
+ "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==",
+ "dev": true,
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/yoctocolors": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/yoctocolors/-/yoctocolors-2.1.1.tgz",
+ "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zrender": {
+ "version": "5.6.1",
+ "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.6.1.tgz",
+ "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==",
+ "dependencies": {
+ "tslib": "2.3.0"
+ }
+ },
+ "node_modules/zrender/node_modules/tslib": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
+ "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+ }
+ }
+}
diff --git a/front/package.json b/front/package.json
new file mode 100644
index 0000000..590658f
--- /dev/null
+++ b/front/package.json
@@ -0,0 +1,44 @@
+{
+ "name": "untitled",
+ "version": "0.0.0",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@amap/amap-jsapi-loader": "^1.0.1",
+ "@antv/g6": "^5.0.47",
+ "@element-plus/icons-vue": "^2.3.1",
+ "@fortawesome/fontawesome-free": "^6.7.2",
+ "@kangc/v-md-editor": "^2.3.18",
+ "axios": "^1.6.7",
+ "chart.js": "^4.4.7",
+ "dayjs": "^1.11.10",
+ "echarts": "^5.6.0",
+ "element-plus": "^2.5.6",
+ "gojs": "^3.0.22",
+ "markdown-it": "^14.0.0",
+ "neo4j-driver": "^5.28.1",
+ "pinia": "^2.1.7",
+ "prismjs": "^1.29.0",
+ "vue": "^3.5.13",
+ "vue-awesome-swiper": "^5.0.1",
+ "vue-chartjs": "^5.3.2",
+ "vue-router": "^4.3.0"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue": "^5.2.3",
+ "autoprefixer": "^10.4.17",
+ "less": "^4.2.0",
+ "postcss": "^8.4.35",
+ "tailwindcss": "^3.4.1",
+ "unplugin-auto-import": "^0.17.5",
+ "unplugin-vue-components": "^0.26.0",
+ "vite": "^6.2.4",
+ "vite-plugin-proxy": "^0.5.0",
+ "vite-plugin-vue-devtools": "^7.7.2"
+ }
+}
diff --git a/front/postcss.config.js b/front/postcss.config.js
new file mode 100644
index 0000000..2e7af2b
--- /dev/null
+++ b/front/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+}
diff --git a/front/public/favicon.ico b/front/public/favicon.ico
new file mode 100644
index 0000000..df36fcf
Binary files /dev/null and b/front/public/favicon.ico differ
diff --git a/front/public/icon.jpg b/front/public/icon.jpg
new file mode 100644
index 0000000..51681d6
Binary files /dev/null and b/front/public/icon.jpg differ
diff --git a/front/public/logo.svg b/front/public/logo.svg
new file mode 100644
index 0000000..d8bdb67
--- /dev/null
+++ b/front/public/logo.svg
@@ -0,0 +1,22 @@
+
\ No newline at end of file
diff --git a/front/src/App.vue b/front/src/App.vue
new file mode 100644
index 0000000..d45c41a
--- /dev/null
+++ b/front/src/App.vue
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/front/src/assets/base.css b/front/src/assets/base.css
new file mode 100644
index 0000000..8816868
--- /dev/null
+++ b/front/src/assets/base.css
@@ -0,0 +1,86 @@
+/* color palette from */
+:root {
+ --vt-c-white: #ffffff;
+ --vt-c-white-soft: #f8f8f8;
+ --vt-c-white-mute: #f2f2f2;
+
+ --vt-c-black: #181818;
+ --vt-c-black-soft: #222222;
+ --vt-c-black-mute: #282828;
+
+ --vt-c-indigo: #2c3e50;
+
+ --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+ --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+ --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65);
+ --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+ --vt-c-text-light-1: var(--vt-c-indigo);
+ --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+ --vt-c-text-dark-1: var(--vt-c-white);
+ --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+}
+
+/* semantic color variables for this project */
+:root {
+ --color-background: var(--vt-c-white);
+ --color-background-soft: var(--vt-c-white-soft);
+ --color-background-mute: var(--vt-c-white-mute);
+
+ --color-border: var(--vt-c-divider-light-2);
+ --color-border-hover: var(--vt-c-divider-light-1);
+
+ --color-heading: var(--vt-c-text-light-1);
+ --color-text: var(--vt-c-text-light-1);
+
+ --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color-background: var(--vt-c-black);
+ --color-background-soft: var(--vt-c-black-soft);
+ --color-background-mute: var(--vt-c-black-mute);
+
+ --color-border: var(--vt-c-divider-dark-2);
+ --color-border-hover: var(--vt-c-divider-dark-1);
+
+ --color-heading: var(--vt-c-text-dark-1);
+ --color-text: var(--vt-c-text-dark-2);
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ margin: 0;
+ font-weight: normal;
+}
+
+body {
+ min-height: 100vh;
+ color: var(--color-text);
+ background: var(--color-background);
+ transition:
+ color 0.5s,
+ background-color 0.5s;
+ line-height: 1.6;
+ font-family:
+ Inter,
+ -apple-system,
+ BlinkMacSystemFont,
+ 'Segoe UI',
+ Roboto,
+ Oxygen,
+ Ubuntu,
+ Cantarell,
+ 'Fira Sans',
+ 'Droid Sans',
+ 'Helvetica Neue',
+ sans-serif;
+ font-size: 15px;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
diff --git a/front/src/assets/logo.svg b/front/src/assets/logo.svg
new file mode 100644
index 0000000..7565660
--- /dev/null
+++ b/front/src/assets/logo.svg
@@ -0,0 +1 @@
+
diff --git a/front/src/assets/main.css b/front/src/assets/main.css
new file mode 100644
index 0000000..4443db6
--- /dev/null
+++ b/front/src/assets/main.css
@@ -0,0 +1,3 @@
+/*@tailwind base;*/
+/*@tailwind components;*/
+/*@tailwind utilities;*/
diff --git a/front/src/components/ImageUpload.vue b/front/src/components/ImageUpload.vue
new file mode 100644
index 0000000..a0718a4
--- /dev/null
+++ b/front/src/components/ImageUpload.vue
@@ -0,0 +1,384 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/front/src/layouts/AdminLayout.vue b/front/src/layouts/AdminLayout.vue
new file mode 100644
index 0000000..2616460
--- /dev/null
+++ b/front/src/layouts/AdminLayout.vue
@@ -0,0 +1,359 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/front/src/main.js b/front/src/main.js
new file mode 100644
index 0000000..e0789da
--- /dev/null
+++ b/front/src/main.js
@@ -0,0 +1,71 @@
+import { createApp } from 'vue'
+import { createPinia } from 'pinia'
+import App from './App.vue'
+import router from "./router/index.js";
+import ElementPlus, {ElMessage} from 'element-plus'
+import 'element-plus/dist/index.css'
+import 'dayjs/locale/zh-cn'
+import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
+import axios from 'axios'
+import VueMarkdownEditor from '@kangc/v-md-editor';
+import '@kangc/v-md-editor/lib/style/base-editor.css';
+import vuepressTheme from '@kangc/v-md-editor/lib/theme/vuepress.js';
+import '@kangc/v-md-editor/lib/theme/style/vuepress.css';
+import Prism from 'prismjs';
+import * as ElementPlusIconsVue from '@element-plus/icons-vue'
+import "./assets/main.css"
+import '@fortawesome/fontawesome-free/css/all.min.css';
+VueMarkdownEditor.use(vuepressTheme, {
+ Prism,
+});
+
+const app = createApp(App);
+const pinia = createPinia();
+for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
+ app.component(key, component)
+}
+app.use(ElementPlus, {
+ locale: zhCn,
+})
+app.use(VueMarkdownEditor);
+axios.defaults.baseURL = '/back';
+axios.loadData = async function (url) {
+ const resp = await axios.get(url);
+ return resp.data;
+};
+axios.interceptors.request.use(function (config) {
+
+ if(localStorage.getItem("token"))
+ config.headers.token = localStorage.getItem("token");
+ return config;
+}, function (error) {
+ return Promise.reject(error);
+});
+// 响应拦截器
+axios.interceptors.response.use(
+ function (response) {
+
+ if(response.data.code==401){
+ ElMessage.error( "登陆异常")
+ router.push("/login")
+ response.status.code=401
+ return response;
+ }
+
+ if( response.data.success== false){
+ ElMessage.error( response.data.message)
+ }
+ // 对响应数据做点什么
+ return response;
+ },
+ function (error) {
+
+ return Promise.reject(error);
+ }
+);
+
+app.config.globalProperties.$http = axios;
+app.use(pinia);
+app.use(router);
+app.use(ElementPlus);
+app.mount("#app");
diff --git a/front/src/router/index.js b/front/src/router/index.js
new file mode 100644
index 0000000..9c28fb7
--- /dev/null
+++ b/front/src/router/index.js
@@ -0,0 +1,158 @@
+import { createRouter, createWebHistory } from "vue-router";
+import { useAuthStore } from "@/stores/auth";
+
+// 导入页面组件
+import Login from "@/views/Login.vue";
+import AdminLayout from "@/layouts/AdminLayout.vue";
+import Dashboard from "@/views/admin/Dashboard.vue";
+import Users from "@/views/admin/Users.vue";
+import PurchaseOrders from "@/views/admin/orders/PurchaseOrders.vue";
+import SalesOrders from "@/views/admin/orders/SalesOrders.vue";
+import Scores from "@/views/admin/Scores.vue";
+import Categories from "@/views/admin/products/Categories.vue";
+import PrimaryProducts from "@/views/admin/products/PrimaryProducts.vue";
+import SecondaryProducts from "@/views/admin/products/SecondaryProducts.vue";
+import SystemConfigs from "@/views/admin/SystemConfigs.vue";
+import Banners from "@/views/admin/Banners.vue";
+import Profile from "@/views/Profile.vue";
+import UserWarehouses from "@/views/admin/UserWarehouses.vue";
+
+const routes = [
+ {
+ path: "/",
+ redirect: "/admin/dashboard",
+ },
+ {
+ path: "/login",
+ name: "Login",
+ component: Login,
+ meta: { title: "登录" },
+ },
+ {
+ path: "/admin",
+ name: "Admin",
+ component: AdminLayout,
+ redirect: "/admin/dashboard",
+ meta: {
+ title: "管理后台",
+ requiresAuth: true,
+ },
+ children: [
+ {
+ path: "dashboard",
+ name: "Dashboard",
+ component: Dashboard,
+ meta: { title: "仪表盘", requiresAuth: true },
+ },
+ {
+ path: "users",
+ name: "Users",
+ component: Users,
+ meta: { title: "用户管理", requiresAuth: true },
+ },
+ {
+ path: "warehouse/users",
+ name: "UserWarehouses",
+ component: UserWarehouses,
+ meta: { title: "用户库存管理", requiresAuth: true, adminOnly: true },
+ },
+ {
+ path: "orders/purchase",
+ name: "PurchaseOrders",
+ component: PurchaseOrders,
+ meta: { title: "买单管理", requiresAuth: true, adminOnly: true },
+ },
+ {
+ path: "orders/sales",
+ name: "SalesOrders",
+ component: SalesOrders,
+ meta: { title: "卖单管理", requiresAuth: true, adminOnly: true },
+ },
+ {
+ path: "scores",
+ name: "Scores",
+ component: Scores,
+ meta: { title: "积分管理", requiresAuth: true },
+ },
+ {
+ path: "products/categories",
+ name: "ProductCategories",
+ component: Categories,
+ meta: { title: "商品分类", requiresAuth: true, adminOnly: true },
+ },
+ {
+ path: "products/primary",
+ name: "PrimaryProducts",
+ component: PrimaryProducts,
+ meta: { title: "一级商品", requiresAuth: true, adminOnly: true },
+ },
+ {
+ path: "products/secondary",
+ name: "SecondaryProducts",
+ component: SecondaryProducts,
+ meta: { title: "二级商品", requiresAuth: true, adminOnly: true },
+ },
+ {
+ path: "configs",
+ name: "SystemConfigs",
+ component: SystemConfigs,
+ meta: { title: "系统配置", requiresAuth: true, adminOnly: true },
+ },
+ {
+ path: "banners",
+ name: "Banners",
+ component: Banners,
+ meta: { title: "轮播图管理", requiresAuth: true, adminOnly: true },
+ },
+ {
+ path: "profile",
+ name: "Profile",
+ component: Profile,
+ meta: { title: "个人信息", requiresAuth: true },
+ },
+ ],
+ },
+];
+
+const router = createRouter({
+ history: createWebHistory(),
+ routes,
+});
+
+// 路由守卫
+router.beforeEach((to, from, next) => {
+ const authStore = useAuthStore();
+
+ // 检查是否需要登录
+ if (to.meta.requiresAuth && !authStore.isLoggedIn) {
+ next("/login");
+ return;
+ }
+
+ // 如果已登录且访问登录页,重定向到管理后台
+ if (to.path === "/login" && authStore.isLoggedIn) {
+ next("/admin/dashboard");
+ return;
+ }
+
+ // 权限检查
+ if (to.meta.requiresAuth && authStore.isLoggedIn) {
+ // 检查是否为管理员或代理商
+ if (authStore.user?.system_role > 1) {
+ // 普通用户无权访问管理后台
+ next("/login");
+ return;
+ }
+
+ // 检查是否为管理员专用页面
+ if (to.meta.adminOnly && !authStore.isAdmin) {
+ // 非管理员无权访问管理员专用页面
+ next("/admin/dashboard");
+ return;
+ }
+ }
+
+ next();
+});
+
+export default router;
diff --git a/front/src/stores/auth.js b/front/src/stores/auth.js
new file mode 100644
index 0000000..8ac9b5b
--- /dev/null
+++ b/front/src/stores/auth.js
@@ -0,0 +1,104 @@
+import { ref, computed } from 'vue'
+import { defineStore } from 'pinia'
+import axios from 'axios'
+
+export const useAuthStore = defineStore('auth', () => {
+ const token = ref(localStorage.getItem('token') || '')
+ const user = ref(JSON.parse(localStorage.getItem('user') || 'null'))
+
+ const isLoggedIn = computed(() => !!token.value)
+ const isAdmin = computed(() => user.value?.system_role === 0)
+ const isAgent = computed(() => user.value?.system_role === 1)
+ const userRole = computed(() => {
+ if (!user.value) return ''
+ switch (user.value.system_role) {
+ case 0: return '管理员'
+ case 1: return '代理商'
+ case 2: return '普通用户'
+ default: return '未知'
+ }
+ })
+
+ // 登录
+ const login = async (credentials) => {
+ try {
+ const response = await axios.post('/auth/login', credentials)
+
+ if (response.data.success) {
+ const { token: newToken, user: userData } = response.data.data
+
+ token.value = newToken
+ user.value = userData
+
+ localStorage.setItem('token', newToken)
+ localStorage.setItem('user', JSON.stringify(userData))
+
+ return userData
+ } else {
+ throw new Error(response.data.message || '登录失败')
+ }
+ } catch (error) {
+ console.error('登录错误:', error)
+ throw error
+ }
+ }
+
+ // 登出
+ const logout = () => {
+ token.value = ''
+ user.value = null
+ localStorage.removeItem('token')
+ localStorage.removeItem('user')
+ }
+
+ // 获取当前用户信息
+ const getCurrentUser = async () => {
+ try {
+ const response = await axios.get('/auth/current')
+
+ if (response.data.success) {
+ user.value = response.data.data
+ localStorage.setItem('user', JSON.stringify(response.data.data))
+ return response.data.data
+ }
+ } catch (error) {
+ console.error('获取用户信息失败:', error)
+ logout() // 如果获取用户信息失败,清除登录状态
+ throw error
+ }
+ }
+
+ // 检查权限
+ const hasPermission = (requiredRole = null) => {
+ if (!user.value) return false
+
+ // 管理员拥有所有权限
+ if (user.value.system_role === 0) return true
+
+ // 如果没有指定角色要求,只要登录即可
+ if (requiredRole === null) return true
+
+ // 检查特定角色权限
+ return user.value.system_role === requiredRole
+ }
+
+ // 更新用户信息
+ const updateUserInfo = (userData) => {
+ user.value = userData
+ localStorage.setItem('user', JSON.stringify(userData))
+ }
+
+ return {
+ token,
+ user,
+ isLoggedIn,
+ isAdmin,
+ isAgent,
+ userRole,
+ login,
+ logout,
+ getCurrentUser,
+ hasPermission,
+ updateUserInfo
+ }
+})
\ No newline at end of file
diff --git a/front/src/views/Login.vue b/front/src/views/Login.vue
new file mode 100644
index 0000000..efdb75f
--- /dev/null
+++ b/front/src/views/Login.vue
@@ -0,0 +1,215 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ loading ? '登录中...' : '登录' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/front/src/views/Profile.vue b/front/src/views/Profile.vue
new file mode 100644
index 0000000..6409bd2
--- /dev/null
+++ b/front/src/views/Profile.vue
@@ -0,0 +1,516 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存修改
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 修改密码
+
+ 重置
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/front/src/views/admin/Banners.vue b/front/src/views/admin/Banners.vue
new file mode 100644
index 0000000..92012cc
--- /dev/null
+++ b/front/src/views/admin/Banners.vue
@@ -0,0 +1,424 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 无图片
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.status === 1 ? '启用' : '禁用' }}
+
+
+
+
+
+
+ {{ formatDate(row.created_at) }}
+
+
+
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/front/src/views/admin/Dashboard.vue b/front/src/views/admin/Dashboard.vue
new file mode 100644
index 0000000..dcf2195
--- /dev/null
+++ b/front/src/views/admin/Dashboard.vue
@@ -0,0 +1,606 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ stats.totalUsers || 0 }}
+
总用户数
+
+
+
+
+
+
+
+
+
+
+
{{ stats.totalOrders || 0 }}
+
总订单数
+
+
+
+
+
+
+
+
+
+
+
{{ stats.totalProducts || 0 }}
+
商品总数
+
+
+
+
+
+
+
+
+
+
+
¥{{ formatAmount(stats.totalAmount) }}
+
交易总额
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 查询统计
+
+
+
+
+
+
+
+ 用户信息
+
+ {{ selectedUserStats.user.customer_name }}
+ {{ selectedUserStats.user.real_name }}
+ {{ selectedUserStats.user.phone }}
+ {{ getUserRoleName(selectedUserStats.user.system_role) }}
+ {{ formatTime(selectedUserStats.user.created_at) }}
+ {{ selectedUserStats.user.company_name || '未填写' }}
+
+
+
+ 统计数据
+
+ ({{ dateRange[0] }} 至 {{ dateRange[1] }})
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ activity.description }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/front/src/views/admin/Scores.vue b/front/src/views/admin/Scores.vue
new file mode 100644
index 0000000..360885f
--- /dev/null
+++ b/front/src/views/admin/Scores.vue
@@ -0,0 +1,553 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.user?.customer_name || row.user?.phone }}
+ ID: {{ row.user_id }}
+ {{ row.user?.phone }}
+
+
+
+
+
+
+ {{ row.change_number > 0 ? '+' : '' }}{{ row.change_number }}
+
+
+
+
+
+
+ {{ row.user?.current_points || 0 }}
+
+
+
+
+
+
+
+ {{ formatDate(row.created_at) }}
+
+
+
+
+
+
+ 查看
+
+
+
+
+
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentRecord.id }}
+ {{ currentRecord.user_id }}
+ {{ currentRecord.user?.customer_name || currentRecord.user?.real_name }}
+ {{ currentRecord.user?.phone }}
+
+
+ {{ currentRecord.change_number > 0 ? '+' : '' }}{{ currentRecord.change_number }}
+
+
+ {{ currentRecord.user?.current_points || 0 }}
+ {{ currentRecord.note }}
+ {{ formatDate(currentRecord.created_at) }}
+ {{ formatDate(currentRecord.updated_at) }}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/front/src/views/admin/SystemConfigs.vue b/front/src/views/admin/SystemConfigs.vue
new file mode 100644
index 0000000..f0bb96e
--- /dev/null
+++ b/front/src/views/admin/SystemConfigs.vue
@@ -0,0 +1,692 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.config_value === 'true' ? '是' : '否' }}
+
+
+
+ {{ formatJsonValue(row.config_value) }}
+
+ {{ row.config_value }}
+
+
+
+
+
+
+
+ {{ getTypeName(row.config_type) }}
+
+
+
+
+
+
+
+ {{ row.is_system === 1 ? '是' : '否' }}
+
+
+
+
+
+
+
+
+ {{ formatDate(row.created_at) }}
+
+
+
+
+
+
+ 查看
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 是
+ 否
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentConfig.id }}
+ {{ currentConfig.config_key }}
+ {{ currentConfig.config_name }}
+
+
+ {{ getTypeName(currentConfig.config_type) }}
+
+
+
+
+ {{ currentConfig.is_system === 1 ? '是' : '否' }}
+
+
+
+
+
+
+ {{ currentConfig.config_value === 'true' ? '是' : '否' }}
+
+
+
{{ formatJson(currentConfig.config_value) }}
+
{{ currentConfig.config_value }}
+
+
+ {{ currentConfig.config_description || '无' }}
+ {{ formatDate(currentConfig.created_at) }}
+ {{ formatDate(currentConfig.updated_at) }}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/front/src/views/admin/UserWarehouses.vue b/front/src/views/admin/UserWarehouses.vue
new file mode 100644
index 0000000..648bcda
--- /dev/null
+++ b/front/src/views/admin/UserWarehouses.vue
@@ -0,0 +1,516 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ row.customer_name || row.real_name || '未知用户' }}
+
{{ row.phone }}
+
+
+
+
+
+
+
+ {{ row.product_type === 1 ? '一级商品' : '二级商品' }}
+
+
+
+
+
+
+
+
+ {{ row.total_quantity }}
+
+
+
+
+
+ ¥{{ formatAmount(row.total_value) }}
+
+
+
+
+
+
+ {{ row.status === 1 ? '库存中' : '已出售' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 查看详情
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentUser.customer_name }}
+ {{ currentUser.real_name }}
+ {{ currentUser.phone }}
+
+ ¥{{ formatAmount(currentUserTotalValue) }}
+
+
+
+
+
+
+
+ {{ row.product_type === 1 ? '一级商品' : '二级商品' }}
+
+
+
+
+
+
+
+
+
+
+ ¥{{ formatAmount(row.total_value) }}
+
+
+
+
+
+
+ {{ row.status === 1 ? '库存中' : '已出售' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/front/src/views/admin/Users.vue b/front/src/views/admin/Users.vue
new file mode 100644
index 0000000..c43ccbf
--- /dev/null
+++ b/front/src/views/admin/Users.vue
@@ -0,0 +1,950 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ getRoleName(row.system_role) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.status === 1 ? '启用' : '禁用' }}
+
+
+
+
+
+
+
+ {{ formatDate(row.expiry_date) }}
+
+ 永不过期
+
+
+
+
+
+ {{ formatDate(row.created_at) }}
+
+
+
+
+
+
+ 查看
+
+
+ 编辑
+
+
+ 付款码
+
+
+ 设置过期
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 启用
+ 禁用
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentUser.id }}
+ {{ currentUser.phone }}
+
+
+ {{ getRoleName(currentUser.system_role) }}
+
+
+
+
+ {{ currentUser.status === 1 ? '启用' : '禁用' }}
+
+
+ {{ currentUser.customer_name }}
+ {{ currentUser.real_name }}
+ {{ currentUser.current_points }}
+ {{ currentUser.identity_code }}
+ {{ currentUser.company_name || '未填写' }}
+ {{ currentUser.referrer_identity_code || '无' }}
+ {{ currentUser.personal_intro || '未填写' }}
+
+
+ {{ formatDate(currentUser.expiry_date) }}
+
+ 永不过期
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatDate(currentUser.created_at) }}
+ {{ formatDate(currentUser.updated_at) }}
+
+
+
+
+
+
+
+ {{ expiryUser.customer_name || expiryUser.real_name || expiryUser.phone }}
+
+
+
+
+ 永不过期
+ 设置过期时间
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
用户:{{ paymentUser.customer_name || paymentUser.real_name || paymentUser.phone }}
+
手机号:{{ paymentUser.phone }}
+
+
+
+
+
+ 支持jpg、png格式,建议尺寸200x200px
+
+
+
+
+ 支持jpg、png格式,建议尺寸200x200px
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/front/src/views/admin/orders/PurchaseOrders.vue b/front/src/views/admin/orders/PurchaseOrders.vue
new file mode 100644
index 0000000..784020a
--- /dev/null
+++ b/front/src/views/admin/orders/PurchaseOrders.vue
@@ -0,0 +1,788 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.buyer?.real_name || row.buyer?.phone }}
+ {{ row.buyer?.phone }}
+
+
+
+
+
+
+ {{ row.seller?.real_name || row.seller?.phone }}
+
{{ row.seller?.phone }}
+
+ 平台商品
+
+
+
+
+
+
+
+
+ {{ row.product_type === 1 ? '一级商品' : '二级商品' }}
+
+
+
+
+
+
+ ¥{{ formatAmount(row.unit_price) }}
+
+
+
+
+
+
+
+ ¥{{ formatAmount(row.total_amount) }}
+
+
+
+
+
+
+ {{ getStatusName(row.order_status) }}
+
+
+
+
+
+
+ {{ formatDate(row.created_at) }}
+
+
+
+
+
+
+ 查看
+
+
+ 留言
+
+
+ 处理
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentOrder.order_no }}
+ {{ currentOrder.buyer?.real_name }}
+ {{ currentOrder.buyer?.phone }}
+ {{ currentOrder.seller?.real_name || '平台' }}
+ {{ currentOrder.seller?.phone || '-' }}
+ {{ currentOrder.product_name }}
+
+
+ {{ currentOrder.product_type === 1 ? '一级商品' : '二级商品' }}
+
+
+
+
+ {{ getStatusName(currentOrder.order_status) }}
+
+
+ ¥{{ formatAmount(currentOrder.unit_price) }}
+ {{ currentOrder.quantity }}
+
+ ¥{{ formatAmount(currentOrder.total_amount) }}
+
+
+
+ {{ currentOrder.address.consignee_name }} {{ currentOrder.address.consignee_phone }}
+ {{ currentOrder.address.province }}{{ currentOrder.address.city }}{{ currentOrder.address.district }}{{ currentOrder.address.detail_address }}
+
+ 暂无
+
+ {{ currentOrder.remark || '无' }}
+ {{ formatDate(currentOrder.created_at) }}
+ {{ formatDate(currentOrder.confirm_time) || '未确认' }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 确认完成
+ 取消订单
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ message.content }}
+
+
+
+
+
+
+
+ 暂无留言
+
+
+
+
+
+
+
+
+
+
+
+ 发送留言
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/front/src/views/admin/orders/SalesOrders.vue b/front/src/views/admin/orders/SalesOrders.vue
new file mode 100644
index 0000000..202c2ed
--- /dev/null
+++ b/front/src/views/admin/orders/SalesOrders.vue
@@ -0,0 +1,764 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.seller?.real_name || row.seller?.phone }}
+ {{ row.seller?.phone }}
+
+
+
+
+
+ {{ row.buyer?.real_name || row.buyer?.phone }}
+ {{ row.buyer?.phone }}
+
+
+
+
+
+
+
+ ¥{{ formatAmount(row.selling_price) }}
+
+
+
+
+
+
+
+ ¥{{ formatAmount(row.total_amount) }}
+
+
+
+
+
+
+ {{ getStatusName(row.order_status) }}
+
+
+
+
+
+
+ {{ formatDate(row.created_at) }}
+
+
+
+
+
+
+ 查看
+
+
+ 留言
+
+
+ 处理
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentOrder.order_no }}
+ {{ currentOrder.seller?.real_name }}
+ {{ currentOrder.seller?.phone }}
+ {{ currentOrder.buyer?.real_name }}
+ {{ currentOrder.buyer?.phone }}
+ {{ currentOrder.product_name }}
+
+
+ {{ getStatusName(currentOrder.order_status) }}
+
+
+ ¥{{ formatAmount(currentOrder.selling_price) }}
+ {{ currentOrder.quantity }}
+
+ ¥{{ formatAmount(currentOrder.total_amount) }}
+
+
+
+ {{ currentOrder.address.consignee_name }} {{ currentOrder.address.consignee_phone }}
+ {{ currentOrder.address.province }}{{ currentOrder.address.city }}{{ currentOrder.address.district }}{{ currentOrder.address.detail_address }}
+
+ 暂无
+
+ {{ currentOrder.remark || '无' }}
+ {{ formatDate(currentOrder.created_at) }}
+ {{ formatDate(currentOrder.complete_time) || '未完成' }}
+
+
+
+
+
关联商品信息
+
+ {{ currentOrder.secondary_product.id }}
+ ¥{{ formatAmount(currentOrder.secondary_product.cost_price) }}
+ {{ currentOrder.secondary_product.product_description || '无' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 确认完成
+ 取消订单
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ message.content }}
+
+
+
+
+
+
+
+ 暂无留言
+
+
+
+
+
+
+
+
+
+
+
+ 发送留言
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/front/src/views/admin/products/Categories.vue b/front/src/views/admin/products/Categories.vue
new file mode 100644
index 0000000..a004640
--- /dev/null
+++ b/front/src/views/admin/products/Categories.vue
@@ -0,0 +1,345 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 无图标
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatDate(row.created_at) }}
+
+
+
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 启用
+ 禁用
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/front/src/views/admin/products/PrimaryProducts.vue b/front/src/views/admin/products/PrimaryProducts.vue
new file mode 100644
index 0000000..f9b3ddc
--- /dev/null
+++ b/front/src/views/admin/products/PrimaryProducts.vue
@@ -0,0 +1,747 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 无图片
+
+
+
+
+
+
+
+ {{ row.category?.category_name || '未分类' }}
+
+
+
+
+
+
+
¥{{ formatAmount(row.current_price) }}
+
+ ¥{{ formatAmount(row.original_price) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatDate(row.created_at) }}
+
+
+
+
+
+
+ 查看
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 上架
+ 下架
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentProduct.id }}
+ {{ currentProduct.product_name }}
+ {{ currentProduct.category?.category_name }}
+
+
+ {{ currentProduct.status === 1 ? '上架' : '下架' }}
+
+
+
+
+ {{ currentProduct.is_hot === 1 ? '是' : '否' }}
+
+
+ ¥{{ formatAmount(currentProduct.original_price) }}
+ ¥{{ formatAmount(currentProduct.current_price) }}
+ {{ currentProduct.stock_quantity }}
+ {{ currentProduct.sales_count }}
+ {{ currentProduct.view_count }}
+ {{ currentProduct.sort_order }}
+ {{ currentProduct.product_description || '无' }}
+ {{ formatDate(currentProduct.created_at) }}
+ {{ formatDate(currentProduct.updated_at) }}
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/front/src/views/admin/products/SecondaryProducts.vue b/front/src/views/admin/products/SecondaryProducts.vue
new file mode 100644
index 0000000..e80874e
--- /dev/null
+++ b/front/src/views/admin/products/SecondaryProducts.vue
@@ -0,0 +1,435 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 无图片
+
+
+
+
+
+
+
+ {{ row.seller?.customer_name || row.seller?.phone }}
+ ID: {{ row.seller_id }}
+
+
+
+
+
+
+ {{ row.original_product_type === 1 ? '一级商品' : '二级商品' }}
+
+
+
+
+
+
+
+
售价: ¥{{ formatAmount(row.selling_price) }}
+
成本: ¥{{ formatAmount(row.cost_price) }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ getStatusName(row.status) }}
+
+
+
+
+
+
+ {{ formatDate(row.created_at) }}
+
+
+
+
+
+
+ 查看详情
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentProduct.id }}
+ {{ currentProduct.product_name }}
+ {{ currentProduct.seller?.customer_name }}
+ {{ currentProduct.seller?.phone }}
+ {{ currentProduct.original_product_id }}
+
+
+ {{ currentProduct.original_product_type === 1 ? '一级商品' : '二级商品' }}
+
+
+ ¥{{ formatAmount(currentProduct.cost_price) }}
+ ¥{{ formatAmount(currentProduct.selling_price) }}
+
+
+ ¥{{ formatAmount(currentProduct.selling_price - currentProduct.cost_price) }}
+
+
+ {{ currentProduct.quantity }}
+ {{ currentProduct.view_count }}
+
+
+ {{ getStatusName(currentProduct.status) }}
+
+
+ {{ currentProduct.product_description || '无' }}
+ {{ formatDate(currentProduct.created_at) }}
+ {{ formatDate(currentProduct.updated_at) }}
+
+
+
+
+
卖家信息
+
+ {{ currentProduct.seller.id }}
+ {{ currentProduct.seller.identity_code }}
+ {{ currentProduct.seller.real_name }}
+ {{ currentProduct.seller.current_points }}
+ {{ currentProduct.seller.company_name || '无' }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/front/tailwind.config.js b/front/tailwind.config.js
new file mode 100644
index 0000000..4a45348
--- /dev/null
+++ b/front/tailwind.config.js
@@ -0,0 +1,17 @@
+/** @type {import('tailwindcss').Config} */
+module.exports = {
+ content: [
+ "./index.html",
+ "./src/**/*.{vue,js,ts,jsx,tsx}"
+ ],
+ theme: {
+ extend: {
+ colors: {
+ primary: '#3B82F6' // 扩展主题色
+ }
+ }
+ },
+ plugins: []
+}
+
+
diff --git a/front/vite.config.js b/front/vite.config.js
new file mode 100644
index 0000000..afd3d53
--- /dev/null
+++ b/front/vite.config.js
@@ -0,0 +1,32 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue(),
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ },
+ server: {
+ host: "localhost",
+ cors: true,
+ port: 1111,
+ open: false, //自动打开
+ proxy: {
+ // 这里的ccc可乱写, 是拼接在url后面的地址 如果接口中没有统一的后缀可自定义
+ // 如果有统一后缀, 如api, 直接写api即可, 也不用rewrite了
+ "^/back": {
+ target: "http://localhost:8090", // 真实接口地址, 后端给的基地址
+ changeOrigin: true, // 允许跨域
+ secure: false, //关键参数,不懂的自己去查
+ rewrite: (path) => path.replace(/^\/back/, '/back')
+ },
+ },
+ },
+})
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..0719d2c
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,51 @@
+module awesomeProject
+
+go 1.25.0
+
+require github.com/gin-gonic/gin v1.10.1
+
+require (
+ filippo.io/edwards25519 v1.1.0 // indirect
+ github.com/bytedance/sonic v1.11.6 // indirect
+ github.com/bytedance/sonic/loader v0.1.1 // indirect
+ github.com/cloudwego/base64x v0.1.4 // indirect
+ github.com/cloudwego/iasm v0.2.0 // indirect
+ github.com/gabriel-vasile/mimetype v1.4.3 // indirect
+ github.com/gin-contrib/sse v0.1.0 // indirect
+ github.com/go-playground/locales v0.14.1 // indirect
+ github.com/go-playground/universal-translator v0.18.1 // indirect
+ github.com/go-playground/validator/v10 v10.20.0 // indirect
+ github.com/go-sql-driver/mysql v1.9.3 // indirect
+ github.com/goccy/go-json v0.10.2 // indirect
+ github.com/golang-jwt/jwt/v5 v5.3.0 // indirect
+ github.com/google/uuid v1.6.0 // indirect
+ github.com/jackc/pgpassfile v1.0.0 // indirect
+ github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
+ github.com/jackc/pgx/v5 v5.7.5 // indirect
+ github.com/jackc/puddle/v2 v2.2.2 // indirect
+ github.com/jinzhu/inflection v1.0.0 // indirect
+ github.com/jinzhu/now v1.1.5 // indirect
+ github.com/json-iterator/go v1.1.12 // indirect
+ github.com/klauspost/cpuid/v2 v2.2.7 // indirect
+ github.com/leodido/go-urn v1.4.0 // indirect
+ github.com/mattn/go-isatty v0.0.20 // indirect
+ github.com/mattn/go-sqlite3 v1.14.32 // indirect
+ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+ github.com/modern-go/reflect2 v1.0.2 // indirect
+ github.com/pelletier/go-toml/v2 v2.2.2 // indirect
+ github.com/robfig/cron/v3 v3.0.1 // indirect
+ github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
+ github.com/ugorji/go/codec v1.2.12 // indirect
+ golang.org/x/arch v0.8.0 // indirect
+ golang.org/x/crypto v0.41.0 // indirect
+ golang.org/x/net v0.42.0 // indirect
+ golang.org/x/sync v0.16.0 // indirect
+ golang.org/x/sys v0.35.0 // indirect
+ golang.org/x/text v0.28.0 // indirect
+ google.golang.org/protobuf v1.34.1 // indirect
+ gopkg.in/yaml.v3 v3.0.1 // indirect
+ gorm.io/driver/mysql v1.6.0 // indirect
+ gorm.io/driver/postgres v1.6.0 // indirect
+ gorm.io/driver/sqlite v1.6.0 // indirect
+ gorm.io/gorm v1.30.1 // indirect
+)
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..4fdd225
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,132 @@
+filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
+filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
+github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0=
+github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=
+github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM=
+github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
+github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=
+github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
+github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
+github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
+github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
+github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
+github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
+github.com/gin-gonic/gin v1.10.1 h1:T0ujvqyCSqRopADpgPgiTT63DUQVSfojyME59Ei63pQ=
+github.com/gin-gonic/gin v1.10.1/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
+github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
+github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
+github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
+github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
+github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
+github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
+github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8=
+github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
+github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
+github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
+github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
+github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo=
+github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
+github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
+github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
+github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=
+github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
+github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs=
+github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M=
+github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo=
+github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
+github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
+github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
+github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
+github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
+github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
+github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
+github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuErjs=
+github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
+github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
+github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
+github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
+github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
+github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
+golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
+golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc=
+golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
+golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
+golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
+golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
+golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
+golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
+golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
+golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
+golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
+golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
+golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
+golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
+golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
+golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
+golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=
+google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/driver/mysql v1.6.0 h1:eNbLmNTpPpTOVZi8MMxCi2aaIm0ZpInbORNXDwyLGvg=
+gorm.io/driver/mysql v1.6.0/go.mod h1:D/oCC2GWK3M/dqoLxnOlaNKmXz8WNTfcS9y5ovaSqKo=
+gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4=
+gorm.io/driver/postgres v1.6.0/go.mod h1:vUw0mrGgrTK+uPHEhAdV4sfFELrByKVGnaVRkXDhtWo=
+gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ=
+gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8=
+gorm.io/gorm v1.30.1 h1:lSHg33jJTBxs2mgJRfRZeLDG+WZaHYCk3Wtfl6Ngzo4=
+gorm.io/gorm v1.30.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=
+nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
+rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
diff --git a/internal/common/config.go b/internal/common/config.go
new file mode 100644
index 0000000..afdbeaa
--- /dev/null
+++ b/internal/common/config.go
@@ -0,0 +1,102 @@
+package common
+
+import (
+ "fmt"
+ "gopkg.in/yaml.v3"
+ "os"
+)
+
+var MineConfig *Config
+
+// Config 应用配置结构
+type Config struct {
+ App AppConfig `yaml:"app"`
+ Database DatabaseConfig `yaml:"database"`
+ JWT JWTConfig `yaml:"jwt"`
+ Server ServerConfig `yaml:"server"`
+ Log LogConfig `yaml:"log"`
+}
+
+// AppConfig 应用基础配置
+type AppConfig struct {
+ Name string `yaml:"name"`
+ Version string `yaml:"version"`
+ Port int `yaml:"port"`
+ Env string `yaml:"env"`
+}
+
+// DatabaseConfig 数据库配置
+type DatabaseConfig struct {
+ Driver string `yaml:"driver"`
+ Host string `yaml:"host"`
+ Port int `yaml:"port"`
+ Username string `yaml:"username"`
+ Password string `yaml:"password"`
+ DBName string `yaml:"dbname"`
+ Charset string `yaml:"charset"`
+ SQLitePath string `yaml:"sqlite_path"`
+ MaxIdleConns int `yaml:"max_idle_conns"`
+ MaxOpenConns int `yaml:"max_open_conns"`
+ ConnMaxLifetime int `yaml:"conn_max_lifetime"`
+}
+
+// JWTConfig JWT配置
+type JWTConfig struct {
+ SecretKey string `yaml:"secret_key"`
+ ExpireHours int `yaml:"expire_hours"`
+}
+
+// ServerConfig 服务器配置
+type ServerConfig struct {
+ ReadTimeout int `yaml:"read_timeout"`
+ WriteTimeout int `yaml:"write_timeout"`
+ StaticPath string `yaml:"static_path"`
+ UploadMaxSize int `yaml:"upload_max_size"`
+}
+
+// LogConfig 日志配置
+type LogConfig struct {
+ Level string `yaml:"level"`
+ FilePath string `yaml:"file_path"`
+ MaxSize int `yaml:"max_size"`
+ MaxAge int `yaml:"max_age"`
+ MaxBackups int `yaml:"max_backups"`
+}
+
+// LoadConfig 加载配置文件
+func LoadConfig(configPath string) (*Config, error) {
+ config := &Config{}
+
+ // 读取配置文件
+ file, err := os.ReadFile(configPath)
+ if err != nil {
+ return nil, fmt.Errorf("读取配置文件失败: %v", err)
+ }
+
+ // 解析YAML
+ err = yaml.Unmarshal(file, config)
+ if err != nil {
+ return nil, fmt.Errorf("解析配置文件失败: %v", err)
+ }
+
+ // 设置全局配置
+ MineConfig = config
+
+ return config, nil
+}
+
+// GetDSN 获取数据库连接字符串
+func (db *DatabaseConfig) GetDSN() string {
+ switch db.Driver {
+ case "mysql":
+ return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True&loc=Local",
+ db.Username, db.Password, db.Host, db.Port, db.DBName, db.Charset)
+ case "postgres":
+ return fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%d sslmode=disable TimeZone=Asia/Shanghai",
+ db.Host, db.Username, db.Password, db.DBName, db.Port)
+ case "sqlite":
+ return db.SQLitePath
+ default:
+ return ""
+ }
+}
diff --git a/internal/common/database.go b/internal/common/database.go
new file mode 100644
index 0000000..8aa0b47
--- /dev/null
+++ b/internal/common/database.go
@@ -0,0 +1,82 @@
+package common
+
+import (
+ "fmt"
+ "log"
+ "time"
+
+ "gorm.io/driver/mysql"
+ "gorm.io/driver/postgres"
+ "gorm.io/driver/sqlite"
+ "gorm.io/gorm"
+ "gorm.io/gorm/logger"
+)
+
+var DB *gorm.DB
+
+// InitDatabase 初始化数据库连接
+func InitDatabase(config *DatabaseConfig) error {
+ var err error
+ var dialector gorm.Dialector
+
+ // 根据驱动类型选择相应的方言
+ switch config.Driver {
+ case "mysql":
+ dialector = mysql.Open(config.GetDSN())
+ case "postgres":
+ dialector = postgres.Open(config.GetDSN())
+ case "sqlite":
+ dialector = sqlite.Open(config.GetDSN())
+ default:
+ return fmt.Errorf("不支持的数据库驱动: %s", config.Driver)
+ }
+
+ // GORM 配置
+ gormConfig := &gorm.Config{
+ Logger: logger.Default.LogMode(logger.Info),
+ }
+
+ // 连接数据库
+ DB, err = gorm.Open(dialector, gormConfig)
+ if err != nil {
+ return fmt.Errorf("连接数据库失败: %v", err)
+ }
+
+ // 获取底层的 *sql.DB
+ sqlDB, err := DB.DB()
+ if err != nil {
+ return fmt.Errorf("获取数据库连接失败: %v", err)
+ }
+
+ // 设置连接池参数
+ sqlDB.SetMaxIdleConns(config.MaxIdleConns)
+ sqlDB.SetMaxOpenConns(config.MaxOpenConns)
+ sqlDB.SetConnMaxLifetime(time.Duration(config.ConnMaxLifetime) * time.Second)
+
+ // 测试连接
+ if err := sqlDB.Ping(); err != nil {
+ return fmt.Errorf("数据库连接测试失败: %v", err)
+ }
+
+ log.Println("数据库连接成功")
+ return nil
+}
+
+// GetDB 获取数据库实例
+func GetDB() *gorm.DB {
+ return DB
+}
+
+// CloseDatabase 关闭数据库连接
+func CloseDatabase() error {
+ sqlDB, err := DB.DB()
+ if err != nil {
+ return err
+ }
+ return sqlDB.Close()
+}
+
+// AutoMigrate 自动迁移数据表
+func AutoMigrate(models ...interface{}) error {
+ return DB.AutoMigrate(models...)
+}
\ No newline at end of file
diff --git a/internal/common/result.go b/internal/common/result.go
new file mode 100644
index 0000000..be34068
--- /dev/null
+++ b/internal/common/result.go
@@ -0,0 +1,24 @@
+package common
+
+type Result struct {
+ Code int `json:"code"`
+ Success bool `json:"success"`
+ Message string `json:"message"`
+ Data interface{} `json:"data"`
+}
+
+func Success(data interface{}) Result {
+
+ return Result{200, true, "", data}
+}
+
+func SuccessWithMessage(data interface{}, message string) Result {
+ return Result{200, true, message, data}
+}
+
+func Error(code int, message string) Result {
+ return Result{code, false, message, nil}
+}
+func ErrorWithData(data interface{}, code int, message string) Result {
+ return Result{code, true, message, data}
+}
diff --git a/internal/config/constants.go b/internal/config/constants.go
new file mode 100644
index 0000000..c1a19f2
--- /dev/null
+++ b/internal/config/constants.go
@@ -0,0 +1,30 @@
+package config
+
+// 配置键常量定义
+const (
+ // 系统基础配置
+ ConfigSiteName = "site_name" // 网站名称
+ ConfigSiteUrl = "site_url" // 网站地址
+ ConfigSiteLogo = "site_logo" // 网站Logo
+ ConfigSiteDescription = "site_description" // 网站描述
+
+ // 商品相关配置
+ ConfigPriceIncreaseRate = "warehouse_price_rate" // 商品入库价格增长率
+ ConfigMaxStockQuantity = "max_stock_quantity" // 最大库存数量
+ ConfigMinSalePrice = "min_sale_price" // 最低销售价格
+
+ // 用户相关配置
+ ConfigMaxUserLevel = "max_user_level" // 用户最大等级
+ ConfigDefaultUserScore = "default_user_score" // 新用户默认积分
+ ConfigReferralBonus = "referral_bonus" // 推荐奖励积分
+
+ // 订单相关配置
+ ConfigOrderTimeout = "order_timeout" // 订单超时时间(分钟)
+ ConfigMaxOrderQuantity = "max_order_quantity" // 单笔订单最大数量
+ ConfigMinOrderAmount = "min_order_amount" // 最小订单金额
+
+ // 系统功能开关
+ ConfigEnableRegistration = "enable_registration" // 是否开放注册
+ ConfigEnableUpgrade = "enable_upgrade" // 是否开启升级功能
+ ConfigMaintenanceMode = "maintenance_mode" // 维护模式
+)
diff --git a/internal/config/events.go b/internal/config/events.go
new file mode 100644
index 0000000..c42efb0
--- /dev/null
+++ b/internal/config/events.go
@@ -0,0 +1,33 @@
+package config
+
+// ConfigEvent 配置变更事件
+type ConfigEvent struct {
+ ConfigKey string `json:"config_key"` // 配置键
+ OldValue interface{} `json:"old_value"` // 旧值
+ NewValue interface{} `json:"new_value"` // 新值
+ ChangeType string `json:"change_type"` // 变更类型:create, update, delete
+ ChangedBy uint `json:"changed_by"` // 修改人ID
+ ChangedAt int64 `json:"changed_at"` // 修改时间戳
+}
+
+// ConfigEventHandler 配置事件处理器接口
+type ConfigEventHandler interface {
+ Handle(event ConfigEvent) error
+ GetConfigKeys() []string // 返回该处理器关心的配置键列表
+}
+
+// ConfigChange 配置变更记录(用于审计)
+type ConfigChange struct {
+ ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
+ ConfigKey string `gorm:"type:varchar(100);not null;comment:配置键" json:"config_key"`
+ OldValue string `gorm:"type:text;comment:旧值" json:"old_value"`
+ NewValue string `gorm:"type:text;comment:新值" json:"new_value"`
+ ChangeType string `gorm:"type:varchar(20);not null;comment:变更类型" json:"change_type"`
+ ChangedBy uint `gorm:"type:int;not null;comment:修改人ID" json:"changed_by"`
+ ChangedAt int64 `gorm:"type:bigint;not null;comment:修改时间戳" json:"changed_at"`
+ Extra map[string]interface{} `gorm:"type:json;comment:额外信息" json:"extra"`
+}
+
+func (ConfigChange) TableName() string {
+ return "config_changes"
+}
\ No newline at end of file
diff --git a/internal/events/config_events.go b/internal/events/config_events.go
new file mode 100644
index 0000000..4dc4e51
--- /dev/null
+++ b/internal/events/config_events.go
@@ -0,0 +1,81 @@
+package events
+
+import (
+ "awesomeProject/internal/config"
+ "log"
+ "sync"
+)
+
+// ConfigEventManager 配置事件管理器
+type ConfigEventManager struct {
+ handlers map[string][]config.ConfigEventHandler // key: config_key, value: handlers
+ mutex sync.RWMutex
+}
+
+var (
+ configEventManager *ConfigEventManager
+ once sync.Once
+)
+
+// GetConfigEventManager 获取配置事件管理器单例
+func GetConfigEventManager() *ConfigEventManager {
+ once.Do(func() {
+ configEventManager = &ConfigEventManager{
+ handlers: make(map[string][]config.ConfigEventHandler),
+ }
+ })
+ return configEventManager
+}
+
+// RegisterHandler 注册配置事件处理器
+func (cem *ConfigEventManager) RegisterHandler(handler config.ConfigEventHandler) {
+ cem.mutex.Lock()
+ defer cem.mutex.Unlock()
+
+ configKeys := handler.GetConfigKeys()
+ for _, key := range configKeys {
+ if cem.handlers[key] == nil {
+ cem.handlers[key] = []config.ConfigEventHandler{}
+ }
+ cem.handlers[key] = append(cem.handlers[key], handler)
+ }
+
+ log.Printf("注册配置事件处理器,监听配置: %v", configKeys)
+}
+
+// TriggerEvent 触发配置变更事件
+func (cem *ConfigEventManager) TriggerEvent(event config.ConfigEvent) {
+ cem.mutex.RLock()
+ handlers := cem.handlers[event.ConfigKey]
+ cem.mutex.RUnlock()
+
+ if len(handlers) == 0 {
+ log.Printf("配置 %s 无对应的事件处理器", event.ConfigKey)
+ return
+ }
+
+ log.Printf("触发配置变更事件: %s, 旧值: %v, 新值: %v", event.ConfigKey, event.OldValue, event.NewValue)
+
+ // 并发处理事件,避免阻塞
+ for _, handler := range handlers {
+ go func(h config.ConfigEventHandler) {
+ if err := h.Handle(event); err != nil {
+ log.Printf("处理配置事件失败: %s, 错误: %v", event.ConfigKey, err)
+ }
+ }(handler)
+ }
+}
+
+// ListRegisteredHandlers 列出已注册的处理器(用于调试)
+func (cem *ConfigEventManager) ListRegisteredHandlers() map[string]int {
+ cem.mutex.RLock()
+ defer cem.mutex.RUnlock()
+
+ result := make(map[string]int)
+ for key, handlers := range cem.handlers {
+ result[key] = len(handlers)
+ }
+ return result
+}
+
+
diff --git a/internal/events/handlers/price_handler.go b/internal/events/handlers/price_handler.go
new file mode 100644
index 0000000..de54290
--- /dev/null
+++ b/internal/events/handlers/price_handler.go
@@ -0,0 +1,168 @@
+package handlers
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/config"
+ "awesomeProject/internal/models"
+ "fmt"
+ "gorm.io/gorm"
+ "log"
+ "strconv"
+)
+
+// PriceConfigHandler 价格配置变更处理器
+type PriceConfigHandler struct{}
+
+// GetConfigKeys 返回该处理器关心的配置键
+func (h *PriceConfigHandler) GetConfigKeys() []string {
+ return []string{
+ config.ConfigPriceIncreaseRate,
+ config.ConfigMinSalePrice,
+ }
+}
+
+// Handle 处理配置变更事件
+func (h *PriceConfigHandler) Handle(event config.ConfigEvent) error {
+ switch event.ConfigKey {
+ case config.ConfigPriceIncreaseRate:
+ return h.handlePriceIncreaseRateChange(event)
+ case config.ConfigMinSalePrice:
+ return h.handleMinSalePriceChange(event)
+ default:
+ return fmt.Errorf("未知的配置键: %s", event.ConfigKey)
+ }
+}
+
+// handlePriceIncreaseRateChange 处理价格增长率变更
+func (h *PriceConfigHandler) handlePriceIncreaseRateChange(event config.ConfigEvent) error {
+ log.Printf("价格增长率配置变更: %v -> %v", event.OldValue, event.NewValue)
+
+ // 解析新的增长率
+ newRateStr, ok := event.NewValue.(string)
+ if !ok {
+ return fmt.Errorf("价格增长率配置值类型错误")
+ }
+
+ newRate, err := strconv.ParseFloat(newRateStr, 64)
+ if err != nil {
+ return fmt.Errorf("价格增长率配置值格式错误: %v", err)
+ }
+
+ db := common.GetDB()
+
+ var secondList []models.SecondaryProduct
+ result := db.Where("status = ? AND quantity > ?", 1, 0).Find(&secondList) // 修正:传递切片指针而不是值
+ if result.Error != nil {
+ log.Printf("查询失败: %v", result.Error)
+ return result.Error
+ }
+
+ // 如果没有找到符合条件的记录,直接返回
+ if len(secondList) == 0 {
+ log.Printf("没有找到需要更新的二级商品")
+ return nil
+ }
+ tx := db.Begin()
+
+ for _, product := range secondList {
+ // 检查商品是否有关联的仓库记录
+ if product.UserWarehouseID == 0 {
+ log.Printf("二级商品 ID: %d 没有关联的仓库记录,跳过", product.ID)
+ continue
+ }
+
+ var warehouse models.UserWarehouse
+ if err := tx.Where("id = ?", product.UserWarehouseID).First(&warehouse).Error; err != nil {
+ tx.Rollback()
+ log.Printf("查询仓库记录失败,ID: %d, 错误: %v", product.UserWarehouseID, err)
+ return err
+ }
+
+ newWarehousePrice := warehouse.PurchasePrice + newRate
+ if err := tx.Model(&models.UserWarehouse{}).Where("id = ?", product.UserWarehouseID).
+ Update("quantity", product.Quantity+warehouse.Quantity).Error; err != nil {
+ tx.Rollback()
+ log.Printf("更新仓库价格失败,ID: %d, 错误: %v", product.UserWarehouseID, err)
+ return err
+ }
+
+ log.Printf("已更新仓库商品 ID: %d 的价格,新价格: %.2f", product.UserWarehouseID, newWarehousePrice)
+
+ tx.Model(&models.SecondaryProduct{}).Where("id = ?", product.ID).Update("status", 0)
+ }
+
+ tx.Model(&models.UserWarehouse{}).Where("quantity>?", 0).Update("status", 1).
+ Update("warehouse_price", gorm.Expr("purchase_price + ?", newRate))
+ tx.Commit()
+ if err := tx.Commit().Error; err != nil {
+ return err
+ }
+
+ log.Printf("价格增长率已更新为: %.2f%%", newRate)
+ return nil
+}
+
+// handleMinSalePriceChange 处理最低销售价格变更
+func (h *PriceConfigHandler) handleMinSalePriceChange(event config.ConfigEvent) error {
+ log.Printf("最低销售价格配置变更: %v -> %v", event.OldValue, event.NewValue)
+
+ // 解析新的最低价格
+ newPriceStr, ok := event.NewValue.(string)
+ if !ok {
+ return fmt.Errorf("最低销售价格配置值类型错误")
+ }
+
+ newPrice, err := strconv.ParseFloat(newPriceStr, 64)
+ if err != nil {
+ return fmt.Errorf("最低销售价格配置值格式错误: %v", err)
+ }
+
+ // 验证价格范围
+ if newPrice < 0 {
+ return fmt.Errorf("最低销售价格不能为负数")
+ }
+
+ // 业务逻辑:检查并更新现有的低于最低价格的商品
+ if err := h.updateLowPriceProducts(newPrice); err != nil {
+ log.Printf("更新低价商品失败: %v", err)
+ // 不返回错误,避免阻塞其他处理器
+ }
+
+ log.Printf("最低销售价格已更新为: %.2f", newPrice)
+ return nil
+}
+
+// updateLowPriceProducts 更新低于最低价格的商品
+func (h *PriceConfigHandler) updateLowPriceProducts(minPrice float64) error {
+ db := common.GetDB()
+
+ // 查找低于最低价格的二级商品
+ var lowPriceProducts []models.SecondaryProduct
+ err := db.Where("sale_price < ? AND status = 1", minPrice).Find(&lowPriceProducts).Error
+ if err != nil {
+ return fmt.Errorf("查询低价商品失败: %v", err)
+ }
+
+ if len(lowPriceProducts) == 0 {
+ log.Printf("没有发现低于最低价格(%.2f)的商品", minPrice)
+ return nil
+ }
+
+ // 批量更新这些商品的状态为下架
+ result := db.Model(&models.SecondaryProduct{}).
+ Where("sale_price < ? AND status = 1", minPrice).
+ Update("status", 0)
+
+ if result.Error != nil {
+ return fmt.Errorf("批量下架低价商品失败: %v", result.Error)
+ }
+
+ log.Printf("已下架 %d 个低于最低价格的商品", result.RowsAffected)
+
+ // 这里可以添加更多逻辑,比如:
+ // 1. 发送通知给商品卖家
+ // 2. 记录下架日志
+ // 3. 更新相关统计数据
+
+ return nil
+}
diff --git a/internal/events/handlers/system_handler.go b/internal/events/handlers/system_handler.go
new file mode 100644
index 0000000..242dda4
--- /dev/null
+++ b/internal/events/handlers/system_handler.go
@@ -0,0 +1,144 @@
+package handlers
+
+import (
+ "awesomeProject/internal/config"
+ "fmt"
+ "log"
+ "strconv"
+)
+
+// SystemConfigHandler 系统配置变更处理器
+type SystemConfigHandler struct{}
+
+// GetConfigKeys 返回该处理器关心的配置键
+func (h *SystemConfigHandler) GetConfigKeys() []string {
+ return []string{
+ config.ConfigEnableRegistration,
+ config.ConfigMaintenanceMode,
+ config.ConfigSiteName,
+ config.ConfigSiteUrl,
+ }
+}
+
+// Handle 处理配置变更事件
+func (h *SystemConfigHandler) Handle(event config.ConfigEvent) error {
+ switch event.ConfigKey {
+ case config.ConfigEnableRegistration:
+ return h.handleRegistrationToggle(event)
+ case config.ConfigMaintenanceMode:
+ return h.handleMaintenanceModeToggle(event)
+ case config.ConfigSiteName:
+ return h.handleSiteNameChange(event)
+ case config.ConfigSiteUrl:
+ return h.handleSiteUrlChange(event)
+ default:
+ return fmt.Errorf("未知的配置键: %s", event.ConfigKey)
+ }
+}
+
+// handleRegistrationToggle 处理注册开关变更
+func (h *SystemConfigHandler) handleRegistrationToggle(event config.ConfigEvent) error {
+ newValueStr, ok := event.NewValue.(string)
+ if !ok {
+ return fmt.Errorf("注册开关配置值类型错误")
+ }
+
+ enabled, err := strconv.ParseBool(newValueStr)
+ if err != nil {
+ return fmt.Errorf("注册开关配置值格式错误: %v", err)
+ }
+
+ if enabled {
+ log.Printf("用户注册已开启")
+ // 这里可以添加逻辑,比如:
+ // 1. 清理注册限制缓存
+ // 2. 发送系统通知
+ // 3. 更新前端配置缓存
+ } else {
+ log.Printf("用户注册已关闭")
+ // 这里可以添加逻辑,比如:
+ // 1. 设置注册限制
+ // 2. 通知管理员
+ }
+
+ return nil
+}
+
+// handleMaintenanceModeToggle 处理维护模式开关
+func (h *SystemConfigHandler) handleMaintenanceModeToggle(event config.ConfigEvent) error {
+ newValueStr, ok := event.NewValue.(string)
+ if !ok {
+ return fmt.Errorf("维护模式配置值类型错误")
+ }
+
+ enabled, err := strconv.ParseBool(newValueStr)
+ if err != nil {
+ return fmt.Errorf("维护模式配置值格式错误: %v", err)
+ }
+
+ if enabled {
+ log.Printf("系统进入维护模式")
+ // 这里可以添加逻辑,比如:
+ // 1. 断开非管理员用户连接
+ // 2. 停止定时任务
+ // 3. 发送维护通知
+ // 4. 设置维护页面
+ } else {
+ log.Printf("系统退出维护模式")
+ // 这里可以添加逻辑,比如:
+ // 1. 恢复正常服务
+ // 2. 重启定时任务
+ // 3. 发送恢复通知
+ }
+
+ return nil
+}
+
+// handleSiteNameChange 处理网站名称变更
+func (h *SystemConfigHandler) handleSiteNameChange(event config.ConfigEvent) error {
+ newName, ok := event.NewValue.(string)
+ if !ok {
+ return fmt.Errorf("网站名称配置值类型错误")
+ }
+
+ if len(newName) == 0 {
+ return fmt.Errorf("网站名称不能为空")
+ }
+
+ log.Printf("网站名称已更新: %s -> %s", event.OldValue, newName)
+
+ // 这里可以添加逻辑,比如:
+ // 1. 更新邮件模板中的网站名称
+ // 2. 刷新前端缓存
+ // 3. 更新SEO相关配置
+ // 4. 发送更新通知
+
+ return nil
+}
+
+// handleSiteUrlChange 处理网站地址变更
+func (h *SystemConfigHandler) handleSiteUrlChange(event config.ConfigEvent) error {
+ newUrl, ok := event.NewValue.(string)
+ if !ok {
+ return fmt.Errorf("网站地址配置值类型错误")
+ }
+
+ if len(newUrl) == 0 {
+ return fmt.Errorf("网站地址不能为空")
+ }
+
+ // 简单的URL格式验证
+ if len(newUrl) < 7 || (newUrl[:7] != "http://" && newUrl[:8] != "https://") {
+ return fmt.Errorf("网站地址格式不正确,必须以http://或https://开头")
+ }
+
+ log.Printf("网站地址已更新: %s -> %s", event.OldValue, newUrl)
+
+ // 这里可以添加逻辑,比如:
+ // 1. 更新CORS配置
+ // 2. 更新回调URL
+ // 3. 刷新API文档
+ // 4. 更新第三方服务配置
+
+ return nil
+}
\ No newline at end of file
diff --git a/internal/events/handlers/user_handler.go b/internal/events/handlers/user_handler.go
new file mode 100644
index 0000000..06e9e6d
--- /dev/null
+++ b/internal/events/handlers/user_handler.go
@@ -0,0 +1,182 @@
+package handlers
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/config"
+ "awesomeProject/internal/models"
+ "fmt"
+ "log"
+ "strconv"
+)
+
+// UserConfigHandler 用户配置变更处理器
+type UserConfigHandler struct{}
+
+// GetConfigKeys 返回该处理器关心的配置键
+func (h *UserConfigHandler) GetConfigKeys() []string {
+ return []string{
+ config.ConfigDefaultUserScore,
+ config.ConfigReferralBonus,
+ config.ConfigMaxUserLevel,
+ config.ConfigEnableRegistration,
+ }
+}
+
+// Handle 处理配置变更事件
+func (h *UserConfigHandler) Handle(event config.ConfigEvent) error {
+ switch event.ConfigKey {
+ case config.ConfigDefaultUserScore:
+ return h.handleDefaultUserScoreChange(event)
+ case config.ConfigReferralBonus:
+ return h.handleReferralBonusChange(event)
+ case config.ConfigMaxUserLevel:
+ return h.handleMaxUserLevelChange(event)
+ case config.ConfigEnableRegistration:
+ return h.handleRegistrationToggle(event)
+ default:
+ return fmt.Errorf("未知的配置键: %s", event.ConfigKey)
+ }
+}
+
+// handleDefaultUserScoreChange 处理默认用户积分变更
+func (h *UserConfigHandler) handleDefaultUserScoreChange(event config.ConfigEvent) error {
+ newScoreStr, ok := event.NewValue.(string)
+ if !ok {
+ return fmt.Errorf("默认用户积分配置值类型错误")
+ }
+
+ newScore, err := strconv.ParseFloat(newScoreStr, 64)
+ if err != nil {
+ return fmt.Errorf("默认用户积分配置值格式错误: %v", err)
+ }
+
+ if newScore < 0 {
+ return fmt.Errorf("默认用户积分不能为负数")
+ }
+
+ log.Printf("默认用户积分已更新: %v -> %.2f", event.OldValue, newScore)
+
+ // 这里可以添加业务逻辑,比如:
+ // 1. 更新新注册用户的积分计算逻辑
+ // 2. 发送通知给管理员
+ // 3. 更新缓存中的默认积分值
+
+ return nil
+}
+
+// handleReferralBonusChange 处理推荐奖励变更
+func (h *UserConfigHandler) handleReferralBonusChange(event config.ConfigEvent) error {
+ newBonusStr, ok := event.NewValue.(string)
+ if !ok {
+ return fmt.Errorf("推荐奖励配置值类型错误")
+ }
+
+ newBonus, err := strconv.ParseFloat(newBonusStr, 64)
+ if err != nil {
+ return fmt.Errorf("推荐奖励配置值格式错误: %v", err)
+ }
+
+ if newBonus < 0 {
+ return fmt.Errorf("推荐奖励不能为负数")
+ }
+
+ log.Printf("推荐奖励已更新: %v -> %.2f", event.OldValue, newBonus)
+
+ // 这里可以添加业务逻辑,比如:
+ // 1. 重新计算推荐奖励策略
+ // 2. 发送通知给有推荐关系的用户
+ // 3. 更新推荐系统的计算规则
+
+ return nil
+}
+
+// handleMaxUserLevelChange 处理最大用户等级变更
+func (h *UserConfigHandler) handleMaxUserLevelChange(event config.ConfigEvent) error {
+ newLevelStr, ok := event.NewValue.(string)
+ if !ok {
+ return fmt.Errorf("最大用户等级配置值类型错误")
+ }
+
+ newLevel, err := strconv.Atoi(newLevelStr)
+ if err != nil {
+ return fmt.Errorf("最大用户等级配置值格式错误: %v", err)
+ }
+
+ if newLevel < 1 {
+ return fmt.Errorf("最大用户等级不能小于1")
+ }
+
+ log.Printf("最大用户等级已更新: %v -> %d", event.OldValue, newLevel)
+
+ // 检查是否有用户等级超过新的最大等级
+ if err := h.checkAndAdjustUserLevels(newLevel); err != nil {
+ log.Printf("调整用户等级失败: %v", err)
+ // 不返回错误,避免阻塞其他处理器
+ }
+
+ return nil
+}
+
+// handleRegistrationToggle 处理注册开关变更
+func (h *UserConfigHandler) handleRegistrationToggle(event config.ConfigEvent) error {
+ newValueStr, ok := event.NewValue.(string)
+ if !ok {
+ return fmt.Errorf("注册开关配置值类型错误")
+ }
+
+ enabled, err := strconv.ParseBool(newValueStr)
+ if err != nil {
+ return fmt.Errorf("注册开关配置值格式错误: %v", err)
+ }
+
+ if enabled {
+ log.Printf("用户注册已开启")
+ // 这里可以添加逻辑,比如:
+ // 1. 清理注册限制缓存
+ // 2. 发送开放注册通知
+ // 3. 更新前端注册页面状态
+ } else {
+ log.Printf("用户注册已关闭")
+ // 这里可以添加逻辑,比如:
+ // 1. 设置注册限制
+ // 2. 显示注册关闭页面
+ // 3. 通知相关管理员
+ }
+
+ return nil
+}
+
+// checkAndAdjustUserLevels 检查并调整超过最大等级的用户
+func (h *UserConfigHandler) checkAndAdjustUserLevels(maxLevel int) error {
+ db := common.GetDB()
+
+ // 查找等级超过最大等级的用户
+ var highLevelUsers []models.User
+ err := db.Where("user_level > ?", maxLevel).Find(&highLevelUsers).Error
+ if err != nil {
+ return fmt.Errorf("查询高等级用户失败: %v", err)
+ }
+
+ if len(highLevelUsers) == 0 {
+ log.Printf("没有发现超过最大等级(%d)的用户", maxLevel)
+ return nil
+ }
+
+ // 批量调整这些用户的等级
+ result := db.Model(&models.User{}).
+ Where("user_level > ?", maxLevel).
+ Update("user_level", maxLevel)
+
+ if result.Error != nil {
+ return fmt.Errorf("批量调整用户等级失败: %v", result.Error)
+ }
+
+ log.Printf("已调整 %d 个用户的等级到最大等级: %d", result.RowsAffected, maxLevel)
+
+ // 这里可以添加更多逻辑,比如:
+ // 1. 发送等级调整通知给用户
+ // 2. 记录等级变更日志
+ // 3. 重新计算相关权益
+
+ return nil
+}
\ No newline at end of file
diff --git a/internal/events/init.go b/internal/events/init.go
new file mode 100644
index 0000000..9b38a71
--- /dev/null
+++ b/internal/events/init.go
@@ -0,0 +1,32 @@
+package events
+
+import (
+ "awesomeProject/internal/events/handlers"
+ "log"
+)
+
+// InitEventSystem 初始化事件系统
+func InitEventSystem() {
+ log.Println("初始化配置事件系统...")
+
+ eventManager := GetConfigEventManager()
+
+ // 注册价格配置处理器
+ priceHandler := &handlers.PriceConfigHandler{}
+ eventManager.RegisterHandler(priceHandler)
+
+ // 注册系统配置处理器
+ systemHandler := &handlers.SystemConfigHandler{}
+ eventManager.RegisterHandler(systemHandler)
+
+ // 注册用户配置处理器
+ userHandler := &handlers.UserConfigHandler{}
+ eventManager.RegisterHandler(userHandler)
+
+ // 可以继续注册更多处理器...
+ // 例如:
+ // orderHandler := &handlers.OrderConfigHandler{}
+ // eventManager.RegisterHandler(orderHandler)
+
+ log.Printf("配置事件系统初始化完成,已注册处理器数量: %v", eventManager.ListRegisteredHandlers())
+}
\ No newline at end of file
diff --git a/internal/handlers/admin_banner_handler.go b/internal/handlers/admin_banner_handler.go
new file mode 100644
index 0000000..4052c00
--- /dev/null
+++ b/internal/handlers/admin_banner_handler.go
@@ -0,0 +1,229 @@
+package handlers
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/models"
+ "net/http"
+ "strconv"
+
+ "github.com/gin-gonic/gin"
+)
+
+// AdminBannerHandler 管理端轮播图处理器
+type AdminBannerHandler struct{}
+
+// CreateBannerRequest 创建轮播图请求结构体
+type CreateBannerRequest struct {
+ Title string `json:"title" binding:"required"`
+ ImageUrl string `json:"image_url" binding:"required"`
+ LinkUrl string `json:"link_url"`
+ Description string `json:"description"`
+ SortOrder int `json:"sort_order"`
+ Status uint8 `json:"status"`
+}
+
+// UpdateBannerRequest 更新轮播图请求结构体
+type UpdateBannerRequest struct {
+ Title string `json:"title"`
+ ImageUrl string `json:"image_url"`
+ LinkUrl string `json:"link_url"`
+ Description string `json:"description"`
+ SortOrder int `json:"sort_order"`
+ Status uint8 `json:"status"`
+}
+
+// GetBanners 获取轮播图列表
+func (h *AdminBannerHandler) GetBanners(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以查看轮播图管理
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ // 分页参数
+ page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
+ pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10"))
+ if page < 1 {
+ page = 1
+ }
+ if pageSize < 1 || pageSize > 100 {
+ pageSize = 10
+ }
+
+ db := common.GetDB()
+ var banners []models.Banner
+ var total int64
+
+ // 获取总数
+ db.Model(&models.Banner{}).Count(&total)
+
+ // 分页查询
+ offset := (page - 1) * pageSize
+ err := db.Offset(offset).Limit(pageSize).Order("sort_order ASC, created_at DESC").Find(&banners).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询轮播图失败"))
+ return
+ }
+
+ // 构建返回数据
+ result := map[string]interface{}{
+ "list": banners,
+ "total": total,
+ "page": page,
+ "page_size": pageSize,
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// GetBanner 获取单个轮播图
+func (h *AdminBannerHandler) GetBanner(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以查看轮播图详情
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ bannerID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "轮播图ID无效"))
+ return
+ }
+
+ var banner models.Banner
+ if err := common.GetDB().First(&banner, uint(bannerID)).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "轮播图不存在"))
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(banner))
+}
+
+// CreateBanner 创建轮播图
+func (h *AdminBannerHandler) CreateBanner(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以创建轮播图
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ var req CreateBannerRequest
+ if err := c.ShouldBindJSON(&req); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "参数错误: "+err.Error()))
+ return
+ }
+
+ // 创建轮播图对象
+ newBanner := models.Banner{
+ Title: req.Title,
+ ImageUrl: req.ImageUrl,
+ LinkUrl: req.LinkUrl,
+ Description: req.Description,
+ SortOrder: req.SortOrder,
+ Status: req.Status,
+ }
+
+ // 保存轮播图
+ if err := common.GetDB().Create(&newBanner).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "创建轮播图失败"))
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(newBanner))
+}
+
+// UpdateBanner 更新轮播图
+func (h *AdminBannerHandler) UpdateBanner(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以更新轮播图
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ bannerID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "轮播图ID无效"))
+ return
+ }
+
+ var req UpdateBannerRequest
+ if err := c.ShouldBindJSON(&req); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "参数错误: "+err.Error()))
+ return
+ }
+
+ // 检查轮播图是否存在
+ var existBanner models.Banner
+ if err := common.GetDB().First(&existBanner, uint(bannerID)).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "轮播图不存在"))
+ return
+ }
+
+ // 准备更新数据
+ updateData := models.Banner{
+ Title: req.Title,
+ ImageUrl: req.ImageUrl,
+ LinkUrl: req.LinkUrl,
+ Description: req.Description,
+ SortOrder: req.SortOrder,
+ Status: req.Status,
+ }
+
+ // 更新轮播图信息
+ updateData.ID = uint(bannerID)
+ if err := common.GetDB().Model(&existBanner).Updates(&updateData).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "更新轮播图失败"))
+ return
+ }
+
+ // 返回更新后的轮播图信息
+ var updatedBanner models.Banner
+ common.GetDB().First(&updatedBanner, uint(bannerID))
+
+ c.JSON(http.StatusOK, common.Success(updatedBanner))
+}
+
+// DeleteBanner 删除轮播图
+func (h *AdminBannerHandler) DeleteBanner(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以删除轮播图
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ bannerID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "轮播图ID无效"))
+ return
+ }
+
+ // 检查轮播图是否存在
+ var banner models.Banner
+ if err := common.GetDB().First(&banner, uint(bannerID)).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "轮播图不存在"))
+ return
+ }
+
+ // 删除轮播图
+ if err := common.GetDB().Delete(&banner).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "删除轮播图失败"))
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success("轮播图删除成功"))
+}
\ No newline at end of file
diff --git a/internal/handlers/admin_config_handler.go b/internal/handlers/admin_config_handler.go
new file mode 100644
index 0000000..0c6086b
--- /dev/null
+++ b/internal/handlers/admin_config_handler.go
@@ -0,0 +1,390 @@
+package handlers
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/config"
+ "awesomeProject/internal/events"
+ "awesomeProject/internal/models"
+ "net/http"
+ "strconv"
+ "time"
+
+ "github.com/gin-gonic/gin"
+ "gorm.io/gorm"
+)
+
+// AdminConfigHandler 管理端系统配置处理器
+type AdminConfigHandler struct{}
+
+// GetSystemConfigs 获取系统配置列表
+func (h *AdminConfigHandler) GetSystemConfigs(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以查看系统配置
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ // 分页参数
+ page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
+ pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10"))
+ if page < 1 {
+ page = 1
+ }
+ if pageSize < 1 || pageSize > 100 {
+ pageSize = 10
+ }
+
+ // 搜索参数
+ configKey := c.Query("config_key")
+ configType := c.Query("config_type")
+ isSystem := c.Query("is_system")
+
+ db := common.GetDB()
+ var configs []models.SystemConfig
+ var total int64
+
+ // 构建查询条件
+ query := db.Model(&models.SystemConfig{})
+
+ // 添加搜索条件
+ if configKey != "" {
+ query = query.Where("config_key LIKE ?", "%"+configKey+"%")
+ }
+ if configType != "" {
+ query = query.Where("config_type = ?", configType)
+ }
+ if isSystem != "" {
+ query = query.Where("is_system = ?", isSystem)
+ }
+
+ // 获取总数
+ query.Count(&total)
+
+ // 分页查询
+ offset := (page - 1) * pageSize
+ err := query.Offset(offset).Limit(pageSize).Order("is_system DESC, created_at DESC").Find(&configs).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询系统配置失败"))
+ return
+ }
+
+ // 构建返回数据
+ result := map[string]interface{}{
+ "list": configs,
+ "total": total,
+ "page": page,
+ "page_size": pageSize,
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// GetSystemConfig 获取单个系统配置
+func (h *AdminConfigHandler) GetSystemConfig(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以查看系统配置
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ configID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "配置ID无效"))
+ return
+ }
+
+ var config models.SystemConfig
+ err = common.GetDB().First(&config, uint(configID)).Error
+ if err != nil {
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(404, "系统配置不存在"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "查询系统配置失败"))
+ }
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(config))
+}
+
+// CreateSystemConfig 创建系统配置
+func (h *AdminConfigHandler) CreateSystemConfig(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以创建系统配置
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ var newConfig models.SystemConfig
+ if err := c.ShouldBindJSON(&newConfig); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "参数错误: "+err.Error()))
+ return
+ }
+
+ // 检查配置键是否已存在
+ var existConfig models.SystemConfig
+ if err := common.GetDB().Where("config_key = ?", newConfig.ConfigKey).First(&existConfig).Error; err == nil {
+ c.JSON(http.StatusOK, common.Error(400, "配置键已存在"))
+ return
+ }
+
+ // 保存配置
+ if err := common.GetDB().Create(&newConfig).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "创建系统配置失败"))
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(newConfig))
+}
+
+// UpdateSystemConfig 更新系统配置
+func (h *AdminConfigHandler) UpdateSystemConfig(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以更新系统配置
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ configID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "配置ID无效"))
+ return
+ }
+
+ var updateData models.SystemConfig
+ if err := c.ShouldBindJSON(&updateData); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "参数错误: "+err.Error()))
+ return
+ }
+
+ // 检查配置是否存在
+ var existConfig models.SystemConfig
+ if err := common.GetDB().First(&existConfig, uint(configID)).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "系统配置不存在"))
+ return
+ }
+
+ // 如果是系统配置,不允许修改配置键
+ if existConfig.IsSystem == 1 && updateData.ConfigKey != existConfig.ConfigKey {
+ c.JSON(http.StatusOK, common.Error(400, "系统配置不允许修改配置键"))
+ return
+ }
+
+ // 如果修改了配置键,检查是否已存在
+ if updateData.ConfigKey != existConfig.ConfigKey {
+ var duplicateConfig models.SystemConfig
+ if err := common.GetDB().Where("config_key = ? AND id != ?", updateData.ConfigKey, configID).First(&duplicateConfig).Error; err == nil {
+ c.JSON(http.StatusOK, common.Error(400, "配置键已存在"))
+ return
+ }
+ }
+
+ // 记录旧值,用于事件触发
+ oldValue := existConfig.ConfigValue
+
+ // 更新配置信息
+ updateData.ID = uint(configID)
+ if err := common.GetDB().Model(&existConfig).Updates(&updateData).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "更新系统配置失败"))
+ return
+ }
+
+ // 返回更新后的配置信息
+ var updatedConfig models.SystemConfig
+ common.GetDB().First(&updatedConfig, uint(configID))
+
+ // 如果配置值发生变化,触发配置变更事件
+ if oldValue != updatedConfig.ConfigValue {
+ configEvent := config.ConfigEvent{
+ ConfigKey: updatedConfig.ConfigKey,
+ OldValue: oldValue,
+ NewValue: updatedConfig.ConfigValue,
+ ChangeType: "update",
+ ChangedBy: user.ID,
+ ChangedAt: time.Now().Unix(),
+ }
+
+ // 异步触发事件,避免阻塞响应
+ go func() {
+ events.GetConfigEventManager().TriggerEvent(configEvent)
+ }()
+
+ // 记录配置变更日志(可选)
+ go h.logConfigChange(configEvent)
+ }
+
+ c.JSON(http.StatusOK, common.Success(updatedConfig))
+}
+
+// DeleteSystemConfig 删除系统配置
+func (h *AdminConfigHandler) DeleteSystemConfig(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以删除系统配置
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ configID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "配置ID无效"))
+ return
+ }
+
+ // 检查配置是否存在
+ var existConfig models.SystemConfig
+ if err := common.GetDB().First(&existConfig, uint(configID)).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "系统配置不存在"))
+ return
+ }
+
+ // 系统配置不允许删除
+ if existConfig.IsSystem == 1 {
+ c.JSON(http.StatusOK, common.Error(400, "系统配置不允许删除"))
+ return
+ }
+
+ // 删除配置
+ if err := common.GetDB().Delete(&existConfig).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "删除系统配置失败"))
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(nil))
+}
+
+// GetConfigByKey 根据配置键获取配置值(公共方法)
+func (h *AdminConfigHandler) GetConfigByKey(c *gin.Context) {
+ configKey := c.Param("key")
+ if configKey == "" {
+ c.JSON(http.StatusOK, common.Error(400, "配置键不能为空"))
+ return
+ }
+
+ var config models.SystemConfig
+ err := common.GetDB().Where("config_key = ?", configKey).First(&config).Error
+ if err != nil {
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(404, "配置不存在"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "查询配置失败"))
+ }
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(config))
+}
+
+// InitSystemConfigs 初始化系统配置
+func (h *AdminConfigHandler) InitSystemConfigs() error {
+ db := common.GetDB()
+
+ // 检查是否已有系统配置
+ var count int64
+ db.Model(&models.SystemConfig{}).Where("is_system = 1").Count(&count)
+ if count > 0 {
+ return nil // 已有系统配置,不重复创建
+ }
+
+ // 创建默认系统配置
+ defaultConfigs := []models.SystemConfig{
+ {
+ ConfigKey: "warehouse_price_rate",
+ ConfigValue: "1.10",
+ ConfigName: "入库价格增值率",
+ ConfigDescription: "商品进入用户仓库时的价格增值比例",
+ ConfigType: "number",
+ IsSystem: 1,
+ },
+ {
+ ConfigKey: "shipping_fee_rate",
+ ConfigValue: "0.05",
+ ConfigName: "运费比例",
+ ConfigDescription: "基于商品价格计算的运费比例",
+ ConfigType: "number",
+ IsSystem: 1,
+ },
+ {
+ ConfigKey: "platform_commission_rate",
+ ConfigValue: "0.03",
+ ConfigName: "平台佣金比例",
+ ConfigDescription: "平台从交易中收取的佣金比例",
+ ConfigType: "number",
+ IsSystem: 1,
+ },
+ {
+ ConfigKey: "min_withdraw_amount",
+ ConfigValue: "100.00",
+ ConfigName: "最小提现金额",
+ ConfigDescription: "用户最小提现金额限制",
+ ConfigType: "number",
+ IsSystem: 1,
+ },
+ {
+ ConfigKey: "max_product_images",
+ ConfigValue: "9",
+ ConfigName: "商品最大图片数量",
+ ConfigDescription: "单个商品最多可上传的图片数量",
+ ConfigType: "number",
+ IsSystem: 1,
+ },
+ }
+
+ for _, config := range defaultConfigs {
+ if err := db.Create(&config).Error; err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
+// logConfigChange 记录配置变更日志
+func (h *AdminConfigHandler) logConfigChange(event config.ConfigEvent) {
+ db := common.GetDB()
+
+ // 创建配置变更记录
+ configChange := config.ConfigChange{
+ ConfigKey: event.ConfigKey,
+ OldValue: convertToString(event.OldValue),
+ NewValue: convertToString(event.NewValue),
+ ChangeType: event.ChangeType,
+ ChangedBy: event.ChangedBy,
+ ChangedAt: event.ChangedAt,
+ Extra: map[string]interface{}{
+ "ip": "", // 可以从context中获取
+ "user_agent": "", // 可以从context中获取
+ },
+ }
+
+ // 保存到数据库
+ if err := db.Create(&configChange).Error; err != nil {
+ // 记录日志失败不应该影响主流程,只记录错误日志
+ // common.Logger.Printf("记录配置变更日志失败: %v", err)
+ }
+}
+
+// convertToString 将interface{}转换为字符串
+func convertToString(value interface{}) string {
+ if value == nil {
+ return ""
+ }
+ if str, ok := value.(string); ok {
+ return str
+ }
+ return ""
+}
diff --git a/internal/handlers/admin_order_handler.go b/internal/handlers/admin_order_handler.go
new file mode 100644
index 0000000..e7d9fbf
--- /dev/null
+++ b/internal/handlers/admin_order_handler.go
@@ -0,0 +1,631 @@
+package handlers
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/models"
+ "fmt"
+ "strconv"
+ "time"
+
+ "github.com/gin-gonic/gin"
+ "gorm.io/gorm"
+ "net/http"
+)
+
+// AdminOrderHandler 管理端订单处理器
+type AdminOrderHandler struct{}
+
+// GetPurchaseOrders 获取买单列表
+func (h *AdminOrderHandler) GetPurchaseOrders(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 分页参数
+ page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
+ pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10"))
+ if page < 1 {
+ page = 1
+ }
+ if pageSize < 1 || pageSize > 100 {
+ pageSize = 10
+ }
+
+ // 搜索参数
+ orderNo := c.Query("order_no")
+ orderStatus := c.Query("order_status")
+ productType := c.Query("product_type")
+ sellerName := c.Query("seller_name")
+ buyerName := c.Query("buyer_name")
+
+ db := common.GetDB()
+ var orders []models.PurchaseOrder
+ var total int64
+
+ // 构建查询条件
+ query := db.Model(&models.PurchaseOrder{}).Preload("Buyer").Preload("Seller").Preload("Address")
+
+ // 如果是代理商,只能查看自己邀请的用户的订单
+ if user.SystemRole == 1 {
+ // 子查询:获取代理商邀请的用户ID列表
+ subQuery := db.Model(&models.User{}).Select("id").Where("referrer_identity_code = ?", user.IdentityCode)
+ query = query.Where("buyer_id IN (?)", subQuery)
+ }
+
+ // 添加搜索条件
+ if orderNo != "" {
+ query = query.Where("order_no LIKE ?", "%"+orderNo+"%")
+ }
+ if orderStatus != "" {
+ query = query.Where("order_status = ?", orderStatus)
+ }
+ if productType != "" {
+ query = query.Where("product_type = ?", productType)
+ }
+ if sellerName != "" {
+ query = query.Joins("LEFT JOIN users AS sellers ON purchase_orders.seller_id = sellers.id").
+ Where("sellers.real_name LIKE ? OR sellers.phone LIKE ?", "%"+sellerName+"%", "%"+sellerName+"%")
+ }
+ if buyerName != "" {
+ query = query.Joins("LEFT JOIN users AS buyers ON purchase_orders.buyer_id = buyers.id").
+ Where("buyers.real_name LIKE ? OR buyers.phone LIKE ?", "%"+buyerName+"%", "%"+buyerName+"%")
+ }
+
+ // 获取总数
+ query.Count(&total)
+
+ // 分页查询
+ offset := (page - 1) * pageSize
+ err := query.Offset(offset).Limit(pageSize).Order("created_at DESC").Find(&orders).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询买单列表失败"))
+ return
+ }
+
+ // 构建返回数据
+ result := map[string]interface{}{
+ "list": orders,
+ "total": total,
+ "page": page,
+ "page_size": pageSize,
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// GetSalesOrders 获取卖单列表
+func (h *AdminOrderHandler) GetSalesOrders(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 分页参数
+ page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
+ pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10"))
+ if page < 1 {
+ page = 1
+ }
+ if pageSize < 1 || pageSize > 100 {
+ pageSize = 10
+ }
+
+ // 搜索参数
+ orderNo := c.Query("order_no")
+ orderStatus := c.Query("order_status")
+ sellerName := c.Query("seller_name")
+ buyerName := c.Query("buyer_name")
+
+ db := common.GetDB()
+ var orders []models.SalesOrder
+ var total int64
+
+ // 构建查询条件
+ query := db.Model(&models.SalesOrder{}).Preload("Seller").Preload("Buyer").Preload("SecondaryProduct").Preload("Address")
+
+ // 如果是代理商,只能查看自己邀请的用户相关的订单
+ if user.SystemRole == 1 {
+ // 子查询:获取代理商邀请的用户ID列表
+ subQuery := db.Model(&models.User{}).Select("id").Where("referrer_identity_code = ?", user.IdentityCode)
+ query = query.Where("buyer_id IN (?) OR seller_id IN (?)", subQuery, subQuery)
+ }
+
+ // 添加搜索条件
+ if orderNo != "" {
+ query = query.Where("order_no LIKE ?", "%"+orderNo+"%")
+ }
+ if orderStatus != "" {
+ query = query.Where("order_status = ?", orderStatus)
+ }
+ if sellerName != "" {
+ query = query.Joins("LEFT JOIN users AS sellers ON sales_orders.seller_id = sellers.id").
+ Where("sellers.real_name LIKE ? OR sellers.phone LIKE ?", "%"+sellerName+"%", "%"+sellerName+"%")
+ }
+ if buyerName != "" {
+ query = query.Joins("LEFT JOIN users AS buyers ON sales_orders.buyer_id = buyers.id").
+ Where("buyers.real_name LIKE ? OR buyers.phone LIKE ?", "%"+buyerName+"%", "%"+buyerName+"%")
+ }
+
+ // 获取总数
+ query.Count(&total)
+
+ // 分页查询
+ offset := (page - 1) * pageSize
+ err := query.Offset(offset).Limit(pageSize).Order("created_at DESC").Find(&orders).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询卖单列表失败"))
+ return
+ }
+
+ // 构建返回数据
+ result := map[string]interface{}{
+ "list": orders,
+ "total": total,
+ "page": page,
+ "page_size": pageSize,
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// GetPurchaseOrder 获取单个买单详情
+func (h *AdminOrderHandler) GetPurchaseOrder(c *gin.Context) {
+ orderID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "订单ID无效"))
+ return
+ }
+
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ var order models.PurchaseOrder
+ query := common.GetDB().Preload("Buyer").Preload("Seller").Preload("Address")
+
+ err = query.First(&order, uint(orderID)).Error
+ if err != nil {
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(404, "订单不存在"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "查询订单详情失败"))
+ }
+ return
+ }
+
+ // 如果是代理商,检查权限
+ if user.SystemRole == 1 {
+ // 检查买家是否为代理商邀请的用户
+ if order.Buyer.ReferrerIdentityCode != user.IdentityCode {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+ }
+
+ c.JSON(http.StatusOK, common.Success(order))
+}
+
+// GetSalesOrder 获取单个卖单详情
+func (h *AdminOrderHandler) GetSalesOrder(c *gin.Context) {
+ orderID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "订单ID无效"))
+ return
+ }
+
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ var order models.SalesOrder
+ query := common.GetDB().Preload("Seller").Preload("Buyer").Preload("SecondaryProduct").Preload("Address")
+
+ err = query.First(&order, uint(orderID)).Error
+ if err != nil {
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(404, "订单不存在"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "查询订单详情失败"))
+ }
+ return
+ }
+
+ // 如果是代理商,检查权限
+ if user.SystemRole == 1 {
+ // 检查买家或卖家是否为代理商邀请的用户
+ if order.Buyer.ReferrerIdentityCode != user.IdentityCode && order.Seller.ReferrerIdentityCode != user.IdentityCode {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+ }
+
+ c.JSON(http.StatusOK, common.Success(order))
+}
+
+// UpdatePurchaseOrderStatus 更新买单状态(仅管理员)
+func (h *AdminOrderHandler) UpdatePurchaseOrderStatus(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以更新订单状态
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ orderID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "订单ID无效"))
+ return
+ }
+
+ var updateData struct {
+ OrderStatus uint8 `json:"order_status" binding:"required"`
+ Remark string `json:"remark"`
+ }
+
+ if err := c.ShouldBindJSON(&updateData); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "参数错误: "+err.Error()))
+ return
+ }
+
+ db := common.GetDB()
+ tx := db.Begin()
+
+ // 检查订单是否存在
+ var order models.PurchaseOrder
+ if err := tx.First(&order, uint(orderID)).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(404, "订单不存在"))
+ return
+ }
+
+ // 更新订单状态
+ updateFields := map[string]interface{}{
+ "order_status": updateData.OrderStatus,
+ "remark": updateData.Remark,
+ }
+
+ // 如果状态为已完成,设置确认时间并将商品入库
+ if updateData.OrderStatus == 2 {
+ now := time.Now()
+ updateFields["confirm_time"] = &now
+
+ // 商品入库到买家仓库
+ if err := h.addToWarehouse(tx, order.BuyerID, &order); err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "商品入库失败"))
+ return
+ }
+ }
+
+ if err := tx.Model(&order).Updates(updateFields).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "更新订单状态失败"))
+ return
+ }
+
+ tx.Commit()
+
+ result := map[string]interface{}{
+ "message": "订单状态更新成功",
+ }
+ if updateData.OrderStatus == 2 {
+ result["message"] = "订单确认成功,商品已入库"
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// UpdateSalesOrderStatus 更新卖单状态(仅管理员)
+func (h *AdminOrderHandler) UpdateSalesOrderStatus(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以更新订单状态
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ orderID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "订单ID无效"))
+ return
+ }
+
+ var updateData struct {
+ OrderStatus uint8 `json:"order_status" binding:"required"`
+ Remark string `json:"remark"`
+ }
+
+ if err := c.ShouldBindJSON(&updateData); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "参数错误: "+err.Error()))
+ return
+ }
+
+ // 检查订单是否存在
+ var order models.SalesOrder
+ if err := common.GetDB().First(&order, uint(orderID)).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "订单不存在"))
+ return
+ }
+
+ // 更新订单状态
+ updateFields := map[string]interface{}{
+ "order_status": updateData.OrderStatus,
+ "remark": updateData.Remark,
+ }
+
+ // 如果状态为确认完成,设置完成时间
+ if updateData.OrderStatus == 2 {
+ updateFields["complete_time"] = time.Now()
+ db := common.GetDB()
+ var purcharseOrder models.PurchaseOrder
+ db.Where("id=?", order.PurchaseOrderID).First(&purcharseOrder)
+ err := h.addToWarehouse(db, purcharseOrder.BuyerID, &purcharseOrder)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "确认失败"))
+ }
+ }
+ if updateData.OrderStatus == 3 {
+ canel(order.PurchaseOrderID, order.BuyerID)
+ }
+ if err := common.GetDB().Model(&order).Updates(updateFields).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "更新订单状态失败"))
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(nil))
+}
+
+// GetOrderStats 获取订单统计信息
+func (h *AdminOrderHandler) GetOrderStats(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ db := common.GetDB()
+ stats := make(map[string]interface{})
+
+ // 买单统计
+ purchaseQuery := db.Model(&models.PurchaseOrder{}).Where("order_status = ?", 2)
+
+ if user.SystemRole == 1 {
+ // 代理商只统计自己邀请的用户的订单
+ subQuery := db.Model(&models.User{}).Select("id").Where("referrer_identity_code = ?", user.IdentityCode)
+ purchaseQuery = purchaseQuery.Where("buyer_id IN (?)", subQuery)
+ }
+
+ var totalPurchaseOrders int64
+ var totalPurchaseAmount float64
+ purchaseQuery.Count(&totalPurchaseOrders)
+ purchaseQuery.Select("COALESCE(SUM(total_amount), 0)").Scan(&totalPurchaseAmount)
+
+ stats["total_purchase_orders"] = totalPurchaseOrders
+ stats["total_purchase_amount"] = totalPurchaseAmount
+
+ // 卖单统计
+ salesQuery := db.Model(&models.SalesOrder{})
+ if user.SystemRole == 1 {
+ // 代理商只统计自己邀请的用户相关的订单
+ subQuery := db.Model(&models.User{}).Select("id").Where("referrer_identity_code = ?", user.IdentityCode)
+ salesQuery = salesQuery.Where("buyer_id IN (?) OR seller_id IN (?)", subQuery, subQuery)
+ }
+
+ var totalSalesOrders int64
+ var totalSalesAmount float64
+ salesQuery.Count(&totalSalesOrders)
+ salesQuery.Select("COALESCE(SUM(total_amount), 0)").Scan(&totalSalesAmount)
+
+ stats["total_sales_orders"] = totalSalesOrders
+ stats["total_sales_amount"] = totalSalesAmount
+
+ // 今日订单统计
+ todayPurchaseQuery := purchaseQuery
+ if user.SystemRole == 1 {
+ subQuery := db.Model(&models.User{}).Select("id").Where("referrer_identity_code = ?", user.IdentityCode)
+ todayPurchaseQuery = todayPurchaseQuery.Where("buyer_id IN (?)", subQuery)
+ }
+ var todayPurchaseOrders int64
+ todayPurchaseQuery.Where("DATE(created_at) = CURDATE()").Count(&todayPurchaseOrders)
+
+ todaySalesQuery := salesQuery
+ if user.SystemRole == 1 {
+ subQuery := db.Model(&models.User{}).Select("id").Where("referrer_identity_code = ?", user.IdentityCode)
+ todaySalesQuery = todaySalesQuery.Where("buyer_id IN (?) OR seller_id IN (?)", subQuery, subQuery)
+ }
+ var todaySalesOrders int64
+ todaySalesQuery.Where("DATE(created_at) = CURDATE()").Count(&todaySalesOrders)
+
+ stats["today_purchase_orders"] = todayPurchaseOrders
+ stats["today_sales_orders"] = todaySalesOrders
+
+ c.JSON(http.StatusOK, common.Success(stats))
+}
+
+func canel(OrderID, UserID uint) {
+ db := common.GetDB()
+ tx := db.Begin()
+
+ // 查询订单
+ var order models.PurchaseOrder
+ if err := tx.Where("id = ? AND buyer_id = ?", OrderID, UserID).First(&order).Error; err != nil {
+ tx.Rollback()
+ return
+ }
+
+ // 检查订单状态(只有待付款和待确认的订单可以取消)
+ if order.OrderStatus != 0 && order.OrderStatus != 1 {
+ tx.Rollback()
+
+ return
+ }
+
+ // 更新订单状态为已取消
+ if err := tx.Model(&order).Update("order_status", 3).Error; err != nil {
+ tx.Rollback()
+
+ return
+ }
+
+ // 恢复商品库存
+ if order.ProductType == 1 { // 一级商品
+ if err := tx.Model(&models.PrimaryProduct{}).Where("id = ?", order.ProductID).
+ Update("stock_quantity", gorm.Expr("stock_quantity + ?", order.Quantity)).Error; err != nil {
+ tx.Rollback()
+
+ return
+ }
+ } else { // 二级商品
+ if err := tx.Model(&models.SecondaryProduct{}).Where("id = ?", order.ProductID).
+ Update("quantity", gorm.Expr("quantity + ?", order.Quantity)).Error; err != nil {
+ tx.Rollback()
+
+ return
+ }
+ }
+
+ tx.Commit()
+}
+
+// addToWarehouse 添加商品到买家仓库
+func (h *AdminOrderHandler) addToWarehouse(tx *gorm.DB, buyerID uint, order *models.PurchaseOrder) error {
+
+ var config models.SystemConfig
+ // 计算入库价格(根据系统配置增值)
+
+ // 检查该订单是否已经入库(防止重复入库)
+ var existingByOrder models.UserWarehouse
+ err := tx.Where("user_id = ? AND source_order_id = ? and product_type=? and product_id=?",
+ buyerID, order.ID, order.ProductType, order.ProductID).First(&existingByOrder).Error
+
+ if err == nil {
+ // 该订单已经入库,直接返回
+ return nil
+ } else if err != gorm.ErrRecordNotFound {
+ // 查询出错
+ return err
+ }
+
+ // 检查仓库中是否已有相同商品(不同订单的相同商品)
+ var existingWarehouse models.UserWarehouse
+ //err = tx.Where("user_id = ? AND product_id = ? AND product_type = ?",
+ // buyerID, order.ProductID, order.ProductType).First(&existingWarehouse).Error
+
+ _ = tx.Where("config_key= ?", "warehouse_price_rate").First(&config).Error
+ value, _ := strconv.ParseFloat(config.ConfigValue, 64)
+ warehousePrice := order.UnitPrice + value
+
+ if err == gorm.ErrRecordNotFound {
+ // 创建新的仓库记录
+ warehouse := models.UserWarehouse{
+ UserID: buyerID,
+ ProductID: order.ProductID,
+ ProductType: order.ProductType,
+ ProductName: order.ProductName,
+ ProductImages: order.ProductImages,
+ PurchasePrice: order.UnitPrice,
+ WarehousePrice: warehousePrice,
+ Quantity: order.Quantity,
+ SourceOrderID: &order.ID,
+ Status: 1, // 库存中
+ }
+
+ return tx.Create(&warehouse).Error
+ } else if err != nil {
+ return err
+ } else {
+ // 更新现有仓库记录的数量(累加不同订单的相同商品)
+ return tx.Model(&existingWarehouse).Update("quantity", existingWarehouse.Quantity+order.Quantity).Error
+ }
+}
+
+func (h *AdminOrderHandler) GetOrderTrend(c *gin.Context) {
+ db := common.GetDB()
+
+ type DailyStats struct {
+ Date string `json:"date"`
+ Count int `json:"count"`
+ }
+
+ result := make([]DailyStats, 0, 7)
+
+ now := time.Now()
+
+ for i := 6; i >= 0; i-- {
+ // 当天 00:00:00
+ startOfDay := time.Date(now.Year(), now.Month(), now.Day()-i, 0, 0, 0, 0, now.Location())
+ // 次日 00:00:00
+ endOfDay := startOfDay.AddDate(0, 0, 1)
+
+ // 格式化显示用的 "01-02"
+ displayDateStr := startOfDay.Format("01-02")
+
+ var count int64
+ db.Model(&models.PurchaseOrder{}).
+ Where("created_at >= ? AND created_at < ?", startOfDay, endOfDay).
+ Count(&count)
+
+ result = append(result, DailyStats{
+ Date: displayDateStr,
+ Count: int(count),
+ })
+ }
+
+ c.JSON(http.StatusOK, common.Success(map[string]interface{}{
+ "trend": result,
+ }))
+}
+
+// GetRecentActivities 获取最近活动
+func (h *AdminOrderHandler) GetRecentActivities(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ db := common.GetDB()
+
+ // 准备返回数据结构
+ type Activity struct {
+ ID uint `json:"id"`
+ Description string `json:"description"`
+ Time time.Time `json:"time"`
+ }
+
+ var activities []Activity
+
+ // 获取最近的订单活动(最多10条)
+ var recentOrders []models.PurchaseOrder
+ orderQuery := db.Model(&models.PurchaseOrder{}).Preload("Buyer")
+
+ if user.SystemRole == 1 {
+ // 代理商只能看到自己邀请的用户的活动
+ subQuery := db.Model(&models.User{}).Select("id").Where("referrer_identity_code = ?", user.IdentityCode)
+ orderQuery = orderQuery.Where("buyer_id IN (?)", subQuery)
+ }
+
+ err := orderQuery.Order("created_at DESC").Limit(10).Find(&recentOrders).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "获取最近活动失败"))
+ return
+ }
+
+ // 将订单转换为活动
+ for _, order := range recentOrders {
+ var description string
+ switch order.OrderStatus {
+ case 0:
+ description = fmt.Sprintf("用户 %s 创建了新订单 %s", order.Buyer.Phone, order.OrderNo)
+ case 1:
+ description = fmt.Sprintf("用户 %s 提交了订单 %s 的付款凭证", order.Buyer.Phone, order.OrderNo)
+ case 2:
+ description = fmt.Sprintf("订单 %s 已完成", order.OrderNo)
+ case 3:
+ description = fmt.Sprintf("订单 %s 已取消", order.OrderNo)
+ }
+
+ activities = append(activities, Activity{
+ ID: order.ID,
+ Description: description,
+ Time: order.CreatedAt,
+ })
+ }
+
+ c.JSON(http.StatusOK, common.Success(map[string]interface{}{
+ "activities": activities,
+ }))
+}
diff --git a/internal/handlers/admin_order_message_handler.go b/internal/handlers/admin_order_message_handler.go
new file mode 100644
index 0000000..f696cd2
--- /dev/null
+++ b/internal/handlers/admin_order_message_handler.go
@@ -0,0 +1,184 @@
+package handlers
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/models"
+ "net/http"
+ "strconv"
+
+ "github.com/gin-gonic/gin"
+ "gorm.io/gorm"
+)
+
+// AdminOrderMessageHandler 管理端订单留言处理器
+type AdminOrderMessageHandler struct{}
+
+// GetOrderMessages 获取订单留言列表
+func (h *AdminOrderMessageHandler) GetOrderMessages(c *gin.Context) {
+ orderID, err := strconv.ParseUint(c.Param("order_id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "订单ID无效"))
+ return
+ }
+
+ orderType := c.Query("type") // purchase 或 sales
+ if orderType == "" {
+ c.JSON(http.StatusOK, common.Error(400, "订单类型无效"))
+ return
+ }
+
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 验证管理员权限
+ if user.SystemRole != 0 && user.SystemRole != 1 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ // 分页参数
+ page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
+ pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
+ if page < 1 {
+ page = 1
+ }
+ if pageSize < 1 || pageSize > 50 {
+ pageSize = 20
+ }
+
+ db := common.GetDB()
+ var messages []models.OrderMessage
+ var total int64
+
+ // 如果是买单,需要同时查询买单和对应卖单的留言
+ var query *gorm.DB
+ if orderType == "purchase" {
+ // 查找是否有对应的卖单
+ var salesOrder models.SalesOrder
+ err := db.Where("purchase_order_id = ?", orderID).First(&salesOrder).Error
+ if err == nil {
+ // 有对应卖单,查询两个订单的留言
+ query = db.Model(&models.OrderMessage{}).
+ Where("(order_id = ? AND order_type = ?) OR (order_id = ? AND order_type = ?)",
+ orderID, "purchase", salesOrder.ID, "sales")
+ } else {
+ // 没有对应卖单,只查询买单留言
+ query = db.Model(&models.OrderMessage{}).
+ Where("order_id = ? AND order_type = ?", orderID, "purchase")
+ }
+ } else {
+ // 卖单,查询卖单和对应买单的留言
+ var salesOrder models.SalesOrder
+ err := db.Where("id = ?", orderID).First(&salesOrder).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "订单不存在"))
+ return
+ }
+
+ query = db.Model(&models.OrderMessage{}).
+ Where("(order_id = ? AND order_type = ?) OR (order_id = ? AND order_type = ?)",
+ salesOrder.ID, "sales", salesOrder.PurchaseOrderID, "purchase")
+ }
+
+ query = query.Preload("User", func(db *gorm.DB) *gorm.DB {
+ return db.Select("id, customer_name, real_name, phone, system_role")
+ })
+
+ // 获取总数
+ query.Count(&total)
+
+ // 分页查询
+ offset := (page - 1) * pageSize
+ err = query.Order("created_at ASC").Offset(offset).Limit(pageSize).Find(&messages).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询留言列表失败"))
+ return
+ }
+
+ // 构建返回数据
+ result := map[string]interface{}{
+ "list": messages,
+ "total": total,
+ "page": page,
+ "page_size": pageSize,
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// CreateOrderMessage 创建订单留言
+func (h *AdminOrderMessageHandler) CreateOrderMessage(c *gin.Context) {
+ orderID, err := strconv.ParseUint(c.Param("order_id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "订单ID无效"))
+ return
+ }
+
+ orderType := c.Query("type") // purchase 或 sales
+ if orderType == "" {
+ c.JSON(http.StatusOK, common.Error(400, "订单类型无效"))
+ return
+ }
+
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 验证管理员权限
+ if user.SystemRole != 0 && user.SystemRole != 1 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ var req struct {
+ Content string `json:"content" binding:"required"`
+ Images string `json:"images"`
+ }
+
+ if err := c.ShouldBindJSON(&req); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "请求参数错误"))
+ return
+ }
+
+ // 验证留言内容
+ if len(req.Content) > 500 {
+ c.JSON(http.StatusOK, common.Error(400, "留言内容不能超过500字"))
+ return
+ }
+
+ // 验证订单是否存在
+ db := common.GetDB()
+ if orderType == "purchase" {
+ var order models.PurchaseOrder
+ if err := db.First(&order, uint(orderID)).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "订单不存在"))
+ return
+ }
+ } else {
+ var order models.SalesOrder
+ if err := db.First(&order, uint(orderID)).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "订单不存在"))
+ return
+ }
+ }
+
+ // 创建留言记录
+ message := models.OrderMessage{
+ OrderID: uint(orderID),
+ OrderType: orderType,
+ UserID: user.ID,
+ Content: req.Content,
+ Images: req.Images,
+ }
+
+ if err := db.Create(&message).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "创建留言失败"))
+ return
+ }
+
+ // 预加载用户信息
+ db.Preload("User", func(db *gorm.DB) *gorm.DB {
+ return db.Select("id, customer_name, real_name, phone, system_role")
+ }).First(&message, message.ID)
+
+ c.JSON(http.StatusOK, common.Success(message))
+}
\ No newline at end of file
diff --git a/internal/handlers/admin_payment_handler.go b/internal/handlers/admin_payment_handler.go
new file mode 100644
index 0000000..8e1eb87
--- /dev/null
+++ b/internal/handlers/admin_payment_handler.go
@@ -0,0 +1,86 @@
+package handlers
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/models"
+ "net/http"
+
+ "github.com/gin-gonic/gin"
+)
+
+// AdminPaymentHandler 管理员付款方式处理器
+type AdminPaymentHandler struct{}
+
+// GetPaymentInfo 获取管理员付款方式信息
+func (h *AdminPaymentHandler) GetPaymentInfo(c *gin.Context) {
+ db := common.GetDB()
+
+ // 查询系统角色为管理员的用户的付款信息
+ var admin models.User
+ err := db.Where("system_role = ?", 0).Select("main_payment_qr_image, sub_payment_qr_image").First(&admin).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询管理员付款信息失败"))
+ return
+ }
+
+ // 返回管理员付款方式信息
+ paymentInfo := map[string]interface{}{
+ "main_payment_qr_image": admin.MainPaymentQrImage,
+ "sub_payment_qr_image": admin.SubPaymentQrImage,
+ }
+
+ c.JSON(http.StatusOK, common.Success(paymentInfo))
+}
+
+// UpdatePaymentInfo 更新管理员付款方式信息
+func (h *AdminPaymentHandler) UpdatePaymentInfo(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 验证是否为管理员
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ // 解析请求数据
+ var req struct {
+ MainPaymentQrImage string `json:"main_payment_qr_image"`
+ SubPaymentQrImage string `json:"sub_payment_qr_image"`
+ }
+
+ if err := c.ShouldBindJSON(&req); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "请求参数错误"))
+ return
+ }
+
+ // 更新管理员付款方式信息
+ updates := map[string]interface{}{}
+ if req.MainPaymentQrImage != "" {
+ updates["main_payment_qr_image"] = req.MainPaymentQrImage
+ }
+ if req.SubPaymentQrImage != "" {
+ updates["sub_payment_qr_image"] = req.SubPaymentQrImage
+ }
+
+ if len(updates) == 0 {
+ c.JSON(http.StatusOK, common.Error(400, "没有要更新的信息"))
+ return
+ }
+
+ if err := common.GetDB().Model(&user).Updates(updates).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "更新付款方式失败"))
+ return
+ }
+
+ // 返回更新后的信息
+ var updatedUser models.User
+ common.GetDB().First(&updatedUser, user.ID)
+
+ paymentInfo := map[string]interface{}{
+ "main_payment_qr_image": updatedUser.MainPaymentQrImage,
+ "sub_payment_qr_image": updatedUser.SubPaymentQrImage,
+ }
+
+ c.JSON(http.StatusOK, common.Success(paymentInfo))
+}
\ No newline at end of file
diff --git a/internal/handlers/admin_product_handler.go b/internal/handlers/admin_product_handler.go
new file mode 100644
index 0000000..0a6a430
--- /dev/null
+++ b/internal/handlers/admin_product_handler.go
@@ -0,0 +1,511 @@
+package handlers
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/models"
+ "fmt"
+ "net/http"
+ "strconv"
+
+ "github.com/gin-gonic/gin"
+ "gorm.io/gorm"
+)
+
+// AdminProductHandler 管理端商品处理器
+type AdminProductHandler struct{}
+
+// CreateProductCategoryRequest 创建商品分类请求结构体
+type CreateProductCategoryRequest struct {
+ CategoryName string `json:"category_name" binding:"required"`
+ CategoryIcon string `json:"category_icon"`
+ SortOrder int `json:"sort_order"`
+ Status uint8 `json:"status"`
+}
+
+// UpdateProductCategoryRequest 更新商品分类请求结构体
+type UpdateProductCategoryRequest struct {
+ CategoryName string `json:"category_name"`
+ CategoryIcon string `json:"category_icon"`
+ SortOrder int `json:"sort_order"`
+ Status uint8 `json:"status"`
+}
+
+// GetProductCategories 获取商品分类列表
+func (h *AdminProductHandler) GetProductCategories(c *gin.Context) {
+ var categories []models.ProductCategory
+
+ err := common.GetDB().Order("sort_order ASC, created_at DESC").Find(&categories).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询商品分类失败"))
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(categories))
+}
+
+// CreateProductCategory 创建商品分类(仅管理员)
+func (h *AdminProductHandler) CreateProductCategory(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以创建分类
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ var req CreateProductCategoryRequest
+ if err := c.ShouldBindJSON(&req); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "参数错误: "+err.Error()))
+ return
+ }
+
+ // 创建分类对象
+ newCategory := models.ProductCategory{
+ CategoryName: req.CategoryName,
+ CategoryIcon: req.CategoryIcon,
+ SortOrder: req.SortOrder,
+ Status: req.Status,
+ }
+
+ // 保存分类
+ if err := common.GetDB().Create(&newCategory).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "创建商品分类失败"))
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(newCategory))
+}
+
+// UpdateProductCategory 更新商品分类(仅管理员)
+func (h *AdminProductHandler) UpdateProductCategory(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以更新分类
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ categoryID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "分类ID无效"))
+ return
+ }
+
+ var req UpdateProductCategoryRequest
+ if err := c.ShouldBindJSON(&req); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "参数错误: "+err.Error()))
+ return
+ }
+
+ // 检查分类是否存在
+ var existCategory models.ProductCategory
+ if err := common.GetDB().First(&existCategory, uint(categoryID)).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "商品分类不存在"))
+ return
+ }
+
+ // 准备更新数据
+ updateData := models.ProductCategory{
+ CategoryName: req.CategoryName,
+ CategoryIcon: req.CategoryIcon,
+ SortOrder: req.SortOrder,
+ Status: req.Status,
+ }
+
+ // 更新分类信息
+ updateData.ID = uint(categoryID)
+ if err := common.GetDB().Model(&existCategory).Updates(&updateData).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "更新商品分类失败"))
+ return
+ }
+
+ // 返回更新后的分类信息
+ var updatedCategory models.ProductCategory
+ common.GetDB().First(&updatedCategory, uint(categoryID))
+
+ c.JSON(http.StatusOK, common.Success(updatedCategory))
+}
+
+// DeleteProductCategory 删除商品分类(仅管理员)
+func (h *AdminProductHandler) DeleteProductCategory(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以删除分类
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ categoryID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "分类ID无效"))
+ return
+ }
+
+ // 检查分类下是否有商品
+ var productCount int64
+ common.GetDB().Model(&models.PrimaryProduct{}).Where("category_id = ?", categoryID).Count(&productCount)
+ if productCount > 0 {
+ c.JSON(http.StatusOK, common.Error(400, "该分类下还有商品,无法删除"))
+ return
+ }
+
+ // 删除分类
+ if err := common.GetDB().Delete(&models.ProductCategory{}, uint(categoryID)).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "删除商品分类失败"))
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(nil))
+}
+
+// GetPrimaryProducts 获取一级商品列表
+func (h *AdminProductHandler) GetPrimaryProducts(c *gin.Context) {
+ // 分页参数
+ page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
+ pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10"))
+ if page < 1 {
+ page = 1
+ }
+ if pageSize < 1 || pageSize > 100 {
+ pageSize = 10
+ }
+
+ // 搜索参数
+ categoryID := c.Query("category_id")
+ productName := c.Query("product_name")
+ status := c.Query("status")
+
+ db := common.GetDB()
+ var products []models.PrimaryProduct
+ var total int64
+
+ // 构建查询条件
+ query := db.Model(&models.PrimaryProduct{}).Preload("Category")
+
+ // 添加搜索条件
+ if categoryID != "" {
+ query = query.Where("category_id = ?", categoryID)
+ }
+ if productName != "" {
+ query = query.Where("product_name LIKE ?", "%"+productName+"%")
+ }
+ if status != "" {
+ query = query.Where("status = ?", status)
+ }
+
+ // 获取总数
+ query.Count(&total)
+
+ // 分页查询
+ offset := (page - 1) * pageSize
+ err := query.Offset(offset).Limit(pageSize).Order("sort_order ASC, created_at DESC").Find(&products).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询商品列表失败"))
+ return
+ }
+
+ // 构建返回数据
+ result := map[string]interface{}{
+ "list": products,
+ "total": total,
+ "page": page,
+ "page_size": pageSize,
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// GetPrimaryProduct 获取单个一级商品详情
+func (h *AdminProductHandler) GetPrimaryProduct(c *gin.Context) {
+ productID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "商品ID无效"))
+ return
+ }
+
+ var product models.PrimaryProduct
+ err = common.GetDB().Preload("Category").First(&product, uint(productID)).Error
+ if err != nil {
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(404, "商品不存在"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "查询商品详情失败"))
+ }
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(product))
+}
+
+// CreatePrimaryProductRequest 创建一级商品请求结构体
+type CreatePrimaryProductRequest struct {
+ CategoryID uint `json:"category_id" binding:"required"`
+ ProductName string `json:"product_name" binding:"required"`
+ ProductDescription string `json:"product_description"`
+ ProductImages string `json:"product_images"`
+ OriginalPrice float64 `json:"original_price" binding:"required"`
+ CurrentPrice float64 `json:"current_price" binding:"required"`
+ StockQuantity int `json:"stock_quantity"`
+ SortOrder int `json:"sort_order"`
+ Status uint8 `json:"status"`
+ IsHot int8 `json:"is_hot"`
+}
+
+// CreatePrimaryProduct 创建一级商品(仅管理员)
+func (h *AdminProductHandler) CreatePrimaryProduct(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以创建商品
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ var req CreatePrimaryProductRequest
+ if err := c.ShouldBindJSON(&req); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "参数错误: "+err.Error()))
+ return
+ }
+
+ // 检查分类是否存在
+ var category models.ProductCategory
+ if err := common.GetDB().First(&category, req.CategoryID).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "商品分类不存在"))
+ return
+ }
+
+ // 创建商品对象
+ newProduct := models.PrimaryProduct{
+ CategoryID: req.CategoryID,
+ ProductName: req.ProductName,
+ ProductDescription: req.ProductDescription,
+ ProductImages: req.ProductImages,
+ OriginalPrice: req.OriginalPrice,
+ CurrentPrice: req.CurrentPrice,
+ StockQuantity: req.StockQuantity,
+ SortOrder: req.SortOrder,
+ Status: req.Status,
+ IsHot: req.IsHot,
+ }
+
+ // 保存商品
+ if err := common.GetDB().Create(&newProduct).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "创建商品失败"))
+ return
+ }
+
+ // 返回创建的商品(包含分类信息)
+ var createdProduct models.PrimaryProduct
+ common.GetDB().Preload("Category").First(&createdProduct, newProduct.ID)
+
+ c.JSON(http.StatusOK, common.Success(createdProduct))
+}
+
+// UpdatePrimaryProductRequest 更新一级商品请求结构体
+type UpdatePrimaryProductRequest struct {
+ CategoryID uint `json:"category_id"`
+ ProductName string `json:"product_name"`
+ ProductDescription string `json:"product_description"`
+ ProductImages string `json:"product_images"`
+ OriginalPrice float64 `json:"original_price"`
+ CurrentPrice float64 `json:"current_price"`
+ StockQuantity int `json:"stock_quantity"`
+ SortOrder int `json:"sort_order"`
+ Status uint8 `json:"status"`
+ IsHot int8 `json:"is_hot"`
+}
+
+// UpdatePrimaryProduct 更新一级商品(仅管理员)
+func (h *AdminProductHandler) UpdatePrimaryProduct(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以更新商品
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ productID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "商品ID无效"))
+ return
+ }
+
+ var req UpdatePrimaryProductRequest
+ if err := c.ShouldBindJSON(&req); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "参数错误: "+err.Error()))
+ return
+ }
+
+ // 检查商品是否存在
+ var existProduct models.PrimaryProduct
+ if err := common.GetDB().First(&existProduct, uint(productID)).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "商品不存在"))
+ return
+ }
+
+ // 如果更新了分类,检查分类是否存在
+ if req.CategoryID != 0 {
+ var category models.ProductCategory
+ if err := common.GetDB().First(&category, req.CategoryID).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "商品分类不存在"))
+ return
+ }
+ }
+
+ // 准备更新数据
+ updateData := models.PrimaryProduct{
+ CategoryID: req.CategoryID,
+ ProductName: req.ProductName,
+ ProductDescription: req.ProductDescription,
+ ProductImages: req.ProductImages,
+ OriginalPrice: req.OriginalPrice,
+ CurrentPrice: req.CurrentPrice,
+ StockQuantity: req.StockQuantity,
+ SortOrder: req.SortOrder,
+ Status: req.Status,
+ IsHot: req.IsHot,
+ }
+ fmt.Println(updateData.IsHot)
+ // 更新商品信息
+ updateData.ID = uint(productID)
+ if err := common.GetDB().Model(&existProduct).Updates(&updateData).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "更新商品失败"))
+ return
+ }
+ common.GetDB().Model(&existProduct).Select("status", "is_hot").
+ Updates(models.PrimaryProduct{IsHot: req.IsHot, Status: req.Status})
+ // 返回更新后的商品信息
+ var updatedProduct models.PrimaryProduct
+ common.GetDB().Preload("Category").First(&updatedProduct, uint(productID))
+
+ c.JSON(http.StatusOK, common.Success(updatedProduct))
+}
+
+// DeletePrimaryProduct 删除一级商品(仅管理员)
+func (h *AdminProductHandler) DeletePrimaryProduct(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以删除商品
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ productID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "商品ID无效"))
+ return
+ }
+
+ // 检查商品是否存在
+ var existProduct models.PrimaryProduct
+ if err := common.GetDB().First(&existProduct, uint(productID)).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "商品不存在"))
+ return
+ }
+
+ // 删除商品
+ if err := common.GetDB().Delete(&existProduct).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "删除商品失败"))
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(nil))
+}
+
+// GetSecondaryProducts 获取二级商品列表
+func (h *AdminProductHandler) GetSecondaryProducts(c *gin.Context) {
+ // 分页参数
+ page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
+ pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10"))
+ if page < 1 {
+ page = 1
+ }
+ if pageSize < 1 || pageSize > 100 {
+ pageSize = 10
+ }
+
+ // 搜索参数
+ sellerID := c.Query("seller_id")
+ productName := c.Query("product_name")
+ status := c.Query("status")
+
+ db := common.GetDB()
+ var products []models.SecondaryProduct
+ var total int64
+
+ // 构建查询条件
+ query := db.Model(&models.SecondaryProduct{}).Preload("Seller")
+
+ // 添加搜索条件
+ if sellerID != "" {
+ query = query.Where("seller_id = ?", sellerID)
+ }
+ if productName != "" {
+ query = query.Where("product_name LIKE ?", "%"+productName+"%")
+ }
+ if status != "" {
+ query = query.Where("status = ?", status)
+ }
+
+ // 获取总数
+ query.Count(&total)
+
+ // 分页查询
+ offset := (page - 1) * pageSize
+ err := query.Offset(offset).Limit(pageSize).Order("created_at DESC").Find(&products).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询二级商品列表失败"))
+ return
+ }
+
+ // 构建返回数据
+ result := map[string]interface{}{
+ "list": products,
+ "total": total,
+ "page": page,
+ "page_size": pageSize,
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// GetProductStats 获取商品统计信息
+func (h *AdminProductHandler) GetProductStats(c *gin.Context) {
+ db := common.GetDB()
+ stats := make(map[string]interface{})
+
+ // 一级商品统计
+ var totalPrimaryProducts int64
+ var onSalePrimaryProducts int64
+ db.Model(&models.PrimaryProduct{}).Count(&totalPrimaryProducts)
+ db.Model(&models.PrimaryProduct{}).Where("status = 1").Count(&onSalePrimaryProducts)
+
+ stats["total_primary_products"] = totalPrimaryProducts
+ stats["on_sale_primary_products"] = onSalePrimaryProducts
+
+ // 二级商品统计
+ var totalSecondaryProducts int64
+ var onSaleSecondaryProducts int64
+ db.Model(&models.SecondaryProduct{}).Count(&totalSecondaryProducts)
+ db.Model(&models.SecondaryProduct{}).Where("status = 1").Count(&onSaleSecondaryProducts)
+
+ stats["total_secondary_products"] = totalSecondaryProducts
+ stats["on_sale_secondary_products"] = onSaleSecondaryProducts
+
+ // 商品分类数量
+ var totalCategories int64
+ db.Model(&models.ProductCategory{}).Count(&totalCategories)
+ stats["total_categories"] = totalCategories
+
+ c.JSON(http.StatusOK, common.Success(stats))
+}
diff --git a/internal/handlers/admin_score_handler.go b/internal/handlers/admin_score_handler.go
new file mode 100644
index 0000000..44d2d55
--- /dev/null
+++ b/internal/handlers/admin_score_handler.go
@@ -0,0 +1,368 @@
+package handlers
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/models"
+ "net/http"
+ "strconv"
+
+ "github.com/gin-gonic/gin"
+ "gorm.io/gorm"
+)
+
+// ScoreRecordCreateRequest 用于接收创建积分记录的请求
+type ScoreRecordCreateRequest struct {
+ UserID uint `json:"user_id" binding:"required"`
+ ChangeNumber int `json:"change_number" binding:"required"`
+ Note string `json:"note" binding:"required"`
+}
+
+// AdminScoreHandler 管理端积分处理器
+type AdminScoreHandler struct{}
+
+// GetScoreRecords 获取积分记录列表
+func (h *AdminScoreHandler) GetScoreRecords(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 分页参数
+ page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
+ pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10"))
+ if page < 1 {
+ page = 1
+ }
+ if pageSize < 1 || pageSize > 100 {
+ pageSize = 10
+ }
+
+ // 搜索参数
+ userID := c.Query("user_id")
+ phone := c.Query("phone")
+ changeType := c.Query("change_type") // positive: 正数, negative: 负数
+
+ db := common.GetDB()
+ var records []models.ScoreRecord
+ var total int64
+
+ // 构建查询条件
+ query := db.Model(&models.ScoreRecord{}).Preload("User")
+
+ // 如果是代理商,只能查看自己邀请的用户的积分记录
+ if user.SystemRole == 1 {
+ // 子查询:获取代理商邀请的用户ID列表
+ subQuery := db.Model(&models.User{}).Select("id").Where("referrer_identity_code = ?", user.IdentityCode)
+ query = query.Where("user_id IN (?)", subQuery)
+ }
+
+ // 添加搜索条件
+ if userID != "" {
+ query = query.Where("user_id = ?", userID)
+ }
+ if phone != "" {
+ // 通过关联用户表搜索手机号
+ query = query.Joins("JOIN users ON users.id = score_records.user_id").Where("users.phone LIKE ?", "%"+phone+"%")
+ }
+ if changeType == "positive" {
+ query = query.Where("change_number > 0")
+ } else if changeType == "negative" {
+ query = query.Where("change_number < 0")
+ }
+
+ // 获取总数
+ query.Count(&total)
+
+ // 分页查询
+ offset := (page - 1) * pageSize
+ err := query.Offset(offset).Limit(pageSize).Order("created_at DESC").Find(&records).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询积分记录失败"))
+ return
+ }
+
+ // 构建返回数据
+ result := map[string]interface{}{
+ "list": records,
+ "total": total,
+ "page": page,
+ "page_size": pageSize,
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// GetScoreRecord 获取单个积分记录详情
+func (h *AdminScoreHandler) GetScoreRecord(c *gin.Context) {
+ recordID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "记录ID无效"))
+ return
+ }
+
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ var record models.ScoreRecord
+ query := common.GetDB().Preload("User")
+
+ err = query.First(&record, uint(recordID)).Error
+ if err != nil {
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(404, "积分记录不存在"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "查询积分记录失败"))
+ }
+ return
+ }
+
+ // 如果是代理商,检查权限
+ if user.SystemRole == 1 {
+ // 检查用户是否为代理商邀请的用户
+ if record.User.ReferrerIdentityCode != user.IdentityCode {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+ }
+
+ c.JSON(http.StatusOK, common.Success(record))
+}
+
+// CreateScoreRecord 创建积分记录(仅管理员)
+func (h *AdminScoreHandler) CreateScoreRecord(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以创建积分记录
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ var newRecord1 ScoreRecordCreateRequest
+ if err := c.ShouldBindJSON(&newRecord1); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "参数错误: "+err.Error()))
+ return
+ }
+
+ // 检查用户是否存在
+ var targetUser models.User
+ if err := common.GetDB().First(&targetUser, newRecord1.UserID).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "用户不存在"))
+ return
+ }
+
+ newRecord := models.ScoreRecord{
+ UserID: newRecord1.UserID,
+ ChangeNumber: newRecord1.ChangeNumber,
+ Note: newRecord1.Note,
+ }
+ // 开启事务
+ tx := common.GetDB().Begin()
+
+ // 创建积分记录
+ if err := tx.Create(&newRecord).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "创建积分记录失败"))
+ return
+ }
+
+ // 更新用户积分
+ newPoints := targetUser.CurrentPoints + newRecord.ChangeNumber
+ if newPoints < 0 {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(400, "用户积分不足"))
+ return
+ }
+
+ if err := tx.Model(&targetUser).Update("current_points", newPoints).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "更新用户积分失败"))
+ return
+ }
+
+ // 提交事务
+ tx.Commit()
+
+ // 返回创建的记录(包含用户信息)
+ var createdRecord models.ScoreRecord
+ common.GetDB().Preload("User").First(&createdRecord, newRecord.ID)
+
+ c.JSON(http.StatusOK, common.Success(createdRecord))
+}
+
+// UpdateScoreRecord 更新积分记录(仅管理员)
+func (h *AdminScoreHandler) UpdateScoreRecord(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以更新积分记录
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ recordID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "记录ID无效"))
+ return
+ }
+
+ var updateData struct {
+ ChangeNumber int `json:"change_number" binding:"required"`
+ Note string `json:"note" binding:"required"`
+ }
+
+ if err := c.ShouldBindJSON(&updateData); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "参数错误: "+err.Error()))
+ return
+ }
+
+ // 检查积分记录是否存在
+ var existRecord models.ScoreRecord
+ if err := common.GetDB().Preload("User").First(&existRecord, uint(recordID)).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "积分记录不存在"))
+ return
+ }
+
+ // 开启事务
+ tx := common.GetDB().Begin()
+
+ // 计算积分差值
+ pointsDiff := updateData.ChangeNumber - existRecord.ChangeNumber
+ newUserPoints := existRecord.User.CurrentPoints + pointsDiff
+
+ if newUserPoints < 0 {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(400, "用户积分不足"))
+ return
+ }
+
+ // 更新积分记录
+ if err := tx.Model(&existRecord).Updates(map[string]interface{}{
+ "change_number": updateData.ChangeNumber,
+ "note": updateData.Note,
+ }).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "更新积分记录失败"))
+ return
+ }
+
+ // 更新用户积分
+ if err := tx.Model(&existRecord.User).Update("current_points", newUserPoints).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "更新用户积分失败"))
+ return
+ }
+
+ // 提交事务
+ tx.Commit()
+
+ // 返回更新后的记录
+ var updatedRecord models.ScoreRecord
+ common.GetDB().Preload("User").First(&updatedRecord, uint(recordID))
+
+ c.JSON(http.StatusOK, common.Success(updatedRecord))
+}
+
+// DeleteScoreRecord 删除积分记录(仅管理员)
+func (h *AdminScoreHandler) DeleteScoreRecord(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以删除积分记录
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ recordID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "记录ID无效"))
+ return
+ }
+
+ // 检查积分记录是否存在
+ var existRecord models.ScoreRecord
+ if err := common.GetDB().Preload("User").First(&existRecord, uint(recordID)).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "积分记录不存在"))
+ return
+ }
+
+ // 开启事务
+ tx := common.GetDB().Begin()
+
+ // 恢复用户积分(减去这条记录的变化值)
+ newUserPoints := existRecord.User.CurrentPoints - existRecord.ChangeNumber
+ if newUserPoints < 0 {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(400, "删除此记录会导致用户积分为负数"))
+ return
+ }
+
+ // 更新用户积分
+ if err := tx.Model(&existRecord.User).Update("current_points", newUserPoints).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "更新用户积分失败"))
+ return
+ }
+
+ // 删除积分记录
+ if err := tx.Delete(&existRecord).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "删除积分记录失败"))
+ return
+ }
+
+ // 提交事务
+ tx.Commit()
+
+ c.JSON(http.StatusOK, common.Success(nil))
+}
+
+// GetScoreStats 获取积分统计信息
+func (h *AdminScoreHandler) GetScoreStats(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ db := common.GetDB()
+ stats := make(map[string]interface{})
+
+ // 构建基础查询
+ baseQuery := db.Model(&models.ScoreRecord{})
+ if user.SystemRole == 1 {
+ // 代理商只统计自己邀请的用户的积分记录
+ subQuery := db.Model(&models.User{}).Select("id").Where("referrer_identity_code = ?", user.IdentityCode)
+ baseQuery = baseQuery.Where("user_id IN (?)", subQuery)
+ }
+
+ // 总积分变化记录数
+ var totalRecords int64
+ baseQuery.Count(&totalRecords)
+ stats["total_records"] = totalRecords
+
+ // 总积分增加
+ var totalIncrease int64
+ baseQuery.Where("change_number > 0").Select("COALESCE(SUM(change_number), 0)").Scan(&totalIncrease)
+ stats["total_increase"] = totalIncrease
+
+ // 总积分减少
+ var totalDecrease int64
+ baseQuery.Where("change_number < 0").Select("COALESCE(SUM(ABS(change_number)), 0)").Scan(&totalDecrease)
+ stats["total_decrease"] = totalDecrease
+
+ // 今日积分变化
+ todayQuery := baseQuery
+ if user.SystemRole == 1 {
+ subQuery := db.Model(&models.User{}).Select("id").Where("referrer_identity_code = ?", user.IdentityCode)
+ todayQuery = todayQuery.Where("user_id IN (?)", subQuery)
+ }
+
+ var todayIncrease int64
+ todayQuery.Where("change_number > 0 AND DATE(created_at) = CURDATE()").Select("COALESCE(SUM(change_number), 0)").Scan(&todayIncrease)
+ stats["today_increase"] = todayIncrease
+
+ var todayDecrease int64
+ todayQuery.Where("change_number < 0 AND DATE(created_at) = CURDATE()").Select("COALESCE(SUM(ABS(change_number)), 0)").Scan(&todayDecrease)
+ stats["today_decrease"] = todayDecrease
+
+ c.JSON(http.StatusOK, common.Success(stats))
+}
diff --git a/internal/handlers/admin_user_handler.go b/internal/handlers/admin_user_handler.go
new file mode 100644
index 0000000..8e3afe0
--- /dev/null
+++ b/internal/handlers/admin_user_handler.go
@@ -0,0 +1,633 @@
+package handlers
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/middleware"
+ "awesomeProject/internal/models"
+ "crypto/md5"
+ "fmt"
+ "github.com/google/uuid"
+ "net/http"
+ "strconv"
+ "time"
+
+ "github.com/gin-gonic/gin"
+ "gorm.io/gorm"
+)
+
+// AdminUserHandler 管理端用户处理器
+type AdminUserHandler struct{}
+
+// GetUsers 获取用户列表
+func (h *AdminUserHandler) GetUsers(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 分页参数
+ page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
+ pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10"))
+ if page < 1 {
+ page = 1
+ }
+ if pageSize < 1 || pageSize > 100 {
+ pageSize = 10
+ }
+
+ // 搜索参数
+ phone := c.Query("phone")
+ realName := c.Query("real_name")
+ systemRole := c.Query("system_role")
+ identityCode := c.Query("identity_code")
+
+ db := common.GetDB()
+ var users []models.User
+ var total int64
+
+ // 构建查询条件
+ query := db.Model(&models.User{})
+
+ // 如果是代理商,只能查看自己邀请的用户
+ if user.SystemRole == 1 {
+ query = query.Where("referrer_identity_code = ?", user.IdentityCode)
+ }
+
+ // 添加搜索条件
+ if phone != "" {
+ query = query.Where("phone LIKE ?", "%"+phone+"%")
+ }
+ if realName != "" {
+ query = query.Where("real_name LIKE ?", "%"+realName+"%")
+ }
+ if systemRole != "" {
+ query = query.Where("system_role = ?", systemRole)
+ } else {
+ query = query.Where("system_role > 0")
+ }
+ if identityCode != "" {
+ query = query.Where("identity_code LIKE ? OR referrer_identity_code LIKE ?", "%"+identityCode+"%", "%"+identityCode+"%")
+
+ }
+
+ // 获取总数
+ query.Count(&total)
+
+ // 分页查询
+ offset := (page - 1) * pageSize
+ err := query.Offset(offset).Limit(pageSize).Order("created_at DESC").Find(&users).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询用户列表失败"))
+ return
+ }
+
+ // 构建返回数据
+ result := map[string]interface{}{
+ "list": users,
+ "total": total,
+ "page": page,
+ "page_size": pageSize,
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// GetUser 获取单个用户信息
+func (h *AdminUserHandler) GetUser(c *gin.Context) {
+ userID, err := middleware.GetUserIDFromParam(c, "id")
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, err.Error()))
+ return
+ }
+
+ var user models.User
+ err = common.GetDB().First(&user, userID).Error
+ if err != nil {
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(404, "用户不存在"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "查询用户信息失败"))
+ }
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(user))
+}
+
+// CreateUser 创建用户(仅管理员)
+func (h *AdminUserHandler) CreateUser(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以创建用户
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ var newUser models.User
+ if err := c.ShouldBindJSON(&newUser); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "参数错误: "+err.Error()))
+ return
+ }
+
+ // 检查手机号是否已存在
+ var existUser models.User
+ if err := common.GetDB().Where("phone = ?", newUser.Phone).First(&existUser).Error; err == nil {
+ c.JSON(http.StatusOK, common.Error(400, "手机号已存在"))
+ return
+ }
+ if newUser.SystemRole == 1 {
+ newUser.IdentityCode = "T" + uuid.New().String()[:8]
+ } else {
+ newUser.IdentityCode = "U" + uuid.New().String()[:8]
+ }
+ if newUser.Password != "" {
+ newUser.Password = fmt.Sprintf("%x", md5.Sum([]byte(newUser.Password)))
+ }
+ // 保存用户
+ if err := common.GetDB().Create(&newUser).Error; err != nil {
+
+ c.JSON(http.StatusOK, common.Error(500, "创建用户失败"))
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(newUser))
+}
+
+// UpdateUser 更新用户信息(仅管理员)
+func (h *AdminUserHandler) UpdateUser(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以更新用户
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ userID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "用户ID无效"))
+ return
+ }
+
+ var updateData models.User
+ if err := c.ShouldBindJSON(&updateData); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "参数错误: "+err.Error()))
+ return
+ }
+ fmt.Println(updateData)
+ // 检查用户是否存在
+ var existUser models.User
+ if err := common.GetDB().First(&existUser, uint(userID)).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "用户不存在"))
+ return
+ }
+
+ // 更新用户信息
+ updateData.ID = uint(userID)
+ if updateData.Password != "" {
+ updateData.Password = fmt.Sprintf("%x", md5.Sum([]byte(updateData.Password)))
+ }
+ if err := common.GetDB().Model(&existUser).Updates(&updateData).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "更新用户信息失败"))
+ return
+ }
+ if err := common.GetDB().Model(&existUser).Updates(map[string]interface{}{
+ "status": updateData.Status,
+ }).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "更新用户信息失败"))
+ return
+ }
+ // 返回更新后的用户信息
+ var updatedUser models.User
+ common.GetDB().First(&updatedUser, uint(userID))
+
+ c.JSON(http.StatusOK, common.Success(updatedUser))
+}
+
+// DeleteUser 删除用户(仅管理员)
+func (h *AdminUserHandler) DeleteUser(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以删除用户
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ userID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "用户ID无效"))
+ return
+ }
+
+ // 检查用户是否存在
+ var existUser models.User
+ if err := common.GetDB().First(&existUser, uint(userID)).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "用户不存在"))
+ return
+ }
+
+ // 删除用户
+ if err := common.GetDB().Delete(&existUser).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "删除用户失败"))
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(nil))
+}
+
+// GetUserStats 获取用户统计信息
+func (h *AdminUserHandler) GetUserStats(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ db := common.GetDB()
+ stats := make(map[string]interface{})
+
+ // 如果是代理商,只统计自己邀请的用户
+ baseQuery := db.Model(&models.User{})
+ if user.SystemRole == 1 {
+ baseQuery = baseQuery.Where("referrer_identity_code = ?", user.IdentityCode)
+ }
+
+ // 总用户数
+ var totalUsers int64
+ baseQuery.Count(&totalUsers)
+ stats["total_users"] = totalUsers
+
+ // 按角色统计
+ var roleCounts []struct {
+ SystemRole uint8 `json:"system_role"`
+ Count int64 `json:"count"`
+ }
+
+ roleQuery := baseQuery
+ if user.SystemRole == 1 {
+ roleQuery = roleQuery.Where("referrer_identity_code = ?", user.IdentityCode)
+ }
+
+ roleQuery.Select("system_role, count(*) as count").Group("system_role").Scan(&roleCounts)
+ stats["role_counts"] = roleCounts
+
+ // 今日新增用户
+ var todayUsers int64
+ todayQuery := baseQuery
+ if user.SystemRole == 1 {
+ todayQuery = todayQuery.Where("referrer_identity_code = ?", user.IdentityCode)
+ }
+ todayQuery.Where("DATE(created_at) = CURDATE()").Count(&todayUsers)
+ stats["today_users"] = todayUsers
+
+ c.JSON(http.StatusOK, common.Success(stats))
+}
+
+// SetUserExpiryDate 设置用户过期时间(仅管理员)
+func (h *AdminUserHandler) SetUserExpiryDate(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 只有管理员可以设置用户过期时间
+ if user.SystemRole != 0 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ userID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "用户ID无效"))
+ return
+ }
+
+ var req struct {
+ ExpiryDate *string `json:"expiry_date"` // ISO 8601 格式,如 "2024-12-31T23:59:59Z",null表示永不过期
+ }
+
+ if err := c.ShouldBindJSON(&req); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "请求参数错误"))
+ return
+ }
+
+ db := common.GetDB()
+
+ // 检查用户是否存在
+ var targetUser models.User
+ if err := db.First(&targetUser, uint(userID)).Error; err != nil {
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(404, "用户不存在"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "查询用户失败"))
+ }
+ return
+ }
+
+ // 防止设置管理员的过期时间
+ if targetUser.SystemRole == 0 {
+ c.JSON(http.StatusOK, common.Error(400, "不能设置管理员的过期时间"))
+ return
+ }
+
+ // 解析过期时间
+ var expiryDate *time.Time
+ if req.ExpiryDate != nil && *req.ExpiryDate != "" {
+ parsedTime, err := time.Parse(time.RFC3339, *req.ExpiryDate)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "过期时间格式错误,请使用ISO 8601格式"))
+ return
+ }
+ expiryDate = &parsedTime
+ }
+
+ // 更新用户过期时间
+ if err := db.Model(&targetUser).Update("expiry_date", expiryDate).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "设置用户过期时间失败"))
+ return
+ }
+
+ var message string
+ if expiryDate == nil {
+ message = "用户已设置为永不过期"
+ } else {
+ message = fmt.Sprintf("用户过期时间已设置为:%s", expiryDate.Format("2006-01-02 15:04:05"))
+ }
+
+ c.JSON(http.StatusOK, common.Success(map[string]interface{}{
+ "message": message,
+ "expiry_date": expiryDate,
+ }))
+}
+
+// SearchUserStats 搜索用户统计信息
+func (h *AdminUserHandler) SearchUserStats(c *gin.Context) {
+ // 获取当前用户信息
+ currentUser, _ := c.Get("current_user")
+ currentUseruser := currentUser.(models.User)
+
+ // 仅管理员可访问
+ if currentUseruser.SystemRole > 1 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ query := c.Query("query")
+ if query == "" {
+ c.JSON(http.StatusOK, common.Error(400, "搜索条件不能为空"))
+ return
+ }
+
+ // 获取时间范围参数
+ startDate := c.Query("start_date")
+ endDate := c.Query("end_date")
+
+ db := common.GetDB()
+ var user models.User
+ //err2 := db.Where("id=?", currentUseruser.ID).First(¤tUseruser).Error
+ //if err2 != nil {
+ // c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ // return
+ //}
+ // 按手机号或姓名搜索用户
+ err := db.Where("phone = ? OR customer_name LIKE ? OR real_name LIKE ?",
+ query, "%"+query+"%", "%"+query+"%").First(&user).Error
+
+ if err != nil {
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(404, "未找到匹配的用户"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "查询用户失败"))
+ }
+ return
+ }
+ if currentUseruser.SystemRole == 1 && user.ReferrerIdentityCode != currentUseruser.IdentityCode {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+ // 统计该用户的数据
+ stats := make(map[string]interface{})
+
+ // 构建采购订单查询
+ purchaseQuery := db.Model(&models.PurchaseOrder{}).Where("buyer_id = ? and order_status=?", user.ID, 2)
+ if startDate != "" && endDate != "" {
+ purchaseQuery = purchaseQuery.Where("created_at >= ? AND created_at <= ?", startDate+" 00:00:00", endDate+" 23:59:59")
+ }
+
+ // 采购订单统计
+ var purchaseOrdersCount int64
+ var totalPurchaseAmount float64
+ purchaseQuery.Count(&purchaseOrdersCount)
+ purchaseQuery.Select("COALESCE(SUM(total_amount), 0)").Scan(&totalPurchaseAmount)
+
+ // 构建销售订单查询
+ salesQuery := db.Model(&models.SalesOrder{}).Where("seller_id = ? and order_status=?", user.ID, 2)
+ if startDate != "" && endDate != "" {
+ salesQuery = salesQuery.Where("created_at >= ? AND created_at <= ?", startDate+" 00:00:00", endDate+" 23:59:59")
+ }
+
+ // 销售订单统计
+ var salesOrdersCount int64
+ var totalSalesAmount float64
+ salesQuery.Count(&salesOrdersCount)
+ salesQuery.Select("COALESCE(SUM(total_amount), 0)").Scan(&totalSalesAmount)
+
+ // 库存统计
+ var warehouseItemsCount int64
+ var totalWarehouseQuantity int64
+ if startDate != "" && endDate != "" {
+ db.Model(&models.UserWarehouse{}).Where("user_id = ? and created_at >= ? AND created_at <= ?", user.ID, startDate+" 00:00:00", endDate+" 23:59:59").Count(&warehouseItemsCount)
+ db.Model(&models.UserWarehouse{}).Where("user_id = ? and created_at >= ? AND created_at <= ?", user.ID, startDate+" 00:00:00", endDate+" 23:59:59").Select("COALESCE(SUM(quantity), 0)").Scan(&totalWarehouseQuantity)
+
+ } else {
+ db.Model(&models.UserWarehouse{}).Where("user_id = ? ", user.ID).Count(&warehouseItemsCount)
+ db.Model(&models.UserWarehouse{}).Where("user_id = ? ", user.ID).Select("COALESCE(SUM(quantity), 0)").Scan(&totalWarehouseQuantity)
+
+ }
+
+ // 积分余额
+ var scoreBalance int
+ //db.Model(&models.ScoreRecord{}).Where("user_id = ?", user.ID).Select("COALESCE(SUM(score_change), 0)").Scan(&scoreBalance)
+ scoreBalance = user.CurrentPoints
+ // 最后活动时间(最近的订单时间)
+ var lastActivityTime *time.Time
+ var lastPurchaseTime, lastSalesTime time.Time
+
+ // 查找最近的采购订单时间
+ db.Model(&models.PurchaseOrder{}).Where("user_id = ?", user.ID).
+ Select("created_at").Order("created_at DESC").Limit(1).Scan(&lastPurchaseTime)
+
+ // 查找最近的销售订单时间
+ db.Model(&models.SalesOrder{}).Where("user_id = ?", user.ID).
+ Select("created_at").Order("created_at DESC").Limit(1).Scan(&lastSalesTime)
+
+ // 取两个时间中的最大值
+ if !lastPurchaseTime.IsZero() && !lastSalesTime.IsZero() {
+ if lastPurchaseTime.After(lastSalesTime) {
+ lastActivityTime = &lastPurchaseTime
+ } else {
+ lastActivityTime = &lastSalesTime
+ }
+ } else if !lastPurchaseTime.IsZero() {
+ lastActivityTime = &lastPurchaseTime
+ } else if !lastSalesTime.IsZero() {
+ lastActivityTime = &lastSalesTime
+ }
+
+ stats["purchase_orders_count"] = purchaseOrdersCount
+ stats["total_purchase_amount"] = totalPurchaseAmount
+ stats["sales_orders_count"] = salesOrdersCount
+ stats["total_sales_amount"] = totalSalesAmount
+ stats["warehouse_items_count"] = warehouseItemsCount
+ stats["total_warehouse_quantity"] = totalWarehouseQuantity
+ stats["score_balance"] = scoreBalance
+ stats["last_activity_time"] = lastActivityTime
+
+ result := map[string]interface{}{
+ "user": user,
+ "stats": stats,
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// GetAllUserWarehouses 获取所有用户库存汇总(管理员专用)
+func (h *AdminUserHandler) GetAllUserWarehouses(c *gin.Context) {
+ // 获取当前用户信息
+ currentUser, _ := c.Get("current_user")
+ currentUseruser := currentUser.(models.User)
+
+ // 仅管理员可访问
+ if currentUseruser.SystemRole > 1 {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ // 分页参数
+ page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
+ pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10"))
+ if page < 1 {
+ page = 1
+ }
+ if pageSize < 1 || pageSize > 100 {
+ pageSize = 10
+ }
+
+ // 搜索参数
+ searchQuery := c.Query("search") // 搜索手机号或姓名
+ productType := c.Query("product_type") // 商品类型:1一级商品,2二级商品
+ status := c.Query("status") // 状态:0已出售,1库存中
+
+ db := common.GetDB()
+
+ // 构建库存记录查询(带用户信息)
+ warehouseQuery := db.Model(&models.UserWarehouse{}).
+ Select("user_warehouse.*, users.phone, users.customer_name, users.real_name").
+ Joins("JOIN users ON users.id = user_warehouse.user_id")
+
+ // 搜索用户(基于手机号或姓名)
+ if searchQuery != "" {
+ warehouseQuery = warehouseQuery.Where("users.phone LIKE ? OR users.customer_name LIKE ? OR users.real_name LIKE ?",
+ "%"+searchQuery+"%", "%"+searchQuery+"%", "%"+searchQuery+"%")
+ }
+
+ // 应用商品类型筛选
+ if productType != "" {
+ warehouseQuery = warehouseQuery.Where("user_warehouse.product_type = ?", productType)
+ }
+
+ // 应用状态筛选
+ if status != "" {
+ warehouseQuery = warehouseQuery.Where("user_warehouse.status = ?", status)
+ }
+
+ // 获取总数
+ var total int64
+ warehouseQuery.Count(&total)
+
+ // 分页查询库存记录
+ var userWarehouses []models.UserWarehouse
+ offset := (page - 1) * pageSize
+ err := warehouseQuery.Offset(offset).Limit(pageSize).Order("user_warehouse.created_at DESC").Find(&userWarehouses).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询用户库存列表失败"))
+ return
+ }
+
+ // 转换数据结构以包含用户信息,并按用户ID、商品类型、商品名称、状态聚合
+ var resultList []struct {
+ UserID uint `json:"user_id"`
+ Phone string `json:"phone"`
+ CustomerName string `json:"customer_name"`
+ RealName string `json:"real_name"`
+ ProductType uint8 `json:"product_type"`
+ ProductName string `json:"product_name"`
+ TotalQuantity int `json:"total_quantity"`
+ TotalValue float64 `json:"total_value"`
+ Status uint8 `json:"status"`
+ }
+
+ // 按用户ID、商品类型、商品名称、状态聚合库存
+ userWarehouseMap := make(map[string]*struct {
+ UserID uint `json:"user_id"`
+ Phone string `json:"phone"`
+ CustomerName string `json:"customer_name"`
+ RealName string `json:"real_name"`
+ ProductType uint8 `json:"product_type"`
+ ProductName string `json:"product_name"`
+ TotalQuantity int `json:"total_quantity"`
+ TotalValue float64 `json:"total_value"`
+ Status uint8 `json:"status"`
+ })
+
+ for _, warehouse := range userWarehouses {
+ // 生成唯一键:用户ID_商品类型_商品名称_状态
+ key := fmt.Sprintf("%d_%d_%s_%d", warehouse.UserID, warehouse.ProductType, warehouse.ProductName, warehouse.Status)
+
+ // 获取用户信息(第一次出现时)
+ var user models.User
+ db.First(&user, warehouse.UserID)
+
+ if item, exists := userWarehouseMap[key]; exists {
+ // 累加数量和价值
+ item.TotalQuantity += warehouse.Quantity
+ item.TotalValue += float64(warehouse.Quantity) * warehouse.WarehousePrice
+ } else {
+ // 创建新的聚合记录
+ userWarehouseMap[key] = &struct {
+ UserID uint `json:"user_id"`
+ Phone string `json:"phone"`
+ CustomerName string `json:"customer_name"`
+ RealName string `json:"real_name"`
+ ProductType uint8 `json:"product_type"`
+ ProductName string `json:"product_name"`
+ TotalQuantity int `json:"total_quantity"`
+ TotalValue float64 `json:"total_value"`
+ Status uint8 `json:"status"`
+ }{
+ UserID: warehouse.UserID,
+ Phone: user.Phone,
+ CustomerName: user.CustomerName,
+ RealName: user.RealName,
+ ProductType: warehouse.ProductType,
+ ProductName: warehouse.ProductName,
+ TotalQuantity: warehouse.Quantity,
+ TotalValue: float64(warehouse.Quantity) * warehouse.WarehousePrice,
+ Status: warehouse.Status,
+ }
+ }
+ }
+
+ // 转换为切片
+ for _, item := range userWarehouseMap {
+ resultList = append(resultList, *item)
+ }
+
+ // 构建返回数据
+ result := map[string]interface{}{
+ "list": resultList,
+ "total": total,
+ "page": page,
+ "page_size": pageSize,
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
diff --git a/internal/handlers/auth_handler.go b/internal/handlers/auth_handler.go
new file mode 100644
index 0000000..cda7983
--- /dev/null
+++ b/internal/handlers/auth_handler.go
@@ -0,0 +1,372 @@
+package handlers
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/models"
+ "awesomeProject/internal/services"
+ jwtutil "awesomeProject/pkg/utils"
+ "crypto/md5"
+ "fmt"
+ "github.com/google/uuid"
+ "net/http"
+ "strings"
+
+ "github.com/gin-gonic/gin"
+ "gorm.io/gorm"
+)
+
+// AuthHandler 认证处理器
+type AuthHandler struct{}
+
+// LoginRequest 登录请求结构
+type LoginRequest struct {
+ Phone string `json:"phone" binding:"required"`
+ Password string `json:"password" binding:"required"`
+}
+
+// LoginResponse 登录响应结构
+type LoginResponse struct {
+ Token string `json:"token"`
+ User models.User `json:"user"`
+}
+type TokenGen struct {
+ UserID uint `json:"user_id"`
+ Phone string `json:"phone"`
+ SystemRole int8 `json:"system_role"`
+}
+
+// Login 用户登录
+func (h *AuthHandler) Login(c *gin.Context) {
+ var req LoginRequest
+ if err := c.ShouldBindJSON(&req); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "参数错误: "+err.Error()))
+ return
+ }
+
+ // 查询用户
+ var user models.User
+ err := common.GetDB().Where("phone = ?", req.Phone).First(&user).Error
+
+ if err != nil {
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(401, "手机号或密码错误"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "登录失败"))
+ }
+ return
+ }
+
+ // 验证密码(这里简单使用MD5,实际应该使用bcrypt)
+ hashedPassword := fmt.Sprintf("%x", md5.Sum([]byte(req.Password)))
+ fmt.Println(hashedPassword)
+ if user.Password != hashedPassword {
+ c.JSON(http.StatusOK, common.Error(404, "手机号或密码错误"))
+ return
+ }
+
+ // 检查用户状态
+ if user.Status != 1 {
+ c.JSON(http.StatusOK, common.Error(404, "用户已被禁用,请联系管理员"))
+ return
+ }
+
+ // 生成JWT token
+ claims := TokenGen{
+ UserID: user.ID,
+ Phone: user.Phone,
+ SystemRole: int8(user.SystemRole),
+ }
+
+ token, err := jwtutil.GenerateToken(claims)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "生成token失败"))
+ return
+ }
+
+ // 返回登录结果
+ response := LoginResponse{
+ Token: token,
+ User: user,
+ }
+
+ c.JSON(http.StatusOK, common.Success(response))
+}
+
+// RegisterRequest 注册请求结构体
+type RegisterRequest struct {
+ models.User
+ SMSCode string `json:"sms_code"` // 短信验证码
+}
+
+// Register 用户注册
+func (h *AuthHandler) Register(c *gin.Context) {
+ var req RegisterRequest
+ if err := c.ShouldBindJSON(&req); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "参数错误: "+err.Error()))
+ return
+ }
+
+ // 验证短信验证码(必填)
+ if req.SMSCode == "" {
+ c.JSON(http.StatusOK, common.Error(400, "请输入短信验证码"))
+ return
+ }
+
+ // 验证短信验证码
+ smsService := services.GetSMSService()
+ if !smsService.VerifyCode(req.Phone, req.SMSCode) {
+ c.JSON(http.StatusOK, common.Error(400, "短信验证码错误或已过期"))
+ return
+ }
+
+ // 检查手机号是否已存在
+ var existUser models.User
+ if err := common.GetDB().Where("phone = ?", req.Phone).First(&existUser).Error; err == nil {
+ c.JSON(http.StatusOK, common.Error(400, "手机号已被注册"))
+ return
+ }
+
+ user := req.User
+
+ // 生成身份码(简单实现,实际应该使用更复杂的算法)
+ user.IdentityCode = fmt.Sprintf("U%v", uuid.New().String()[:8])
+
+ // 密码加密(这里简单使用MD5,实际应该使用bcrypt)
+ hashedPassword := fmt.Sprintf("%x", md5.Sum([]byte(user.Password)))
+ user.Password = hashedPassword
+
+ // 默认为普通用户
+ if user.SystemRole == 0 {
+ user.SystemRole = 2
+
+ }
+ user.Status = 0
+ // 保存用户
+ if err := common.GetDB().Create(&user).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "注册失败"))
+ return
+ }
+
+ common.GetDB().Model(&user).Update("status", 0)
+
+ c.JSON(http.StatusOK, common.Success(user))
+}
+
+// GetCurrentUser 获取当前用户信息
+func (h *AuthHandler) GetCurrentUser(c *gin.Context) {
+ // 从token中获取用户信息
+ tokenMap, exists := c.Get("tokenMap")
+ if !exists {
+ c.JSON(http.StatusOK, common.Error(401, "未授权访问"))
+ return
+ }
+
+ claims := tokenMap.(map[string]interface{})
+ userIDFloat, ok := claims["user_id"].(float64)
+ if !ok {
+ c.JSON(http.StatusOK, common.Error(401, "用户信息无效"))
+ return
+ }
+
+ userID := uint(userIDFloat)
+
+ // 查询用户信息
+ var user models.User
+ if err := common.GetDB().First(&user, userID).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "用户不存在"))
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(user))
+}
+
+// UpdateProfileRequest 更新个人信息请求结构体
+type UpdateProfileRequest struct {
+ CustomerName string `json:"customer_name" binding:"required"`
+ RealName string `json:"real_name" binding:"required"`
+ Avatar string `json:"avatar"`
+ CompanyName string `json:"company_name"`
+ PersonalIntro string `json:"personal_intro"`
+ BusinessLicense string `json:"business_license"`
+ IDCardFront string `json:"id_card_front"`
+ IDCardBack string `json:"id_card_back"`
+ MainPaymentCode string `json:"main_payment_code"`
+ BackupPaymentCode string `json:"backup_payment_code"`
+ Phone string `json:"phone"`
+}
+
+// UpdateProfile 更新个人信息
+func (h *AuthHandler) UpdateProfile(c *gin.Context) {
+ // 从token中获取用户信息
+ tokenMap, exists := c.Get("tokenMap")
+ if !exists {
+ c.JSON(http.StatusOK, common.Error(401, "未授权访问"))
+ return
+ }
+
+ claims := tokenMap.(map[string]interface{})
+ userIDFloat, ok := claims["user_id"].(float64)
+ if !ok {
+ c.JSON(http.StatusOK, common.Error(401, "用户信息无效"))
+ return
+ }
+
+ userID := uint(userIDFloat)
+
+ var req UpdateProfileRequest
+ if err := c.ShouldBindJSON(&req); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "参数错误: "+err.Error()))
+ return
+ }
+
+ // 查询当前用户
+ var user models.User
+ if err := common.GetDB().First(&user, userID).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "用户不存在"))
+ return
+ }
+
+ // 更新用户信息
+ updateData := models.User{
+ CustomerName: req.CustomerName,
+ RealName: req.RealName,
+ Avatar: req.Avatar,
+ CompanyName: req.CompanyName,
+ PersonalIntro: req.PersonalIntro,
+ BusinessLicenseImage: req.BusinessLicense,
+ IdCardFrontImage: req.IDCardFront,
+ IdCardBackImage: req.IDCardBack,
+ MainPaymentQrImage: &req.MainPaymentCode,
+ SubPaymentQrImage: &req.BackupPaymentCode,
+ Phone: req.Phone,
+ }
+
+ updateData.ID = userID
+ if err := common.GetDB().Model(&user).Updates(&updateData).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "更新个人信息失败"))
+ return
+ }
+
+ // 返回更新后的用户信息
+ var updatedUser models.User
+ common.GetDB().First(&updatedUser, userID)
+
+ c.JSON(http.StatusOK, common.Success(updatedUser))
+}
+
+// ChangePasswordRequest 修改密码请求结构体
+type ChangePasswordRequest struct {
+ CurrentPassword string `json:"current_password" binding:"required"`
+ NewPassword string `json:"new_password" binding:"required"`
+}
+
+// ChangePassword 修改密码
+func (h *AuthHandler) ChangePassword(c *gin.Context) {
+ // 从token中获取用户信息
+ tokenMap, exists := c.Get("tokenMap")
+ if !exists {
+ c.JSON(http.StatusOK, common.Error(401, "未授权访问"))
+ return
+ }
+
+ claims := tokenMap.(map[string]interface{})
+ userIDFloat, ok := claims["user_id"].(float64)
+ if !ok {
+ c.JSON(http.StatusOK, common.Error(401, "用户信息无效"))
+ return
+ }
+
+ userID := uint(userIDFloat)
+
+ var req ChangePasswordRequest
+ if err := c.ShouldBindJSON(&req); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "参数错误: "+err.Error()))
+ return
+ }
+
+ // 查询当前用户
+ var user models.User
+ if err := common.GetDB().First(&user, userID).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "用户不存在"))
+ return
+ }
+
+ // 验证当前密码
+ hashedCurrentPassword := fmt.Sprintf("%x", md5.Sum([]byte(req.CurrentPassword)))
+ if hashedCurrentPassword != user.Password {
+ c.JSON(http.StatusOK, common.Error(400, "当前密码错误"))
+ return
+ }
+
+ // 加密新密码
+ hashedNewPassword := fmt.Sprintf("%x", md5.Sum([]byte(req.NewPassword)))
+
+ // 更新密码
+ if err := common.GetDB().Model(&user).Update("password", hashedNewPassword).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "修改密码失败"))
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(nil))
+}
+
+// SendSMSRequest 发送短信验证码请求结构体
+type SendSMSRequest struct {
+ Phone string `json:"phone" binding:"required"`
+}
+
+// SendSMS 发送短信验证码
+func (h *AuthHandler) SendSMS(c *gin.Context) {
+ var req SendSMSRequest
+ if err := c.ShouldBindJSON(&req); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "参数错误: "+err.Error()))
+ return
+ }
+
+ // 获取客户端IP地址
+ clientIP := getClientIP(c)
+
+ // 调用短信服务发送验证码
+ smsService := services.GetSMSService()
+ code, err := smsService.SendSMS(req.Phone, clientIP)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, err.Error()))
+ return
+ }
+
+ // 根据环境决定是否返回验证码(开发环境返回,生产环境不返回)
+ config := common.MineConfig
+ response := map[string]interface{}{
+ "message": "验证码已发送",
+ }
+
+ // 仅在开发环境返回验证码,方便测试
+ if config != nil && config.App.Env == "development" {
+ response["code"] = code
+ }
+
+ c.JSON(http.StatusOK, common.Success(response))
+}
+
+// getClientIP 获取客户端真实IP地址
+func getClientIP(c *gin.Context) string {
+ // 优先从 X-Forwarded-For 获取(经过代理时)
+ ip := c.GetHeader("X-Forwarded-For")
+ if ip != "" {
+ // X-Forwarded-For 可能包含多个IP,取第一个
+ ips := strings.Split(ip, ",")
+ if len(ips) > 0 {
+ return strings.TrimSpace(ips[0])
+ }
+ }
+
+ // 从 X-Real-IP 获取
+ ip = c.GetHeader("X-Real-IP")
+ if ip != "" {
+ return strings.TrimSpace(ip)
+ }
+
+ // 最后从 RemoteAddr 获取
+ ip = c.ClientIP()
+ return ip
+}
diff --git a/internal/handlers/init_handler.go b/internal/handlers/init_handler.go
new file mode 100644
index 0000000..7f8e157
--- /dev/null
+++ b/internal/handlers/init_handler.go
@@ -0,0 +1,164 @@
+package handlers
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/models"
+ "crypto/md5"
+ "fmt"
+ "log"
+
+ "gorm.io/gorm"
+)
+
+// InitHandler 初始化处理器
+type InitHandler struct{}
+
+// InitDefaultAdmin 初始化默认管理员
+func (h *InitHandler) InitDefaultAdmin() error {
+ db := common.GetDB()
+
+ // 检查是否已有管理员用户
+ var adminCount int64
+ db.Model(&models.User{}).Where("system_role = 0").Count(&adminCount)
+ if adminCount > 0 {
+ return nil // 已有管理员,不重复创建
+ }
+
+ // 创建默认管理员
+ hashedPassword := fmt.Sprintf("%x", md5.Sum([]byte("admin123")))
+ admin := models.User{
+ Phone: "13800138000",
+ SystemRole: 0, // 管理员
+ CustomerName: "系统管理员",
+ RealName: "Administrator",
+ Password: hashedPassword,
+ Status: 1,
+ }
+
+ if err := db.Create(&admin).Error; err != nil {
+ return fmt.Errorf("创建默认管理员失败: %v", err)
+ }
+
+ // 更新身份码
+ admin.IdentityCode = fmt.Sprintf("A%08d", admin.ID)
+ if err := db.Model(&admin).Update("identity_code", admin.IdentityCode).Error; err != nil {
+ return fmt.Errorf("更新管理员身份码失败: %v", err)
+ }
+
+ log.Printf("默认管理员创建成功: 手机号: %s, 密码: admin123", admin.Phone)
+ return nil
+}
+
+// InitDefaultAgent 初始化默认代理商(可选)
+func (h *InitHandler) InitDefaultAgent() error {
+ db := common.GetDB()
+
+ // 检查是否已有代理商用户
+ var agent models.User
+ err := db.Where("phone = ?", "13800138001").First(&agent).Error
+ if err == nil {
+ return nil // 代理商已存在
+ } else if err != gorm.ErrRecordNotFound {
+ return fmt.Errorf("查询代理商失败: %v", err)
+ }
+
+ // 创建默认代理商
+ hashedPassword := fmt.Sprintf("%x", md5.Sum([]byte("agent123")))
+ agentUser := models.User{
+ Phone: "13800138001",
+ SystemRole: 1, // 代理商
+ CustomerName: "测试代理商",
+ RealName: "Test Agent",
+ Password: hashedPassword,
+ Status: 1,
+ }
+
+ if err := db.Create(&agentUser).Error; err != nil {
+ return fmt.Errorf("创建默认代理商失败: %v", err)
+ }
+
+ // 更新身份码
+ agentUser.IdentityCode = fmt.Sprintf("T%08d", agentUser.ID)
+ if err := db.Model(&agentUser).Update("identity_code", agentUser.IdentityCode).Error; err != nil {
+ return fmt.Errorf("更新代理商身份码失败: %v", err)
+ }
+
+ log.Printf("默认代理商创建成功: 手机号: %s, 密码: agent123", agentUser.Phone)
+ return nil
+}
+
+// InitTestUsers 初始化测试用户
+func (h *InitHandler) InitTestUsers() error {
+ db := common.GetDB()
+
+ // 获取代理商身份码
+ var agent models.User
+ if err := db.Where("system_role = 1").First(&agent).Error; err != nil {
+ return nil // 没有代理商,跳过创建测试用户
+ }
+
+ // 创建测试用户
+ testUsers := []models.User{
+ {
+ Phone: "13800138002",
+ SystemRole: 2, // 普通用户
+ CustomerName: "测试用户1",
+ RealName: "Test User 1",
+ Password: fmt.Sprintf("%x", md5.Sum([]byte("user123"))),
+ ReferrerIdentityCode: agent.IdentityCode,
+ Status: 1,
+ },
+ {
+ Phone: "13800138003",
+ SystemRole: 2, // 普通用户
+ CustomerName: "测试用户2",
+ RealName: "Test User 2",
+ Password: fmt.Sprintf("%x", md5.Sum([]byte("user123"))),
+ ReferrerIdentityCode: agent.IdentityCode,
+ Status: 1,
+ },
+ }
+
+ for i, user := range testUsers {
+ // 检查用户是否已存在
+ var existUser models.User
+ if err := db.Where("phone = ?", user.Phone).First(&existUser).Error; err == nil {
+ continue // 用户已存在,跳过
+ }
+
+ if err := db.Create(&user).Error; err != nil {
+ return fmt.Errorf("创建测试用户失败: %v", err)
+ }
+
+ // 更新身份码
+ user.IdentityCode = fmt.Sprintf("U%08d", user.ID)
+ if err := db.Model(&user).Update("identity_code", user.IdentityCode).Error; err != nil {
+ return fmt.Errorf("更新用户身份码失败: %v", err)
+ }
+
+ testUsers[i] = user
+ log.Printf("测试用户创建成功: 手机号: %s, 密码: user123", user.Phone)
+ }
+
+ return nil
+}
+
+// InitAll 初始化所有数据
+func (h *InitHandler) InitAll() error {
+ // 初始化默认管理员
+ if err := h.InitDefaultAdmin(); err != nil {
+ return err
+ }
+
+ // 初始化默认代理商
+ if err := h.InitDefaultAgent(); err != nil {
+ return err
+ }
+
+ // 初始化测试用户
+ if err := h.InitTestUsers(); err != nil {
+ return err
+ }
+
+ return nil
+}
\ No newline at end of file
diff --git a/internal/handlers/uploadHandler.go b/internal/handlers/uploadHandler.go
new file mode 100644
index 0000000..1cf6372
--- /dev/null
+++ b/internal/handlers/uploadHandler.go
@@ -0,0 +1,309 @@
+package handlers
+
+import (
+ "awesomeProject/internal/common"
+ "crypto/md5"
+ "fmt"
+ "github.com/gin-gonic/gin"
+ "io"
+ "net/http"
+ "os"
+ "path/filepath"
+ "strings"
+ "time"
+)
+
+// UploadHandler 文件上传处理器
+type UploadHandler struct{}
+
+// NewUploadHandler 创建文件上传处理器实例
+func NewUploadHandler() *UploadHandler {
+ return &UploadHandler{}
+}
+
+// UploadResponse 上传响应
+type UploadResponse struct {
+ FileName string `json:"fileName"` // 原文件名
+ NewFileName string `json:"newFileName"` // 新文件名
+ URL string `json:"url"` // 访问URL
+ Size int64 `json:"size"` // 文件大小(字节)
+ Type string `json:"type"` // 文件类型
+}
+
+// UploadFile 上传文件
+func (h *UploadHandler) UploadFile(c *gin.Context) {
+ // 获取上传的文件
+ file, header, err := c.Request.FormFile("file")
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "获取上传文件失败: "+err.Error()))
+ return
+ }
+ defer file.Close()
+
+ // 检查文件大小限制 (10MB)
+ maxSize := int64(10 * 1024 * 1024) // 10MB
+ if header.Size > maxSize {
+ c.JSON(http.StatusOK, common.Error(500, "文件大小超过限制(最大10MB)"))
+ return
+ }
+
+ // 检查文件类型
+ if !isAllowedFileType(header.Filename) {
+ c.JSON(http.StatusOK, common.Error(500, "不支持的文件类型"))
+ return
+ }
+
+ // 创建保存目录
+ saveDir := "./public/file"
+ if err := os.MkdirAll(saveDir, os.ModePerm); err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "创建保存目录失败: "+err.Error()))
+ return
+ }
+
+ // 生成新的文件名
+ newFileName, err := generateFileName(header.Filename, file)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "生成文件名失败: "+err.Error()))
+ return
+ }
+
+ // 完整的保存路径
+ savePath := filepath.Join(saveDir, newFileName)
+
+ // 保存文件
+ if err := saveUploadedFile(file, savePath); err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "保存文件失败: "+err.Error()))
+ return
+ }
+
+ // 构建响应
+ response := UploadResponse{
+ FileName: header.Filename,
+ NewFileName: newFileName,
+ URL: "/back/file/" + newFileName,
+ Size: header.Size,
+ Type: getFileType(header.Filename),
+ }
+
+ c.JSON(http.StatusOK, common.Success(response))
+}
+
+// generateFileName 生成唯一的文件名
+func generateFileName(originalName string, file io.Reader) (string, error) {
+ // 获取文件扩展名
+ ext := filepath.Ext(originalName)
+
+ // 重置文件指针到开头
+ if seeker, ok := file.(io.Seeker); ok {
+ seeker.Seek(0, 0)
+ }
+
+ // 读取文件内容用于生成哈希
+ hasher := md5.New()
+ if _, err := io.Copy(hasher, file); err != nil {
+ return "", err
+ }
+
+ // 重置文件指针到开头
+ if seeker, ok := file.(io.Seeker); ok {
+ seeker.Seek(0, 0)
+ }
+
+ // 生成文件名:时间戳 + MD5哈希前8位 + 扩展名
+ timestamp := time.Now().Format("20060102150405")
+ hash := fmt.Sprintf("%x", hasher.Sum(nil))[:8]
+ newName := fmt.Sprintf("%s_%s%s", timestamp, hash, ext)
+
+ return newName, nil
+}
+
+// saveUploadedFile 保存上传的文件
+func saveUploadedFile(src io.Reader, dst string) error {
+ out, err := os.Create(dst)
+ if err != nil {
+ return err
+ }
+ defer out.Close()
+
+ _, err = io.Copy(out, src)
+ return err
+}
+
+// isAllowedFileType 检查是否为允许的文件类型
+func isAllowedFileType(filename string) bool {
+ ext := strings.ToLower(filepath.Ext(filename))
+
+ // 允许的文件类型
+ allowedTypes := map[string]bool{
+ // 图片类型
+ ".jpg": true,
+ ".jpeg": true,
+ ".png": true,
+ ".gif": true,
+ ".bmp": true,
+ ".webp": true,
+ ".svg": true,
+ // 文档类型
+ ".pdf": true,
+ ".doc": true,
+ ".docx": true,
+ ".xls": true,
+ ".xlsx": true,
+ ".ppt": true,
+ ".pptx": true,
+ ".txt": true,
+ ".rtf": true,
+ // 压缩包类型
+ ".zip": true,
+ ".rar": true,
+ ".7z": true,
+ ".tar": true,
+ ".gz": true,
+ // 视频类型
+ ".mp4": true,
+ ".avi": true,
+ ".mov": true,
+ ".wmv": true,
+ ".flv": true,
+ ".webm": true,
+ // 音频类型
+ ".mp3": true,
+ ".wav": true,
+ ".flac": true,
+ ".aac": true,
+ ".ogg": true,
+ }
+
+ return allowedTypes[ext]
+}
+
+// getFileType 获取文件类型
+func getFileType(filename string) string {
+ ext := strings.ToLower(filepath.Ext(filename))
+
+ imageTypes := map[string]bool{
+ ".jpg": true, ".jpeg": true, ".png": true, ".gif": true,
+ ".bmp": true, ".webp": true, ".svg": true,
+ }
+
+ documentTypes := map[string]bool{
+ ".pdf": true, ".doc": true, ".docx": true, ".xls": true,
+ ".xlsx": true, ".ppt": true, ".pptx": true, ".txt": true, ".rtf": true,
+ }
+
+ videoTypes := map[string]bool{
+ ".mp4": true, ".avi": true, ".mov": true, ".wmv": true,
+ ".flv": true, ".webm": true,
+ }
+
+ audioTypes := map[string]bool{
+ ".mp3": true, ".wav": true, ".flac": true, ".aac": true, ".ogg": true,
+ }
+
+ archiveTypes := map[string]bool{
+ ".zip": true, ".rar": true, ".7z": true, ".tar": true, ".gz": true,
+ }
+
+ if imageTypes[ext] {
+ return "image"
+ } else if documentTypes[ext] {
+ return "document"
+ } else if videoTypes[ext] {
+ return "video"
+ } else if audioTypes[ext] {
+ return "audio"
+ } else if archiveTypes[ext] {
+ return "archive"
+ }
+
+ return "other"
+}
+
+// BatchUploadFiles 批量上传文件
+func (h *UploadHandler) BatchUploadFiles(c *gin.Context) {
+ form, err := c.MultipartForm()
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "获取上传文件失败: "+err.Error()))
+ return
+ }
+
+ files := form.File["files"]
+ if len(files) == 0 {
+ c.JSON(http.StatusOK, common.Error(500, "没有选择文件"))
+ return
+ }
+
+ // 限制批量上传数量
+ if len(files) > 10 {
+ c.JSON(http.StatusOK, common.Error(500, "一次最多上传10个文件"))
+ return
+ }
+
+ var responses []UploadResponse
+ var failedFiles []string
+
+ // 创建保存目录
+ saveDir := "./public/file"
+ if err := os.MkdirAll(saveDir, os.ModePerm); err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "创建保存目录失败: "+err.Error()))
+ return
+ }
+
+ for _, header := range files {
+ // 检查文件大小
+ if header.Size > int64(10*1024*1024) {
+ failedFiles = append(failedFiles, header.Filename+" (文件过大)")
+ continue
+ }
+
+ // 检查文件类型
+ if !isAllowedFileType(header.Filename) {
+ failedFiles = append(failedFiles, header.Filename+" (不支持的类型)")
+ continue
+ }
+
+ // 打开文件
+ file, err := header.Open()
+ if err != nil {
+ failedFiles = append(failedFiles, header.Filename+" (打开失败)")
+ continue
+ }
+
+ // 生成新文件名
+ newFileName, err := generateFileName(header.Filename, file)
+ if err != nil {
+ file.Close()
+ failedFiles = append(failedFiles, header.Filename+" (生成文件名失败)")
+ continue
+ }
+
+ // 保存文件
+ savePath := filepath.Join(saveDir, newFileName)
+ if err := saveUploadedFile(file, savePath); err != nil {
+ file.Close()
+ failedFiles = append(failedFiles, header.Filename+" (保存失败)")
+ continue
+ }
+
+ file.Close()
+
+ // 添加到成功列表
+ responses = append(responses, UploadResponse{
+ FileName: header.Filename,
+ NewFileName: newFileName,
+ URL: "/back/file/" + newFileName,
+ Size: header.Size,
+ Type: getFileType(header.Filename),
+ })
+ }
+
+ result := map[string]interface{}{
+ "success": responses,
+ "failed": failedFiles,
+ "totalCount": len(files),
+ "successCount": len(responses),
+ "failedCount": len(failedFiles),
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
diff --git a/internal/handlers/user_address_handler.go b/internal/handlers/user_address_handler.go
new file mode 100644
index 0000000..5d9adcf
--- /dev/null
+++ b/internal/handlers/user_address_handler.go
@@ -0,0 +1,227 @@
+package handlers
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/models"
+ "net/http"
+ "strconv"
+
+ "github.com/gin-gonic/gin"
+ "gorm.io/gorm"
+)
+
+// UserAddressHandler 用户收货地址处理器
+type UserAddressHandler struct{}
+
+// GetAddressList 获取用户收货地址列表
+func (h *UserAddressHandler) GetAddressList(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ var addresses []models.UserAddress
+ err := common.GetDB().Where("user_id = ?", user.ID).Order("is_default DESC, created_at DESC").Find(&addresses).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "获取收货地址失败"))
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(addresses))
+}
+
+// GetAddress 获取单个收货地址
+func (h *UserAddressHandler) GetAddress(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ addressID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "地址ID无效"))
+ return
+ }
+
+ var address models.UserAddress
+ err = common.GetDB().Where("id = ? AND user_id = ?", addressID, user.ID).First(&address).Error
+ if err != nil {
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(404, "收货地址不存在"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "获取收货地址失败"))
+ }
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(address))
+}
+
+// CreateAddress 创建收货地址
+func (h *UserAddressHandler) CreateAddress(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ var address models.UserAddress
+ if err := c.ShouldBindJSON(&address); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "请求参数错误"))
+ return
+ }
+
+ // 设置用户ID
+ address.UserID = user.ID
+
+ // 开启事务
+ tx := common.GetDB().Begin()
+
+ // 如果设置为默认地址,先取消其他地址的默认状态
+ if address.IsDefault == 1 {
+ if err := tx.Model(&models.UserAddress{}).Where("user_id = ?", user.ID).Update("is_default", 0).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "更新默认地址状态失败"))
+ return
+ }
+ }
+
+ // 创建地址
+ if err := tx.Create(&address).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "创建收货地址失败"))
+ return
+ }
+
+ tx.Commit()
+
+ c.JSON(http.StatusOK, common.Success(address))
+}
+
+// UpdateAddress 更新收货地址
+func (h *UserAddressHandler) UpdateAddress(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ addressID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "地址ID无效"))
+ return
+ }
+
+ // 检查地址是否存在且属于当前用户
+ var existAddress models.UserAddress
+ err = common.GetDB().Where("id = ? AND user_id = ?", addressID, user.ID).First(&existAddress).Error
+ if err != nil {
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(404, "收货地址不存在"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "获取收货地址失败"))
+ }
+ return
+ }
+
+ var updateData models.UserAddress
+ if err := c.ShouldBindJSON(&updateData); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "请求参数错误"))
+ return
+ }
+
+ // 开启事务
+ tx := common.GetDB().Begin()
+
+ // 如果设置为默认地址,先取消其他地址的默认状态
+ if updateData.IsDefault == 1 {
+ if err := tx.Model(&models.UserAddress{}).Where("user_id = ? AND id != ?", user.ID, addressID).Update("is_default", 0).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "更新默认地址状态失败"))
+ return
+ }
+ }
+
+ // 更新地址信息
+ updateData.UserID = user.ID // 确保不会被修改
+ if err := tx.Model(&existAddress).Updates(updateData).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "更新收货地址失败"))
+ return
+ }
+
+ tx.Commit()
+
+ // 返回更新后的地址
+ var updatedAddress models.UserAddress
+ common.GetDB().Where("id = ?", addressID).First(&updatedAddress)
+
+ c.JSON(http.StatusOK, common.Success(updatedAddress))
+}
+
+// DeleteAddress 删除收货地址
+func (h *UserAddressHandler) DeleteAddress(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ addressID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "地址ID无效"))
+ return
+ }
+
+ // 检查地址是否存在且属于当前用户
+ var address models.UserAddress
+ err = common.GetDB().Where("id = ? AND user_id = ?", addressID, user.ID).First(&address).Error
+ if err != nil {
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(404, "收货地址不存在"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "获取收货地址失败"))
+ }
+ return
+ }
+
+ // 删除地址
+ if err := common.GetDB().Delete(&address).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "删除收货地址失败"))
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(nil))
+}
+
+// SetDefaultAddress 设置默认收货地址
+func (h *UserAddressHandler) SetDefaultAddress(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ addressID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "地址ID无效"))
+ return
+ }
+
+ // 检查地址是否存在且属于当前用户
+ var address models.UserAddress
+ err = common.GetDB().Where("id = ? AND user_id = ?", addressID, user.ID).First(&address).Error
+ if err != nil {
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(404, "收货地址不存在"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "获取收货地址失败"))
+ }
+ return
+ }
+
+ // 开启事务
+ tx := common.GetDB().Begin()
+
+ // 取消其他地址的默认状态
+ if err := tx.Model(&models.UserAddress{}).Where("user_id = ?", user.ID).Update("is_default", 0).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "更新默认地址状态失败"))
+ return
+ }
+
+ // 设置当前地址为默认
+ if err := tx.Model(&address).Update("is_default", 1).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "设置默认地址失败"))
+ return
+ }
+
+ tx.Commit()
+
+ c.JSON(http.StatusOK, common.Success(nil))
+}
\ No newline at end of file
diff --git a/internal/handlers/user_banner_handler.go b/internal/handlers/user_banner_handler.go
new file mode 100644
index 0000000..5bd07ae
--- /dev/null
+++ b/internal/handlers/user_banner_handler.go
@@ -0,0 +1,26 @@
+package handlers
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/models"
+ "net/http"
+
+ "github.com/gin-gonic/gin"
+)
+
+// UserBannerHandler 用户端轮播图处理器
+type UserBannerHandler struct{}
+
+// GetActiveBanners 获取启用的轮播图列表
+func (h *UserBannerHandler) GetActiveBanners(c *gin.Context) {
+ var banners []models.Banner
+
+ // 查询启用的轮播图,按排序顺序排列
+ err := common.GetDB().Where("status = ?", 1).Order("sort_order ASC, created_at DESC").Find(&banners).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询轮播图失败"))
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(banners))
+}
\ No newline at end of file
diff --git a/internal/handlers/user_order_handler.go b/internal/handlers/user_order_handler.go
new file mode 100644
index 0000000..e0f11e9
--- /dev/null
+++ b/internal/handlers/user_order_handler.go
@@ -0,0 +1,863 @@
+package handlers
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/models"
+ "fmt"
+ "net/http"
+ "strconv"
+ "time"
+
+ "github.com/gin-gonic/gin"
+ "gorm.io/gorm"
+)
+
+// UserOrderHandler 用户订单处理器
+type UserOrderHandler struct{}
+
+// CreatePurchaseOrder 创建买单
+func (h *UserOrderHandler) CreatePurchaseOrder(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ var req struct {
+ ProductID uint `json:"product_id" binding:"required"`
+ ProductType uint8 `json:"product_type" binding:"required"` // 1一级商品,2二级商品
+ ProductName string `json:"product_name" binding:"required"`
+ ProductImages string `json:"product_images"`
+ UnitPrice float64 `json:"unit_price" binding:"required"`
+ Quantity int `json:"quantity" binding:"required"`
+ TotalAmount float64 `json:"total_amount" binding:"required"`
+ AddressID uint `json:"address_id" binding:"required"`
+ PaymentProofImage string `json:"payment_proof_image"` // 不再强制要求
+ Remark string `json:"remark"`
+ }
+
+ if err := c.ShouldBindJSON(&req); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "请求参数错误"))
+ return
+ }
+
+ // 验证商品类型
+ if req.ProductType != 1 && req.ProductType != 2 {
+ c.JSON(http.StatusOK, common.Error(400, "商品类型无效"))
+ return
+ }
+
+ // 验证数量和金额
+ if req.Quantity <= 0 {
+ c.JSON(http.StatusOK, common.Error(400, "购买数量必须大于0"))
+ return
+ }
+
+ if req.TotalAmount != req.UnitPrice*float64(req.Quantity) {
+ c.JSON(http.StatusOK, common.Error(400, "订单金额计算错误"))
+ return
+ }
+
+ db := common.GetDB()
+
+ // 开启事务
+ tx := db.Begin()
+
+ // 验证收货地址是否属于当前用户
+ var address models.UserAddress
+ if err := tx.Where("id = ? AND user_id = ?", req.AddressID, user.ID).First(&address).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(404, "收货地址不存在"))
+ return
+ }
+
+ var sellerID *uint
+ //var productInfo interface{}
+
+ // 根据商品类型进行不同的处理
+ if req.ProductType == 1 { // 一级商品
+ var primaryProduct models.PrimaryProduct
+ if err := tx.First(&primaryProduct, req.ProductID).Error; err != nil {
+ tx.Rollback()
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(404, "商品不存在"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "查询商品失败"))
+ }
+ return
+ }
+
+ // 检查商品状态和库存
+ if primaryProduct.Status != 1 {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(400, "商品已下架"))
+ return
+ }
+
+ if primaryProduct.StockQuantity < req.Quantity {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(400, "库存不足"))
+ return
+ }
+
+ // 减少库存,增加销量
+ if err := tx.Model(&primaryProduct).Updates(map[string]interface{}{
+ "stock_quantity": primaryProduct.StockQuantity - req.Quantity,
+ "sales_count": primaryProduct.SalesCount + req.Quantity,
+ }).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "更新商品库存失败"))
+ return
+ }
+
+ //productInfo = primaryProduct
+
+ } else { // 二级商品
+ var secondaryProduct models.SecondaryProduct
+ if err := tx.Preload("Seller").First(&secondaryProduct, req.ProductID).Error; err != nil {
+ tx.Rollback()
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(404, "商品不存在"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "查询商品失败"))
+ }
+ return
+ }
+
+ // 检查商品状态和库存
+ if secondaryProduct.Status != 1 {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(400, "商品已下架"))
+ return
+ }
+
+ if secondaryProduct.Quantity < req.Quantity {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(400, "库存不足"))
+ return
+ }
+
+ // 检查是否是自己的商品
+ if secondaryProduct.SellerID == user.ID {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(400, "不能购买自己的商品"))
+ return
+ }
+ var config models.SystemConfig
+ tx.Where("config_key=?", "limit_days").First(&config)
+ value, _ := strconv.Atoi(config.ConfigValue)
+
+ if value > 0 {
+ fiveDaysAgo := time.Now().AddDate(0, 0, -value)
+ var existingOrderCount int64
+ if err := tx.Model(&models.PurchaseOrder{}).Where(
+ "buyer_id = ? AND seller_id = ? AND product_type = 2 AND created_at > ? AND order_status != 3",
+ user.ID, secondaryProduct.SellerID, fiveDaysAgo,
+ ).Count(&existingOrderCount).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "检查购买记录失败"))
+ return
+ }
+
+ if existingOrderCount > 0 {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(400, fmt.Sprintf("%v天内只能向同一个卖家购买一次商品", value)))
+ return
+ }
+ }
+
+ // 减少库存,增加浏览量
+ if err := tx.Model(&secondaryProduct).Updates(map[string]interface{}{
+ "quantity": secondaryProduct.Quantity - req.Quantity,
+ "view_count": secondaryProduct.ViewCount + 1,
+ }).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "更新商品库存失败"))
+ return
+ }
+
+ sellerID = &secondaryProduct.SellerID
+ //productInfo = secondaryProduct
+ }
+
+ // 生成订单编号
+ orderNo := fmt.Sprintf("PO%d%d", time.Now().Unix(), user.ID)
+
+ // 创建买单
+ orderStatus := 0 // 默认待付款
+ if req.PaymentProofImage != "" {
+ orderStatus = 1 // 如果有付款凭证,设为待确认
+ }
+
+ purchaseOrder := models.PurchaseOrder{
+ OrderNo: orderNo,
+ BuyerID: user.ID,
+ SellerID: sellerID,
+ ProductID: req.ProductID,
+ ProductType: req.ProductType,
+ ProductName: req.ProductName,
+ ProductImages: req.ProductImages,
+ UnitPrice: req.UnitPrice,
+ Quantity: req.Quantity,
+ TotalAmount: req.TotalAmount,
+ AddressID: &req.AddressID,
+ OrderStatus: uint8(orderStatus),
+ PaymentProofImage: req.PaymentProofImage,
+ Remark: req.Remark,
+ }
+
+ if err := tx.Create(&purchaseOrder).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "创建订单失败"))
+ return
+ }
+
+ //如果是二级商品,创建对应的卖单
+ if req.ProductType == 2 {
+ salesOrder := models.SalesOrder{
+ OrderNo: fmt.Sprintf("SO%d%d", time.Now().Unix(), *sellerID),
+ SellerID: *sellerID,
+ BuyerID: user.ID,
+ SecondaryProductID: req.ProductID,
+ ProductName: req.ProductName,
+ ProductImages: req.ProductImages,
+ SellingPrice: req.UnitPrice,
+ Quantity: req.Quantity,
+ TotalAmount: req.TotalAmount,
+ AddressID: &req.AddressID,
+ OrderStatus: 0, // 待付款
+ PaymentProofImage: req.PaymentProofImage,
+ PurchaseOrderID: purchaseOrder.ID,
+ }
+
+ if err := tx.Create(&salesOrder).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "创建卖单失败"))
+ return
+ }
+ }
+
+ // 提交事务
+ tx.Commit()
+
+ // 返回订单信息
+ result := map[string]interface{}{
+ "order_id": purchaseOrder.ID,
+ "order_no": purchaseOrder.OrderNo,
+ "status": "订单已提交,等待确认",
+ "message": "订单创建成功",
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// GetPurchaseOrders 获取买单列表
+func (h *UserOrderHandler) GetPurchaseOrders(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 分页参数
+ page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
+ pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10"))
+ if page < 1 {
+ page = 1
+ }
+ if pageSize < 1 || pageSize > 50 {
+ pageSize = 10
+ }
+ order_id, _ := strconv.Atoi(c.DefaultQuery("order_id", "0"))
+ // 状态过滤
+ status := c.Query("status")
+ startDate := c.Query("start_date")
+ endDate := c.Query("end_date")
+
+ db := common.GetDB()
+ var orders []models.PurchaseOrder
+ var total int64
+
+ // 构建查询条件
+ query := db.Model(&models.PurchaseOrder{}).Where("buyer_id = ?", user.ID).
+ Preload("Address").Preload("Seller")
+
+ // 添加状态过滤
+ if status != "" && status != "all" {
+ switch status {
+ case "pending":
+ query = query.Where("order_status = 0")
+ case "confirming":
+ query = query.Where("order_status = 1")
+ case "completed":
+ query = query.Where("order_status = 2")
+ case "cancelled":
+ query = query.Where("order_status = 3")
+ }
+ }
+
+ // 添加日期过滤
+ if startDate != "" {
+ query = query.Where("created_at >= ?", startDate+" 00:00:00")
+ }
+ if endDate != "" {
+ query = query.Where("created_at <= ?", endDate+" 23:59:59")
+ }
+ if order_id > 0 {
+ query = query.Where("id = ?", order_id)
+ }
+ // 获取总数
+ query.Count(&total)
+
+ // 分页查询
+ offset := (page - 1) * pageSize
+ err := query.Order("created_at DESC").Offset(offset).Limit(pageSize).Find(&orders).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询订单列表失败"))
+ return
+ }
+
+ // 计算总金额
+ var totalAmount float64
+ db.Model(&models.PurchaseOrder{}).Where("buyer_id = ? AND order_status = 2", user.ID).Select("COALESCE(SUM(total_amount), 0)").Scan(&totalAmount)
+
+ // 构建返回数据
+ result := map[string]interface{}{
+ "list": orders,
+ "total": total,
+ "page": page,
+ "page_size": pageSize,
+ "total_amount": totalAmount,
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// GetSalesOrders 获取卖单列表
+func (h *UserOrderHandler) GetSalesOrders(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 分页参数
+ page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
+ pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10"))
+ if page < 1 {
+ page = 1
+ }
+ if pageSize < 1 || pageSize > 50 {
+ pageSize = 10
+ }
+
+ // 状态过滤
+ status := c.Query("status")
+ startDate := c.Query("start_date")
+ endDate := c.Query("end_date")
+
+ db := common.GetDB()
+ var orders []models.SalesOrder
+ var total int64
+
+ // 构建查询条件
+ query := db.Model(&models.SalesOrder{}).Where("seller_id = ?", user.ID).Preload("Buyer").Preload("Address")
+
+ // 添加状态过滤
+ if status != "" && status != "all" {
+ switch status {
+ case "pending":
+ query = query.Where("order_status = 0")
+ case "confirming":
+ query = query.Where("order_status = 1")
+ case "completed":
+ query = query.Where("order_status = 2")
+ case "cancelled":
+ query = query.Where("order_status = 3")
+ }
+ }
+
+ // 添加日期过滤
+ if startDate != "" {
+ query = query.Where("created_at >= ?", startDate+" 00:00:00")
+ }
+ if endDate != "" {
+ query = query.Where("created_at <= ?", endDate+" 23:59:59")
+ }
+
+ // 获取总数
+ query.Count(&total)
+
+ // 分页查询
+ offset := (page - 1) * pageSize
+ err := query.Order("created_at DESC").Offset(offset).Limit(pageSize).Find(&orders).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询卖单列表失败"))
+ return
+ }
+
+ // 计算总金额
+ var totalAmount float64
+ db.Model(&models.SalesOrder{}).Where("seller_id = ? AND order_status = 2", user.ID).Select("COALESCE(SUM(total_amount), 0)").Scan(&totalAmount)
+
+ // 构建返回数据
+ result := map[string]interface{}{
+ "list": orders,
+ "total": total,
+ "page": page,
+ "page_size": pageSize,
+ "total_amount": totalAmount,
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// GetOrderStats 获取订单统计信息(待付款和待确认数量)
+func (h *UserOrderHandler) GetOrderStats(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ db := common.GetDB()
+ stats := make(map[string]interface{})
+
+ // 买单统计
+ var purchasePendingCount int64 // 待付款
+ var purchaseConfirmingCount int64 // 待确认
+ db.Model(&models.PurchaseOrder{}).Where("buyer_id = ? AND order_status = ?", user.ID, 0).Count(&purchasePendingCount)
+ db.Model(&models.PurchaseOrder{}).Where("buyer_id = ? AND order_status = ?", user.ID, 1).Count(&purchaseConfirmingCount)
+
+ // 卖单统计
+ var salesPendingCount int64 // 待付款
+ var salesConfirmingCount int64 // 待确认
+ db.Model(&models.SalesOrder{}).Where("seller_id = ? AND order_status = ?", user.ID, 0).Count(&salesPendingCount)
+ db.Model(&models.SalesOrder{}).Where("seller_id = ? AND order_status = ?", user.ID, 1).Count(&salesConfirmingCount)
+
+ stats["purchase_pending_count"] = purchasePendingCount
+ stats["purchase_confirming_count"] = purchaseConfirmingCount
+ stats["sales_pending_count"] = salesPendingCount
+ stats["sales_confirming_count"] = salesConfirmingCount
+
+ c.JSON(http.StatusOK, common.Success(stats))
+}
+
+// ConfirmPurchaseOrder 确认买单(买家确认收货)
+func (h *UserOrderHandler) ConfirmPurchaseOrder(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ orderID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "订单ID无效"))
+ return
+ }
+
+ db := common.GetDB()
+ tx := db.Begin()
+
+ // 买家确认买单(确认收货)
+ var order models.PurchaseOrder
+ if err := tx.Where("id = ? AND buyer_id = ?", orderID, user.ID).First(&order).Error; err != nil {
+ tx.Rollback()
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(404, "订单不存在"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "查询订单失败"))
+ }
+ return
+ }
+
+ if order.OrderStatus != 1 {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(400, "订单状态不允许确认"))
+ return
+ }
+
+ // 更新订单状态为已完成
+ now := time.Now()
+ if err := tx.Model(&order).Updates(map[string]interface{}{
+ "order_status": 2,
+ "confirm_time": &now,
+ }).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "确认订单失败"))
+ return
+ }
+
+ // 商品入库
+ if err := h.addToWarehouse(tx, user.ID, &order); err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "商品入库失败"))
+ return
+ }
+
+ tx.Commit()
+
+ result := map[string]interface{}{
+ "message": "订单确认成功,商品已入库",
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// ConfirmSalesOrder 确认卖单(卖家确认发货)
+func (h *UserOrderHandler) ConfirmSalesOrder(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ orderID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "订单ID无效"))
+ return
+ }
+
+ // 卖家确认卖单
+ var order models.SalesOrder
+ tx := common.GetDB().Begin()
+ if err := tx.Where("id = ? AND seller_id = ?", orderID, user.ID).First(&order).Error; err != nil {
+ tx.Rollback()
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(404, "订单不存在"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "查询订单失败"))
+ }
+ return
+ }
+
+ if order.OrderStatus != 1 {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(400, "订单状态不允许确认"))
+ return
+ }
+
+ // 更新卖单状态为已完成
+ now := time.Now()
+ if err := tx.Model(&order).Updates(models.SalesOrder{
+ OrderStatus: 2,
+ CompleteTime: &now,
+ }).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "确认订单失败"))
+ return
+ }
+
+ // 同时更新对应的买单状态
+ if err := tx.Model(&models.PurchaseOrder{}).Where(
+ "id=?",
+ order.PurchaseOrderID,
+ ).Updates(models.PurchaseOrder{
+ OrderStatus: 2,
+ ConfirmTime: &now,
+ }).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "更新买单状态失败"))
+ return
+ }
+
+ var config models.SystemConfig
+ tx.Where("config_key=?", "warehouse_price_rate").First(&config)
+ vaule, _ := strconv.Atoi(config.ConfigValue)
+ newRecord := models.ScoreRecord{
+ UserID: user.ID,
+ Note: "系统策略",
+ ChangeNumber: -vaule,
+ }
+
+ if err := tx.Create(&newRecord).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "创建积分记录失败"))
+ return
+ }
+
+ // 更新用户积分
+ newPoints := user.CurrentPoints + newRecord.ChangeNumber
+ if newPoints < 0 {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(400, "用户积分不足"))
+ return
+ }
+
+ if err := tx.Model(&user).Update("current_points", newPoints).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "更新用户积分失败"))
+ return
+ }
+
+ tx.Commit()
+
+ var purcharseOrder models.PurchaseOrder
+ db := common.GetDB()
+ db.Where("id=?", order.PurchaseOrderID).First(&purcharseOrder)
+ err = h.addToWarehouse(db, order.BuyerID, &purcharseOrder)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "添加用户仓库失败"))
+ }
+ result := map[string]interface{}{
+ "message": "订单确认成功",
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// addToWarehouse 添加商品到买家仓库
+func (h *UserOrderHandler) addToWarehouse(tx *gorm.DB, buyerID uint, order *models.PurchaseOrder) error {
+
+ fmt.Println("order::", order)
+ // 检查该订单是否已经入库(防止重复入库)
+ var existingByOrder models.UserWarehouse
+ err := tx.Where("user_id = ? AND source_order_id = ? and product_type=? and product_id=?",
+ buyerID, order.ID, order.ProductType, order.ProductID).First(&existingByOrder).Error
+
+ if err == nil {
+ // 该订单已经入库,直接返回
+ return nil
+ } else if err != gorm.ErrRecordNotFound {
+ // 查询出错
+ return err
+ }
+
+ var config models.SystemConfig
+ tx.Where("config_key=?", "warehouse_price_rate").First(&config)
+ value, _ := strconv.Atoi(config.ConfigValue)
+ // 计算入库价格(根据系统配置增值)
+ warehousePrice := order.UnitPrice + float64(value)
+
+ // 检查仓库中是否已有相同商品(不同订单的相同商品)
+ var existingWarehouse models.UserWarehouse
+ //err = tx.Where("user_id = ? AND product_id = ? AND product_type = ?",
+ // buyerID, order.ProductID, order.ProductType).First(&existingWarehouse).Error
+
+ if err == gorm.ErrRecordNotFound {
+ // 创建新的仓库记录
+ warehouse := models.UserWarehouse{
+ UserID: buyerID,
+ ProductID: order.ProductID,
+ ProductType: order.ProductType,
+ ProductName: order.ProductName,
+ ProductImages: order.ProductImages,
+ PurchasePrice: order.UnitPrice,
+ WarehousePrice: warehousePrice,
+ Quantity: order.Quantity,
+ SourceOrderID: &order.ID,
+ Status: 1, // 库存中
+ }
+
+ return tx.Create(&warehouse).Error
+ } else if err != nil {
+ return err
+ } else {
+ // 更新现有仓库记录的数量(累加不同订单的相同商品)
+ return tx.Model(&existingWarehouse).Update("quantity", existingWarehouse.Quantity+order.Quantity).Error
+ }
+
+}
+
+// UploadPaymentProof 上传付款凭证
+func (h *UserOrderHandler) UploadPaymentProof(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ orderID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "订单ID无效"))
+ return
+ }
+
+ var req struct {
+ PaymentProofImage string `json:"payment_proof_image" binding:"required"`
+ ProductType uint `json:"product_type" binding:"required"`
+ }
+
+ if err := c.ShouldBindJSON(&req); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "请求参数错误"))
+ return
+ }
+
+ db := common.GetDB()
+ tx := db.Begin()
+
+ // 查询订单
+ var order models.PurchaseOrder
+ if err := tx.Where("id = ? AND buyer_id = ?", orderID, user.ID).First(&order).Error; err != nil {
+ tx.Rollback()
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(404, "订单不存在"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "查询订单失败"))
+ }
+ return
+ }
+
+ // 检查订单状态
+ if order.OrderStatus != 0 {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(400, "订单状态不允许上传付款凭证"))
+ return
+ }
+
+ // 更新订单状态为待确认,并保存付款凭证
+ if err := tx.Model(&order).Updates(map[string]interface{}{
+ "payment_proof_image": req.PaymentProofImage,
+ "order_status": 1, // 待确认
+ }).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "更新订单失败"))
+ return
+ }
+
+ var saleOrder models.SalesOrder
+ if req.ProductType == 2 {
+
+ if err := tx.Where("purchase_order_id = ?", order.ID).First(&saleOrder).Error; err != nil {
+ tx.Rollback()
+ c.JSON(200, common.Error(400, "查找不到有效订单"))
+ }
+
+ // 再更新,这里可以使用 Model 指定要更新的对象
+ // 注意:这仍然会基于 saleOrder 的主键 ID 更新,但因为我们刚查出来,所以是安全的。
+ // 但更清晰的方式是直接用 Where。
+
+ // 更好的方式是:直接基于原始条件更新
+ if err := tx.Where("purchase_order_id = ?", order.ID).Updates(models.SalesOrder{
+ OrderStatus: 1,
+ PaymentProofImage: req.PaymentProofImage,
+ }).Error; err != nil {
+ tx.Rollback()
+ c.JSON(200, common.Error(400, "更新错误"))
+ }
+ }
+
+ tx.Commit()
+
+ result := map[string]interface{}{
+ "message": "付款凭证上传成功,订单已提交等待确认",
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// CancelOrder 取消订单
+func (h *UserOrderHandler) CancelOrder(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ orderID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "订单ID无效"))
+ return
+ }
+
+ db := common.GetDB()
+ tx := db.Begin()
+
+ // 查询订单
+ var order models.PurchaseOrder
+ if err := tx.Where("id = ? AND buyer_id = ?", orderID, user.ID).First(&order).Error; err != nil {
+ tx.Rollback()
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(404, "订单不存在"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "查询订单失败"))
+ }
+ return
+ }
+
+ // 检查订单状态(只有待付款和待确认的订单可以取消)
+ if order.OrderStatus != 0 && order.OrderStatus != 1 {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(400, "订单状态不允许取消"))
+ return
+ }
+
+ // 更新订单状态为已取消
+ if err := tx.Model(&order).Update("order_status", 3).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "取消订单失败"))
+ return
+ }
+
+ // 恢复商品库存
+ if order.ProductType == 1 { // 一级商品
+ if err := tx.Model(&models.PrimaryProduct{}).Where("id = ?", order.ProductID).
+ Update("stock_quantity", gorm.Expr("stock_quantity + ?", order.Quantity)).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "恢复库存失败"))
+ return
+ }
+ } else { // 二级商品
+ if err := tx.Model(&models.SecondaryProduct{}).Where("id = ?", order.ProductID).
+ Update("quantity", gorm.Expr("quantity + ?", order.Quantity)).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "恢复库存失败"))
+ return
+ }
+ }
+
+ tx.Commit()
+
+ result := map[string]interface{}{
+ "message": "订单已取消",
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// GetPurchaseOrderDetail 获取买单详情
+func (h *UserOrderHandler) GetPurchaseOrderDetail(c *gin.Context) {
+ orderID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "订单ID无效"))
+ return
+ }
+
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ var order models.PurchaseOrder
+ query := common.GetDB().Where("buyer_id = ?", user.ID).
+ Preload("Buyer").
+ Preload("Seller").
+ Preload("Address")
+
+ err = query.First(&order, uint(orderID)).Error
+ if err != nil {
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(404, "订单不存在"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "查询订单详情失败"))
+ }
+ return
+ }
+ adminID := uint(1)
+ if order.ProductType == 1 {
+ if order.SellerID == nil {
+ order.SellerID = &adminID
+ var seller models.User
+
+ common.GetDB().Where("id=?", order.SellerID).First(&seller)
+ order.Seller = &seller
+ }
+ }
+
+ c.JSON(http.StatusOK, common.Success(order))
+}
+
+// GetSalesOrderDetail 获取卖单详情
+func (h *UserOrderHandler) GetSalesOrderDetail(c *gin.Context) {
+ orderID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "订单ID无效"))
+ return
+ }
+
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ var order models.SalesOrder
+ query := common.GetDB().Where("seller_id = ?", user.ID).
+ Preload("Seller").
+ Preload("Buyer").
+ Preload("Address")
+
+ err = query.First(&order, uint(orderID)).Error
+ if err != nil {
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(404, "订单不存在"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "查询订单详情失败"))
+ }
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(order))
+}
diff --git a/internal/handlers/user_order_message_handler.go b/internal/handlers/user_order_message_handler.go
new file mode 100644
index 0000000..9db57c9
--- /dev/null
+++ b/internal/handlers/user_order_message_handler.go
@@ -0,0 +1,220 @@
+package handlers
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/models"
+ "net/http"
+ "strconv"
+
+ "github.com/gin-gonic/gin"
+ "gorm.io/gorm"
+)
+
+// UserOrderMessageHandler 用户端订单留言处理器
+type UserOrderMessageHandler struct{}
+
+// GetOrderMessages 获取订单留言列表
+func (h *UserOrderMessageHandler) GetOrderMessages(c *gin.Context) {
+
+ orderID, err := strconv.ParseUint(c.Param("order_id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "订单ID无效"))
+ return
+ }
+
+ orderType := c.Query("type") // purchase 或 sales
+ if orderType == "" {
+ c.JSON(http.StatusOK, common.Error(400, "订单类型无效"))
+ return
+ }
+
+ // 分页参数
+ page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
+ pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
+ if page < 1 {
+ page = 1
+ }
+ if pageSize < 1 || pageSize > 50 {
+ pageSize = 20
+ }
+
+ db := common.GetDB()
+ var messages []models.OrderMessage
+ var total int64
+
+ // 如果是买单,需要同时查询买单和对应卖单的留言
+ var query *gorm.DB
+ if orderType == "purchase" {
+ // 查找是否有对应的卖单
+ var salesOrder models.SalesOrder
+ err := db.Where("purchase_order_id = ?", orderID).First(&salesOrder).Error
+ if err == nil {
+ // 有对应卖单,查询两个订单的留言
+ query = db.Model(&models.OrderMessage{}).
+ Where("(order_id = ? AND order_type = ?) OR (order_id = ? AND order_type = ?)",
+ orderID, "purchase", salesOrder.ID, "sales")
+ } else {
+ // 没有对应卖单,只查询买单留言
+ query = db.Model(&models.OrderMessage{}).
+ Where("order_id = ? AND order_type = ?", orderID, "purchase")
+ }
+ } else {
+ // 卖单,查询卖单和对应买单的留言
+ var salesOrder models.SalesOrder
+ err := db.Where("id = ?", orderID).First(&salesOrder).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "订单不存在"))
+ return
+ }
+
+ query = db.Model(&models.OrderMessage{}).
+ Where("(order_id = ? AND order_type = ?) OR (order_id = ? AND order_type = ?)",
+ salesOrder.ID, "sales", salesOrder.PurchaseOrderID, "purchase")
+ }
+
+ query = query.Preload("User", func(db *gorm.DB) *gorm.DB {
+ return db.Select("id, customer_name, real_name, phone, system_role")
+ })
+
+ // 获取总数
+ query.Count(&total)
+
+ // 分页查询
+ offset := (page - 1) * pageSize
+ err = query.Order("created_at ASC").Offset(offset).Limit(pageSize).Find(&messages).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询留言列表失败"))
+ return
+ }
+
+ // 构建返回数据
+ result := map[string]interface{}{
+ "list": messages,
+ "total": total,
+ "page": page,
+ "page_size": pageSize,
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// CreateOrderMessage 创建订单留言
+func (h *UserOrderMessageHandler) CreateOrderMessage(c *gin.Context) {
+ orderID, err := strconv.ParseUint(c.Param("order_id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "订单ID无效"))
+ return
+ }
+
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 验证用户是否有权限给此订单留言
+ orderType := h.getUserOrderType(uint(orderID), user.ID)
+ if orderType == "" {
+ c.JSON(http.StatusOK, common.Error(403, "权限不足"))
+ return
+ }
+
+ var req struct {
+ Content string `json:"content" binding:"required"`
+ Images string `json:"images"`
+ }
+
+ if err := c.ShouldBindJSON(&req); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "请求参数错误"))
+ return
+ }
+
+ // 验证留言内容
+ if len(req.Content) > 500 {
+ c.JSON(http.StatusOK, common.Error(400, "留言内容不能超过500字"))
+ return
+ }
+
+ // 创建留言记录
+ message := models.OrderMessage{
+ OrderID: uint(orderID),
+ OrderType: orderType,
+ UserID: user.ID,
+ Content: req.Content,
+ Images: req.Images,
+ }
+
+ db := common.GetDB()
+ if err := db.Create(&message).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "创建留言失败"))
+ return
+ }
+
+ // 预加载用户信息
+ db.Preload("User", func(db *gorm.DB) *gorm.DB {
+ return db.Select("id, customer_name, real_name, phone")
+ }).First(&message, message.ID)
+
+ c.JSON(http.StatusOK, common.Success(message))
+}
+
+// checkOrderPermission 检查用户是否有权限访问订单留言
+func (h *UserOrderMessageHandler) checkOrderPermission(orderID uint, userID uint) bool {
+ db := common.GetDB()
+
+ // 检查买单权限
+ var purchaseCount int64
+ db.Model(&models.PurchaseOrder{}).Where("id = ? AND buyer_id = ?", orderID, userID).Count(&purchaseCount)
+ if purchaseCount > 0 {
+ return true
+ }
+
+ // 检查卖单权限
+ var salesCount int64
+ db.Model(&models.SalesOrder{}).Where("id = ? AND seller_id = ?", orderID, userID).Count(&salesCount)
+ if salesCount > 0 {
+ return true
+ }
+
+ // 检查是否为买单的卖家(二级商品订单)
+ var purchaseOrder models.PurchaseOrder
+ if err := db.Where("id = ? AND product_type = 2", orderID).First(&purchaseOrder).Error; err == nil {
+ // 查找对应的二级商品是否属于当前用户
+ var secondaryCount int64
+ db.Model(&models.SecondaryProduct{}).Where("id = ? AND seller_id = ?", purchaseOrder.ProductID, userID).Count(&secondaryCount)
+ if secondaryCount > 0 {
+ return true
+ }
+ }
+
+ return false
+}
+
+// getUserOrderType 获取用户在订单中的角色类型
+func (h *UserOrderMessageHandler) getUserOrderType(orderID uint, userID uint) string {
+ db := common.GetDB()
+
+ // 检查是否为买单的买家
+ var purchaseCount int64
+ db.Model(&models.PurchaseOrder{}).Where("id = ? AND buyer_id = ?", orderID, userID).Count(&purchaseCount)
+ if purchaseCount > 0 {
+ return "purchase"
+ }
+
+ // 检查是否为卖单的卖家
+ var salesCount int64
+ db.Model(&models.SalesOrder{}).Where("id = ? AND (seller_id = ?)", orderID, userID).Count(&salesCount)
+ if salesCount > 0 || userID == 1 {
+ return "sales"
+ }
+
+ // 检查是否为买单的卖家(二级商品订单)
+ var purchaseOrder models.PurchaseOrder
+ if err := db.Where("id = ? AND product_type = 2", orderID).First(&purchaseOrder).Error; err == nil {
+ // 查找对应的二级商品是否属于当前用户
+ var secondaryCount int64
+ db.Model(&models.SecondaryProduct{}).Where("id = ? AND seller_id = ?", purchaseOrder.ProductID, userID).Count(&secondaryCount)
+ if secondaryCount > 0 {
+ return "purchase" // 对于买单的卖家,也归类为purchase类型
+ }
+ }
+
+ return ""
+}
diff --git a/internal/handlers/user_payment_handler.go b/internal/handlers/user_payment_handler.go
new file mode 100644
index 0000000..c2fc452
--- /dev/null
+++ b/internal/handlers/user_payment_handler.go
@@ -0,0 +1,107 @@
+package handlers
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/models"
+ "net/http"
+ "strconv"
+
+ "github.com/gin-gonic/gin"
+ "gorm.io/gorm"
+)
+
+// UserPaymentHandler 用户收款方式处理器
+type UserPaymentHandler struct{}
+
+// GetPaymentInfo 获取用户收款方式信息
+func (h *UserPaymentHandler) GetPaymentInfo(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 返回收款方式信息
+ paymentInfo := map[string]interface{}{
+ "main_payment_qr_image": user.MainPaymentQrImage,
+ "sub_payment_qr_image": user.SubPaymentQrImage,
+ }
+
+ c.JSON(http.StatusOK, common.Success(paymentInfo))
+}
+
+// UpdatePaymentInfo 更新用户收款方式信息
+func (h *UserPaymentHandler) UpdatePaymentInfo(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 解析请求数据
+ var req struct {
+ MainPaymentQrImage string `json:"main_payment_qr_image"`
+ SubPaymentQrImage string `json:"sub_payment_qr_image"`
+ }
+
+ if err := c.ShouldBindJSON(&req); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "请求参数错误"))
+ return
+ }
+
+ // 更新用户收款方式信息
+ updates := map[string]interface{}{}
+ if req.MainPaymentQrImage != "" {
+ updates["main_payment_qr_image"] = req.MainPaymentQrImage
+ }
+ if req.SubPaymentQrImage != "" {
+ updates["sub_payment_qr_image"] = req.SubPaymentQrImage
+ }
+
+ if len(updates) == 0 {
+ c.JSON(http.StatusOK, common.Error(400, "没有要更新的信息"))
+ return
+ }
+
+ if err := common.GetDB().Model(&user).Updates(updates).Error; err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "更新收款方式失败"))
+ return
+ }
+
+ // 返回更新后的信息
+ var updatedUser models.User
+ common.GetDB().First(&updatedUser, user.ID)
+
+ paymentInfo := map[string]interface{}{
+ "main_payment_qr_image": updatedUser.MainPaymentQrImage,
+ "sub_payment_qr_image": updatedUser.SubPaymentQrImage,
+ }
+
+ c.JSON(http.StatusOK, common.Success(paymentInfo))
+}
+
+// GetSellerPaymentInfo 获取卖家收款方式信息
+func (h *UserPaymentHandler) GetSellerPaymentInfo(c *gin.Context) {
+ sellerID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "卖家ID无效"))
+ return
+ }
+
+ var seller models.User
+ err = common.GetDB().Select("main_payment_qr_image, sub_payment_qr_image").First(&seller, sellerID).Error
+ if err != nil {
+ if err == gorm.ErrRecordNotFound {
+ c.JSON(http.StatusOK, common.Error(404, "卖家不存在"))
+ } else {
+ c.JSON(http.StatusOK, common.Error(500, "查询卖家信息失败"))
+ }
+ return
+ }
+
+ // 返回卖家收款方式信息
+ paymentInfo := map[string]interface{}{
+ "main_payment_qr_image": seller.MainPaymentQrImage,
+ "sub_payment_qr_image": seller.SubPaymentQrImage,
+ }
+
+ c.JSON(http.StatusOK, common.Success(paymentInfo))
+}
+
+func (h *UserPaymentHandler) GetSellerInfo(c *gin.Context) {
+
+}
diff --git a/internal/handlers/user_product_handler.go b/internal/handlers/user_product_handler.go
new file mode 100644
index 0000000..53d984a
--- /dev/null
+++ b/internal/handlers/user_product_handler.go
@@ -0,0 +1,330 @@
+package handlers
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/models"
+ "fmt"
+ "net/http"
+ "strconv"
+ "time"
+
+ "github.com/gin-gonic/gin"
+)
+
+// UserProductHandler 用户端商品处理器
+type UserProductHandler struct{}
+
+// GetHomeData 获取首页数据(轮播图、商品分类和一级商品)
+func (h *UserProductHandler) GetHomeData(c *gin.Context) {
+ db := common.GetDB()
+
+ // 获取启用的轮播图,按排序排列
+ var banners []models.Banner
+ err := db.Where("status = ?", 1).Order("sort_order ASC, created_at DESC").Find(&banners).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询轮播图失败"))
+ return
+ }
+
+ // 获取启用的商品分类,按排序排列
+ var categories []models.ProductCategory
+ err = db.Where("status = ?", 1).Order("sort_order ASC, created_at DESC").Find(&categories).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询商品分类失败"))
+ return
+ }
+
+ // 获取上架的一级商品,按排序排列,限制数量
+ var primaryProducts []models.PrimaryProduct
+ err = db.Where("status = ?", 1).
+ Preload("Category").
+ Order("is_hot desc, sort_order ASC, created_at DESC").
+ Find(&primaryProducts).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询一级商品失败"))
+ return
+ }
+
+ // 构建返回数据
+ result := map[string]interface{}{
+ "banners": banners,
+ "categories": categories,
+ "primary_products": primaryProducts,
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// GetProductCategories 获取商品分类列表
+func (h *UserProductHandler) GetProductCategories(c *gin.Context) {
+ var categories []models.ProductCategory
+
+ err := common.GetDB().Where("status = ?", 1).Order("sort_order ASC, created_at DESC").Find(&categories).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询商品分类失败"))
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(categories))
+}
+
+// GetPrimaryProducts 获取一级商品列表
+func (h *UserProductHandler) GetPrimaryProducts(c *gin.Context) {
+ // 分页参数
+ page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
+ pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10"))
+ if page < 1 {
+ page = 1
+ }
+ if pageSize < 1 || pageSize > 50 {
+ pageSize = 10
+ }
+
+ // 搜索参数
+ categoryID := c.Query("category_id")
+ productName := c.Query("product_name")
+ sortType := c.DefaultQuery("sort", "default") // default, price_asc, price_desc, sales, views
+
+ db := common.GetDB()
+ var products []models.PrimaryProduct
+ var total int64
+
+ // 构建查询条件 - 只查询上架商品
+ query := db.Model(&models.PrimaryProduct{}).Where("status = ?", 1).Preload("Category")
+
+ // 添加搜索条件
+ if categoryID != "" {
+ query = query.Where("category_id = ?", categoryID)
+ }
+ if productName != "" {
+ query = query.Where("product_name LIKE ?", "%"+productName+"%")
+ }
+
+ // 获取总数
+ query.Count(&total)
+
+ // 排序
+ switch sortType {
+ case "price_asc":
+ query = query.Order("current_price ASC")
+ case "price_desc":
+ query = query.Order("current_price DESC")
+ case "sales":
+ query = query.Order("sales_count DESC")
+ case "views":
+ query = query.Order("view_count DESC")
+ default:
+ query = query.Order("sort_order ASC, created_at DESC")
+ }
+
+ // 分页查询
+ offset := (page - 1) * pageSize
+ err := query.Offset(offset).Limit(pageSize).Find(&products).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询商品列表失败"))
+ return
+ }
+
+ // 构建返回数据
+ result := map[string]interface{}{
+ "list": products,
+ "total": total,
+ "page": page,
+ "page_size": pageSize,
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// GetPrimaryProduct 获取一级商品详情
+func (h *UserProductHandler) GetPrimaryProduct(c *gin.Context) {
+ productID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "商品ID无效"))
+ return
+ }
+
+ var product models.PrimaryProduct
+ err = common.GetDB().Where("status = ?", 1).Preload("Category").First(&product, uint(productID)).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "商品不存在或已下架"))
+ return
+ }
+
+ // 增加浏览量
+ common.GetDB().Model(&product).UpdateColumn("view_count", product.ViewCount+1)
+
+ c.JSON(http.StatusOK, common.Success(product))
+}
+
+// GetSecondaryProducts 获取二级商品列表(用户挂售的商品)
+func (h *UserProductHandler) GetSecondaryProducts(c *gin.Context) {
+ // 分页参数
+ page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
+
+ pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10"))
+ if page < 1 {
+ page = 1
+ }
+ if pageSize < 1 || pageSize > 50 {
+ pageSize = 10
+ }
+
+ // 搜索参数
+ productName := c.Query("product_name")
+ sortType := c.DefaultQuery("sort", "default") // default, price_asc, price_desc, views
+ categoryId, _ := strconv.Atoi(c.DefaultQuery("category_id", "0"))
+
+ // 地址筛选参数
+ province := c.Query("province")
+ city := c.Query("city")
+ district := c.Query("district")
+
+ db := common.GetDB()
+ var products []models.SecondaryProduct
+ var total int64
+
+ // 构建查询条件 - 只查询上架商品,并预加载卖家信息
+ query := db.Model(&models.SecondaryProduct{}).Where("status = ? and quantity>0", 1).
+ Preload("Seller")
+
+ // 添加商品名称搜索条件
+ if productName != "" {
+ query = query.Where("product_name LIKE ?", "%"+productName+"%")
+ }
+
+ // 添加分类筛选条件
+ if categoryId > 0 {
+ query = query.Where("category_id = ?", categoryId)
+ }
+
+ // 添加地址筛选条件 - 根据卖家的默认地址筛选
+ if province != "" || city != "" || district != "" {
+ // 子查询获取符合地址条件的用户ID
+ subQuery := db.Model(&models.UserAddress{}).
+ Select("user_id").
+ Where("is_default = ?", 1)
+
+ if province != "" {
+ subQuery = subQuery.Where("province = ?", province)
+ }
+ if city != "" {
+ subQuery = subQuery.Where("city = ?", city)
+ }
+ if district != "" {
+ subQuery = subQuery.Where("district = ?", district)
+ }
+
+ query = query.Where("seller_id IN (?)", subQuery)
+ }
+ // 获取总数
+ query.Count(&total)
+
+ // 排序
+ switch sortType {
+ case "price":
+ query = query.Order("selling_price ASC")
+ case "price_desc":
+ query = query.Order("selling_price DESC")
+ case "view":
+ query = query.Order("view_count DESC")
+ case "sales":
+ query = query.Order("sales_count DESC")
+ case "quantity":
+ query = query.Order("quantity DESC")
+ default:
+ query = query.Order("created_at DESC")
+ }
+
+ // 分页查询
+ offset := (page - 1) * pageSize
+ err := query.Offset(offset).Limit(pageSize).Find(&products).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询商品列表失败"))
+ return
+ }
+
+ // 获取当前用户信息
+ currentUser, exists := c.Get("current_user")
+ var userID uint
+ if exists {
+ user := currentUser.(models.User)
+ userID = user.ID
+ }
+
+ // 获取系统配置limit_days
+ var config models.SystemConfig
+ db.Where("config_key=?", "limit_days").First(&config)
+ limitDays, _ := strconv.Atoi(config.ConfigValue)
+
+ // 为每个商品添加购买限制检查
+ type ProductWithPurchaseLimit struct {
+ models.SecondaryProduct
+ CanPurchase bool `json:"can_purchase"`
+ PurchaseLimitMessage string `json:"purchase_limit_message"`
+ }
+
+ productList := make([]ProductWithPurchaseLimit, 0, len(products))
+ for _, product := range products {
+ productWithLimit := ProductWithPurchaseLimit{
+ SecondaryProduct: product,
+ CanPurchase: true,
+ PurchaseLimitMessage: "",
+ }
+
+ // 如果用户已登录,检查购买限制
+ if exists && userID > 0 {
+ // 检查是否是自己的商品
+ if product.SellerID == userID {
+ productWithLimit.CanPurchase = false
+ productWithLimit.PurchaseLimitMessage = "不能购买自己的商品"
+ } else if limitDays > 0 {
+ // 检查是否在限制天数内已经购买过该卖家的商品
+ limitDaysAgo := time.Now().AddDate(0, 0, -limitDays)
+ var existingOrderCount int64
+ db.Model(&models.PurchaseOrder{}).Where(
+ "buyer_id = ? AND seller_id = ? AND product_type = 2 AND created_at > ? AND order_status != 3",
+ userID, product.SellerID, limitDaysAgo,
+ ).Count(&existingOrderCount)
+
+ if existingOrderCount > 0 {
+ productWithLimit.CanPurchase = false
+ productWithLimit.PurchaseLimitMessage = fmt.Sprintf("%v天内只能向同一个卖家购买一次商品", limitDays)
+ }
+ }
+ }
+
+ productList = append(productList, productWithLimit)
+ }
+
+ // 构建返回数据
+ result := map[string]interface{}{
+ "list": productList,
+ "total": total,
+ "page": page,
+ "page_size": pageSize,
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// GetSecondaryProduct 获取二级商品详情
+func (h *UserProductHandler) GetSecondaryProduct(c *gin.Context) {
+ productID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "商品ID无效"))
+ return
+ }
+
+ var product models.SecondaryProduct
+ err = common.GetDB().Where("status = ?", 1).Preload("Seller").First(&product, uint(productID)).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "商品不存在或已下架"))
+ return
+ }
+
+ // 增加浏览量
+ common.GetDB().Model(&product).UpdateColumn("view_count", product.ViewCount+1)
+
+ c.JSON(http.StatusOK, common.Success(product))
+}
diff --git a/internal/handlers/user_reconciliation_handler.go b/internal/handlers/user_reconciliation_handler.go
new file mode 100644
index 0000000..40047cc
--- /dev/null
+++ b/internal/handlers/user_reconciliation_handler.go
@@ -0,0 +1,157 @@
+package handlers
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/models"
+ "net/http"
+ "time"
+
+ "github.com/gin-gonic/gin"
+)
+
+// UserReconciliationHandler 用户端对账管理处理器
+type UserReconciliationHandler struct{}
+
+// GetReconciliationStats 获取对账统计数据
+func (h *UserReconciliationHandler) GetReconciliationStats(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 获取日期参数
+ startDate := c.Query("start_date")
+ endDate := c.Query("end_date")
+
+ // 如果没有传入日期,默认为今天
+ if startDate == "" || endDate == "" {
+ today := time.Now().Format("2006-01-02")
+ startDate = today
+ endDate = today
+ }
+
+ // 解析日期
+ startTime, err := time.Parse("2006-01-02", startDate)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "开始日期格式错误"))
+ return
+ }
+ endTime, err := time.Parse("2006-01-02", endDate)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "结束日期格式错误"))
+ return
+ }
+
+ // 设置时间范围
+ startTime = time.Date(startTime.Year(), startTime.Month(), startTime.Day(), 0, 0, 0, 0, startTime.Location())
+ endTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 23, 59, 59, 999999999, endTime.Location())
+
+ // 构建返回数据
+ result := map[string]interface{}{
+ "primary_confirmed": h.getPrimaryMarketStats(user.ID, startTime, endTime, 2), // 已确认
+ "primary_pending": h.getPrimaryMarketStats(user.ID, startTime, endTime, 1), // 待确认
+ "secondary_buy_confirmed": h.getSecondaryBuyStats(user.ID, startTime, endTime, 2), // 二级市场买单已确认
+ "secondary_buy_pending": h.getSecondaryBuyStats(user.ID, startTime, endTime, 1), // 二级市场买单待确认
+ "secondary_sell_confirmed": h.getSecondarySellStats(user.ID, startTime, endTime, 2), // 二级市场卖单已确认
+ "secondary_sell_pending": h.getSecondarySellStats(user.ID, startTime, endTime, 1), // 二级市场卖单待确认
+ "warehouse_active": h.getWarehouseStats(user.ID, 1), // 寄售中
+ "warehouse_inactive": h.getWarehouseStats(user.ID, 0), // 未寄售
+ "score_change": h.getScoreChangeStats(user.ID, startTime, endTime), // 积分变更
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// getPrimaryMarketStats 获取一级市场统计数据
+func (h *UserReconciliationHandler) getPrimaryMarketStats(userID uint, startTime, endTime time.Time, status int) map[string]interface{} {
+ var totalAmount float64
+ var totalQuantity int64
+ db := common.GetDB()
+ // 查询一级商品订单统计
+ db.Model(&models.PurchaseOrder{}).
+ Where("buyer_id = ? AND product_type = ? AND order_status = ? AND created_at BETWEEN ? AND ?",
+ userID, 1, status, startTime, endTime).
+ Select("COALESCE(SUM(total_amount), 0) as total_amount, COALESCE(SUM(quantity), 0) as total_quantity").
+ Row().Scan(&totalAmount, &totalQuantity)
+
+ return map[string]interface{}{
+ "amount": totalAmount,
+ "quantity": totalQuantity,
+ }
+}
+
+// getSecondaryBuyStats 获取二级市场买单统计数据
+func (h *UserReconciliationHandler) getSecondaryBuyStats(userID uint, startTime, endTime time.Time, status int) map[string]interface{} {
+ var totalAmount float64
+ var totalQuantity int64
+ db := common.GetDB()
+ // 查询二级商品买单统计
+ db.Model(&models.PurchaseOrder{}).
+ Where("buyer_id = ? AND product_type = ? AND order_status = ? AND created_at BETWEEN ? AND ?",
+ userID, 2, status, startTime, endTime).
+ Select("COALESCE(SUM(total_amount), 0) as total_amount, COALESCE(SUM(quantity), 0) as total_quantity").
+ Row().Scan(&totalAmount, &totalQuantity)
+
+ return map[string]interface{}{
+ "amount": totalAmount,
+ "quantity": totalQuantity,
+ }
+}
+
+// getSecondarySellStats 获取二级市场卖单统计数据
+func (h *UserReconciliationHandler) getSecondarySellStats(userID uint, startTime, endTime time.Time, status int) map[string]interface{} {
+ var totalAmount float64
+ var totalQuantity int64
+ db := common.GetDB()
+ // 查询二级商品卖单统计
+ db.Model(&models.SalesOrder{}).
+ Where("seller_id = ? AND order_status = ? AND created_at BETWEEN ? AND ?",
+ userID, status, startTime, endTime).
+ Select("COALESCE(SUM(total_amount), 0) as total_amount, COALESCE(SUM(quantity), 0) as total_quantity").
+ Row().Scan(&totalAmount, &totalQuantity)
+
+ return map[string]interface{}{
+ "amount": totalAmount,
+ "quantity": totalQuantity,
+ }
+}
+
+// getWarehouseStats 获取仓库商品统计数据
+func (h *UserReconciliationHandler) getWarehouseStats(userID uint, status int) map[string]interface{} {
+ var totalAmount float64
+ var totalQuantity int64
+ db := common.GetDB()
+ // 查询仓库商品统计
+ db.Model(&models.UserWarehouse{}).
+ Where("user_id = ? AND status = ?", userID, status).
+ Select("COALESCE(SUM(warehouse_price * quantity), 0) as total_amount, COALESCE(SUM(quantity), 0) as total_quantity").
+ Row().Scan(&totalAmount, &totalQuantity)
+
+ return map[string]interface{}{
+ "amount": totalAmount,
+ "quantity": totalQuantity,
+ }
+}
+
+// getScoreChangeStats 获取积分变更统计数据
+func (h *UserReconciliationHandler) getScoreChangeStats(userID uint, startTime, endTime time.Time) map[string]interface{} {
+ var increaseScore int64
+ var decreaseScore int64
+ db := common.GetDB()
+ // 查询增加的积分
+ db.Model(&models.ScoreRecord{}).
+ Where("user_id = ? AND change_number > 0 AND created_at BETWEEN ? AND ?",
+ userID, startTime, endTime).
+ Select("COALESCE(SUM(change_number), 0)").
+ Row().Scan(&increaseScore)
+
+ // 查询减少的积分(取绝对值)
+ db.Model(&models.ScoreRecord{}).
+ Where("user_id = ? AND change_number < 0 AND created_at BETWEEN ? AND ?",
+ userID, startTime, endTime).
+ Select("COALESCE(ABS(SUM(change_number)), 0)").
+ Row().Scan(&decreaseScore)
+
+ return map[string]interface{}{
+ "increase": increaseScore,
+ "decrease": decreaseScore,
+ }
+}
diff --git a/internal/handlers/user_score_handler.go b/internal/handlers/user_score_handler.go
new file mode 100644
index 0000000..2743afb
--- /dev/null
+++ b/internal/handlers/user_score_handler.go
@@ -0,0 +1,131 @@
+package handlers
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/models"
+ "net/http"
+ "strconv"
+
+ "github.com/gin-gonic/gin"
+)
+
+// UserScoreHandler 用户端积分处理器
+type UserScoreHandler struct{}
+
+// GetMyScoreRecords 获取我的积分记录列表
+func (h *UserScoreHandler) GetMyScoreRecords(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 分页参数
+ page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
+ pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
+ if page < 1 {
+ page = 1
+ }
+ if pageSize < 1 || pageSize > 50 {
+ pageSize = 20
+ }
+
+ // 搜索参数
+ changeType := c.Query("change_type") // all, positive, negative
+
+ db := common.GetDB()
+ var records []models.ScoreRecord
+ var total int64
+
+ // 构建查询条件 - 只查询当前用户的积分记录
+ query := db.Model(&models.ScoreRecord{}).Where("user_id = ?", user.ID)
+
+ // 添加积分变化类型筛选
+ if changeType == "positive" {
+ query = query.Where("change_number > 0")
+ } else if changeType == "negative" {
+ query = query.Where("change_number < 0")
+ }
+
+ // 获取总数
+ query.Count(&total)
+
+ // 分页查询
+ offset := (page - 1) * pageSize
+ err := query.Offset(offset).Limit(pageSize).Order("created_at DESC").Find(&records).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询积分记录失败"))
+ return
+ }
+
+ // 计算统计信息
+ var totalIncome int // 总收入积分
+ var totalExpense int // 总支出积分
+ var currentPoints int // 当前积分
+
+ currentPoints = user.CurrentPoints
+
+ // 统计总收入和总支出
+ db.Model(&models.ScoreRecord{}).Where("user_id = ? AND change_number > 0", user.ID).
+ Select("COALESCE(SUM(change_number), 0)").Scan(&totalIncome)
+ db.Model(&models.ScoreRecord{}).Where("user_id = ? AND change_number < 0", user.ID).
+ Select("COALESCE(SUM(ABS(change_number)), 0)").Scan(&totalExpense)
+
+ // 构建返回数据
+ result := map[string]interface{}{
+ "list": records,
+ "total": total,
+ "page": page,
+ "page_size": pageSize,
+ "current_points": currentPoints,
+ "total_income": totalIncome,
+ "total_expense": totalExpense,
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// GetMyScoreStats 获取我的积分统计信息
+func (h *UserScoreHandler) GetMyScoreStats(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ db := common.GetDB()
+
+ // 当前积分
+ currentPoints := user.CurrentPoints
+
+ // 总收入积分
+ var totalIncome int
+ db.Model(&models.ScoreRecord{}).Where("user_id = ? AND change_number > 0", user.ID).
+ Select("COALESCE(SUM(change_number), 0)").Scan(&totalIncome)
+
+ // 总支出积分
+ var totalExpense int
+ db.Model(&models.ScoreRecord{}).Where("user_id = ? AND change_number < 0", user.ID).
+ Select("COALESCE(SUM(ABS(change_number)), 0)").Scan(&totalExpense)
+
+ // 今日获得积分
+ var todayIncome int
+ db.Model(&models.ScoreRecord{}).Where("user_id = ? AND change_number > 0 AND DATE(created_at) = CURDATE()", user.ID).
+ Select("COALESCE(SUM(change_number), 0)").Scan(&todayIncome)
+
+ // 本月获得积分
+ var monthIncome int
+ db.Model(&models.ScoreRecord{}).Where("user_id = ? AND change_number > 0 AND YEAR(created_at) = YEAR(NOW()) AND MONTH(created_at) = MONTH(NOW())", user.ID).
+ Select("COALESCE(SUM(change_number), 0)").Scan(&monthIncome)
+
+ // 最近的积分记录(5条)
+ var recentRecords []models.ScoreRecord
+ db.Model(&models.ScoreRecord{}).Where("user_id = ?", user.ID).
+ Order("created_at DESC").Limit(5).Find(&recentRecords)
+
+ // 构建返回数据
+ result := map[string]interface{}{
+ "current_points": currentPoints,
+ "total_income": totalIncome,
+ "total_expense": totalExpense,
+ "today_income": todayIncome,
+ "month_income": monthIncome,
+ "recent_records": recentRecords,
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
\ No newline at end of file
diff --git a/internal/handlers/user_warehouse_handler.go b/internal/handlers/user_warehouse_handler.go
new file mode 100644
index 0000000..4e596eb
--- /dev/null
+++ b/internal/handlers/user_warehouse_handler.go
@@ -0,0 +1,247 @@
+package handlers
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/models"
+ "net/http"
+ "strconv"
+
+ "github.com/gin-gonic/gin"
+)
+
+// UserWarehouseHandler 用户仓库处理器
+type UserWarehouseHandler struct{}
+
+// GetWarehouseList 获取用户仓库商品列表
+func (h *UserWarehouseHandler) GetWarehouseList(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ // 分页参数
+ page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
+ pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10"))
+ if page < 1 {
+ page = 1
+ }
+ if pageSize < 1 || pageSize > 50 {
+ pageSize = 10
+ }
+
+ // 筛选参数
+ productType := c.Query("product_type")
+ status := c.Query("status")
+ productName := c.Query("product_name")
+
+ db := common.GetDB()
+ var warehouses []models.UserWarehouse
+ var total int64
+
+ // 构建查询条件
+ query := db.Model(&models.UserWarehouse{}).Where("user_id = ? and quantity>0", user.ID)
+
+ // 添加筛选条件
+ if productType != "" {
+ query = query.Where("product_type = ?", productType)
+ }
+ if status != "" {
+ query = query.Where("status = ?", status)
+ }
+ if productName != "" {
+ query = query.Where("product_name LIKE ?", "%"+productName+"%")
+ }
+
+ // 获取总数
+ query.Count(&total)
+
+ // 分页查询
+ offset := (page - 1) * pageSize
+ err := query.Order("created_at DESC").Offset(offset).Limit(pageSize).Find(&warehouses).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(500, "查询仓库商品列表失败"))
+ return
+ }
+
+ // 计算总价值
+ var totalValue float64
+ db.Model(&models.UserWarehouse{}).Where("user_id = ? AND status = 1", user.ID).
+ Select("COALESCE(SUM(warehouse_price * quantity), 0)").Scan(&totalValue)
+
+ // 构建返回数据
+ result := map[string]interface{}{
+ "list": warehouses,
+ "total": total,
+ "page": page,
+ "page_size": pageSize,
+ "total_value": totalValue,
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// GetWarehouseItem 获取单个仓库商品详情
+func (h *UserWarehouseHandler) GetWarehouseItem(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ itemID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "商品ID无效"))
+ return
+ }
+
+ var warehouse models.UserWarehouse
+ err = common.GetDB().Where("id = ? AND user_id = ?", itemID, user.ID).First(&warehouse).Error
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(404, "仓库商品不存在"))
+ return
+ }
+
+ c.JSON(http.StatusOK, common.Success(warehouse))
+}
+
+// SellWarehouseItem 出售仓库商品
+func (h *UserWarehouseHandler) SellWarehouseItem(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ itemID, err := strconv.ParseUint(c.Param("id"), 10, 32)
+ if err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "商品ID无效"))
+ return
+ }
+
+ var req struct {
+ Quantity int `json:"quantity" binding:"required,min=1"`
+ Price float64 `json:"price" binding:"required,gt=0"`
+ Description string `json:"description" binding:"required"`
+ Condition string `json:"condition" binding:"required"`
+ }
+
+ if err := c.ShouldBindJSON(&req); err != nil {
+ c.JSON(http.StatusOK, common.Error(400, "请求参数错误"))
+ return
+ }
+
+ db := common.GetDB()
+ tx := db.Begin()
+
+ // 查询仓库商品
+ var warehouse models.UserWarehouse
+ if err := tx.Where("id = ? AND user_id = ? AND status = 1", itemID, user.ID).First(&warehouse).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(404, "仓库商品不存在或已出售"))
+ return
+ }
+
+ // 检查库存数量
+ if warehouse.Quantity < req.Quantity {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(400, "库存数量不足"))
+ return
+ }
+
+ // 创建二级商品上架
+ secondaryProduct := models.SecondaryProduct{
+ SellerID: user.ID,
+ OriginalProductID: &warehouse.ProductID,
+ OriginalProductType: warehouse.ProductType,
+ ProductName: warehouse.ProductName,
+ ProductDescription: req.Description,
+ ProductImages: warehouse.ProductImages,
+ CostPrice: warehouse.PurchasePrice,
+ SellingPrice: req.Price,
+ Quantity: req.Quantity,
+ Status: 1, // 上架状态
+ ViewCount: 0,
+ CategoryID: 1, // 默认分类,可以后续优化
+ ProductCondition: req.Condition,
+ UserWarehouseID: uint(itemID),
+ }
+
+ if secondaryProduct.OriginalProductType == 1 {
+ var primaryProduct models.PrimaryProduct
+ err = tx.Where("id=?", secondaryProduct.OriginalProductID).First(&primaryProduct).Error
+ if err == nil {
+ secondaryProduct.CategoryID = primaryProduct.CategoryID
+ }
+ } else {
+ var sec models.SecondaryProduct
+ err = tx.Where("id=?", secondaryProduct.OriginalProductID).First(&sec).Error
+ if err == nil {
+ secondaryProduct.CategoryID = sec.CategoryID
+ }
+ }
+
+ if err := tx.Create(&secondaryProduct).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "创建出售商品失败"))
+ return
+ }
+
+ // 更新仓库商品数量
+ if warehouse.Quantity == req.Quantity {
+ // 全部出售,更新状态为已出售
+ if err := tx.Model(&warehouse).Updates(map[string]interface{}{
+ "quantity": 0,
+ "status": 0, // 已出售
+ }).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "更新仓库商品状态失败"))
+ return
+ }
+ } else {
+ // 部分出售,减少数量
+ if err := tx.Model(&warehouse).Update("quantity", warehouse.Quantity-req.Quantity).Error; err != nil {
+ tx.Rollback()
+ c.JSON(http.StatusOK, common.Error(500, "更新仓库商品数量失败"))
+ return
+ }
+ }
+
+ tx.Commit()
+
+ result := map[string]interface{}{
+ "message": "商品挂售成功",
+ "secondary_product": secondaryProduct,
+ }
+
+ c.JSON(http.StatusOK, common.Success(result))
+}
+
+// GetWarehouseStats 获取仓库统计信息
+func (h *UserWarehouseHandler) GetWarehouseStats(c *gin.Context) {
+ currentUser, _ := c.Get("current_user")
+ user := currentUser.(models.User)
+
+ db := common.GetDB()
+ stats := make(map[string]interface{})
+
+ // 库存中商品数量
+ var stockCount int64
+ db.Model(&models.UserWarehouse{}).Where("user_id = ? AND status = 1", user.ID).Count(&stockCount)
+
+ // 已出售商品数量
+ var soldCount int64
+ db.Model(&models.UserWarehouse{}).Where("user_id = ? AND status = 0", user.ID).Count(&soldCount)
+
+ // 库存总价值
+ var totalValue float64
+ db.Model(&models.UserWarehouse{}).Where("user_id = ? AND status = 1", user.ID).
+ Select("COALESCE(SUM(warehouse_price * quantity), 0)").Scan(&totalValue)
+
+ // 一级商品数量
+ var primaryCount int64
+ db.Model(&models.UserWarehouse{}).Where("user_id = ? AND product_type = 1 AND status = 1", user.ID).Count(&primaryCount)
+
+ // 二级商品数量
+ var secondaryCount int64
+ db.Model(&models.UserWarehouse{}).Where("user_id = ? AND product_type = 2 AND status = 1", user.ID).Count(&secondaryCount)
+
+ stats["stock_count"] = stockCount
+ stats["sold_count"] = soldCount
+ stats["total_value"] = totalValue
+ stats["primary_count"] = primaryCount
+ stats["secondary_count"] = secondaryCount
+
+ c.JSON(http.StatusOK, common.Success(stats))
+}
diff --git a/internal/middleware/auth.go b/internal/middleware/auth.go
new file mode 100644
index 0000000..afa9f49
--- /dev/null
+++ b/internal/middleware/auth.go
@@ -0,0 +1,102 @@
+package middleware
+
+import (
+ "awesomeProject/internal/common"
+ jwtutil "awesomeProject/pkg/utils"
+ "github.com/gin-gonic/gin"
+ "net/http"
+ "strings"
+)
+
+// Whitelist 白名单路径(支持通配符)
+var Whitelist = []string{
+ "/back/file/**",
+ "/back/login",
+}
+
+func CORSMiddleware() gin.HandlerFunc {
+ return func(c *gin.Context) {
+ c.Header("Access-Control-Allow-Origin", "*")
+ c.Header("Access-Control-Allow-Methods", "*")
+ c.Header("Access-Control-Allow-Headers", "*")
+ if c.Request.Method == "OPTIONS" {
+ c.AbortWithStatus(http.StatusNoContent)
+ return
+ }
+ c.Next()
+ }
+}
+
+func JWTMiddleware(c *gin.Context) {
+ // ✅ 1. 获取请求路径
+ path := c.Request.URL.Path
+ if !strings.HasPrefix(path, "/back") {
+ c.Next()
+ return
+ }
+ // ✅ 2. 检查是否在白名单中
+ for _, rule := range Whitelist {
+ if PathMatch(rule, path) {
+ c.Next()
+ return
+ }
+ }
+
+ // ✅ 3. 从 Header 中提取 Token
+ tokenString := c.GetHeader("token")
+ if tokenString == "" {
+ c.AbortWithStatusJSON(http.StatusOK, common.Error(401, "token无效"))
+ return
+ }
+
+ // ✅ 4. 解析并验证 Token
+ claims, err := jwtutil.ParseTokenToMap(tokenString)
+ if err != nil {
+ c.AbortWithStatusJSON(http.StatusOK, common.Error(401, "token无效"))
+ return
+ }
+
+ // ✅ 5. Token 有效,继续处理
+ c.Set("tokenMap", claims)
+ c.Next()
+}
+
+// PathMatch 判断请求路径是否匹配白名单中的通配符规则
+func PathMatch(pattern, path string) bool {
+ if pattern == path {
+ return true
+ }
+
+ if len(pattern) > 0 && pattern[0] == '/' {
+ pattern = pattern[1:]
+ }
+ if len(path) > 0 && path[0] == '/' {
+ path = path[1:]
+ }
+
+ patternParts := strings.Split(pattern, "/")
+ pathParts := strings.Split(path, "/")
+
+ if len(patternParts) > len(pathParts) {
+ return false
+ }
+
+ for i := 0; i < len(patternParts); i++ {
+ p := patternParts[i]
+ if p == "**" {
+ // 匹配任意多级路径
+ return true
+ } else if p == "*" {
+ // 匹配单级路径
+ if i == len(patternParts)-1 {
+ return true
+ }
+ continue
+ } else if p != pathParts[i] {
+ return false
+ }
+ }
+
+ // 如果模式完全匹配路径的前缀
+ return len(patternParts) == len(pathParts)
+}
diff --git a/internal/middleware/right.go b/internal/middleware/right.go
new file mode 100644
index 0000000..8af47c1
--- /dev/null
+++ b/internal/middleware/right.go
@@ -0,0 +1,213 @@
+package middleware
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/models"
+ "fmt"
+ "github.com/gin-gonic/gin"
+ "net/http"
+ "strconv"
+)
+
+// AdminRoleMiddleware 管理员权限中间件
+func AdminRoleMiddleware() gin.HandlerFunc {
+ return func(c *gin.Context) {
+ // 获取token中的用户信息
+ tokenMap, exists := c.Get("tokenMap")
+ if !exists {
+ c.AbortWithStatusJSON(http.StatusOK, common.Error(401, "未授权访问"))
+ return
+ }
+
+ claims := tokenMap.(map[string]interface{})
+ userIDFloat, ok := claims["user_id"].(float64)
+ if !ok {
+ c.AbortWithStatusJSON(http.StatusOK, common.Error(401, "用户信息无效"))
+ return
+ }
+
+ userID := uint(userIDFloat)
+
+ // 查询用户信息
+ var user models.User
+ if err := common.GetDB().First(&user, userID).Error; err != nil {
+ c.AbortWithStatusJSON(http.StatusOK, common.Error(401, "用户不存在"))
+ return
+ }
+
+ // 检查用户角色:0管理员,1代理商,2普通用户
+ if user.SystemRole != 0 {
+ c.AbortWithStatusJSON(http.StatusOK, common.Error(403, "权限不足,仅管理员可访问"))
+ return
+ }
+
+ c.Set("current_user", user)
+ c.Next()
+ }
+}
+
+// AgentRoleMiddleware 代理商权限中间件
+func AgentRoleMiddleware() gin.HandlerFunc {
+ return func(c *gin.Context) {
+ // 获取token中的用户信息
+ tokenMap, exists := c.Get("tokenMap")
+ if !exists {
+ c.AbortWithStatusJSON(http.StatusOK, common.Error(401, "未授权访问"))
+ return
+ }
+
+ claims := tokenMap.(map[string]interface{})
+ userIDFloat, ok := claims["user_id"].(float64)
+ if !ok {
+ c.AbortWithStatusJSON(http.StatusOK, common.Error(401, "用户信息无效"))
+ return
+ }
+
+ userID := uint(userIDFloat)
+
+ // 查询用户信息
+ var user models.User
+ if err := common.GetDB().First(&user, userID).Error; err != nil {
+ c.AbortWithStatusJSON(http.StatusOK, common.Error(401, "用户不存在"))
+ return
+ }
+
+ // 检查用户角色:0管理员,1代理商
+ if user.SystemRole != 0 && user.SystemRole != 1 {
+ c.AbortWithStatusJSON(http.StatusOK, common.Error(403, "权限不足,仅管理员和代理商可访问"))
+ return
+ }
+
+ c.Set("current_user", user)
+ c.Next()
+ }
+}
+func UserRoleMiddleware() gin.HandlerFunc {
+ return func(c *gin.Context) {
+
+ // 获取token中的用户信息
+ tokenMap, exists := c.Get("tokenMap")
+ if !exists {
+ c.AbortWithStatusJSON(http.StatusOK, common.Error(401, "未授权访问"))
+ return
+ }
+
+ claims := tokenMap.(map[string]interface{})
+ userIDFloat, ok := claims["user_id"].(float64)
+ if !ok {
+ c.AbortWithStatusJSON(http.StatusOK, common.Error(401, "用户信息无效"))
+ return
+ }
+
+ userID := uint(userIDFloat)
+
+ // 查询用户信息
+ var user models.User
+ if err := common.GetDB().First(&user, userID).Error; err != nil {
+ c.AbortWithStatusJSON(http.StatusOK, common.Error(401, "用户不存在"))
+ return
+ }
+
+ c.Set("current_user", user)
+ c.Next()
+ }
+}
+
+// CheckUserPermission 检查用户权限(代理商只能查看自己邀请的用户)
+func CheckUserPermission() gin.HandlerFunc {
+ return func(c *gin.Context) {
+ currentUser, exists := c.Get("current_user")
+ if !exists {
+ c.AbortWithStatusJSON(http.StatusOK, common.Error(401, "用户信息获取失败"))
+ return
+ }
+
+ user := currentUser.(models.User)
+
+ // 如果是管理员,拥有所有权限
+ if user.SystemRole == 0 {
+ c.Next()
+ return
+ }
+
+ // 如果是代理商,需要检查权限
+ if user.SystemRole == 1 {
+ // 获取请求路径
+ //path := c.Request.URL.Path
+ method := c.Request.Method
+
+ //// 代理商权限限制
+ //allowedPaths := []string{
+ // "/back/admin/users", // 查看用户列表
+ // "/back/admin/purchase-orders", // 查看买单
+ // "/back/admin/sales-orders", // 查看卖单
+ // "/back/admin/score-records", // 查看积分记录
+ //}
+ //
+ //// 检查是否为允许的路径
+ //pathAllowed := false
+ //for _, allowedPath := range allowedPaths {
+ // if strings.HasPrefix(path, allowedPath) {
+ // pathAllowed = true
+ // break
+ // }
+ //}
+ //
+ //if !pathAllowed {
+ // c.AbortWithStatusJSON(http.StatusOK, common.Error(403, "代理商权限不足"))
+ // return
+ //}
+
+ // 对于GET请求,添加查询过滤条件
+ if method == "GET" {
+ // 设置代理商身份码,用于数据过滤
+ c.Set("agent_identity_code", user.IdentityCode)
+ } else {
+ // 非GET请求,代理商不允许
+ c.AbortWithStatusJSON(http.StatusOK, common.Error(403, "代理商只能查看数据,不能进行修改操作"))
+ return
+ }
+ }
+
+ c.Next()
+ }
+}
+
+// GetUserIDFromParam 从URL参数中获取用户ID并检查权限
+func GetUserIDFromParam(c *gin.Context, paramName string) (uint, error) {
+ currentUser, exists := c.Get("current_user")
+ if !exists {
+ return 0, fmt.Errorf("用户信息获取失败")
+ }
+
+ user := currentUser.(models.User)
+ userIDStr := c.Param(paramName)
+ userID, err := strconv.ParseUint(userIDStr, 10, 32)
+ if err != nil {
+ return 0, fmt.Errorf("用户ID无效")
+ }
+
+ targetUserID := uint(userID)
+
+ // 如果是管理员,可以查看所有用户
+ if user.SystemRole == 0 {
+ return targetUserID, nil
+ }
+
+ // 如果是代理商,只能查看自己邀请的用户
+ if user.SystemRole == 1 {
+ var targetUser models.User
+ if err := common.GetDB().First(&targetUser, targetUserID).Error; err != nil {
+ return 0, fmt.Errorf("目标用户不存在")
+ }
+
+ // 检查是否为代理商邀请的用户
+ if targetUser.ReferrerIdentityCode != user.IdentityCode {
+ return 0, fmt.Errorf("权限不足,只能查看您邀请的用户")
+ }
+
+ return targetUserID, nil
+ }
+
+ return 0, fmt.Errorf("权限不足")
+}
diff --git a/internal/models/banner.go b/internal/models/banner.go
new file mode 100644
index 0000000..1f61e58
--- /dev/null
+++ b/internal/models/banner.go
@@ -0,0 +1,22 @@
+package models
+
+import (
+ "time"
+)
+
+// Banner 轮播图表
+type Banner struct {
+ ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
+ Title string `gorm:"type:varchar(200);not null;comment:轮播图标题" json:"title" binding:"required"`
+ ImageUrl string `gorm:"type:varchar(500);not null;comment:轮播图图片URL" json:"image_url" binding:"required"`
+ LinkUrl string `gorm:"type:varchar(500);comment:点击跳转链接" json:"link_url"`
+ Description string `gorm:"type:text;comment:描述信息" json:"description"`
+ SortOrder int `gorm:"type:int;not null;default:0;comment:排序序号" json:"sort_order"`
+ Status uint8 `gorm:"type:tinyint;not null;default:1;comment:状态:0禁用,1启用" json:"status"`
+ CreatedAt time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP" json:"created_at"`
+ UpdatedAt time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" json:"updated_at"`
+}
+
+func (Banner) TableName() string {
+ return "banners"
+}
\ No newline at end of file
diff --git a/internal/models/migrate.go b/internal/models/migrate.go
new file mode 100644
index 0000000..3b5f9d4
--- /dev/null
+++ b/internal/models/migrate.go
@@ -0,0 +1,28 @@
+package models
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/config"
+)
+
+// AutoMigrateAll 自动迁移所有数据表
+func AutoMigrateAll() error {
+ db := common.GetDB()
+
+ // 按依赖关系迁移表
+ return db.AutoMigrate(
+ &User{},
+ &UserAddress{},
+ &ProductCategory{},
+ &PrimaryProduct{},
+ &SecondaryProduct{},
+ &UserWarehouse{},
+ &PurchaseOrder{},
+ &SalesOrder{},
+ &OrderMessage{}, // 订单留言表
+ &SystemConfig{},
+ &ScoreRecord{},
+ &Banner{}, // 轮播图表
+ &config.ConfigChange{}, // 配置变更记录表
+ )
+}
\ No newline at end of file
diff --git a/internal/models/order_message.go b/internal/models/order_message.go
new file mode 100644
index 0000000..b5d2d44
--- /dev/null
+++ b/internal/models/order_message.go
@@ -0,0 +1,25 @@
+package models
+
+import (
+ "time"
+)
+
+// OrderMessage 订单留言模型
+type OrderMessage struct {
+ ID uint `gorm:"primaryKey" json:"id"`
+ OrderID uint `gorm:"not null;index" json:"order_id"` // 订单ID
+ OrderType string `gorm:"type:varchar(20);not null;default:'purchase'" json:"order_type"` // 订单类型:purchase(买单), sales(卖单)
+ UserID uint `gorm:"not null;index" json:"user_id"` // 留言用户ID
+ Content string `gorm:"type:text;not null" json:"content"` // 留言内容
+ Images string `gorm:"type:text" json:"images"` // 留言图片,多个图片用逗号分隔
+ CreatedAt time.Time `json:"created_at"`
+ UpdatedAt time.Time `json:"updated_at"`
+
+ // 关联关系
+ User *User `gorm:"foreignKey:UserID" json:"user,omitempty"`
+}
+
+// TableName 指定表名
+func (OrderMessage) TableName() string {
+ return "order_messages"
+}
\ No newline at end of file
diff --git a/internal/models/primary_product.go b/internal/models/primary_product.go
new file mode 100644
index 0000000..1a5c698
--- /dev/null
+++ b/internal/models/primary_product.go
@@ -0,0 +1,31 @@
+package models
+
+import (
+ "time"
+)
+
+// PrimaryProduct 一级商品表(管理员发布的官方商品)
+type PrimaryProduct struct {
+ ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
+ CategoryID uint `gorm:"type:int;not null;comment:分类ID" json:"category_id" binding:"required"`
+ ProductName string `gorm:"type:varchar(200);not null;comment:商品名称" json:"product_name" binding:"required"`
+ ProductDescription string `gorm:"type:text;comment:商品描述" json:"product_description"`
+ ProductImages string `gorm:"type:text;comment:商品图片URLs,逗号分割" json:"product_images"`
+ OriginalPrice float64 `gorm:"type:decimal(10,2);not null;comment:原价" json:"original_price" binding:"required"`
+ CurrentPrice float64 `gorm:"type:decimal(10,2);not null;comment:现价" json:"current_price" binding:"required"`
+ StockQuantity int `gorm:"type:int;not null;default:0;comment:库存数量" json:"stock_quantity"`
+ SalesCount int `gorm:"type:int;not null;default:0;comment:销量" json:"sales_count"`
+ ViewCount int `gorm:"type:int;not null;default:0;comment:浏览量" json:"view_count"`
+ Status uint8 `gorm:"type:tinyint;not null;default:1;comment:状态:0下架,1上架" json:"status"`
+ IsHot int8 `gorm:"type:tinyint;not null;default:0;comment:是否为热门商品:0否,1是" json:"is_hot"`
+ SortOrder int `gorm:"type:int;not null;default:0;comment:排序序号" json:"sort_order"`
+ CreatedAt time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP" json:"created_at"`
+ UpdatedAt time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" json:"updated_at"`
+
+ // 关联关系 - 注意:不要在关联字段上加验证标签
+ Category ProductCategory `gorm:"foreignKey:CategoryID" json:"category,omitempty"`
+}
+
+func (PrimaryProduct) TableName() string {
+ return "primary_products"
+}
diff --git a/internal/models/product_category.go b/internal/models/product_category.go
new file mode 100644
index 0000000..e83b89e
--- /dev/null
+++ b/internal/models/product_category.go
@@ -0,0 +1,20 @@
+package models
+
+import (
+ "time"
+)
+
+// ProductCategory 商品分类表
+type ProductCategory struct {
+ ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
+ CategoryName string `gorm:"type:varchar(100);not null;comment:分类名称" json:"category_name" binding:"required"`
+ CategoryIcon string `gorm:"type:varchar(255);comment:分类图标URL" json:"category_icon"`
+ SortOrder int `gorm:"type:int;not null;default:0;comment:排序序号" json:"sort_order"`
+ Status uint8 `gorm:"type:tinyint;not null;default:1;comment:状态:0禁用,1启用" json:"status"`
+ CreatedAt time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP" json:"created_at"`
+ UpdatedAt time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" json:"updated_at"`
+}
+
+func (ProductCategory) TableName() string {
+ return "product_categories"
+}
\ No newline at end of file
diff --git a/internal/models/purchase_order.go b/internal/models/purchase_order.go
new file mode 100644
index 0000000..78ca232
--- /dev/null
+++ b/internal/models/purchase_order.go
@@ -0,0 +1,35 @@
+package models
+
+import (
+ "time"
+)
+
+// PurchaseOrder 买单表
+type PurchaseOrder struct {
+ ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
+ OrderNo string `gorm:"type:varchar(50);not null;uniqueIndex;comment:订单编号" json:"order_no"`
+ BuyerID uint `gorm:"type:int;not null;comment:买家用户ID" json:"buyer_id" binding:"required"`
+ SellerID *uint `gorm:"type:int;comment:卖家用户ID(二级商品交易时使用)" json:"seller_id"`
+ ProductID uint `gorm:"type:int;not null;comment:商品ID" json:"product_id" binding:"required"`
+ ProductType uint8 `gorm:"type:tinyint;not null;comment:商品类型:1一级商品,2二级商品" json:"product_type" binding:"required"`
+ ProductName string `gorm:"type:varchar(200);not null;comment:商品名称" json:"product_name" binding:"required"`
+ ProductImages string `gorm:"type:text;comment:商品图片URLs,逗号分割" json:"product_images"`
+ UnitPrice float64 `gorm:"type:decimal(10,2);not null;comment:单价" json:"unit_price" binding:"required"`
+ Quantity int `gorm:"type:int;not null;default:1;comment:数量" json:"quantity"`
+ TotalAmount float64 `gorm:"type:decimal(10,2);not null;comment:总金额" json:"total_amount" binding:"required"`
+ AddressID *uint `gorm:"type:int;comment:收货地址ID" json:"address_id"`
+ OrderStatus uint8 `gorm:"type:tinyint;not null;default:0;comment:订单状态:0待付款,1待确认,2已完成,3已取消" json:"order_status"`
+ ConfirmTime *time.Time `gorm:"type:timestamp;null;comment:确认时间" json:"confirm_time"`
+ Remark string `gorm:"type:text;comment:备注" json:"remark"`
+ CreatedAt time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP" json:"created_at"`
+ UpdatedAt time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" json:"updated_at"`
+ PaymentProofImage string `gorm:"type:varchar(255)" json:"payment_proof_image"`
+ // 关联关系
+ Buyer User `gorm:"foreignKey:BuyerID" json:"buyer,omitempty"`
+ Seller *User `gorm:"foreignKey:SellerID" json:"seller,omitempty"`
+ Address *UserAddress `gorm:"foreignKey:AddressID" json:"address,omitempty"`
+}
+
+func (PurchaseOrder) TableName() string {
+ return "purchase_orders"
+}
diff --git a/internal/models/sales_order.go b/internal/models/sales_order.go
new file mode 100644
index 0000000..c1a093d
--- /dev/null
+++ b/internal/models/sales_order.go
@@ -0,0 +1,37 @@
+package models
+
+import (
+ "time"
+)
+
+// SalesOrder 卖单表
+type SalesOrder struct {
+ ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
+ OrderNo string `gorm:"type:varchar(50);not null;uniqueIndex;comment:订单编号" json:"order_no"`
+ SellerID uint `gorm:"type:int;not null;comment:卖家用户ID" json:"seller_id" binding:"required"`
+ BuyerID uint `gorm:"type:int;not null;comment:买家用户ID" json:"buyer_id" binding:"required"`
+ SecondaryProductID uint `gorm:"type:int;not null;comment:二级商品ID" json:"secondary_product_id" binding:"required"`
+ ProductName string `gorm:"type:varchar(200);not null;comment:商品名称" json:"product_name" binding:"required"`
+ ProductImages string `gorm:"type:text;comment:商品图片URLs,逗号分割" json:"product_images"`
+ SellingPrice float64 `gorm:"type:decimal(10,2);not null;comment:出售价格" json:"selling_price" binding:"required"`
+ Quantity int `gorm:"type:int;not null;default:1;comment:数量" json:"quantity"`
+ TotalAmount float64 `gorm:"type:decimal(10,2);not null;comment:总金额" json:"total_amount" binding:"required"`
+ AddressID *uint `gorm:"type:int;comment:收货地址ID" json:"address_id"`
+ OrderStatus uint8 `gorm:"type:tinyint;not null;default:0;comment:订单状态:0待付款,1待发货,2确认完成,3已取消" json:"order_status"`
+ CompleteTime *time.Time `gorm:"type:timestamp;null;comment:完成时间" json:"complete_time"`
+ Remark string `gorm:"type:text;comment:备注" json:"remark"`
+ CreatedAt time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP" json:"created_at"`
+ UpdatedAt time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" json:"updated_at"`
+ PaymentProofImage string `json:"payment_proof_image" gorm:"type:varchar(255)"`
+ PurchaseOrderID uint `gorm:"type:int;" json:"purchase_order_id"`
+ // 关联关系
+ Seller *User `gorm:"foreignKey:SellerID" json:"seller,omitempty"`
+ Buyer User `gorm:"foreignKey:BuyerID" json:"buyer,omitempty"`
+ SecondaryProduct SecondaryProduct `gorm:"foreignKey:SecondaryProductID" json:"secondary_product,omitempty"`
+ Address *UserAddress `gorm:"foreignKey:AddressID" json:"address,omitempty"`
+ PurchaseOrder *PurchaseOrder `gorm:"foreignKey:PurchaseOrderID" json:"purchase_order,omitempty"`
+}
+
+func (SalesOrder) TableName() string {
+ return "sales_orders"
+}
diff --git a/internal/models/score_record.go b/internal/models/score_record.go
new file mode 100644
index 0000000..e60eb38
--- /dev/null
+++ b/internal/models/score_record.go
@@ -0,0 +1,22 @@
+package models
+
+import (
+ "time"
+)
+
+// ScoreRecord 积分记录表
+type ScoreRecord struct {
+ ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
+ UserID uint `gorm:"type:int;not null;comment:用户编号" json:"user_id" binding:"required"`
+ ChangeNumber int `gorm:"type:int;not null;comment:变化数量" json:"change_number" binding:"required"`
+ Note string `gorm:"type:varchar(200);not null;comment:说明" json:"note" binding:"required"`
+ CreatedAt time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP" json:"created_at"`
+ UpdatedAt time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" json:"updated_at"`
+
+ // 关联关系
+ User User `gorm:"foreignKey:UserID" json:"user,omitempty"`
+}
+
+func (ScoreRecord) TableName() string {
+ return "score_records"
+}
diff --git a/internal/models/secondary_product.go b/internal/models/secondary_product.go
new file mode 100644
index 0000000..8900922
--- /dev/null
+++ b/internal/models/secondary_product.go
@@ -0,0 +1,35 @@
+package models
+
+import (
+ "time"
+)
+
+// SecondaryProduct 二级商品表(用户上架的商品)
+type SecondaryProduct struct {
+ ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
+ SellerID uint `gorm:"type:int;not null;comment:卖家用户ID" json:"seller_id" binding:"required"`
+ OriginalProductID *uint `gorm:"type:int;comment:原始商品ID(一级商品ID或二级商品ID)" json:"original_product_id"`
+ OriginalProductType uint8 `gorm:"type:tinyint;not null;comment:原始商品类型:1一级商品,2二级商品" json:"original_product_type" binding:"required"`
+ ProductName string `gorm:"type:varchar(200);not null;comment:商品名称" json:"product_name" binding:"required"`
+ ProductDescription string `gorm:"type:text;comment:商品描述" json:"product_description"`
+ ProductImages string `gorm:"type:text;comment:商品图片URLs,JSON格式存储" json:"product_images"`
+ CostPrice float64 `gorm:"type:decimal(10,2);not null;comment:成本价(用户购买时的价格)" json:"cost_price" binding:"required"`
+ SellingPrice float64 `gorm:"type:decimal(10,2);not null;comment:出售价格" json:"selling_price" binding:"required"`
+ Quantity int `gorm:"type:int;not null;default:1;comment:出售数量" json:"quantity"`
+ Status uint8 `gorm:"type:tinyint;not null;default:1;comment:状态:0下架,1上架,2已售出" json:"status"`
+ ViewCount int `gorm:"type:int;not null;default:0;comment:浏览量" json:"view_count"`
+ SalesCount int `gorm:"type:int;not null;default:0;" json:"sales_count"`
+ CreatedAt time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP" json:"created_at"`
+ UpdatedAt time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" json:"updated_at"`
+ CategoryID uint `gorm:"type:int;not null;default:0;comment:商品分类ID" json:"category_id"`
+ ProductCondition string `gorm:"type varchar(255)" json:"product_condition"`
+ UserWarehouseID uint `gorm:"type:int;not null" json:"user_warehouse_id"`
+ // 关联关系
+ Seller User `gorm:"foreignKey:SellerID" json:"seller,omitempty"`
+ Category *ProductCategory `gorm:"foreignKey:CategoryID" json:"category,omitempty"`
+ UserWarehouse *UserWarehouse `gorm:"foreignKey:UserWarehouseID" json:"user_warehouse,omitempty"`
+}
+
+func (SecondaryProduct) TableName() string {
+ return "secondary_products"
+}
diff --git a/internal/models/system_config.go b/internal/models/system_config.go
new file mode 100644
index 0000000..ba02335
--- /dev/null
+++ b/internal/models/system_config.go
@@ -0,0 +1,22 @@
+package models
+
+import (
+ "time"
+)
+
+// SystemConfig 系统常量设置表
+type SystemConfig struct {
+ ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
+ ConfigKey string `gorm:"type:varchar(100);not null;uniqueIndex;comment:配置键" json:"config_key" binding:"required"`
+ ConfigValue string `gorm:"type:text;not null;comment:配置值" json:"config_value" binding:"required"`
+ ConfigName string `gorm:"type:varchar(200);not null;comment:配置名称" json:"config_name" binding:"required"`
+ ConfigDescription string `gorm:"type:text;comment:配置描述" json:"config_description"`
+ ConfigType string `gorm:"type:varchar(20);not null;default:'string';comment:配置类型:string、number、boolean、json" json:"config_type"`
+ IsSystem uint8 `gorm:"type:tinyint;not null;default:0;comment:是否系统配置:0否,1是" json:"is_system"`
+ CreatedAt time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP" json:"created_at"`
+ UpdatedAt time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" json:"updated_at"`
+}
+
+func (SystemConfig) TableName() string {
+ return "system_configs"
+}
\ No newline at end of file
diff --git a/internal/models/user.go b/internal/models/user.go
new file mode 100644
index 0000000..e869e7c
--- /dev/null
+++ b/internal/models/user.go
@@ -0,0 +1,34 @@
+package models
+
+import (
+ "time"
+)
+
+// User 用户表
+type User struct {
+ ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
+ Phone string `gorm:"type:varchar(20);not null;uniqueIndex" json:"phone" binding:"required"`
+ SystemRole uint8 `gorm:"type:tinyint;not null;default:2;comment:系统角色:0管理员,1代理商,2普通用户" json:"system_role"`
+ CustomerName string `gorm:"type:varchar(50)" json:"customer_name"`
+ RealName string `gorm:"type:varchar(50)" json:"real_name"`
+ CurrentPoints int `gorm:"type:int;not null;default:0;comment:当前积分" json:"current_points"`
+ Avatar string `gorm:"type:varchar(255)" json:"avatar"`
+ CompanyName string `gorm:"type:varchar(100)" json:"company_name"`
+ PersonalIntro string `gorm:"type:text" json:"personal_intro"`
+ IdentityCode string `gorm:"type:varchar(50);uniqueIndex" json:"identity_code"`
+ ReferrerIdentityCode string `gorm:"type:varchar(50)" json:"referrer_identity_code"`
+ BusinessLicenseImage string `gorm:"type:varchar(255)" json:"business_license_image"`
+ IdCardFrontImage string `gorm:"type:varchar(255)" json:"id_card_front_image"`
+ IdCardBackImage string `gorm:"type:varchar(255)" json:"id_card_back_image"`
+ MainPaymentQrImage *string `gorm:"type:varchar(255)" json:"main_payment_qr_image"`
+ SubPaymentQrImage *string `gorm:"type:varchar(255)" json:"sub_payment_qr_image"`
+ Password string `gorm:"type:varchar(255)" json:"password"`
+ Status uint8 `gorm:"type:tinyint;not null;default:1;comment:状态:0禁用,1启用" json:"status"`
+ ExpiryDate *time.Time `gorm:"type:timestamp;null;comment:过期时间,null表示永不过期" json:"expiry_date"`
+ CreatedAt time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP" json:"created_at"`
+ UpdatedAt time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" json:"updated_at"`
+}
+
+func (User) TableName() string {
+ return "users"
+}
diff --git a/internal/models/user_address.go b/internal/models/user_address.go
new file mode 100644
index 0000000..1ef4dae
--- /dev/null
+++ b/internal/models/user_address.go
@@ -0,0 +1,28 @@
+package models
+
+import (
+ "time"
+)
+
+// UserAddress 收货地址表
+type UserAddress struct {
+ ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
+ UserID uint `gorm:"type:int;not null;comment:用户ID" json:"user_id"`
+ ConsigneeName string `gorm:"type:varchar(50);not null;comment:收件人姓名" json:"consignee_name" binding:"required"`
+ ConsigneePhone string `gorm:"type:varchar(20);not null;comment:收件人电话" json:"consignee_phone" binding:"required"`
+ Province string `gorm:"type:varchar(50);not null;comment:省份" json:"province" binding:"required"`
+ City string `gorm:"type:varchar(50);not null;comment:城市" json:"city" binding:"required"`
+ District string `gorm:"type:varchar(50);not null;comment:区县" json:"district" binding:"required"`
+ DetailAddress string `gorm:"type:varchar(200);not null;comment:详细地址" json:"detail_address" binding:"required"`
+ PostalCode string `gorm:"type:varchar(10);comment:邮政编码" json:"postal_code"`
+ IsDefault uint8 `gorm:"type:tinyint;not null;default:0;comment:是否默认地址:0否,1是" json:"is_default"`
+ CreatedAt time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP" json:"created_at"`
+ UpdatedAt time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" json:"updated_at"`
+
+ // 关联关系
+ User *User `gorm:"foreignKey:UserID;constraint:OnDelete:CASCADE" json:"-"`
+}
+
+func (UserAddress) TableName() string {
+ return "user_addresses"
+}
diff --git a/internal/models/user_warehouse.go b/internal/models/user_warehouse.go
new file mode 100644
index 0000000..6fcf6e9
--- /dev/null
+++ b/internal/models/user_warehouse.go
@@ -0,0 +1,29 @@
+package models
+
+import (
+ "time"
+)
+
+// UserWarehouse 用户仓库表
+type UserWarehouse struct {
+ ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
+ UserID uint `gorm:"type:int;not null;comment:用户ID" json:"user_id" binding:"required"`
+ ProductID uint `gorm:"type:int;not null;comment:商品ID" json:"product_id" binding:"required"`
+ ProductType uint8 `gorm:"type:tinyint;not null;comment:商品类型:1一级商品,2二级商品" json:"product_type" binding:"required"`
+ ProductName string `gorm:"type:varchar(200);not null;comment:商品名称" json:"product_name" binding:"required"`
+ ProductImages string `gorm:"type:text;comment:商品图片URLs,JSON格式存储" json:"product_images"`
+ PurchasePrice float64 `gorm:"type:decimal(10,2);not null;comment:购买价格" json:"purchase_price" binding:"required"`
+ WarehousePrice float64 `gorm:"type:decimal(10,2);not null;comment:入库价格(根据系统常量增值后)" json:"warehouse_price" binding:"required"`
+ Quantity int `gorm:"type:int;not null;default:1;comment:数量" json:"quantity"`
+ SourceOrderID *uint `gorm:"type:int;comment:来源订单ID" json:"source_order_id"`
+ Status uint8 `gorm:"type:tinyint;not null;default:1;comment:状态:0已出售,1库存中" json:"status"`
+ CreatedAt time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP" json:"created_at"`
+ UpdatedAt time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" json:"updated_at"`
+
+ // 关联关系
+ User User `gorm:"foreignKey:UserID" json:"user,omitempty"`
+}
+
+func (UserWarehouse) TableName() string {
+ return "user_warehouse"
+}
\ No newline at end of file
diff --git a/internal/routers/admin_router.go b/internal/routers/admin_router.go
new file mode 100644
index 0000000..765d51b
--- /dev/null
+++ b/internal/routers/admin_router.go
@@ -0,0 +1,168 @@
+package routers
+
+import (
+ "awesomeProject/internal/handlers"
+ "awesomeProject/internal/middleware"
+
+ "github.com/gin-gonic/gin"
+)
+
+// SetupAdminRoutes 设置管理端路由
+func SetupAdminRoutes(router *gin.Engine) {
+ // 管理端路由组
+ adminGroup := router.Group("/back/admin")
+
+ // 应用JWT中间件
+ adminGroup.Use(middleware.JWTMiddleware)
+
+ // 创建handler实例
+ userHandler := &handlers.AdminUserHandler{}
+ orderHandler := &handlers.AdminOrderHandler{}
+ scoreHandler := &handlers.AdminScoreHandler{}
+ productHandler := &handlers.AdminProductHandler{}
+ configHandler := &handlers.AdminConfigHandler{}
+ paymentHandler := &handlers.AdminPaymentHandler{}
+ orderMessageHandler := &handlers.AdminOrderMessageHandler{}
+ bannerHandler := &handlers.AdminBannerHandler{}
+
+ // 用户管理路由(管理员和代理商都可访问,但代理商有限制)
+ userRoutes := adminGroup.Group("/users")
+
+ userRoutes.Use(middleware.AgentRoleMiddleware(), middleware.CheckUserPermission())
+ {
+ userRoutes.GET("", userHandler.GetUsers) // 获取用户列表
+
+ userRoutes.GET("/:id", userHandler.GetUser) // 获取单个用户信息
+ userRoutes.GET("/stats", userHandler.GetUserStats) // 获取用户统计
+ userRoutes.GET("/search-stats", userHandler.SearchUserStats) // 搜索用户统计
+ // 以下接口仅管理员可访问
+ userRoutes.Use(middleware.AdminRoleMiddleware())
+
+ userRoutes.POST("", userHandler.CreateUser) // 创建用户
+ userRoutes.PUT("/:id", userHandler.UpdateUser) // 更新用户
+ userRoutes.PUT("/:id/expiry", userHandler.SetUserExpiryDate) // 设置用户过期时间
+ userRoutes.DELETE("/:id", userHandler.DeleteUser) // 删除用户
+ }
+
+ // 用户库存管理路由(仅管理员可访问)
+ warehouseRoutes := adminGroup.Group("/warehouse")
+ warehouseRoutes.Use(middleware.AdminRoleMiddleware())
+ {
+ warehouseRoutes.GET("/users", userHandler.GetAllUserWarehouses) // 获取所有用户库存汇总
+ }
+
+ // 订单管理路由(管理员和代理商都可访问,但代理商有限制)
+ orderRoutes := adminGroup.Group("/orders")
+ orderRoutes.Use(middleware.AgentRoleMiddleware(), middleware.CheckUserPermission())
+ {
+ // 买单管理
+ purchaseGroup := orderRoutes.Group("/purchase")
+ {
+ purchaseGroup.GET("", orderHandler.GetPurchaseOrders) // 获取买单列表
+ purchaseGroup.GET("/stats", orderHandler.GetOrderStats) // 获取订单统计
+ purchaseGroup.GET("/trend", orderHandler.GetOrderTrend) // 获取订单趋势
+ purchaseGroup.GET("/activities", orderHandler.GetRecentActivities) // 获取最近活动
+ purchaseGroup.GET("/:id", orderHandler.GetPurchaseOrder) // 获取单个买单详情
+
+ // 以下接口仅管理员可访问
+ purchaseGroup.Use(middleware.AdminRoleMiddleware())
+ purchaseGroup.PUT("/:id/status", orderHandler.UpdatePurchaseOrderStatus) // 更新买单状态
+ }
+
+ // 卖单管理
+ salesGroup := orderRoutes.Group("/sales")
+ {
+ salesGroup.GET("", orderHandler.GetSalesOrders) // 获取卖单列表
+ salesGroup.GET("/:id", orderHandler.GetSalesOrder) // 获取单个卖单详情
+
+ // 以下接口仅管理员可访问
+ salesGroup.Use(middleware.AdminRoleMiddleware())
+ salesGroup.PUT("/:id/status", orderHandler.UpdateSalesOrderStatus) // 更新卖单状态
+ }
+
+ // 订单留言管理(管理员和代理商都可访问)
+ orderRoutes.GET("/:order_id/messages", orderMessageHandler.GetOrderMessages) // 获取订单留言列表
+ orderRoutes.POST("/:order_id/messages", orderMessageHandler.CreateOrderMessage) // 创建订单留言
+ }
+
+ // 积分管理路由(管理员和代理商都可访问,但代理商有限制)
+ scoreRoutes := adminGroup.Group("/scores")
+ scoreRoutes.Use(middleware.AgentRoleMiddleware(), middleware.CheckUserPermission())
+ {
+ scoreRoutes.GET("", scoreHandler.GetScoreRecords) // 获取积分记录列表
+ scoreRoutes.GET("/stats", scoreHandler.GetScoreStats) // 获取积分统计
+ scoreRoutes.GET("/:id", scoreHandler.GetScoreRecord) // 获取单个积分记录详情
+
+ // 以下接口仅管理员可访问
+ scoreRoutes.Use(middleware.AdminRoleMiddleware())
+ scoreRoutes.POST("", scoreHandler.CreateScoreRecord) // 创建积分记录
+ scoreRoutes.PUT("/:id", scoreHandler.UpdateScoreRecord) // 更新积分记录
+ scoreRoutes.DELETE("/:id", scoreHandler.DeleteScoreRecord) // 删除积分记录
+ }
+
+ // 商品管理路由(仅管理员可访问)
+ productRoutes := adminGroup.Group("/products")
+ productRoutes.Use(middleware.AdminRoleMiddleware())
+ {
+ // 商品分类管理
+ categoryGroup := productRoutes.Group("/categories")
+ {
+ categoryGroup.GET("", productHandler.GetProductCategories) // 获取分类列表
+ categoryGroup.POST("", productHandler.CreateProductCategory) // 创建分类
+ categoryGroup.PUT("/:id", productHandler.UpdateProductCategory) // 更新分类
+ categoryGroup.DELETE("/:id", productHandler.DeleteProductCategory) // 删除分类
+ }
+
+ // 一级商品管理
+ primaryGroup := productRoutes.Group("/primary")
+ {
+ primaryGroup.GET("", productHandler.GetPrimaryProducts) // 获取一级商品列表
+ primaryGroup.GET("/stats", productHandler.GetProductStats) // 获取商品统计
+ primaryGroup.GET("/:id", productHandler.GetPrimaryProduct) // 获取单个一级商品详情
+ primaryGroup.POST("", productHandler.CreatePrimaryProduct) // 创建一级商品
+ primaryGroup.PUT("/:id", productHandler.UpdatePrimaryProduct) // 更新一级商品
+ primaryGroup.DELETE("/:id", productHandler.DeletePrimaryProduct) // 删除一级商品
+ }
+
+ // 二级商品管理(仅查看)
+ secondaryGroup := productRoutes.Group("/secondary")
+ {
+ secondaryGroup.GET("", productHandler.GetSecondaryProducts) // 获取二级商品列表
+ }
+ }
+
+ // 系统配置管理路由(仅管理员可访问)
+ configRoutes := adminGroup.Group("/configs")
+ configRoutes.Use(middleware.AdminRoleMiddleware())
+ {
+ configRoutes.GET("", configHandler.GetSystemConfigs) // 获取系统配置列表
+ configRoutes.GET("/:id", configHandler.GetSystemConfig) // 获取单个系统配置
+ configRoutes.POST("", configHandler.CreateSystemConfig) // 创建系统配置
+ configRoutes.PUT("/:id", configHandler.UpdateSystemConfig) // 更新系统配置
+ configRoutes.DELETE("/:id", configHandler.DeleteSystemConfig) // 删除系统配置
+ }
+
+ // 管理员付款方式路由
+ paymentRoutes := adminGroup.Group("/payment")
+ {
+ paymentRoutes.GET("/info", paymentHandler.GetPaymentInfo) // 获取管理员付款方式信息(无需权限验证,用户购买时需要查看)
+
+ // 以下接口仅管理员可访问
+ paymentRoutes.Use(middleware.AdminRoleMiddleware())
+ paymentRoutes.PUT("/info", paymentHandler.UpdatePaymentInfo) // 更新管理员付款方式信息
+ }
+
+ // 轮播图管理路由(仅管理员可访问)
+ bannerRoutes := adminGroup.Group("/banners")
+ bannerRoutes.Use(middleware.AdminRoleMiddleware())
+ {
+ bannerRoutes.GET("", bannerHandler.GetBanners) // 获取轮播图列表
+ bannerRoutes.GET("/:id", bannerHandler.GetBanner) // 获取单个轮播图
+ bannerRoutes.POST("", bannerHandler.CreateBanner) // 创建轮播图
+ bannerRoutes.PUT("/:id", bannerHandler.UpdateBanner) // 更新轮播图
+ bannerRoutes.DELETE("/:id", bannerHandler.DeleteBanner) // 删除轮播图
+ }
+
+ // 公共配置查询路由(根据key获取配置,无需权限验证)
+ adminGroup.GET("/config/:key", configHandler.GetConfigByKey)
+}
diff --git a/internal/routers/public_router.go b/internal/routers/public_router.go
new file mode 100644
index 0000000..a771d1e
--- /dev/null
+++ b/internal/routers/public_router.go
@@ -0,0 +1,53 @@
+package routers
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/handlers"
+ "awesomeProject/internal/middleware"
+ "awesomeProject/internal/models"
+ "github.com/gin-gonic/gin"
+)
+
+// SetupPublicRoutes 设置公共路由
+func SetupPublicRoutes(router *gin.Engine) {
+ // 创建handler实例
+ authHandler := &handlers.AuthHandler{}
+ uploadHandler := handlers.NewUploadHandler()
+
+ // 公共路由组
+ publicGroup := router.Group("/back")
+ publicGroup.POST("/upload", uploadHandler.UploadFile)
+ publicGroup.GET("/config", func(context *gin.Context) {
+
+ db := common.GetDB()
+ key := context.DefaultQuery("key", "")
+ if key == "" {
+ context.JSON(200, common.Error(500, "键值对为空"))
+ return
+ }
+ var config models.SystemConfig
+ db.Where("config_key=?", key).First(&config)
+ context.JSON(200, common.Success(config.ConfigValue))
+ })
+ // 认证相关路由(无需token验证)
+ authGroup := publicGroup.Group("/auth")
+ {
+ authGroup.POST("/login", authHandler.Login) // 用户登录
+ authGroup.POST("/register", authHandler.Register) // 用户注册
+ authGroup.POST("/send-sms", authHandler.SendSMS) // 发送短信验证码
+ }
+
+ // 需要token验证的公共路由
+ protectedGroup := publicGroup.Group("")
+
+ protectedGroup.Use(middleware.JWTMiddleware)
+ {
+ protectedGroup.GET("/current-user", authHandler.GetCurrentUser) // 获取当前用户信息
+ protectedGroup.PUT("/update-profile", authHandler.UpdateProfile) // 更新个人信息
+ protectedGroup.PUT("/change-password", authHandler.ChangePassword) // 修改密码
+
+ // 文件上传路由
+ // 单文件上传
+ protectedGroup.POST("/upload/batch", uploadHandler.BatchUploadFiles) // 批量文件上传
+ }
+}
diff --git a/internal/routers/router.go b/internal/routers/router.go
new file mode 100644
index 0000000..258350c
--- /dev/null
+++ b/internal/routers/router.go
@@ -0,0 +1,27 @@
+package routers
+
+import (
+ "awesomeProject/internal/middleware"
+
+ "github.com/gin-gonic/gin"
+)
+
+// SetupRouter 设置路由
+func SetupRouter() *gin.Engine {
+ // 创建gin引擎
+ router := gin.Default()
+
+ // 添加全局中间件
+ router.Use(middleware.CORSMiddleware())
+
+ // 设置公共路由(如登录、注册等)
+ SetupPublicRoutes(router)
+
+ // 设置管理端路由
+ SetupAdminRoutes(router)
+
+ // 设置用户端路由
+ SetupUserRoutes(router)
+
+ return router
+}
\ No newline at end of file
diff --git a/internal/routers/user_router.go b/internal/routers/user_router.go
new file mode 100644
index 0000000..2d39ce8
--- /dev/null
+++ b/internal/routers/user_router.go
@@ -0,0 +1,123 @@
+package routers
+
+import (
+ "awesomeProject/internal/handlers"
+ "awesomeProject/internal/middleware"
+
+ "github.com/gin-gonic/gin"
+)
+
+// SetupUserRoutes 设置用户端路由
+func SetupUserRoutes(router *gin.Engine) {
+ // 用户端路由组
+ userGroup := router.Group("/back/user")
+
+ // 应用JWT中间件(用户端需要登录)
+ userGroup.Use(middleware.JWTMiddleware)
+ userGroup.Use(middleware.UserRoleMiddleware())
+ // 创建handler实例
+ productHandler := &handlers.UserProductHandler{}
+ paymentHandler := &handlers.UserPaymentHandler{}
+ addressHandler := &handlers.UserAddressHandler{}
+ orderHandler := &handlers.UserOrderHandler{}
+ warehouseHandler := &handlers.UserWarehouseHandler{}
+ scoreHandler := &handlers.UserScoreHandler{}
+ orderMessageHandler := &handlers.UserOrderMessageHandler{}
+ reconciliationHandler := &handlers.UserReconciliationHandler{}
+ bannerHandler := &handlers.UserBannerHandler{}
+
+ // 首页数据路由
+ userGroup.GET("/home/data", productHandler.GetHomeData) // 获取首页数据(分类和一级商品)
+
+ // 轮播图相关路由
+ userGroup.GET("/banners", bannerHandler.GetActiveBanners) // 获取启用的轮播图列表
+
+ // 商品相关路由
+ productRoutes := userGroup.Group("/products")
+ {
+ // 商品分类
+ productRoutes.GET("/categories", productHandler.GetProductCategories) // 获取商品分类列表
+
+ // 一级商品(官方商品)
+ primaryGroup := productRoutes.Group("/primary")
+ {
+ primaryGroup.GET("", productHandler.GetPrimaryProducts) // 获取一级商品列表
+ primaryGroup.GET("/:id", productHandler.GetPrimaryProduct) // 获取一级商品详情
+ }
+
+ // 二级商品(用户挂售商品)
+ secondaryGroup := productRoutes.Group("/secondary")
+ {
+ secondaryGroup.GET("", productHandler.GetSecondaryProducts) // 获取二级商品列表
+ secondaryGroup.GET("/:id", productHandler.GetSecondaryProduct) // 获取二级商品详情
+ }
+ }
+
+ // 收款方式相关路由
+ paymentRoutes := userGroup.Group("/payment")
+ {
+ paymentRoutes.GET("/info", paymentHandler.GetPaymentInfo) // 获取收款方式信息
+ paymentRoutes.PUT("/info", paymentHandler.UpdatePaymentInfo) // 更新收款方式信息
+ }
+
+ // 获取卖家收款信息
+ userGroup.GET("/seller/:id/info", paymentHandler.GetSellerInfo) // 获取卖家基本信息
+ userGroup.GET("/seller/:id/payment", paymentHandler.GetSellerPaymentInfo) // 获取卖家收款方式信息
+
+ // 收货地址相关路由
+ addressRoutes := userGroup.Group("/addresses")
+ {
+ addressRoutes.GET("", addressHandler.GetAddressList) // 获取收货地址列表
+ addressRoutes.GET("/:id", addressHandler.GetAddress) // 获取单个收货地址
+ addressRoutes.POST("", addressHandler.CreateAddress) // 创建收货地址
+ addressRoutes.PUT("/:id", addressHandler.UpdateAddress) // 更新收货地址
+ addressRoutes.DELETE("/:id", addressHandler.DeleteAddress) // 删除收货地址
+ addressRoutes.PUT("/:id/default", addressHandler.SetDefaultAddress) // 设置默认收货地址
+ }
+
+ // 订单相关路由
+ orderRoutes := userGroup.Group("/orders")
+ {
+ // 买单相关
+ orderRoutes.POST("/purchase", orderHandler.CreatePurchaseOrder) // 创建买单
+ orderRoutes.GET("/purchase", orderHandler.GetPurchaseOrders) // 获取买单列表
+ orderRoutes.GET("/purchase/:id", orderHandler.GetPurchaseOrderDetail) // 获取买单详情
+ orderRoutes.PUT("/purchase/:id/confirm", orderHandler.ConfirmPurchaseOrder) // 确认买单(买家确认收货)
+ orderRoutes.PUT("/purchase/:id/payment", orderHandler.UploadPaymentProof) // 上传付款凭证
+ orderRoutes.PUT("/purchase/:id/cancel", orderHandler.CancelOrder) // 取消订单
+
+ // 卖单相关
+ orderRoutes.GET("/sales", orderHandler.GetSalesOrders) // 获取卖单列表
+ orderRoutes.GET("/sales/:id", orderHandler.GetSalesOrderDetail) // 获取卖单详情
+ orderRoutes.PUT("/sales/:id/confirm", orderHandler.ConfirmSalesOrder) // 确认卖单(卖家确认发货)
+
+ // 订单留言相关
+ orderRoutes.GET("/:order_id/messages", orderMessageHandler.GetOrderMessages) // 获取订单留言列表
+ orderRoutes.POST("/:order_id/messages", orderMessageHandler.CreateOrderMessage) // 创建订单留言
+
+ // 订单统计
+ orderRoutes.GET("/stats", orderHandler.GetOrderStats) // 获取订单统计信息
+ }
+
+ // 仓库相关路由
+ warehouseRoutes := userGroup.Group("/warehouse")
+ {
+ warehouseRoutes.GET("", warehouseHandler.GetWarehouseList) // 获取仓库商品列表
+ warehouseRoutes.GET("/:id", warehouseHandler.GetWarehouseItem) // 获取单个仓库商品详情
+ warehouseRoutes.POST("/:id/sell", warehouseHandler.SellWarehouseItem) // 出售仓库商品
+ warehouseRoutes.GET("/stats", warehouseHandler.GetWarehouseStats) // 获取仓库统计信息
+ }
+
+ // 积分相关路由
+ scoreRoutes := userGroup.Group("/scores")
+ {
+ scoreRoutes.GET("/records", scoreHandler.GetMyScoreRecords) // 获取我的积分记录列表
+ scoreRoutes.GET("/stats", scoreHandler.GetMyScoreStats) // 获取我的积分统计信息
+ }
+
+ // 对账管理相关路由
+ reconciliationRoutes := userGroup.Group("/reconciliation")
+ {
+ reconciliationRoutes.GET("/stats", reconciliationHandler.GetReconciliationStats) // 获取对账统计数据
+ }
+}
diff --git a/internal/services/sms_service.go b/internal/services/sms_service.go
new file mode 100644
index 0000000..be311e3
--- /dev/null
+++ b/internal/services/sms_service.go
@@ -0,0 +1,261 @@
+package services
+
+import (
+ "fmt"
+ "math/rand"
+ "sync"
+ "time"
+)
+
+// SMSCodeInfo 短信验证码信息
+type SMSCodeInfo struct {
+ Code string // 验证码
+ Phone string // 手机号
+ IP string // IP地址
+ CreatedAt time.Time // 创建时间
+ ExpiresAt time.Time // 过期时间
+}
+
+// RateLimitInfo 频率限制信息
+type RateLimitInfo struct {
+ Count int // 请求次数
+ FirstTime time.Time // 首次请求时间
+ LastTime time.Time // 最后请求时间
+}
+
+// SMSService 短信验证码服务
+type SMSService struct {
+ // 验证码存储:key为手机号,value为验证码信息
+ codes sync.Map // map[string]*SMSCodeInfo
+
+ // 手机号频率限制:key为手机号,value为限制信息
+ phoneLimits sync.Map // map[string]*RateLimitInfo
+
+ // IP频率限制:key为IP地址,value为限制信息
+ ipLimits sync.Map // map[string]*RateLimitInfo
+}
+
+var (
+ smsServiceInstance *SMSService
+ smsServiceOnce sync.Once
+)
+
+// GetSMSService 获取短信服务单例
+func GetSMSService() *SMSService {
+ smsServiceOnce.Do(func() {
+ smsServiceInstance = &SMSService{}
+ // 启动清理协程,定期清理过期数据
+ go smsServiceInstance.cleanup()
+ })
+ return smsServiceInstance
+}
+
+// GenerateCode 生成6位数字验证码
+func (s *SMSService) GenerateCode() string {
+ // 使用时间戳作为随机种子,确保每次生成的验证码都不同
+ r := rand.New(rand.NewSource(time.Now().UnixNano()))
+ return fmt.Sprintf("%06d", r.Intn(1000000))
+}
+
+// SendSMS 发送短信验证码
+// phone: 手机号
+// ip: 客户端IP地址
+// 返回:验证码、错误信息
+func (s *SMSService) SendSMS(phone, ip string) (string, error) {
+ // 1. 验证手机号格式
+ if !s.validatePhone(phone) {
+ return "", fmt.Errorf("手机号格式不正确")
+ }
+
+ // 2. 检查手机号频率限制(同一手机号1分钟内只能发送1次)
+ if err := s.checkPhoneLimit(phone); err != nil {
+ return "", err
+ }
+
+ // 3. 检查IP频率限制(同一IP1分钟内最多发送5次)
+ if err := s.checkIPLimit(ip); err != nil {
+ return "", err
+ }
+
+ // 4. 生成验证码
+ code := s.GenerateCode()
+
+ // 5. 存储验证码信息(有效期5分钟)
+ codeInfo := &SMSCodeInfo{
+ Code: code,
+ Phone: phone,
+ IP: ip,
+ CreatedAt: time.Now(),
+ ExpiresAt: time.Now().Add(5 * time.Minute),
+ }
+ s.codes.Store(phone, codeInfo)
+
+ // 6. 更新频率限制记录
+ s.updatePhoneLimit(phone)
+ s.updateIPLimit(ip)
+
+ // TODO: 这里应该调用真实的短信服务API发送验证码
+ // 目前只返回验证码,实际生产环境需要调用短信服务商API
+ fmt.Printf("[SMS] 发送验证码到 %s: %s (IP: %s)\n", phone, code, ip)
+
+ return code, nil
+}
+
+// VerifyCode 验证验证码
+func (s *SMSService) VerifyCode(phone, code string) bool {
+ value, ok := s.codes.Load(phone)
+ if !ok {
+ return false
+ }
+
+ codeInfo := value.(*SMSCodeInfo)
+
+ // 检查是否过期
+ if time.Now().After(codeInfo.ExpiresAt) {
+ s.codes.Delete(phone)
+ return false
+ }
+
+ // 验证码匹配
+ if codeInfo.Code == code {
+ // 验证成功后删除验证码(一次性使用)
+ s.codes.Delete(phone)
+ return true
+ }
+
+ return false
+}
+
+// validatePhone 验证手机号格式
+func (s *SMSService) validatePhone(phone string) bool {
+ if len(phone) != 11 {
+ return false
+ }
+ // 简单验证:1开头,第二位3-9
+ if phone[0] != '1' || phone[1] < '3' || phone[1] > '9' {
+ return false
+ }
+ return true
+}
+
+// checkPhoneLimit 检查手机号频率限制
+// 同一手机号1分钟内只能发送1次
+func (s *SMSService) checkPhoneLimit(phone string) error {
+ value, ok := s.phoneLimits.Load(phone)
+ if !ok {
+ return nil // 没有限制记录,可以发送
+ }
+
+ limitInfo := value.(*RateLimitInfo)
+ // 检查是否在限制时间内(1分钟)
+ if time.Since(limitInfo.LastTime) < 1*time.Minute {
+ return fmt.Errorf("操作过于频繁,请1分钟后再试")
+ }
+
+ return nil
+}
+
+// checkIPLimit 检查IP频率限制
+// 同一IP1分钟内最多发送5次
+func (s *SMSService) checkIPLimit(ip string) error {
+ value, ok := s.ipLimits.Load(ip)
+ if !ok {
+ return nil // 没有限制记录,可以发送
+ }
+
+ limitInfo := value.(*RateLimitInfo)
+
+ // 如果超过1分钟,重置计数
+ if time.Since(limitInfo.FirstTime) >= 1*time.Minute {
+ limitInfo.Count = 0
+ limitInfo.FirstTime = time.Now()
+ return nil
+ }
+
+ // 检查是否超过限制(1分钟内最多5次)
+ if limitInfo.Count >= 5 {
+ return fmt.Errorf("请求过于频繁,请稍后再试")
+ }
+
+ return nil
+}
+
+// updatePhoneLimit 更新手机号限制记录
+func (s *SMSService) updatePhoneLimit(phone string) {
+ value, ok := s.phoneLimits.Load(phone)
+ if !ok {
+ // 创建新记录
+ s.phoneLimits.Store(phone, &RateLimitInfo{
+ Count: 1,
+ FirstTime: time.Now(),
+ LastTime: time.Now(),
+ })
+ return
+ }
+
+ limitInfo := value.(*RateLimitInfo)
+ limitInfo.Count++
+ limitInfo.LastTime = time.Now()
+}
+
+// updateIPLimit 更新IP限制记录
+func (s *SMSService) updateIPLimit(ip string) {
+ value, ok := s.ipLimits.Load(ip)
+ if !ok {
+ // 创建新记录
+ s.ipLimits.Store(ip, &RateLimitInfo{
+ Count: 1,
+ FirstTime: time.Now(),
+ LastTime: time.Now(),
+ })
+ return
+ }
+
+ limitInfo := value.(*RateLimitInfo)
+
+ // 如果超过1分钟,重置计数
+ if time.Since(limitInfo.FirstTime) >= 1*time.Minute {
+ limitInfo.Count = 1
+ limitInfo.FirstTime = time.Now()
+ limitInfo.LastTime = time.Now()
+ } else {
+ limitInfo.Count++
+ limitInfo.LastTime = time.Now()
+ }
+}
+
+// cleanup 定期清理过期数据
+func (s *SMSService) cleanup() {
+ ticker := time.NewTicker(2 * time.Minute) // 每10分钟清理一次
+ defer ticker.Stop()
+
+ for range ticker.C {
+ now := time.Now()
+
+ // 清理过期的验证码
+ s.codes.Range(func(key, value interface{}) bool {
+ codeInfo := value.(*SMSCodeInfo)
+ if now.After(codeInfo.ExpiresAt) {
+ s.codes.Delete(key)
+ }
+ return true
+ })
+
+ // 清理过期的频率限制记录(超过1小时未使用的记录)
+ s.phoneLimits.Range(func(key, value interface{}) bool {
+ limitInfo := value.(*RateLimitInfo)
+ if now.Sub(limitInfo.LastTime) > 1*time.Hour {
+ s.phoneLimits.Delete(key)
+ }
+ return true
+ })
+
+ s.ipLimits.Range(func(key, value interface{}) bool {
+ limitInfo := value.(*RateLimitInfo)
+ if now.Sub(limitInfo.LastTime) > 1*time.Hour {
+ s.ipLimits.Delete(key)
+ }
+ return true
+ })
+ }
+}
diff --git a/internal/tasks/auto_cancel_order.go b/internal/tasks/auto_cancel_order.go
new file mode 100644
index 0000000..0b8138e
--- /dev/null
+++ b/internal/tasks/auto_cancel_order.go
@@ -0,0 +1,102 @@
+package tasks
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/models"
+ "fmt"
+ "log"
+ "strconv"
+ "time"
+
+ "gorm.io/gorm"
+)
+
+// AutoCancelUnpaidOrders 自动取消超过30分钟未付款的订单
+func AutoCancelUnpaidOrders() {
+ log.Println("开始执行自动取消未付款订单任务...")
+
+ db := common.GetDB()
+ var cancelOrders []models.PurchaseOrder
+ if err := db.Model(&models.PurchaseOrder{}).Where("order_status = ? and product_type=?", 3, 2).Find(&cancelOrders).Error; err != nil {
+ log.Printf("查询未付款订单失败: %v", err)
+ return
+ }
+
+ var Ids []uint
+ for _, order := range cancelOrders {
+ Ids = append(Ids, order.ID)
+ }
+ fmt.Println(cancelOrders)
+ db.Model(&models.SalesOrder{}).Where("purchase_order_id in ?", Ids).Update("order_status", 3)
+
+ var config models.SystemConfig
+ db.Where("config_key=?", "order_over_time").First(&config)
+ value, _ := strconv.Atoi(config.ConfigValue)
+ thirtyMinutesAgo := time.Now().Add(-time.Duration(value) * time.Minute)
+ // 查找所有超过30分钟未付款的订单
+ var unpaidOrders []models.PurchaseOrder
+ if err := db.Where("order_status = ? AND created_at < ?", 0, thirtyMinutesAgo).Find(&unpaidOrders).Error; err != nil {
+ log.Printf("查询未付款订单失败: %v", err)
+ return
+ }
+
+ log.Printf("找到 %d 个需要自动取消的未付款订单", len(unpaidOrders))
+
+ // 处理每个未付款订单
+ for _, order := range unpaidOrders {
+ // 开启事务
+ tx := db.Begin()
+
+ // 更新订单状态为已取消
+ if err := tx.Model(&order).Update("order_status", 3).Error; err != nil {
+ tx.Rollback()
+ log.Printf("取消订单 %d 失败: %v", order.ID, err)
+ continue
+ }
+
+ // 恢复商品库存
+ if order.ProductType == 1 { // 一级商品
+ if err := tx.Model(&models.PrimaryProduct{}).Where("id = ?", order.ProductID).
+ Update("stock_quantity", gorm.Expr("stock_quantity + ?", order.Quantity)).Error; err != nil {
+ tx.Rollback()
+ log.Printf("恢复一级商品 %d 库存失败: %v", order.ProductID, err)
+ continue
+ }
+ } else { // 二级商品
+ if err := tx.Model(&models.SecondaryProduct{}).Where("id = ?", order.ProductID).
+ Update("quantity", gorm.Expr("quantity + ?", order.Quantity)).Error; err != nil {
+ tx.Rollback()
+ log.Printf("恢复二级商品 %d 库存失败: %v", order.ProductID, err)
+ continue
+ }
+
+ // 如果是二级商品,还需要取消对应的卖家订单
+ var salesOrder models.SalesOrder
+ if err := tx.Where("purchase_order_id = ?", order.ID).First(&salesOrder).Error; err != nil {
+ if err != gorm.ErrRecordNotFound {
+ tx.Rollback()
+ log.Printf("查询订单 %d 对应的卖家订单失败: %v", order.ID, err)
+ continue
+ }
+ } else {
+ // 更新卖家订单状态为已取消
+ if err := tx.Model(&salesOrder).Update("order_status", 3).Error; err != nil {
+ tx.Rollback()
+ log.Printf("取消卖家订单 %d 失败: %v", salesOrder.ID, err)
+ continue
+ }
+ }
+ }
+
+ // 提交事务
+ if err := tx.Commit().Error; err != nil {
+ log.Printf("提交事务失败: %v", err)
+ continue
+ }
+
+ log.Printf("成功自动取消订单 ID: %d, 订单号: %s", order.ID, order.OrderNo)
+
+ }
+
+ log.Println("自动取消未付款订单任务执行完成")
+}
diff --git a/internal/tasks/check_user_expiry.go b/internal/tasks/check_user_expiry.go
new file mode 100644
index 0000000..8881d06
--- /dev/null
+++ b/internal/tasks/check_user_expiry.go
@@ -0,0 +1,54 @@
+package tasks
+
+import (
+ "awesomeProject/internal/common"
+ "awesomeProject/internal/models"
+ "log"
+ "time"
+)
+
+// CheckUserExpiry 检查用户过期状态并禁用过期用户
+func CheckUserExpiry() {
+ log.Println("开始执行用户过期检查任务...")
+
+ db := common.GetDB()
+ now := time.Now()
+
+ // 查找所有已过期但仍然启用的用户
+ var expiredUsers []models.User
+ if err := db.Where("expiry_date IS NOT NULL AND expiry_date < ? AND status = ?", now, 1).Find(&expiredUsers).Error; err != nil {
+ log.Printf("查询过期用户失败: %v", err)
+ return
+ }
+
+ if len(expiredUsers) == 0 {
+ log.Println("没有发现过期用户")
+ return
+ }
+
+ log.Printf("发现 %d 个过期用户需要禁用", len(expiredUsers))
+
+ // 批量禁用过期用户
+ var userIDs []uint
+ for _, user := range expiredUsers {
+ userIDs = append(userIDs, user.ID)
+ log.Printf("用户 ID: %d, 手机号: %s, 过期时间: %v",
+ user.ID, user.Phone, user.ExpiryDate.Format("2006-01-02 15:04:05"))
+ }
+
+ // 使用事务批量更新状态
+ tx := db.Begin()
+ if err := tx.Model(&models.User{}).Where("id IN ?", userIDs).Update("status", 0).Error; err != nil {
+ tx.Rollback()
+ log.Printf("批量禁用过期用户失败: %v", err)
+ return
+ }
+
+ if err := tx.Commit().Error; err != nil {
+ log.Printf("提交事务失败: %v", err)
+ return
+ }
+
+ log.Printf("成功禁用 %d 个过期用户", len(userIDs))
+ log.Println("用户过期检查任务执行完成")
+}
\ No newline at end of file
diff --git a/internal/tasks/cronTask.go b/internal/tasks/cronTask.go
new file mode 100644
index 0000000..2d87417
--- /dev/null
+++ b/internal/tasks/cronTask.go
@@ -0,0 +1,46 @@
+package tasks
+
+import (
+ "log"
+
+ "github.com/robfig/cron/v3"
+)
+
+var CronTask *cron.Cron
+
+// InitCronTasks 初始化所有定时任务
+func InitCronTasks() {
+ log.Println("初始化定时任务...")
+ CronTask = cron.New()
+
+ // 添加定时任务:每15分钟检查一次未付款订单
+ _, err := CronTask.AddFunc("*/15 * * * *", AutoCancelUnpaidOrders)
+ if err != nil {
+ log.Printf("添加自动取消订单任务失败: %v", err)
+ } else {
+ log.Println("已添加自动取消订单任务,每15分钟执行一次")
+ }
+ go AutoCancelUnpaidOrders()
+
+ // 添加定时任务:每小时检查一次用户过期状态
+ _, err = CronTask.AddFunc("0 * * * *", CheckUserExpiry)
+ if err != nil {
+ log.Printf("添加用户过期检查任务失败: %v", err)
+ } else {
+ log.Println("已添加用户过期检查任务,每小时执行一次")
+ }
+ // 立即执行一次用户过期检查
+ go CheckUserExpiry()
+ // 启动所有定时任务
+ CronTask.Start()
+ log.Println("所有定时任务已启动")
+}
+
+// 添加单个定时任务(保留原有函数以兼容旧代码)
+func addTask(cronn string, work func()) {
+ _, err := CronTask.AddFunc(cronn, work)
+ if err != nil {
+ log.Printf("添加定时任务失败: %v", err)
+ return
+ }
+}
diff --git a/main b/main
new file mode 100644
index 0000000..006fff7
Binary files /dev/null and b/main differ
diff --git a/pkg/utils/jwtUtil.go b/pkg/utils/jwtUtil.go
new file mode 100644
index 0000000..3c30ae4
--- /dev/null
+++ b/pkg/utils/jwtUtil.go
@@ -0,0 +1,191 @@
+package jwtutil
+
+import (
+ "awesomeProject/internal/common"
+ "errors"
+ "fmt"
+ "reflect"
+ "time"
+
+ "github.com/golang-jwt/jwt/v5"
+)
+
+// getSecretKey 获取密钥
+func getSecretKey() []byte {
+ if common.MineConfig != nil {
+ return []byte(common.MineConfig.JWT.SecretKey)
+ }
+ // 默认密钥(仅开发环境使用)
+ return []byte("your-very-secret-key-32-bytes")
+}
+
+// getTokenExpireDuration 获取Token过期时间
+func getTokenExpireDuration() time.Duration {
+ if common.MineConfig != nil {
+ return time.Duration(common.MineConfig.JWT.ExpireHours) * time.Hour
+ }
+ // 默认24小时
+ return time.Hour * 24
+}
+
+// 通用:生成 Token,支持任意结构体
+func GenerateToken(claims interface{}) (string, error) {
+ // 1. 将结构体转换为 map[string]interface{}
+ claimMap, err := structToMap(claims)
+ if err != nil {
+ return "", err
+ }
+
+ // 2. 添加标准声明(exp, iat, nbf)
+ claimMap["exp"] = time.Now().Add(getTokenExpireDuration()).Unix()
+ claimMap["iat"] = time.Now().Unix()
+ claimMap["nbf"] = time.Now().Unix()
+
+ // 3. 创建 Token
+ token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims(claimMap))
+
+ // 4. 签名
+ return token.SignedString(getSecretKey())
+}
+
+func ParseTokenToMap(tokenString string) (map[string]interface{}, error) {
+ token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
+ if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
+ return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
+ }
+ return getSecretKey(), nil
+ })
+ if err != nil {
+ return nil, err
+ }
+
+ if !token.Valid {
+ return nil, errors.New("token is invalid")
+ }
+
+ claims, ok := token.Claims.(jwt.MapClaims)
+ if !ok {
+ return nil, errors.New("token claims is invalid")
+ }
+
+ return claims, nil
+}
+
+func ParseToken(tokenString string, dest interface{}) error {
+
+ if reflect.TypeOf(dest).Kind() != reflect.Ptr {
+ return errors.New("dest must be a pointer to a struct")
+ }
+ token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
+ if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
+ return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
+ }
+ return getSecretKey(), nil
+ })
+
+ if err != nil {
+ return err
+ }
+
+ if !token.Valid {
+ return errors.New("token 无效")
+ }
+
+ // 提取 MapClaims
+ if claims, ok := token.Claims.(jwt.MapClaims); ok {
+ // 将 MapClaims 转回结构体
+ if err := mapToStruct(claims, dest); err != nil {
+ return err
+ }
+ return nil
+ }
+
+ return errors.New("无法解析 token 声明")
+}
+
+// 将结构体转为 map[string]interface{}
+func structToMap(obj interface{}) (map[string]interface{}, error) {
+ val := reflect.ValueOf(obj)
+ if val.Kind() == reflect.Ptr {
+ val = val.Elem()
+ }
+
+ if val.Kind() != reflect.Struct {
+ return nil, errors.New("输入必须是结构体")
+ }
+
+ result := make(map[string]interface{})
+ typ := val.Type()
+ for i := 0; i < val.NumField(); i++ {
+ field := val.Field(i)
+ fieldType := typ.Field(i)
+ jsonTag := fieldType.Tag.Get("json")
+ if jsonTag == "" || jsonTag == "-" {
+ continue
+ }
+ key := jsonTag
+ result[key] = field.Interface()
+ }
+ return result, nil
+}
+
+// 将 map[string]interface{} 转回结构体
+func mapToStruct(data map[string]interface{}, dest interface{}) error {
+ val := reflect.ValueOf(dest)
+ if val.Kind() != reflect.Ptr {
+ return errors.New("dest 必须是指针")
+ }
+ val = val.Elem()
+ if val.Kind() != reflect.Struct {
+ return errors.New("dest 必须是指针指向结构体")
+ }
+
+ for i := 0; i < val.NumField(); i++ {
+ field := val.Field(i)
+ fieldType := val.Type().Field(i)
+ jsonTag := fieldType.Tag.Get("json")
+ if jsonTag == "" || jsonTag == "-" {
+ continue
+ }
+
+ if field.CanSet() {
+ value, ok := data[jsonTag]
+ if !ok {
+ continue
+ }
+
+ // 自动类型转换
+ switch field.Kind() {
+ case reflect.String:
+ if s, ok := value.(string); ok {
+ field.SetString(s)
+ }
+ case reflect.Int, reflect.Int64:
+ if n, ok := value.(float64); ok {
+ field.SetInt(int64(n))
+ }
+ case reflect.Uint, reflect.Uint64:
+ if n, ok := value.(float64); ok {
+ field.SetUint(uint64(n))
+ }
+ case reflect.Bool:
+ if b, ok := value.(bool); ok {
+ field.SetBool(b)
+ }
+ case reflect.Float64:
+ if f, ok := value.(float64); ok {
+ field.SetFloat(f)
+ }
+ default:
+ continue
+ }
+ }
+ }
+ return nil
+}
+func ValidateToken(tokenString string, dest interface{}) bool {
+ token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
+ return getSecretKey(), nil
+ })
+ return err == nil && token.Valid && ParseToken(tokenString, dest) == nil
+}
diff --git a/public/file/20250902091924_9b4298ba.png b/public/file/20250902091924_9b4298ba.png
new file mode 100644
index 0000000..5c60842
Binary files /dev/null and b/public/file/20250902091924_9b4298ba.png differ
diff --git a/public/file/20250902092108_e056556d.png b/public/file/20250902092108_e056556d.png
new file mode 100644
index 0000000..38b70e8
Binary files /dev/null and b/public/file/20250902092108_e056556d.png differ
diff --git a/public/file/20250902092412_49b0199a.jpg b/public/file/20250902092412_49b0199a.jpg
new file mode 100644
index 0000000..5bf9592
Binary files /dev/null and b/public/file/20250902092412_49b0199a.jpg differ
diff --git a/public/file/20250902092416_9b4298ba.png b/public/file/20250902092416_9b4298ba.png
new file mode 100644
index 0000000..5c60842
Binary files /dev/null and b/public/file/20250902092416_9b4298ba.png differ
diff --git a/public/file/20250902102539_639669b0.png b/public/file/20250902102539_639669b0.png
new file mode 100644
index 0000000..56ee383
Binary files /dev/null and b/public/file/20250902102539_639669b0.png differ
diff --git a/public/file/20250902102604_883b4677.png b/public/file/20250902102604_883b4677.png
new file mode 100644
index 0000000..66b01bf
Binary files /dev/null and b/public/file/20250902102604_883b4677.png differ
diff --git a/public/file/20250902103131_a0ac0a17.jpeg b/public/file/20250902103131_a0ac0a17.jpeg
new file mode 100644
index 0000000..e5aa71a
Binary files /dev/null and b/public/file/20250902103131_a0ac0a17.jpeg differ
diff --git a/public/file/20250902103136_e18fe0eb.jpeg b/public/file/20250902103136_e18fe0eb.jpeg
new file mode 100644
index 0000000..6359dac
Binary files /dev/null and b/public/file/20250902103136_e18fe0eb.jpeg differ
diff --git a/public/file/20250902104133_a0ac0a17.jpeg b/public/file/20250902104133_a0ac0a17.jpeg
new file mode 100644
index 0000000..e5aa71a
Binary files /dev/null and b/public/file/20250902104133_a0ac0a17.jpeg differ
diff --git a/public/file/20250902104136_e18fe0eb.jpeg b/public/file/20250902104136_e18fe0eb.jpeg
new file mode 100644
index 0000000..6359dac
Binary files /dev/null and b/public/file/20250902104136_e18fe0eb.jpeg differ
diff --git a/public/file/20250902112107_639669b0.png b/public/file/20250902112107_639669b0.png
new file mode 100644
index 0000000..56ee383
Binary files /dev/null and b/public/file/20250902112107_639669b0.png differ
diff --git a/public/file/20250902145904_da9e6bd8.jpg b/public/file/20250902145904_da9e6bd8.jpg
new file mode 100644
index 0000000..110f37d
Binary files /dev/null and b/public/file/20250902145904_da9e6bd8.jpg differ
diff --git a/public/file/20250902150503_da9e6bd8.jpg b/public/file/20250902150503_da9e6bd8.jpg
new file mode 100644
index 0000000..110f37d
Binary files /dev/null and b/public/file/20250902150503_da9e6bd8.jpg differ
diff --git a/public/file/20250902150539_a082ce87.png b/public/file/20250902150539_a082ce87.png
new file mode 100644
index 0000000..2235814
Binary files /dev/null and b/public/file/20250902150539_a082ce87.png differ
diff --git a/public/file/20250902150542_3a4a5b13.png b/public/file/20250902150542_3a4a5b13.png
new file mode 100644
index 0000000..a262e60
Binary files /dev/null and b/public/file/20250902150542_3a4a5b13.png differ
diff --git a/public/file/20250903085714_da9e6bd8.jpg b/public/file/20250903085714_da9e6bd8.jpg
new file mode 100644
index 0000000..110f37d
Binary files /dev/null and b/public/file/20250903085714_da9e6bd8.jpg differ
diff --git a/public/file/20250903085718_4befb1a8.jpg b/public/file/20250903085718_4befb1a8.jpg
new file mode 100644
index 0000000..49964a3
Binary files /dev/null and b/public/file/20250903085718_4befb1a8.jpg differ
diff --git a/public/file/20250903085721_2a7e2fc8.jpg b/public/file/20250903085721_2a7e2fc8.jpg
new file mode 100644
index 0000000..14c0311
Binary files /dev/null and b/public/file/20250903085721_2a7e2fc8.jpg differ
diff --git a/public/file/20250903111754_af655669.jpeg b/public/file/20250903111754_af655669.jpeg
new file mode 100644
index 0000000..170217e
Binary files /dev/null and b/public/file/20250903111754_af655669.jpeg differ
diff --git a/public/file/20250903111758_ea22e0d9.jpeg b/public/file/20250903111758_ea22e0d9.jpeg
new file mode 100644
index 0000000..1b9216d
Binary files /dev/null and b/public/file/20250903111758_ea22e0d9.jpeg differ
diff --git a/public/file/20250903115327_af655669.jpeg b/public/file/20250903115327_af655669.jpeg
new file mode 100644
index 0000000..170217e
Binary files /dev/null and b/public/file/20250903115327_af655669.jpeg differ
diff --git a/public/file/20250903115330_ea22e0d9.jpeg b/public/file/20250903115330_ea22e0d9.jpeg
new file mode 100644
index 0000000..1b9216d
Binary files /dev/null and b/public/file/20250903115330_ea22e0d9.jpeg differ
diff --git a/public/file/20250903125954_d771c101.png b/public/file/20250903125954_d771c101.png
new file mode 100644
index 0000000..ddc01fc
Binary files /dev/null and b/public/file/20250903125954_d771c101.png differ
diff --git a/public/file/20250903134051_ea22e0d9.jpeg b/public/file/20250903134051_ea22e0d9.jpeg
new file mode 100644
index 0000000..1b9216d
Binary files /dev/null and b/public/file/20250903134051_ea22e0d9.jpeg differ
diff --git a/public/file/20250903134356_d771c101.png b/public/file/20250903134356_d771c101.png
new file mode 100644
index 0000000..ddc01fc
Binary files /dev/null and b/public/file/20250903134356_d771c101.png differ
diff --git a/public/file/20250903134815_d771c101.png b/public/file/20250903134815_d771c101.png
new file mode 100644
index 0000000..ddc01fc
Binary files /dev/null and b/public/file/20250903134815_d771c101.png differ
diff --git a/public/file/20250903153218_ea22e0d9.jpeg b/public/file/20250903153218_ea22e0d9.jpeg
new file mode 100644
index 0000000..1b9216d
Binary files /dev/null and b/public/file/20250903153218_ea22e0d9.jpeg differ
diff --git a/public/file/20250904101417_7c6bf467.png b/public/file/20250904101417_7c6bf467.png
new file mode 100644
index 0000000..36fc14c
Binary files /dev/null and b/public/file/20250904101417_7c6bf467.png differ
diff --git a/public/file/20250913123755_84e52359.jpg b/public/file/20250913123755_84e52359.jpg
new file mode 100644
index 0000000..f200197
Binary files /dev/null and b/public/file/20250913123755_84e52359.jpg differ
diff --git a/public/file/20250913124429_3657ddb6.jpg b/public/file/20250913124429_3657ddb6.jpg
new file mode 100644
index 0000000..6c878b1
Binary files /dev/null and b/public/file/20250913124429_3657ddb6.jpg differ
diff --git a/public/file/20250913125113_3657ddb6.jpg b/public/file/20250913125113_3657ddb6.jpg
new file mode 100644
index 0000000..6c878b1
Binary files /dev/null and b/public/file/20250913125113_3657ddb6.jpg differ
diff --git a/public/file/20250913125535_3657ddb6.jpg b/public/file/20250913125535_3657ddb6.jpg
new file mode 100644
index 0000000..6c878b1
Binary files /dev/null and b/public/file/20250913125535_3657ddb6.jpg differ
diff --git a/public/file/20250913125733_3657ddb6.jpg b/public/file/20250913125733_3657ddb6.jpg
new file mode 100644
index 0000000..6c878b1
Binary files /dev/null and b/public/file/20250913125733_3657ddb6.jpg differ
diff --git a/public/file/20250913142213_3657ddb6.jpg b/public/file/20250913142213_3657ddb6.jpg
new file mode 100644
index 0000000..6c878b1
Binary files /dev/null and b/public/file/20250913142213_3657ddb6.jpg differ
diff --git a/public/file/20250913153556_3657ddb6.jpg b/public/file/20250913153556_3657ddb6.jpg
new file mode 100644
index 0000000..6c878b1
Binary files /dev/null and b/public/file/20250913153556_3657ddb6.jpg differ
diff --git a/public/file/20250913153605_2abf85b3.jpg b/public/file/20250913153605_2abf85b3.jpg
new file mode 100644
index 0000000..90519f4
Binary files /dev/null and b/public/file/20250913153605_2abf85b3.jpg differ
diff --git a/public/file/20250913153821_2abf85b3.jpg b/public/file/20250913153821_2abf85b3.jpg
new file mode 100644
index 0000000..90519f4
Binary files /dev/null and b/public/file/20250913153821_2abf85b3.jpg differ
diff --git a/public/file/20250913153824_3657ddb6.jpg b/public/file/20250913153824_3657ddb6.jpg
new file mode 100644
index 0000000..6c878b1
Binary files /dev/null and b/public/file/20250913153824_3657ddb6.jpg differ
diff --git a/public/file/20250913162502_3657ddb6.jpg b/public/file/20250913162502_3657ddb6.jpg
new file mode 100644
index 0000000..6c878b1
Binary files /dev/null and b/public/file/20250913162502_3657ddb6.jpg differ
diff --git a/public/file/20250913163110_3657ddb6.jpg b/public/file/20250913163110_3657ddb6.jpg
new file mode 100644
index 0000000..6c878b1
Binary files /dev/null and b/public/file/20250913163110_3657ddb6.jpg differ
diff --git a/public/file/20250913163347_3657ddb6.jpg b/public/file/20250913163347_3657ddb6.jpg
new file mode 100644
index 0000000..6c878b1
Binary files /dev/null and b/public/file/20250913163347_3657ddb6.jpg differ
diff --git a/public/file/20250913163500_3657ddb6.jpg b/public/file/20250913163500_3657ddb6.jpg
new file mode 100644
index 0000000..6c878b1
Binary files /dev/null and b/public/file/20250913163500_3657ddb6.jpg differ
diff --git a/public/file/20250916105653_0b6dc315.png b/public/file/20250916105653_0b6dc315.png
new file mode 100644
index 0000000..bad4ad0
Binary files /dev/null and b/public/file/20250916105653_0b6dc315.png differ
diff --git a/public/file/20250916105705_0b6dc315.png b/public/file/20250916105705_0b6dc315.png
new file mode 100644
index 0000000..bad4ad0
Binary files /dev/null and b/public/file/20250916105705_0b6dc315.png differ
diff --git a/public/file/20250916105715_0b6dc315.png b/public/file/20250916105715_0b6dc315.png
new file mode 100644
index 0000000..bad4ad0
Binary files /dev/null and b/public/file/20250916105715_0b6dc315.png differ
diff --git a/public/file/20250916105722_0b6dc315.png b/public/file/20250916105722_0b6dc315.png
new file mode 100644
index 0000000..bad4ad0
Binary files /dev/null and b/public/file/20250916105722_0b6dc315.png differ
diff --git a/public/file/20250916105729_0b6dc315.png b/public/file/20250916105729_0b6dc315.png
new file mode 100644
index 0000000..bad4ad0
Binary files /dev/null and b/public/file/20250916105729_0b6dc315.png differ
diff --git a/public/file/20250916110937_f2a179bd.png b/public/file/20250916110937_f2a179bd.png
new file mode 100644
index 0000000..6374e2d
Binary files /dev/null and b/public/file/20250916110937_f2a179bd.png differ
diff --git a/public/file/20250916111002_09ee01c2.png b/public/file/20250916111002_09ee01c2.png
new file mode 100644
index 0000000..c25f9d2
Binary files /dev/null and b/public/file/20250916111002_09ee01c2.png differ
diff --git a/public/file/20250916114909_dededd0c.png b/public/file/20250916114909_dededd0c.png
new file mode 100644
index 0000000..772fb73
Binary files /dev/null and b/public/file/20250916114909_dededd0c.png differ
diff --git a/public/file/20250916115526_fc06f62c.png b/public/file/20250916115526_fc06f62c.png
new file mode 100644
index 0000000..4e818bc
Binary files /dev/null and b/public/file/20250916115526_fc06f62c.png differ
diff --git a/public/file/20250916120952_dededd0c.png b/public/file/20250916120952_dededd0c.png
new file mode 100644
index 0000000..772fb73
Binary files /dev/null and b/public/file/20250916120952_dededd0c.png differ
diff --git a/public/file/20250916123132_da65b168.png b/public/file/20250916123132_da65b168.png
new file mode 100644
index 0000000..5c11f02
Binary files /dev/null and b/public/file/20250916123132_da65b168.png differ
diff --git a/public/file/20250916124338_dededd0c.png b/public/file/20250916124338_dededd0c.png
new file mode 100644
index 0000000..772fb73
Binary files /dev/null and b/public/file/20250916124338_dededd0c.png differ
diff --git a/public/file/20250916125343_dededd0c.png b/public/file/20250916125343_dededd0c.png
new file mode 100644
index 0000000..772fb73
Binary files /dev/null and b/public/file/20250916125343_dededd0c.png differ
diff --git a/public/file/20250916125347_dededd0c.png b/public/file/20250916125347_dededd0c.png
new file mode 100644
index 0000000..772fb73
Binary files /dev/null and b/public/file/20250916125347_dededd0c.png differ
diff --git a/public/file/20250924110357_ea22e0d9.jpeg b/public/file/20250924110357_ea22e0d9.jpeg
new file mode 100644
index 0000000..1b9216d
Binary files /dev/null and b/public/file/20250924110357_ea22e0d9.jpeg differ
diff --git a/public/file/20250924113219_0b6dc315.png b/public/file/20250924113219_0b6dc315.png
new file mode 100644
index 0000000..bad4ad0
Binary files /dev/null and b/public/file/20250924113219_0b6dc315.png differ
diff --git a/public/file/20250924113247_883b4677.png b/public/file/20250924113247_883b4677.png
new file mode 100644
index 0000000..66b01bf
Binary files /dev/null and b/public/file/20250924113247_883b4677.png differ
diff --git a/public/file/20250924113618_883b4677.png b/public/file/20250924113618_883b4677.png
new file mode 100644
index 0000000..66b01bf
Binary files /dev/null and b/public/file/20250924113618_883b4677.png differ
diff --git a/public/file/20251113201003_9b4298ba.png b/public/file/20251113201003_9b4298ba.png
new file mode 100644
index 0000000..5c60842
Binary files /dev/null and b/public/file/20251113201003_9b4298ba.png differ
diff --git a/public/file/20251220152707_b89ec398.png b/public/file/20251220152707_b89ec398.png
new file mode 100644
index 0000000..b4887bf
Binary files /dev/null and b/public/file/20251220152707_b89ec398.png differ
diff --git a/public/file/20251220152938_71cb232a.png b/public/file/20251220152938_71cb232a.png
new file mode 100644
index 0000000..740130c
Binary files /dev/null and b/public/file/20251220152938_71cb232a.png differ
diff --git a/public/file/20251220152955_2e30c931.png b/public/file/20251220152955_2e30c931.png
new file mode 100644
index 0000000..cc4d3e6
Binary files /dev/null and b/public/file/20251220152955_2e30c931.png differ
diff --git a/public/file/20251220153019_2e30c931.png b/public/file/20251220153019_2e30c931.png
new file mode 100644
index 0000000..cc4d3e6
Binary files /dev/null and b/public/file/20251220153019_2e30c931.png differ
diff --git a/public/file/20251220153458_02f6f844.png b/public/file/20251220153458_02f6f844.png
new file mode 100644
index 0000000..cb5a951
Binary files /dev/null and b/public/file/20251220153458_02f6f844.png differ
diff --git a/public/h5/assets/uniicons.2579c7da.ttf b/public/h5/assets/uniicons.2579c7da.ttf
new file mode 100644
index 0000000..14696d0
Binary files /dev/null and b/public/h5/assets/uniicons.2579c7da.ttf differ
diff --git a/public/h5/index.html b/public/h5/index.html
new file mode 100644
index 0000000..142c017
--- /dev/null
+++ b/public/h5/index.html
@@ -0,0 +1,3 @@
+商帮帮
\ No newline at end of file
diff --git a/public/h5/static/banner1.jpg b/public/h5/static/banner1.jpg
new file mode 100644
index 0000000..32a55b3
Binary files /dev/null and b/public/h5/static/banner1.jpg differ
diff --git a/public/h5/static/customicons.css b/public/h5/static/customicons.css
new file mode 100644
index 0000000..14ed5fa
--- /dev/null
+++ b/public/h5/static/customicons.css
@@ -0,0 +1,20 @@
+@font-face {
+ font-family: "customicons"; /* Project id 2878519 */
+ src:url('/static/customicons.ttf') format('truetype');
+}
+
+.customicons {
+ font-family: "customicons" !important;
+}
+
+.youxi:before {
+ content: "\e60e";
+}
+
+.wenjian:before {
+ content: "\e60f";
+}
+
+.zhuanfa:before {
+ content: "\e610";
+}
diff --git a/public/h5/static/customicons.ttf b/public/h5/static/customicons.ttf
new file mode 100644
index 0000000..a3c8ab9
Binary files /dev/null and b/public/h5/static/customicons.ttf differ
diff --git a/public/h5/static/home.png b/public/h5/static/home.png
new file mode 100644
index 0000000..0b7d682
Binary files /dev/null and b/public/h5/static/home.png differ
diff --git a/public/h5/static/icon.jpg b/public/h5/static/icon.jpg
new file mode 100644
index 0000000..51681d6
Binary files /dev/null and b/public/h5/static/icon.jpg differ
diff --git a/public/h5/static/index.css b/public/h5/static/index.css
new file mode 100644
index 0000000..d8a0ae2
--- /dev/null
+++ b/public/h5/static/index.css
@@ -0,0 +1 @@
+uni-tabbar{display:block;box-sizing:border-box;width:100%;z-index:998}uni-tabbar .uni-tabbar{display:-webkit-box;display:-webkit-flex;display:flex;z-index:998;box-sizing:border-box}uni-tabbar.uni-tabbar-bottom,uni-tabbar.uni-tabbar-bottom .uni-tabbar,uni-tabbar.uni-tabbar-top,uni-tabbar.uni-tabbar-top .uni-tabbar{position:fixed;left:var(--window-left);right:var(--window-right)}.uni-app--showlayout+uni-tabbar.uni-tabbar-bottom,.uni-app--showlayout+uni-tabbar.uni-tabbar-bottom .uni-tabbar,.uni-app--showlayout+uni-tabbar.uni-tabbar-top,.uni-app--showlayout+uni-tabbar.uni-tabbar-top .uni-tabbar{left:var(--window-margin);right:var(--window-margin)}uni-tabbar.uni-tabbar-bottom .uni-tabbar{bottom:0;padding-bottom:0;padding-bottom:constant(safe-area-inset-bottom);padding-bottom:env(safe-area-inset-bottom)}uni-tabbar .uni-tabbar~.uni-placeholder{width:100%;margin-bottom:0;margin-bottom:constant(safe-area-inset-bottom);margin-bottom:env(safe-area-inset-bottom)}uni-tabbar .uni-tabbar *{box-sizing:border-box}uni-tabbar .uni-tabbar__item{-webkit-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-webkit-flex:1;flex:1;font-size:0;text-align:center;-webkit-tap-highlight-color:rgba(0,0,0,0)}uni-tabbar .uni-tabbar__bd,uni-tabbar .uni-tabbar__item{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal}uni-tabbar .uni-tabbar__bd{position:relative;-webkit-flex-direction:column;flex-direction:column;cursor:pointer}uni-tabbar .uni-tabbar__icon{position:relative;display:inline-block;margin-top:5px}uni-tabbar .uni-tabbar__icon.uni-tabbar__icon__diff{margin-top:0;width:34px;height:34px}uni-tabbar .uni-tabbar__icon img{width:100%;height:100%}uni-tabbar .uni-tabbar__iconfont{font-family:UniTabbarIconFont}uni-tabbar .uni-tabbar__label{position:relative;text-align:center;font-size:10px}uni-tabbar .uni-tabbar-border{position:absolute;left:0;top:0;width:100%;height:1px;-webkit-transform:scaleY(.5);transform:scaleY(.5)}uni-tabbar .uni-tabbar__reddot{position:absolute;top:2px;right:0;width:12px;height:12px;border-radius:50%;background-color:#f43530;color:#fff;-webkit-transform:translate(40%);transform:translate(40%)}uni-tabbar .uni-tabbar__badge{width:auto;height:16px;line-height:16px;border-radius:16px;min-width:16px;padding:0 2px;font-size:12px;text-align:center;white-space:nowrap}uni-tabbar .uni-tabbar__mid{-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;position:absolute;bottom:0;background-size:100% 100%}uni-content,uni-tabbar .uni-tabbar__mid{display:-webkit-box;display:-webkit-flex;display:flex}uni-content{-webkit-box-flex:1;-webkit-flex:1 0 auto;flex:1 0 auto;height:100%}uni-main{-webkit-box-flex:1;-webkit-flex:1;flex:1;width:100%}uni-top-window+uni-content{height:calc(100vh - var(--top-window-height))}uni-left-window{width:var(--window-left);-webkit-box-ordinal-group:0;-webkit-order:-1;order:-1}uni-left-window,uni-right-window{position:relative;overflow-x:hidden}uni-right-window{width:var(--window-right)}uni-left-window[data-show],uni-right-window[data-show]{position:absolute}uni-right-window[data-show]{right:0}.uni-left-window,.uni-right-window,uni-content .uni-mask{z-index:997}.uni-mask+.uni-left-window,.uni-mask+.uni-right-window{position:fixed}.uni-top-window{position:fixed;left:var(--window-margin);right:var(--window-margin);top:0;z-index:998;overflow:hidden}uni-toast{position:fixed;top:0;right:0;bottom:0;left:0;z-index:999;display:block;box-sizing:border-box;pointer-events:none;font-size:16px}uni-toast .uni-sample-toast{position:fixed;z-index:999;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-align:center;max-width:80%}uni-toast .uni-simple-toast__text{display:inline-block;vertical-align:middle;color:#fff;background-color:rgba(17,17,17,.7);padding:10px 20px;border-radius:5px;font-size:13px;text-align:center;max-width:100%;word-break:break-word;white-space:normal}uni-toast .uni-mask{pointer-events:auto}uni-toast .uni-toast{position:fixed;z-index:999;width:8em;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background:rgba(17,17,17,.7);text-align:center;border-radius:5px;color:#fff}uni-toast .uni-toast *{box-sizing:border-box}uni-toast .uni-toast__icon{margin:20px 0 0;width:38px;height:38px;vertical-align:baseline}uni-toast .uni-icon_toast{margin:15px 0 0}uni-toast .uni-icon_toast.uni-icon-success-no-circle:before{color:#fff;font-size:55px}uni-toast .uni-icon_toast.uni-icon-error:before{color:#fff;font-size:50px}uni-toast .uni-icon_toast.uni-loading{margin:20px 0 0;width:38px;height:38px;vertical-align:baseline}uni-toast .uni-toast__content{margin:0 0 15px}uni-modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:999;display:block;box-sizing:border-box}uni-modal .uni-modal{position:fixed;z-index:999;width:80%;max-width:300px;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background-color:#fff;text-align:center;border-radius:3px;overflow:hidden}uni-modal .uni-modal *{box-sizing:border-box}uni-modal .uni-modal__hd{padding:1em 1.6em .3em}uni-modal .uni-modal__title{font-weight:400;font-size:18px;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}uni-modal .uni-modal__bd,uni-modal .uni-modal__title{word-wrap:break-word;word-break:break-all;white-space:pre-wrap}uni-modal .uni-modal__bd{padding:1.3em 1.6em 1.3em;min-height:40px;font-size:15px;line-height:1.4;color:#999;max-height:400px;overflow-x:hidden;overflow-y:auto}uni-modal .uni-modal__textarea{resize:none;border:0;margin:0;width:90%;padding:10px;font-size:20px;outline:none;border:none;background-color:#eee;text-decoration:inherit}uni-modal .uni-modal__ft{position:relative;line-height:48px;font-size:18px;display:-webkit-box;display:-webkit-flex;display:flex}uni-modal .uni-modal__ft:after{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid #d5d5d6;color:#d5d5d6;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}uni-modal .uni-modal__btn{display:block;-webkit-box-flex:1;-webkit-flex:1;flex:1;color:#3cc51f;text-decoration:none;-webkit-tap-highlight-color:rgba(0,0,0,0);position:relative;cursor:pointer}uni-modal .uni-modal__btn:active{background-color:#eee}uni-modal .uni-modal__btn:after{content:" ";position:absolute;left:0;top:0;width:1px;bottom:0;border-left:1px solid #d5d5d6;color:#d5d5d6;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}uni-modal .uni-modal__btn:first-child:after{display:none}uni-modal .uni-modal__btn_default{color:#353535}uni-modal .uni-modal__btn_primary{color:#007aff}uni-actionsheet{display:block;box-sizing:border-box}uni-actionsheet .uni-actionsheet{position:fixed;left:6px;right:6px;bottom:6px;-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:999;visibility:hidden;-webkit-transition:visibility .3s,-webkit-transform .3s;transition:visibility .3s,-webkit-transform .3s;transition:transform .3s,visibility .3s;transition:transform .3s,visibility .3s,-webkit-transform .3s}uni-actionsheet .uni-actionsheet.uni-actionsheet_toggle{visibility:visible;-webkit-transform:translate(0);transform:translate(0)}uni-actionsheet .uni-actionsheet *{box-sizing:border-box}uni-actionsheet .uni-actionsheet__action,uni-actionsheet .uni-actionsheet__menu{border-radius:5px;background-color:#fcfcfd}uni-actionsheet .uni-actionsheet__action{margin-top:6px}uni-actionsheet .uni-actionsheet__cell,uni-actionsheet .uni-actionsheet__title{position:relative;padding:10px 6px;text-align:center;font-size:18px;text-overflow:ellipsis;overflow:hidden;cursor:pointer}uni-actionsheet .uni-actionsheet__title{position:absolute;top:0;right:0;left:0;z-index:1;color:var(--UI-FG);background-color:#fff;border-radius:5px 5px 0 0;border-bottom:1px solid #e5e5e5}uni-actionsheet .uni-actionsheet__cell:before{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid #e5e5e5;color:#e5e5e5;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}uni-actionsheet .uni-actionsheet__cell:active{background-color:#ececec}uni-actionsheet .uni-actionsheet__cell:first-child:before{display:none}@media screen and (min-width:500px) and (min-height:500px){.uni-mask.uni-actionsheet__mask{background:none}uni-actionsheet .uni-actionsheet{width:300px;left:50%;right:auto;top:50%;bottom:auto;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);opacity:0;-webkit-transition:opacity .3s,visibility .3s;transition:opacity .3s,visibility .3s}uni-actionsheet .uni-actionsheet.uni-actionsheet_toggle{opacity:1;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}uni-actionsheet .uni-actionsheet__menu{box-shadow:0 0 20px 5px rgba(0,0,0,.3)}uni-actionsheet .uni-actionsheet__action{display:none}}.image-view-area,.image-view-view{position:absolute;left:0;top:0;width:100%;height:100%}.image-view-img{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);max-height:100%;max-width:100%}.uni-system-preview-image{display:block;position:fixed;left:0;top:0;width:100%;height:100%;z-index:999;background:rgba(0,0,0,.8)}.uni-system-preview-image-swiper{position:absolute;left:0;top:0;width:100%;height:100%}.uni-system-preview-image .nav-btn-back{position:absolute;box-sizing:border-box;top:0;right:0;width:44px;height:44px;padding:6px;line-height:32px;font-size:26px;color:#fff;text-align:center;cursor:pointer}*{margin:0;-webkit-tap-highlight-color:transparent}@font-face{font-weight:400;font-style:normal;font-family:uni;src:url("data:application/octet-stream;base64,AAEAAAALAIAAAwAwR1NVQrD+s+0AAAE4AAAAQk9TLzJAKEx+AAABfAAAAFZjbWFw65cFHQAAAhwAAAJQZ2x5ZvCRR/EAAASUAAAKtGhlYWQLKIN9AAAA4AAAADZoaGVhCCwD+gAAALwAAAAkaG10eEJo//8AAAHUAAAASGxvY2EYqhW6AAAEbAAAACZtYXhwASEAVQAAARgAAAAgbmFtZeNcHtgAAA9IAAAB5nBvc3T6bLhLAAARMAAAAOYAAQAAA+gAAABaA+j/////A+kAAQAAAAAAAAAAAAAAAAAAABIAAQAAAAEAACkCj3dfDzz1AAsD6AAAAADUER9XAAAAANQRH1f//wAAA+kD6gAAAAgAAgAAAAAAAAABAAAAEgBJAAUAAAAAAAIAAAAKAAoAAAD/AAAAAAAAAAEAAAAKAB4ALAABREZMVAAIAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAAAAQOwAZAABQAIAnoCvAAAAIwCegK8AAAB4AAxAQIAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA6gHqEQPoAAAAWgPqAAAAAAABAAAAAAAAAAAAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+j//wPoAAAD6AAAAAAABQAAAAMAAAAsAAAABAAAAXQAAQAAAAAAbgADAAEAAAAsAAMACgAAAXQABABCAAAABAAEAAEAAOoR//8AAOoB//8AAAABAAQAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAAAEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAANwAAAAAAAAAEQAA6gEAAOoBAAAAAQAA6gIAAOoCAAAAAgAA6gMAAOoDAAAAAwAA6gQAAOoEAAAABAAA6gUAAOoFAAAABQAA6gYAAOoGAAAABgAA6gcAAOoHAAAABwAA6ggAAOoIAAAACAAA6gkAAOoJAAAACQAA6goAAOoKAAAACgAA6gsAAOoLAAAACwAA6gwAAOoMAAAADAAA6g0AAOoNAAAADQAA6g4AAOoOAAAADgAA6g8AAOoPAAAADwAA6hAAAOoQAAAAEAAA6hEAAOoRAAAAEQAAAAAARgCMANIBJgF4AcQCMgJgAqgC/ANIA6YD/gROBKAE9AVaAAAAAgAAAAADrwOtABQAKQAAASIHBgcGFBcWFxYyNzY3NjQnJicmAyInJicmNDc2NzYyFxYXFhQHBgcGAfV4Z2Q7PDw7ZGfwZmQ7PDw7ZGZ4bl5bNjc3Nlte215bNjc3NlteA608O2Rn8GdjOzw8O2Nn8GdkOzz8rzc1W17bXlw1Nzc1XF7bXls1NwAAAAACAAAAAAOzA7MAFwAtAAABIgcGBwYVFBcWFxYzMjc2NzY1NCcmJyYTBwYiLwEmNjsBETQ2OwEyFhURMzIWAe52Z2Q7PT07ZGd2fGpmOz4+O2ZpIXYOKA52Dg0XXQsHJgcLXRcNA7M+O2ZqfHZnZDs9PTtkZ3Z9aWY7Pv3wmhISmhIaARcICwsI/ukaAAMAAAAAA+UD5QAXACMALAAAASIHBgcGFRQXFhcWMzI3Njc2NTQnJicmAxQrASI1AzQ7ATIHJyImNDYyFhQGAe6Ecm9BRERBb3KEiXZxQkREQnF1aQIxAwgCQgMBIxIZGSQZGQPkREJxdomEcm9BRERBb3KEinVxQkT9HQICAWICAjEZIxkZIxkAAAAAAwAAAAADsQPkABsAKgAzAAABBgcGBwYHBjcRFBcWFxYXNjc2NzY1ESQXJicmBzMyFhUDFAYrASInAzQ2EyImNDYyFhQGAfVBQTg7LDt/IEc+bF5sbF1tPUj+2KhQQVVvNAQGDAMCJgUBCwYeDxYWHhUVA+QPEg4SDhIpCv6tj3VkST4dHT5JZHWPAVNeNRkSGPwGBP7GAgMFAToEBv5AFR8VFR8VAAAAAgAAAAADsQPkABkALgAAAQYHBgc2BREUFxYXFhc2NzY3NjURJBcmJyYTAQYvASY/ATYyHwEWNjclNjIfARYB9VVVQk+v/tFHPmxebGxdbT1I/tGvT0JVo/7VBASKAwMSAQUBcQEFAgESAgUBEQQD4xMYEhk3YP6sjnVlSD8cHD9IZXWOAVRgNxkSGP62/tkDA48EBBkCAVYCAQHlAQIQBAAAAAACAAAAAAPkA+QAFwAtAAABIgcGBwYVFBcWFxYzMjc2NzY1NCcmJyYTAQYiLwEmPwE2Mh8BFjI3ATYyHwEWAe6Ecm9BQ0NCbnODiXVxQkREQnF1kf6gAQUBowMDFgEFAYUCBQEBQwIFARUEA+NEQnF1iYNzbkJDQ0FvcoSJdXFCRP6j/qUBAagEBR4CAWYBAQENAgIVBAAAAAQAAAAAA68DrQAUACkAPwBDAAABIgcGBwYUFxYXFjI3Njc2NCcmJyYDIicmJyY0NzY3NjIXFhcWFAcGBwYTBQ4BLwEmBg8BBhYfARYyNwE+ASYiFzAfAQH1eGdkOzw8O2Rn8GZkOzw8O2RmeG5eWzY3NzZbXtteWzY3NzZbXmn+9gYSBmAGDwUDBQEGfQUQBgElBQELEBUBAQOtPDtkZ/BnYzs8PDtjZ/BnZDs8/K83NVte215cNTc3NVxe215bNTcCJt0FAQVJBQIGBAcRBoAGBQEhBQ8LBAEBAAABAAAAAAO7AzoAFwAAEy4BPwE+AR8BFjY3ATYWFycWFAcBBiInPQoGBwUHGgzLDCELAh0LHwsNCgr9uQoeCgGzCyEOCw0HCZMJAQoBvgkCCg0LHQv9sQsKAAAAAAIAAAAAA+UD5gAXACwAAAEiBwYHBhUUFxYXFjMyNzY3NjU0JyYnJhMHBi8BJicmNRM0NjsBMhYVExceAQHvhHJvQUNDQm5zg4l1cUJEREJxdVcQAwT6AwIEEAMCKwIDDsUCAQPlREJxdYmDc25CQ0NBb3KEiXVxQkT9VhwEAncCAgMGAXoCAwMC/q2FAgQAAAQAAAAAA68DrQADABgALQAzAAABMB8BAyIHBgcGFBcWFxYyNzY3NjQnJicmAyInJicmNDc2NzYyFxYXFhQHBgcGAyMVMzUjAuUBAfJ4Z2Q7PDw7ZGfwZmQ7PDw7ZGZ4bl5bNjc3Nlte215bNjc3NltemyT92QKDAQEBLDw7ZGfwZ2M7PDw7Y2fwZ2Q7PPyvNzVbXtteXDU3NzVcXtteWzU3AjH9JAAAAAMAAAAAA+QD5AAXACcAMAAAASIHBgcGFRQXFhcWMzI3Njc2NTQnJicmAzMyFhUDFAYrASImNQM0NhMiJjQ2MhYUBgHuhHJvQUNDQm5zg4l1cUJEREJxdZ42BAYMAwInAwMMBh8PFhYeFhYD40RCcXWJg3NuQkNDQW9yhIl1cUJE/vYGBf7AAgMDAgFABQb+NhYfFhYfFgAABAAAAAADwAPAAAgAEgAoAD0AAAEyNjQmIgYUFhcjFTMRIxUzNSMDIgcGBwYVFBYXFjMyNzY3NjU0Jy4BAyInJicmNDc2NzYyFxYXFhQHBgcGAfQYISEwISFRjzk5yTorhG5rPT99am+DdmhlPD4+PMyFbV5bNTc3NVte2l5bNTc3NVteAqAiLyIiLyI5Hf7EHBwCsT89a26Ed8w8Pj48ZWh2g29qffyjNzVbXtpeWzU3NzVbXtpeWzU3AAADAAAAAAOoA6gACwAgADUAAAEHJwcXBxc3FzcnNwMiBwYHBhQXFhcWMjc2NzY0JyYnJgMiJyYnJjQ3Njc2MhcWFxYUBwYHBgKOmpocmpocmpocmpq2dmZiOjs7OmJm7GZiOjs7OmJmdmtdWTQ2NjRZXdZdWTQ2NjRZXQKqmpocmpocmpocmpoBGTs6YmbsZmI6Ozs6YmbsZmI6O/zCNjRZXdZdWTQ2NjRZXdZdWTQ2AAMAAAAAA+kD6gAaAC8AMAAAAQYHBiMiJyYnJjQ3Njc2MhcWFxYVFAcGBwEHATI3Njc2NCcmJyYiBwYHBhQXFhcWMwKONUBCR21dWjU3NzVaXdpdWzU2GBcrASM5/eBXS0grKysrSEuuSkkqLCwqSUpXASMrFxg2NVtd2l1aNTc3NVpdbUdCQDX+3jkBGSsrSEuuSkkqLCwqSUquS0grKwAC//8AAAPoA+gAFAAwAAABIgcGBwYQFxYXFiA3Njc2ECcmJyYTFg4BIi8BBwYuATQ/AScmPgEWHwE3Nh4BBg8BAfSIdHFDRERDcXQBEHRxQ0REQ3F0SQoBFBsKoqgKGxMKqKIKARQbCqKoChsUAQqoA+hEQ3F0/vB0cUNERENxdAEQdHFDRP1jChsTCqiiCgEUGwqiqAobFAEKqKIKARQbCqIAAAIAAAAAA+QD5AAXADQAAAEiBwYHBhUUFxYXFjMyNzY3NjU0JyYnJhMUBiMFFxYUDwEGLwEuAT8BNh8BFhQPAQUyFh0BAe6Ecm9BQ0NCbnODiXVxQkREQnF1fwQC/pGDAQEVAwTsAgEC7AQEFAIBhAFwAgMD40RCcXWJg3NuQkNDQW9yhIl1cUJE/fYCAwuVAgQCFAQE0AIFAtEEBBQCBQGVCwMDJwAAAAUAAAAAA9QD0wAjACcANwBHAEgAAAERFAYjISImNREjIiY9ATQ2MyE1NDYzITIWHQEhMhYdARQGIyERIREHIgYVERQWOwEyNjURNCYjISIGFREUFjsBMjY1ETQmKwEDeyYb/XYbJkMJDQ0JAQYZEgEvExkBBgkNDQn9CQJc0QkNDQktCQ0NCf7sCQ0NCS0JDQ0JLQMi/TQbJiYbAswMCiwJDS4SGRkSLg0JLAoM/UwCtGsNCf5NCQ0NCQGzCQ0NCf5NCQ0NCQGzCQ0AAAAAEADGAAEAAAAAAAEABAAAAAEAAAAAAAIABwAEAAEAAAAAAAMABAALAAEAAAAAAAQABAAPAAEAAAAAAAUACwATAAEAAAAAAAYABAAeAAEAAAAAAAoAKwAiAAEAAAAAAAsAEwBNAAMAAQQJAAEACABgAAMAAQQJAAIADgBoAAMAAQQJAAMACAB2AAMAAQQJAAQACAB+AAMAAQQJAAUAFgCGAAMAAQQJAAYACACcAAMAAQQJAAoAVgCkAAMAAQQJAAsAJgD6d2V1aVJlZ3VsYXJ3ZXVpd2V1aVZlcnNpb24gMS4wd2V1aUdlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC5odHRwOi8vZm9udGVsbG8uY29tAHcAZQB1AGkAUgBlAGcAdQBsAGEAcgB3AGUAdQBpAHcAZQB1AGkAVgBlAHIAcwBpAG8AbgAgADEALgAwAHcAZQB1AGkARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETAAZjaXJjbGUIZG93bmxvYWQEaW5mbwxzYWZlX3N1Y2Nlc3MJc2FmZV93YXJuB3N1Y2Nlc3MOc3VjY2Vzcy1jaXJjbGURc3VjY2Vzcy1uby1jaXJjbGUHd2FpdGluZw53YWl0aW5nLWNpcmNsZQR3YXJuC2luZm8tY2lyY2xlBmNhbmNlbAZzZWFyY2gFY2xlYXIEYmFjawZkZWxldGUAAAAA") format("truetype")}@font-face{font-weight:400;font-style:normal;font-family:unibtn;src:url("data:application/octet-stream;base64,AAEAAAAKAIAAAwAgT1MvMvUTHSwAAACsAAAAYGNtYXD/1LSBAAABDAAAAVpnbHlmz06L9gAAAmgAAAQ0aGVhZA501cwAAAacAAAANmhoZWEH7wQ6AAAG1AAAACRobXR4JCoHAwAABvgAAAAkbG9jYQQeBSgAAAccAAAAFG1heHAADQBLAAAHMAAAACBuYW1l5hEPkgAAB1AAAAHacG9zdAQfBCEAAAksAAAAPAAEBAUBkAAFAAACmQLMAAAAjwKZAswAAAHrADMBCQAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAAAEDmAP/9A8D/wABAA8AAQAAAAAEAAAAAAAAAAAAAACAAAAAAAAMAAAADAAAAHAABAAAAAABUAAMAAQAAABwABAA4AAAACgAIAAIAAuYC5gbmUf/9//8AAOYA5gTmUP/9//8aARoAGbcAAwABAAAAAAAAAAAAAAAAAQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAWAAeQLBAuoAFQAAASY0NzYyFwEeARUUBgcBBiInJjQ3AQFgCAgHFgcBNQQEBAT+ywcWBwgIASICxQcXBwgI/twECwUGCwT+3AgIBxcIARMAAAABAVgAeQK5AuoAFQAACQIWFAcGIicBLgE1NDY3ATYyFxYUArn+3gEiCAgIFQj+zAUDAwUBNAgVCAgCxf7t/u0IFwcICAEkBAsGBQsEASQICAcXAAACANAAaQO6Aw0AGwA0AAAlFAYjISImNRE0NjsBNSMiBhURFBYzITI2PQEjEycHFwcOAw8BMzU+ATc+AT8CBxc3JwNSBwT9wgQGBgSwwBEYGBECXxEXLmikIW53SoJjPQUBLwU2LS11QAZqbiGkAaUEBwcEAagFBjEZEf40ERkZEqUBKKwjcwEGPF9+RwgHPG4rKzIEAQF0IqwCAAACAJcAXgNzAxsALwBIAAABLgEvAi4BIyIGDwIOAQcGFh8BBwYWFx4BMzI2PwEXHgEzMjY3PgEnNDUnNz4BBTYmLwE3PgE/ARceAR8BBw4BHwEnJgYPAQNzAgoG42cDCgcGCgNk4wYKAgEDBKUlAQUFAwYEAgUDyswCBQMGCgMCAQEoowUD/foBAwSNwgUJAlZYAgkFw4wEAwEirgULBK4CFAYIAR/NBgYGBs4jAQgGBgwEn+IGDAQCAgIBbGoBAQYGAwkDAQHeoQUMsAYKBIgdAQYFsbAFBgEbiQQLBcFaAwECXAACAL8AdQNQAxEAIAA8AAABIgYdARQGIyEiJj0BNCYjIgYdAR4BMyEyNj0BNCYnLgE3AS4BIyIGBwEGFBceATMyNjcBNjIXARYyNz4BAvcKDgsH/nUICw4KCQ8BJhsBjBsnBAMDCVT+5goYDQ0YCf7mBgcDCQUECAQBGQUQBQEaBxMHBgEBsA4J4gcLCwfiCQ4OCeIbJycb4gQJAwQDNAEaCgkJCf7lBxMGBAMDAwEZBQX+5wYHBhMAAwDcAXYDMQH6AAsAFwAjAAABMjY1NCYjIgYVFBYhMjY1NCYjIgYVFBYhMjY1NCYjIgYVFBYBHhwnJxwbJycBAxwnJxwbJycBBBsnJxscJycBdicbGycnGxsnJxsbJycbGycnGxsnJxsbJwAAAQDsAJ0DFALOACUAAAE3NjQnJiIPAScmIgcGFB8BBwYUFx4BMzI2PwEXHgEzMjY3NjQnAijsCQkIGAjs6ggYCAkJ6uwJCQQKBgULBOzsBAsFBgoECQkBu+oJFwkICOvrCAgIGAjr6wgYCAQEBATr7QUEBQQIFwkAAQBdAIwD0AL4AB4AAAEWFRYHAQYHBgcGIyIvASYvAQEmJzQ3PgEXCQE2MzYDwwwBDP3/BAUCAgcGCAcEAwMD/toJAQoMHQwBDAHoCw8PAu4LDRAL/dsEAgECAQECAgMCASELDg8NCQIL/vkCCAoBAAEAAAABAADLWb2BXw889QALBAAAAAAA1ZTIqwAAAADVlMirAF0AXgPQAxsAAAAIAAIAAAAAAAAAAQAAA8D/wAAABCoAXQBGA9AAAQAAAAAAAAAAAAAAAAAAAAkEAAAABAABYAQAAVgEAADQBAAAlwQAAL8EAADcBAAA7AQqAF0AAAAAACoAVACiARQBcAGmAeICGgABAAAACQBJAAMAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEADgAAAAEAAAAAAAIABwAOAAEAAAAAAAMADgAVAAEAAAAAAAQADgAjAAEAAAAAAAUACwAxAAEAAAAAAAYADgA8AAEAAAAAAAoAGgBKAAMAAQQJAAEAHABkAAMAAQQJAAIADgCAAAMAAQQJAAMAHACOAAMAAQQJAAQAHACqAAMAAQQJAAUAFgDGAAMAAQQJAAYAHADcAAMAAQQJAAoANAD4c3RyZWFtaWNvbmZvbnRSZWd1bGFyc3RyZWFtaWNvbmZvbnRzdHJlYW1pY29uZm9udFZlcnNpb24gMS4wc3RyZWFtaWNvbmZvbnRGb250IGdlbmVyYXRlZCBieSBJY29Nb29uLgBzAHQAcgBlAGEAbQBpAGMAbwBuAGYAbwBuAHQAUgBlAGcAdQBsAGEAcgBzAHQAcgBlAGEAbQBpAGMAbwBuAGYAbwBuAHQAcwB0AHIAZQBhAG0AaQBjAG8AbgBmAG8AbgB0AFYAZQByAHMAaQBvAG4AIAAxAC4AMABzAHQAcgBlAGEAbQBpAGMAbwBuAGYAbwBuAHQARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAJAAABAgEDAQQBBQEGAQcBCAEJAAAAAAAAAAA=") format("truetype")}body,html{-webkit-user-select:none;user-select:none;width:100%;height:100%}body{overflow-x:hidden}body,uni-page-body{background-color:var(--UI-BG-0);color:var(--UI-FG-0)}[class*=" uni-icon-"],[class^=uni-icon-]{display:inline-block;vertical-align:middle;font:normal normal normal 14px/1 uni;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased}[class*=" uni-btn-icon"],[class^=uni-btn-icon]{display:inline-block;font:normal normal normal 14px/1 unibtn;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased}[class*=" uni-btn-icon"]:before,[class^=uni-btn-icon]:before{margin:0;box-sizing:border-box}.uni-icon-success-no-circle:before{content:"\EA08"}.uni-icon-error:before{content:"\EA0B"}.uni-loading,uni-button[loading]:before{background:rgba(0,0,0,0) url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgxMDB2MTAwSDB6Ii8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTlFOUU5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTMwKSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iIzk4OTY5NyIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgzMCAxMDUuOTggNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjOUI5OTlBIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDYwIDc1Ljk4IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0EzQTFBMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA2NSA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNBQkE5QUEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoMTIwIDU4LjY2IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0IyQjJCMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgxNTAgNTQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjQkFCOEI5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDE4MCA1MCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDMkMwQzEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTE1MCA0NS45OCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDQkNCQ0IiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTEyMCA0MS4zNCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNEMkQyRDIiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDM1IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0RBREFEQSIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgtNjAgMjQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTJFMkUyIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKC0zMCAtNS45OCA2NSkiLz48L3N2Zz4=") no-repeat}.uni-loading{width:20px;height:20px;display:inline-block;vertical-align:middle;-webkit-animation:uni-loading 1s steps(12) infinite;animation:uni-loading 1s steps(12) infinite;background-size:100%}@-webkit-keyframes uni-loading{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes uni-loading{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.uni-mask{position:fixed;z-index:999;top:0;right:0;left:0;bottom:0;background:rgba(0,0,0,.5)}.uni-fade-enter-active,.uni-fade-leave-active{-webkit-transition-duration:.25s;transition-duration:.25s;-webkit-transition-property:opacity;transition-property:opacity;-webkit-transition-timing-function:ease;transition-timing-function:ease}.uni-fade-enter,.uni-fade-leave-active{opacity:0}[nvue] uni-label,[nvue] uni-scroll-view,[nvue] uni-swiper-item,[nvue] uni-view{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-shrink:0;flex-shrink:0;-webkit-box-flex:0;-webkit-flex-grow:0;flex-grow:0;-webkit-flex-basis:auto;flex-basis:auto;-webkit-box-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-align-content:flex-start;align-content:flex-start}[nvue] uni-button{margin:0}[nvue-dir-row] uni-label,[nvue-dir-row] uni-swiper-item,[nvue-dir-row] uni-view{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;flex-direction:row}[nvue-dir-column] uni-label,[nvue-dir-column] uni-swiper-item,[nvue-dir-column] uni-view{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column}[nvue-dir-row-reverse] uni-label,[nvue-dir-row-reverse] uni-swiper-item,[nvue-dir-row-reverse] uni-view{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;flex-direction:row-reverse}[nvue-dir-column-reverse] uni-label,[nvue-dir-column-reverse] uni-swiper-item,[nvue-dir-column-reverse] uni-view{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;flex-direction:column-reverse}[nvue] uni-image,[nvue] uni-input,[nvue] uni-scroll-view,[nvue] uni-swiper,[nvue] uni-swiper-item,[nvue] uni-text,[nvue] uni-textarea,[nvue] uni-video,[nvue] uni-view{position:relative;border:0 solid #000;box-sizing:border-box}[nvue] uni-swiper-item{position:absolute}html{--UI-BG:#fff;--UI-BG-1:#f7f7f7;--UI-BG-2:#fff;--UI-BG-3:#f7f7f7;--UI-BG-4:#4c4c4c;--UI-BG-5:#fff;--UI-FG:#000;--UI-FG-0:rgba(0,0,0,0.9);--UI-FG-HALF:rgba(0,0,0,0.9);--UI-FG-1:rgba(0,0,0,0.5);--UI-FG-2:rgba(0,0,0,0.3);--UI-FG-3:rgba(0,0,0,0.1)}uni-app{width:100%;height:100%}uni-app,uni-page-head{display:block;box-sizing:border-box}uni-page-head .uni-page-head{position:fixed;left:var(--window-left);right:var(--window-right);height:44px;height:calc(44px + constant(safe-area-inset-top));height:calc(44px + env(safe-area-inset-top));padding:7px 3px;padding-top:calc(7px + constant(safe-area-inset-top));padding-top:calc(7px + env(safe-area-inset-top));display:-webkit-box;display:-webkit-flex;display:flex;overflow:hidden;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;box-sizing:border-box;z-index:998;color:#fff;background-color:#000;-webkit-transition-property:all;transition-property:all}uni-page-head .uni-page-head-titlePenetrate,uni-page-head .uni-page-head-titlePenetrate .uni-page-head-bd,uni-page-head .uni-page-head-titlePenetrate .uni-page-head-bd *{pointer-events:none}uni-page-head .uni-page-head-titlePenetrate *{pointer-events:auto}uni-page-head .uni-page-head.uni-page-head-transparent .uni-page-head-ft>div{-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}uni-page-head .uni-page-head~.uni-placeholder{width:100%;height:44px;height:calc(44px + constant(safe-area-inset-top));height:calc(44px + env(safe-area-inset-top))}uni-page-head .uni-placeholder-titlePenetrate{pointer-events:none}uni-page-head .uni-page-head *{box-sizing:border-box}uni-page-head .uni-page-head-hd{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;font-size:16px}uni-page-head .uni-page-head-bd{position:absolute;left:70px;right:70px;min-width:0}.uni-page-head-btn{position:relative;width:auto;margin:0 2px;word-break:keep-all;white-space:pre;cursor:pointer}.uni-page-head-transparent .uni-page-head-btn{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;width:32px;height:32px;border-radius:50%;background-color:rgba(0,0,0,.5)}uni-page-head .uni-btn-icon{overflow:hidden;min-width:1em}.uni-page-head-btn-red-dot:after{content:attr(badge-text);position:absolute;right:0;top:0;background-color:red;color:#fff;width:18px;height:18px;line-height:18px;border-radius:18px;overflow:hidden;-webkit-transform:scale(.5) translate(40%,-40%);transform:scale(.5) translate(40%,-40%);-webkit-transform-origin:100% 0;transform-origin:100% 0}.uni-page-head-btn-red-dot[badge-text]:after{font-size:12px;width:auto;min-width:18px;max-width:42px;text-align:center;padding:0 3px;-webkit-transform:scale(.7) translate(40%,-40%);transform:scale(.7) translate(40%,-40%)}.uni-page-head-btn-select>.uni-btn-icon:after{display:inline-block;font-family:unibtn;content:"\e601";margin-left:2px;-webkit-transform:rotate(-90deg) scale(.8);transform:rotate(-90deg) scale(.8)}.uni-page-head-search{position:relative;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-flex:1;-webkit-flex:1;flex:1;margin:0 2px;line-height:30px;font-size:15px}.uni-page-head-search-input{width:100%;height:100%;padding-left:34px;text-align:left}.uni-page-head-search-placeholder{position:absolute;max-width:100%;height:100%;padding-left:34px;overflow:hidden;word-break:keep-all;white-space:pre}.uni-page-head-search-placeholder-right{right:0}.uni-page-head-search-placeholder-center{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.uni-page-head-search-placeholder:before{position:absolute;top:0;left:2px;width:30px;content:"\ea0e";display:block;font-size:20px;font-family:uni;text-align:center}uni-page-head .uni-page-head-ft{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;flex-direction:row-reverse;font-size:13px}uni-page-head .uni-page-head__title{font-weight:700;font-size:16px;line-height:30px;text-align:center;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}uni-page-head .uni-page-head__title .uni-loading{width:16px;height:16px;margin-top:-3px}uni-page-head .uni-page-head__title .uni-page-head__title_image{width:auto;height:26px;vertical-align:middle}uni-page-head .uni-page-head-shadow{overflow:visible}uni-page-head .uni-page-head-shadow:after{content:"";position:absolute;left:0;right:0;top:100%;height:5px;background-size:100% 100%}uni-page-head .uni-page-head-shadow-grey:after{background-image:url(https://cdn.dcloud.net.cn/img/shadow-grey.png)}uni-page-head .uni-page-head-shadow-blue:after{background-image:url(https://cdn.dcloud.net.cn/img/shadow-blue.png)}uni-page-head .uni-page-head-shadow-green:after{background-image:url(https://cdn.dcloud.net.cn/img/shadow-green.png)}uni-page-head .uni-page-head-shadow-orange:after{background-image:url(https://cdn.dcloud.net.cn/img/shadow-orange.png)}uni-page-head .uni-page-head-shadow-red:after{background-image:url(https://cdn.dcloud.net.cn/img/shadow-red.png)}uni-page-head .uni-page-head-shadow-yellow:after{background-image:url(https://cdn.dcloud.net.cn/img/shadow-yellow.png)}uni-page-head .uni-icon-clear{-webkit-align-self:center;align-self:center;padding-right:5px}uni-page-wrapper{display:block;height:100%;position:relative}uni-page-head[uni-page-head-type=default]~uni-page-wrapper{height:calc(100% - 44px);height:calc(100% - 44px - constant(safe-area-inset-top));height:calc(100% - 44px - env(safe-area-inset-top))}uni-page-body,uni-page-refresh{display:block;box-sizing:border-box;width:100%}uni-page-refresh{position:absolute;top:0;height:40px}uni-page-refresh .uni-page-refresh{position:absolute;top:-45px;left:50%;-webkit-transform:translate3d(-50%,0,0);transform:translate3d(-50%,0,0);background:#fff;box-shadow:0 1px 6px rgba(0,0,0,.117647),0 1px 4px rgba(0,0,0,.117647);display:none;z-index:997}uni-page-refresh .uni-page-refresh,uni-page-refresh .uni-page-refresh-inner{width:40px;height:40px;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;align-items:center;border-radius:50%}uni-page-refresh .uni-page-refresh-inner{line-height:0}uni-page-refresh.uni-page-refresh--aborting .uni-page-refresh,uni-page-refresh.uni-page-refresh--pulling .uni-page-refresh,uni-page-refresh.uni-page-refresh--reached .uni-page-refresh,uni-page-refresh.uni-page-refresh--refreshing .uni-page-refresh,uni-page-refresh.uni-page-refresh--restoring .uni-page-refresh,uni-page-refresh .uni-page-refresh-inner{display:-webkit-box;display:-webkit-flex;display:flex}uni-page-refresh.uni-page-refresh--aborting .uni-page-refresh__spinner,uni-page-refresh.uni-page-refresh--pulling .uni-page-refresh__spinner,uni-page-refresh.uni-page-refresh--reached .uni-page-refresh__spinner,uni-page-refresh.uni-page-refresh--refreshing .uni-page-refresh__icon,uni-page-refresh.uni-page-refresh--restoring .uni-page-refresh__icon{display:none}uni-page-refresh.uni-page-refresh--refreshing .uni-page-refresh__spinner{-webkit-transform-origin:center center;transform-origin:center center;-webkit-animation:uni-page-refresh-rotate 2s linear infinite;animation:uni-page-refresh-rotate 2s linear infinite}uni-page-refresh.uni-page-refresh--refreshing .uni-page-refresh__path{stroke-dasharray:1,200;stroke-dashoffset:0;stroke-linecap:round;-webkit-animation:uni-page-refresh-dash 1.5s ease-in-out infinite,uni-page-refresh-colorful 6s ease-in-out infinite;animation:uni-page-refresh-dash 1.5s ease-in-out infinite,uni-page-refresh-colorful 6s ease-in-out infinite}@-webkit-keyframes uni-page-refresh-rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes uni-page-refresh-rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes uni-page-refresh-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes uni-page-refresh-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}uni-page{display:block;width:100%;height:100%}.uni-async-error{position:absolute;left:0;right:0;top:0;bottom:0;color:#999;padding:100px 10px;text-align:center}.uni-async-loading{box-sizing:border-box;width:100%;padding:50px;text-align:center}.uni-async-loading .uni-loading{width:30px;height:30px}@font-face{font-weight:400;font-style:normal;font-family:unimapbtn;src:url("data:application/octet-stream;base64,AAEAAAAKAIAAAwAgT1MvMkLLXiQAAACsAAAAYGNtYXAADe3YAAABDAAAAUJnbHlmzCeOEgAAAlAAAAD4aGVhZBcH/NkAAANIAAAANmhoZWEHvgOiAAADgAAAACRobXR4BAAAAAAAA6QAAAAGbG9jYQB8AAAAAAOsAAAABm1heHABDwBlAAADtAAAACBuYW1laz5x0AAAA9QAAALZcG9zdAEQAAIAAAawAAAAJwAEBAABkAAFAAgCiQLMAAAAjwKJAswAAAHrADIBCAAAAgAFAwAAAAAAAAAAAAAQAAAAAAAAAAAAAABQZkVkAEDsMuwyA4D/gABcA4AAgAAAAAEAAAAAAAAAAAAAACAAAAAAAAMAAAADAAAAHAABAAAAAAA8AAMAAQAAABwABAAgAAAABAAEAAEAAOwy//8AAOwy//8TzwABAAAAAAAAAQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAD/oAPgA2AACAAwAFgAAAEeATI2NCYiBgUjLgEnNTQmIgYdAQ4BByMiBhQWOwEeARcVFBYyNj0BPgE3MzI2NCYBNTQmIgYdAS4BJzMyNjQmKwE+ATcVFBYyNj0BHgEXIyIGFBY7AQ4BAbABLUQtLUQtAg8iD9OcEhwSnNMPIg4SEg4iD9OcEhwSnNMPIg4SEv5SEhwSga8OPg4SEg4+Dq+BEhwSga8OPg4SEg4+Dq8BgCItLUQtLQKc0w8iDhISDiIP05wSHBKc0w8iDhISDiIP05wSHBL+gj4OEhIOPg6vgRIcEoGvDj4OEhIOPg6vgRIcEoGvAAEAAAABAABmV+0zXw889QALBAAAAAAA2gRcbgAAAADaBFxuAAD/oAPgA2AAAAAIAAIAAAAAAAAAAQAAA4D/gABcBAAAAAAgA+AAAQAAAAAAAAAAAAAAAAAAAAEEAAAAAAAAAAAAAAAAfAAAAAEAAAACAFkAAwAAAAAAAgAAAAoACgAAAP8AAAAAAAAAAAASAN4AAQAAAAAAAAAVAAAAAQAAAAAAAQARABUAAQAAAAAAAgAHACYAAQAAAAAAAwARAC0AAQAAAAAABAARAD4AAQAAAAAABQALAE8AAQAAAAAABgARAFoAAQAAAAAACgArAGsAAQAAAAAACwATAJYAAwABBAkAAAAqAKkAAwABBAkAAQAiANMAAwABBAkAAgAOAPUAAwABBAkAAwAiAQMAAwABBAkABAAiASUAAwABBAkABQAWAUcAAwABBAkABgAiAV0AAwABBAkACgBWAX8AAwABBAkACwAmAdUKQ3JlYXRlZCBieSBpY29uZm9udAp1bmljaG9vc2Vsb2NhdGlvblJlZ3VsYXJ1bmljaG9vc2Vsb2NhdGlvbnVuaWNob29zZWxvY2F0aW9uVmVyc2lvbiAxLjB1bmljaG9vc2Vsb2NhdGlvbkdlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC5odHRwOi8vZm9udGVsbG8uY29tAAoAQwByAGUAYQB0AGUAZAAgAGIAeQAgAGkAYwBvAG4AZgBvAG4AdAAKAHUAbgBpAGMAaABvAG8AcwBlAGwAbwBjAGEAdABpAG8AbgBSAGUAZwB1AGwAYQByAHUAbgBpAGMAaABvAG8AcwBlAGwAbwBjAGEAdABpAG8AbgB1AG4AaQBjAGgAbwBvAHMAZQBsAG8AYwBhAHQAaQBvAG4AVgBlAHIAcwBpAG8AbgAgADEALgAwAHUAbgBpAGMAaABvAG8AcwBlAGwAbwBjAGEAdABpAG8AbgBHAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAHMAdgBnADIAdAB0AGYAIABmAHIAbwBtACAARgBvAG4AdABlAGwAbABvACAAcAByAG8AagBlAGMAdAAuAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAABAgAA") format("truetype")}.uni-system-choose-location{display:block;position:fixed;left:0;top:0;width:100%;height:100%;background:#f8f8f8}.uni-system-choose-location .map{position:absolute;top:0;left:0;width:100%;height:300px}.uni-system-choose-location .map-location{position:absolute;left:50%;bottom:50%;width:32px;height:52px;margin-left:-16px;cursor:pointer;background-size:100%}.uni-system-choose-location .map-move{position:absolute;bottom:50px;right:10px;width:40px;height:40px;box-sizing:border-box;line-height:40px;background-color:#fff;border-radius:50%;pointer-events:auto;cursor:pointer;box-shadow:0 0 5px 1px rgba(0,0,0,.3)}.uni-system-choose-location .map-move>i{display:block;width:100%;height:100%;font:normal normal normal 14px/1 unimapbtn;line-height:inherit;text-align:center;font-size:24px;text-rendering:auto;-webkit-font-smoothing:antialiased}.uni-system-choose-location .nav{position:absolute;top:0;left:0;width:100%;height:44px;background-color:rgba(0,0,0,0);background-image:-webkit-linear-gradient(top,rgba(0,0,0,.3),rgba(0,0,0,0));background-image:linear-gradient(180deg,rgba(0,0,0,.3),rgba(0,0,0,0))}.uni-system-choose-location .nav-btn{position:absolute;box-sizing:border-box;top:0;left:0;width:60px;height:44px;padding:6px;line-height:32px;font-size:26px;color:#fff;text-align:center;cursor:pointer}.uni-system-choose-location .nav-btn.confirm{left:auto;right:0}.uni-system-choose-location .nav-btn.disable{opacity:.4}.uni-system-choose-location .nav-btn>.uni-btn-icon{display:block;width:100%;height:100%;line-height:inherit;border-radius:2px}.uni-system-choose-location .nav-btn.confirm>.uni-btn-icon{background-color:#007aff}.uni-system-choose-location .menu{position:absolute;top:300px;left:0;width:100%;bottom:0;background-color:#fff}.uni-system-choose-location .search{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;flex-direction:row;height:50px;padding:8px;line-height:34px;box-sizing:border-box;background-color:#fff}.uni-system-choose-location .search-input{-webkit-box-flex:1;-webkit-flex:1;flex:1;height:100%;border-radius:5px;padding:0 5px;background:#ebebeb}.uni-system-choose-location .search-btn{margin-left:5px;color:#007aff;font-size:17px;text-align:center}.uni-system-choose-location .list{position:absolute;top:50px;left:0;width:100%;bottom:0;padding-bottom:10px}.uni-system-choose-location .list-loading{display:-webkit-box;display:-webkit-flex;display:flex;height:50px;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.uni-system-choose-location .list-item{position:relative;padding:10px;padding-right:40px;cursor:pointer}.uni-system-choose-location .list-item.selected:before{position:absolute;top:50%;right:10px;width:30px;height:30px;margin-top:-15px;text-align:center;content:"\e651";font:normal normal normal 14px/1 unibtn;font-size:24px;line-height:30px;color:#007aff;text-rendering:auto;-webkit-font-smoothing:antialiased}.uni-system-choose-location .list-item:not(:last-child):after{position:absolute;content:"";height:1px;left:10px;bottom:0;width:100%;background-color:#d3d3d3}.uni-system-choose-location .list-item-title{font-size:14px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.uni-system-choose-location .list-item-detail{font-size:12px;color:grey;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}@media screen and (min-width:800px){.uni-system-choose-location .map{top:0;height:100%}.uni-system-choose-location .map-move{bottom:10px;right:320px}.uni-system-choose-location .menu{top:54px;left:auto;right:10px;width:300px;bottom:10px;max-height:600px;box-shadow:0 0 20px 5px rgba(0,0,0,.3)}}.uni-system-open-location{display:block;position:absolute;left:0;top:0;width:100%;height:100%;background:#f8f8f8;z-index:999}.uni-system-open-location .map{position:absolute;top:0;left:0;width:100%;bottom:80px;height:auto}.uni-system-open-location .info{position:absolute;bottom:0;left:0;width:100%;height:80px;background-color:#fff;padding:15px;box-sizing:border-box;line-height:1.5}.uni-system-open-location .info>.name{font-size:17px;color:#111}.uni-system-open-location .info>.address{font-size:14px;color:#666}.uni-system-open-location .info>.nav{position:absolute;top:50%;right:15px;width:50px;height:50px;border-radius:50%;margin-top:-25px;background-color:#007aff}.uni-system-open-location .info>.nav>svg{display:block;width:100%;height:100%;padding:10px;box-sizing:border-box}.uni-system-open-location .map-move{position:absolute;bottom:50px;right:10px;width:40px;height:40px;box-sizing:border-box;line-height:40px;background-color:#fff;border-radius:50%;pointer-events:auto;cursor:pointer;box-shadow:0 0 5px 1px rgba(0,0,0,.3)}.uni-system-open-location .map-move>i{display:block;width:100%;height:100%;font:normal normal normal 14px/1 unimapbtn;line-height:inherit;text-align:center;font-size:24px;text-rendering:auto;-webkit-font-smoothing:antialiased}.uni-system-open-location .nav-btn-back{position:absolute;box-sizing:border-box;top:0;left:0;width:44px;height:44px;padding:6px;line-height:32px;font-size:26px;color:#fff;text-align:center;cursor:pointer}.uni-system-open-location .nav-btn-back>.uni-btn-icon{display:block;width:100%;height:100%;line-height:inherit;border-radius:50%;background-color:rgba(0,0,0,.5)}.uni-system-open-location .map-content{position:absolute;left:0;top:0;width:100%;bottom:0;overflow:hidden}.uni-system-open-location .map-content.fix-position{top:-74px;bottom:-44px}.uni-system-open-location .map-content>iframe{width:100%;height:100%;border:none}.uni-system-open-location .actTonav{position:absolute;right:16px;bottom:56px;width:60px;height:60px;border-radius:60px}uni-audio{display:none}uni-audio[controls]{display:inline-block}uni-audio[hidden]{display:none}.uni-audio-default{max-width:100%;min-width:302px;height:65px;background:#fcfcfc;border:1px solid #e0e0e0;border-radius:2.5px;display:inline-block;overflow:hidden}.uni-audio-left{width:65px;height:65px;float:left;background-color:#e6e6e6;background-size:100% 100%;background-position:50% 50%}.uni-audio-button{width:24px;height:24px;margin:20.5px;background-size:cover}.uni-audio-button.play{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAB4dJREFUaAXNWg1MlVUYvpcfIRCJ+MnCaOBl8dOcOCEQZ9kmI5cQG5Yb6MifKbMaGVobOtlibTWHDpgpxBUwF07826iFsMkYJhg559JdGiQSkUzSBA0QkZ7n4/u+nXsvwf3jwru99/y/3/N+3znvec97rlbjABofH38GYtaAV4MjwDqwH9gHTBoE3wd3gA3gi+B6rVY7hHR2CKD9wFngs+BHYGuJYziWMqiscwgP8wLvBQ+AHUWURZle1mqhtXQAhLui7xZwPvgFsBENDg7+Drp069at2z09Pf03b978u6mpqZ+dVq1aFRAVFeW/aNGigNDQ0JfDwsISfXx8wowETBT+QpIPLsf0GpuomvrXIgUAPhhizoGXi+II+tq1az/o9fpLFRUVd8S26fJZWVkLN2/enBgTE/PW/PnzF5v0b0P5HSjxp0m9WXFaBQD+NYw6C1bf+vDwcF9DQ4N+/fr19ciPm0m1osLT01N76tSpNaD3PTw8FgpD+TXSoESrUGeWnVIBgM/EiDKwJ0eiPNrS0nJsw4YNNd3d3aOscxSFhIS4V1dXpyckJGRB5jxZ7jDSbVDiW7lslriY1cgVMvjjKErgR0dH/zl06NCuFStWfOdo8HwkZVL2wYMHP3ny5AlNLonPPi5jkSpMfyb9AhjAadMIlsBjrndmZ2fnnThxos9UwEyUMzIynj9y5EgB1gb3ExK/xBuTTSczBQCeC/ZnsDTnCR6f9YMbN25QiNMoOjras7W1tcjb2ztcfijXRKzpwjaaQgBPU0lrI4HntOGbdzZ4AuYzt2/fvm9sbOweyyBiOidjlCr4Y6QAyrTzkqlEx9GSkpJ9zpo2BGNKfHZRUdF+1D+W24iNGFVSpxAAcxekryK9/cuXLx/FoqpWe85iBlPpvbi4uB0yBE4lHabSvyyLX2AXyhJ42nmYytPsMBcI+80ZWKZeGQsxEqtEkgJ4+3Sm9sh1Gm5SM2EqFfnWpsRSV1dXIYzbI2NWv0AqGiXXl+4Bd1ihs0XZu3fvHhgYGNBXVVUlWDTAyk7p6ekNIyMj7fIwYiVmIwWkNvo2trgHAQEBy+CghW7cuPGLvr6+L3fu3PmSJNBBP8R09erVHwVxEwrgU/AwkqQ00DFT8lamqkEICgqKKy4u1sMU7li6dKnVLvL/Pbe0tLRFaEsidi1+UlB5ng3ctBYsWLBV6GRxFnJ4yjIj7CX36uvrS1NTU+uwEM3ara3Al/gaTl+EPC6Vi/hNRUhHR8dPSt5Rqbu7+3Nr1679rL+//3BBQYHyYJvFd3V1iTNkNRV4RZF2G6TkHZ36+vpG5uXlHcah59Pk5GSbj5AY3y1gi6ACisOk4UlKaJyJrBYnsuTa2trjzc3N7/r7+9N1sYo6OzsfCAN0VEB9GzwGCo0zlnV1dfVOTEzMhn3Xl5eXx1rzIBOMflRAsv8UopxhrRFoT18vL68QHCu/am9vz7FUjglGHyow6xQcHBxjKwgqwKCTRIweKHlnpZhGDfC7LP4CJhgH3QCUxzd/AmboA0kP8zNNcDt+w8ZUvHv37l+tedaSJUueFfrfpwJ0oSVLxLiN0DgjWWxsDxobG79JSUn53haXRafT+QrAOjiFDEoFg05K3tEpduoxg8FweuXKlRlJSUm1toAnpvDwcB55FTJQAdUFYMRMaXFkil34l9zc3K2RkZElV65ceWSPbCz414XxF6kAXWfpdMNwHyNmQge7skNDQ3dOnjy5PzAwMLewsLDLLmEYDJMb5ObmFiXLIeZ6FxzNGOK+IFeyk91f4enTpyNtbW3HIiIiNsHCNCmy7U1zcnKWCTIuEDu/AOn8RKLRMFbJcJ9StjRlBIN94Y40ZmZmboqNja3iScrS8dP1IyaEWt4W+kmYaYVILHA/8GGglbHKdevWqV+FHaYjOGofw811hcfZOV1fW9pxzE1wcXGJlscSq6SA+qZhJfai8nN2wNHtDhb0pt7eXoe9Qcq1lRg3hRvNkLtyytuHfAHlKVOI+UIwQxYaRolramrSmZ8LhLefJIAnRmKVSFUAHbiq8yeqNRpGiWE5XlXKs5WWlZUthu3/SHh+voxVqlKnEEuYRvTPee5czjKjxDCr2bMVnYNF9IO7fRRQAokHxIuPeCig3t4YKcAeUCIYiRrcffjwYUd8fPyHzo6PwuJ4XL9+/QAWrjILOHWmDu5SAWjHa500sBSNZoibUWKGvNnuDOKbNwFPLLytITYjUteAWIuOvNbZptQxxF1ZWXnYGWuCc57TRnjzhMFbGmIyI7MpJPbAdMpEuQzsKdc/hi+jT0tLO+NoE0tTSWsjL9h58vP45qe8YppSAQqBEmaXfAy0MlbJcJ+tXqUMUMMdlpsUIuE78JYVO89mznn7LvmUh8gL+xzKknVS6hmrZLiPETNrr1npmNG3oXsg7LCKaFobx1yzKhKhBE3sFnA+mCFuI4IyBuyWzYjb/MHQh+lFN09SPIxgirxIlxhepeIWiHL41vPBFl90i4MtykOROfVXA4tAT9YJisyJP3tMu4gnA29aB2UY4V4DXg1m/FMH9gMrMSd6jwwe8PxtAPMU6JC/2/wHuyI2cMsNBRIAAAAASUVORK5CYII=)}.uni-audio-button.pause{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAABatJREFUaAXVWl1IpFUYnllZGUf3wlz6MXER1ES7s83VUDJw6KpdaSTDwMnYFSK6KNirooHullKQCNzQRjZ/wom1u9ALQ0mT1ktFdEBWXLdibaH1jwmx5zme83W+z2Hm+7bZmc8X3jl/73vO837n/z3j9aSBjo6O8lBNC7gZXAUuBxeCz4FJj8APwTHwCngaPOX1evcRZocAuhAcAt8G74KdEnWoyzpobGYIjfnBn4D/BqeLWBfr9Du1wmtXAZXnQPY9cBj8HNhEe3t7sbW1tfn19fW7m5ubD5aXl7dnZmYeUKipqel8dXV1UUlJyfmysrILFRUV9X6/n8PMSveREQYPYHgdWgsTpW0ZAPDPQ3kC/JJeCUEvLi7+NDg4+EskEvldL0sVD4VCz3Z1db1SW1v7egJj7kD/Coy4l6qelAYAfB0quQ02vno8Hr8/OTkZaWtrmzo4ODhK1Uiycp/P5x0fH28JBAKh3Nxcow3osDdaYcRCMv2kBgD8O1D+BuyTlcTn5+cj7e3t0Y2NjX+SVey0rLS09OzY2Fiwvr4+BN1cqX+A8CqM+E6mTwRnTuTIDAn+FpIC/OHh4V+9vb0fNzQ0jKYbPJtknaybbbAtCYNt35JYZJY5SNgDctj8DFEBfnd3d627u/vT4eHhP8zqTybV0dHxTH9//+f5+fkVsgX2xKuJhtMJAwCeE/Y3sBiPBF9XV/fh0tISK8kY1dTU+BYWFvo0IzgnLlontmkIATyXSq42Ajy7kl8+0+D5ldgm29aGEzFNSIwUEWQyADlc59VSGe/r6/ssU8PmGI75l20TA3LjsoTYiNEgYwjBMu6CPKuIr4/Vph+TasyQzGJkbm7ubaxO1yQEDqVyDKU9pvUe+AhpAZ7rPJbKHyjgBuKyTUwSCzESqyBhAL4+D1PXZZ6Hm9STWCpV/U5DYiEmTe+6xOwRQwiJEAq/pQCPB0VFRdf+7w7LutJJ3LG3t7dvaseOdzGMImoIXVaN8WzjNvDERkzEpnAiFJjP4OvzMhJQBTyYqbjdEDov7+/vf4+6pu0wZQcGBi7arV/JWbAFiN2Lnzcg8COFuGkVFBSo2a70UoYEhC5+OqWgJoAv+mdeXt5bWpat6M7Ozk1tc7vMIfSa0lxdXf1VxZ2ETsGz7sfRoV4sFtMxNtOAF1hAugs6jrn3lxcmDV0VDTBuRrxJaYWujFowltMA40LNa6ArUWugLBgLaYByfXjUHVaTd13UgvEcDTjVRAPodBJE74GKuzW0YHxEA+gxE0TXh4q7NbRgfEgDeIQWRL+Nirs1tGCM0YAVBZZOJxV3a2jBuEIDphVYesxU3EnIY4ETeco+jg71LBinacAUWNxueFSlx4yCTmh0dPRLJ4AoOzIy8oWTNihLbNpxmpin1H2AnrcrFJqdnf0KM901tzFiUoQ94M3GxsYPZHoC94FW9gBJnEYZoa8SBy1hGNNuIWIiNg2PwKwbIPYDdhF9lZqgK6LEpA0fYv3PAHQF94IbCikdrcXFxWdVOtsh/abEpOG4ITGbvBI9EBA3f3qJo9FoUFPIapROX81zTYzEKkgNIQ8s4qwOH2d7PPQS9/T0vKjS2QqJQXqsFYSwxCrSpsmK6yVdi7zx0APmoVuvs7Pz/Wx55+jkHRoa+jonJ+cp4gHdAV+CAcbrjckASsCI0+vcpQGw7h6CVrDwRvMCTS8xvwbLM0Fsy+KZJha+1hCbiYw5oOdCkM86V1UejWBXZmJOsA22pXkeCIOvNAmfmk4MIQWaIYZTwiemYDAY3dracsUTU1IDpBGn95FP9Yac2KfzmVUzgkssHxfCYOGGR2gQvXp0jNG3lOyh+wKosrLykmWMq3q4SYXBth+6laLtEL3hqr8a2AZuFYQhrvizR8pJbAWeKA1j6OFuATeDq8D09hWClc+Jp0ceGHn/5hWWt8C0/N3mX15C4bDnCIuAAAAAAElFTkSuQmCC)}.uni-audio-right{box-sizing:border-box;height:65px;margin-left:65px;padding:11px 16.5px 13.5px 15px;overflow:hidden}.uni-audio-time{margin-top:3.5px;height:16.5px;font-size:12px;color:#888;float:right}.uni-audio-info{margin-right:70px;overflow:hidden}.uni-audio-name{height:22.5px;line-height:22.5px;margin-bottom:3.5px;font-size:14px;color:#353535}.uni-audio-author,.uni-audio-name{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.uni-audio-author{height:14.5px;line-height:14.5px;font-size:12px;color:#888}uni-button{position:relative;display:block;margin-left:auto;margin-right:auto;padding-left:14px;padding-right:14px;box-sizing:border-box;font-size:18px;text-align:center;text-decoration:none;line-height:2.55555556;border-radius:5px;-webkit-tap-highlight-color:transparent;overflow:hidden;color:#000;background-color:#f8f8f8;cursor:pointer}uni-button[hidden]{display:none!important}uni-button:after{content:" ";width:200%;height:200%;position:absolute;top:0;left:0;border:1px solid rgba(0,0,0,.2);-webkit-transform:scale(.5);transform:scale(.5);-webkit-transform-origin:0 0;transform-origin:0 0;box-sizing:border-box;border-radius:10px}uni-button[native]{padding-left:0;padding-right:0}uni-button[native] .uni-button-cover-view-wrapper{border:inherit;border-color:inherit;border-radius:inherit;background-color:inherit}uni-button[native] .uni-button-cover-view-inner{padding-left:14px;padding-right:14px}uni-button uni-cover-view{line-height:inherit;white-space:inherit}uni-button[type=default]{color:#000;background-color:#f8f8f8}uni-button[type=primary]{color:#fff;background-color:#007aff}uni-button[type=warn]{color:#fff;background-color:#e64340}uni-button[disabled]{color:hsla(0,0%,100%,.6);cursor:not-allowed}uni-button[disabled]:not([type]),uni-button[disabled][type=default]{color:rgba(0,0,0,.3);background-color:#f7f7f7}uni-button[disabled][type=primary]{background-color:rgba(0,122,255,.6)}uni-button[disabled][type=warn]{background-color:#ec8b89}uni-button[type=primary][plain]{color:#007aff;border:1px solid #007aff;background-color:rgba(0,0,0,0)}uni-button[type=primary][plain][disabled]{color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.2)}uni-button[type=primary][plain]:after{border-width:0}uni-button[type=default][plain]{color:#353535;border:1px solid #353535;background-color:rgba(0,0,0,0)}uni-button[type=default][plain][disabled]{color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.2)}uni-button[type=default][plain]:after{border-width:0}uni-button[plain]{color:#353535;border:1px solid #353535;background-color:rgba(0,0,0,0)}uni-button[plain][disabled]{color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.2)}uni-button[plain]:after{border-width:0}uni-button[plain][native] .uni-button-cover-view-inner{padding:0}uni-button[type=warn][plain]{color:#e64340;border:1px solid #e64340;background-color:rgba(0,0,0,0)}uni-button[type=warn][plain][disabled]{color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.2)}uni-button[type=warn][plain]:after{border-width:0}uni-button[size=mini]{display:inline-block;line-height:2.3;font-size:13px;padding:0 1.34em}uni-button[size=mini][native]{padding:0}uni-button[size=mini][native] .uni-button-cover-view-inner{padding:0 1.34em}uni-button[loading]:not([disabled]){cursor:progress}uni-button[loading]:before{content:" ";display:inline-block;width:18px;height:18px;vertical-align:middle;-webkit-animation:uni-loading 1s steps(12) infinite;animation:uni-loading 1s steps(12) infinite;background-size:100%}uni-button[loading][type=primary]{color:hsla(0,0%,100%,.6);background-color:#0062cc}uni-button[loading][type=primary][plain]{color:#007aff;background-color:rgba(0,0,0,0)}uni-button[loading][type=default]{color:rgba(0,0,0,.6);background-color:#dedede}uni-button[loading][type=default][plain]{color:#353535;background-color:rgba(0,0,0,0)}uni-button[loading][type=warn]{color:hsla(0,0%,100%,.6);background-color:#ce3c39}uni-button[loading][type=warn][plain]{color:#e64340;background-color:rgba(0,0,0,0)}uni-button[loading][native]:before{content:none}.button-hover{color:rgba(0,0,0,.6);background-color:#dedede}.button-hover[plain]{color:rgba(53,53,53,.6);border-color:rgba(53,53,53,.6);background-color:rgba(0,0,0,0)}.button-hover[type=primary]{color:hsla(0,0%,100%,.6);background-color:#0062cc}.button-hover[type=primary][plain]{color:rgba(0,122,255,.6);border-color:rgba(0,122,255,.6);background-color:rgba(0,0,0,0)}.button-hover[type=default]{color:rgba(0,0,0,.6);background-color:#dedede}.button-hover[type=default][plain]{color:rgba(53,53,53,.6);border-color:rgba(53,53,53,.6);background-color:rgba(0,0,0,0)}.button-hover[type=warn]{color:hsla(0,0%,100%,.6);background-color:#ce3c39}.button-hover[type=warn][plain]{color:rgba(230,67,64,.6);border-color:rgba(230,67,64,.6);background-color:rgba(0,0,0,0)}uni-canvas{width:300px;height:150px;display:block;position:relative}uni-canvas>canvas{position:absolute;top:0;left:0;width:100%;height:100%}uni-checkbox-group[hidden]{display:none}uni-checkbox{-webkit-tap-highlight-color:transparent;display:inline-block;cursor:pointer}uni-checkbox[hidden]{display:none}uni-checkbox[disabled]{cursor:not-allowed}uni-checkbox .uni-checkbox-wrapper{display:-webkit-inline-flex;display:-webkit-inline-box;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;align-items:center;vertical-align:middle}uni-checkbox .uni-checkbox-input{margin-right:5px;-webkit-appearance:none;appearance:none;outline:0;border:1px solid #d1d1d1;background-color:#fff;border-radius:3px;width:22px;height:22px;position:relative}@media (hover:hover){uni-checkbox:not([disabled]) .uni-checkbox-input:hover{border-color:var(--HOVER-BD-COLOR,#007aff)!important}}uni-checkbox .uni-checkbox-input.uni-checkbox-input-checked{color:#007aff}uni-checkbox .uni-checkbox-input.uni-checkbox-input-checked:before{font:normal normal normal 14px/1 uni;content:"\EA08";font-size:22px;position:absolute;top:50%;left:50%;transform:translate(-50%,-48%) scale(.73);-webkit-transform:translate(-50%,-48%) scale(.73)}uni-checkbox .uni-checkbox-input.uni-checkbox-input-disabled{background-color:#e1e1e1}uni-checkbox .uni-checkbox-input.uni-checkbox-input-disabled:before{color:#adadad}uni-checkbox-group{display:block}.ql-container{display:block;position:relative;box-sizing:border-box;-webkit-user-select:text;user-select:text;outline:none;overflow:hidden;width:100%;height:200px;min-height:200px}.ql-container[hidden]{display:none}.ql-container .ql-editor{position:relative;font-size:inherit;line-height:inherit;font-family:inherit;min-height:inherit;width:100%;height:100%;padding:0;overflow-x:hidden;overflow-y:auto;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-overflow-scrolling:touch}.ql-container .ql-editor::-webkit-scrollbar{width:0!important}.ql-container .ql-editor.scroll-disabled{overflow:hidden}.ql-container .ql-image-overlay{display:-webkit-box;display:-webkit-flex;display:flex;position:absolute;box-sizing:border-box;border:1px dashed #ccc;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-user-select:none;user-select:none}.ql-container .ql-image-overlay .ql-image-size{position:absolute;padding:4px 8px;text-align:center;background-color:#fff;color:#888;border:1px solid #ccc;box-sizing:border-box;opacity:.8;right:4px;top:4px;font-size:12px;display:inline-block;width:auto}.ql-container .ql-image-overlay .ql-image-toolbar{position:relative;text-align:center;box-sizing:border-box;background:#000;border-radius:5px;color:#fff;font-size:0;min-height:24px;z-index:100}.ql-container .ql-image-overlay .ql-image-toolbar span{display:inline-block;cursor:pointer;padding:5px;font-size:12px;border-right:1px solid #fff}.ql-container .ql-image-overlay .ql-image-toolbar span:last-child{border-right:0}.ql-container .ql-image-overlay .ql-image-toolbar span.triangle-up{padding:0;position:absolute;top:-12px;left:50%;-webkit-transform:translatex(-50%);transform:translatex(-50%);width:0;height:0;border-width:6px;border-style:solid;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #000 rgba(0,0,0,0)}.ql-container .ql-image-overlay .ql-image-handle{position:absolute;height:12px;width:12px;border-radius:50%;border:1px solid #ccc;box-sizing:border-box;background:#fff}.ql-container img{display:inline-block;max-width:100%}.ql-clipboard p{margin:0;padding:0}.ql-editor{box-sizing:border-box;height:100%;outline:none;overflow-y:auto;tab-size:4;-moz-tab-size:4;text-align:left;white-space:pre-wrap;word-wrap:break-word}.ql-editor>*{cursor:text}.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6,.ql-editor ol,.ql-editor p,.ql-editor pre,.ql-editor ul{margin:0;padding:0;counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol>li,.ql-editor ul>li{list-style-type:none}.ql-editor ul>li:before{content:"\2022"}.ql-editor ul[data-checked=false],.ql-editor ul[data-checked=true]{pointer-events:none}.ql-editor ul[data-checked=false]>li *,.ql-editor ul[data-checked=true]>li *{pointer-events:all}.ql-editor ul[data-checked=false]>li:before,.ql-editor ul[data-checked=true]>li:before{color:#777;cursor:pointer;pointer-events:all}.ql-editor ul[data-checked=true]>li:before{content:"\2611"}.ql-editor ul[data-checked=false]>li:before{content:"\2610"}.ql-editor li:before{display:inline-block;white-space:nowrap;width:2em}.ql-editor ol li{counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;counter-increment:list-0}.ql-editor ol li:before{content:counter(list-0,decimal) ". "}.ql-editor ol li.ql-indent-1{counter-increment:list-1}.ql-editor ol li.ql-indent-1:before{content:counter(list-1,lower-alpha) ". "}.ql-editor ol li.ql-indent-1{counter-reset:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-2{counter-increment:list-2}.ql-editor ol li.ql-indent-2:before{content:counter(list-2,lower-roman) ". "}.ql-editor ol li.ql-indent-2{counter-reset:list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-3{counter-increment:list-3}.ql-editor ol li.ql-indent-3:before{content:counter(list-3,decimal) ". "}.ql-editor ol li.ql-indent-3{counter-reset:list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-4{counter-increment:list-4}.ql-editor ol li.ql-indent-4:before{content:counter(list-4,lower-alpha) ". "}.ql-editor ol li.ql-indent-4{counter-reset:list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-5{counter-increment:list-5}.ql-editor ol li.ql-indent-5:before{content:counter(list-5,lower-roman) ". "}.ql-editor ol li.ql-indent-5{counter-reset:list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-6{counter-increment:list-6}.ql-editor ol li.ql-indent-6:before{content:counter(list-6,decimal) ". "}.ql-editor ol li.ql-indent-6{counter-reset:list-7 list-8 list-9}.ql-editor ol li.ql-indent-7{counter-increment:list-7}.ql-editor ol li.ql-indent-7:before{content:counter(list-7,lower-alpha) ". "}.ql-editor ol li.ql-indent-7{counter-reset:list-8 list-9}.ql-editor ol li.ql-indent-8{counter-increment:list-8}.ql-editor ol li.ql-indent-8:before{content:counter(list-8,lower-roman) ". "}.ql-editor ol li.ql-indent-8{counter-reset:list-9}.ql-editor ol li.ql-indent-9{counter-increment:list-9}.ql-editor ol li.ql-indent-9:before{content:counter(list-9,decimal) ". "}.ql-editor .ql-indent-1:not(.ql-direction-rtl),.ql-editor li.ql-indent-1:not(.ql-direction-rtl){padding-left:2em}.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:2em}.ql-editor .ql-indent-2:not(.ql-direction-rtl),.ql-editor li.ql-indent-2:not(.ql-direction-rtl){padding-left:4em}.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:4em}.ql-editor .ql-indent-3:not(.ql-direction-rtl),.ql-editor li.ql-indent-3:not(.ql-direction-rtl){padding-left:6em}.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:6em}.ql-editor .ql-indent-4:not(.ql-direction-rtl),.ql-editor li.ql-indent-4:not(.ql-direction-rtl){padding-left:8em}.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:8em}.ql-editor .ql-indent-5:not(.ql-direction-rtl),.ql-editor li.ql-indent-5:not(.ql-direction-rtl){padding-left:10em}.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:10em}.ql-editor .ql-indent-6:not(.ql-direction-rtl),.ql-editor li.ql-indent-6:not(.ql-direction-rtl){padding-left:12em}.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:12em}.ql-editor .ql-indent-7:not(.ql-direction-rtl),.ql-editor li.ql-indent-7:not(.ql-direction-rtl){padding-left:14em}.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:14em}.ql-editor .ql-indent-8:not(.ql-direction-rtl),.ql-editor li.ql-indent-8:not(.ql-direction-rtl){padding-left:16em}.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:16em}.ql-editor .ql-indent-9:not(.ql-direction-rtl),.ql-editor li.ql-indent-9:not(.ql-direction-rtl){padding-left:18em}.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right,.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:18em}.ql-editor .ql-direction-rtl{direction:rtl;text-align:inherit}.ql-editor .ql-align-center{text-align:center}.ql-editor .ql-align-justify{text-align:justify}.ql-editor .ql-align-right{text-align:right}.ql-editor.ql-blank:before{color:rgba(0,0,0,.6);content:attr(data-placeholder);font-style:italic;pointer-events:none;position:absolute}.ql-container.ql-disabled .ql-editor ul[data-checked]>li:before{pointer-events:none}.ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}uni-icon{display:inline-block;font-size:0;box-sizing:border-box}uni-icon[hidden]{display:none}uni-icon>i{font:normal normal normal 14px/1 weui}uni-icon>i:before{margin:0;box-sizing:border-box}@font-face{font-weight:400;font-style:normal;font-family:weui;src:url("data:application/octet-stream;base64,AAEAAAALAIAAAwAwR1NVQrD+s+0AAAE4AAAAQk9TLzJAKEx8AAABfAAAAFZjbWFw65cFHQAAAhwAAAJQZ2x5Zp+UEEcAAASUAAAIvGhlYWQUqc7xAAAA4AAAADZoaGVhB/YD+wAAALwAAAAkaG10eEJoAAAAAAHUAAAASGxvY2EUxhJeAAAEbAAAACZtYXhwASEAQwAAARgAAAAgbmFtZeNcHtgAAA1QAAAB5nBvc3T6OoZLAAAPOAAAAOYAAQAAA+gAAABaA+gAAAAAA7MAAQAAAAAAAAAAAAAAAAAAABIAAQAAAAEAAMCU2KdfDzz1AAsD6AAAAADY7EUUAAAAANjsRRQAAAAAA7MD5AAAAAgAAgAAAAAAAAABAAAAEgA3AAUAAAAAAAIAAAAKAAoAAAD/AAAAAAAAAAEAAAAKAB4ALAABREZMVAAIAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAAAAQOwAZAABQAIAnoCvAAAAIwCegK8AAAB4AAxAQIAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA6gHqEQPoAAAAWgPoAAAAAAABAAAAAAAAAAAAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAAAAABQAAAAMAAAAsAAAABAAAAXQAAQAAAAAAbgADAAEAAAAsAAMACgAAAXQABABCAAAABAAEAAEAAOoR//8AAOoB//8AAAABAAQAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAAAEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAANwAAAAAAAAAEQAA6gEAAOoBAAAAAQAA6gIAAOoCAAAAAgAA6gMAAOoDAAAAAwAA6gQAAOoEAAAABAAA6gUAAOoFAAAABQAA6gYAAOoGAAAABgAA6gcAAOoHAAAABwAA6ggAAOoIAAAACAAA6gkAAOoJAAAACQAA6goAAOoKAAAACgAA6gsAAOoLAAAACwAA6gwAAOoMAAAADAAA6g0AAOoNAAAADQAA6g4AAOoOAAAADgAA6g8AAOoPAAAADwAA6hAAAOoQAAAAEAAA6hEAAOoRAAAAEQAAAAAARACKAMQBEgFgAZIB4gH6AioCeAK0AwwDZAOiA9wEEAReAAAAAgAAAAADlQOVABQAKQAAJSInJicmNDc2NzYyFxYXFhQHBgcGJzI3Njc2NCcmJyYiBwYHBhQXFhcWAfRxYV83OTk3X2HiYV83OTk3X2FxZFVTMTIyMVNVyFVTMTIyMVNVUzk3X2HiYV83OTk3X2HiYV83OTIyMVNVyFVTMTIyMVNVyFVTMTIAAAIAAAAAA7MDswAXAC0AAAEiBwYHBhUUFxYXFjMyNzY3NjU0JyYnJhMHBiIvASY2OwERNDY7ATIWFREzMhYB7nZnZDs9PTtkZ3Z8amY7Pj47Zmkhdg4oDnYODRddCwcmBwtdFw0Dsz47Zmp8dmdkOz09O2Rndn1pZjs+/fCaEhKaEhoBFwgLCwj+6RoAAwAAAAADlQOVABQAGAAhAAAlIicmJyY0NzY3NjIXFhcWFAcGBwYDETMRJzI2NCYiBhQWAfRxYV83OTk3X2HiYV83OTk3X2GQPh8RGRkiGRlTOTdfYeJhXzc5OTdfYeJhXzc5AfT+3QEjKhgjGBgjGAAAAAACAAAAAAOxA+QAFwAsAAABBgcGDwERFBcWFxYXNjc2NzY1EScmJyYTAQYvASY/ATYyHwEWNjclNjIfARYB9WlsP3A3Rz5sXmxsXW09SDdwQGuP/tUEBIoDAxIBBQFxAQUCARICBQERBAPjFyASJBL+rI51ZUg/HBw/SGV1jgFUEiQSIP66/tkDA48EBBkCAVYCAQHlAQIQBAAAAAADAAAAAAOxA+QAFwAmAC8AAAEGBwYPAREUFxYXFhc2NzY3NjURJyYnJgczMhYVAxQGKwEiJwM0NhMiJjQ2MhYUBgH1aWtAcDdHPmxebGxdbT1IN3BAa4M0BAYMAwImBQELBh4PFhYeFRUD5BggEiQS/q2PdWRJPh0dPklkdY8BUxIkEiD4BgT+xgIDBQE6BAb+QBUfFRUfFQAAAAACAAAAAAOVA5UAFAAaAAAlIicmJyY0NzY3NjIXFhcWFAcGBwYDJwcXAScB9HFhXzc5OTdfYeJhXzc5OTdfYaJzLJ8BFi1TOTdfYeJhXzc5OTdfYeJhXzc5AUhzLJ8BFSwAAAAAAwAAAAADlQOVABQAKQAvAAAlIicmJyY0NzY3NjIXFhcWFAcGBwYnMjc2NzY0JyYnJiIHBgcGFBcWFxYTNxcBJzcB9HFhXzc5OTdfYeJhXzc5OTdfYXFkVVMxMjIxU1XIVVMxMjIxU1Uz8iT+6p8jUzk3X2HiYV83OTk3X2HiYV83OTIyMVNVyFVTMTIyMVNVyFVTMTIBBPIj/uufJAAAAAEAAAAAA5kDGAAHAAAlATcXARcBBgGF/vg7zgHYOv3vAcsBCTvPAdg7/e4BAAAAAAIAAAAAA5UDlQAFABoAAAE1IxUXNwMiJyYnJjQ3Njc2MhcWFxYUBwYHBgITPrEsvnFhXzc5OTdfYeJhXzc5OTdfYQIO4PqxLP7kOTdfYeJhXzc5OTdfYeJhXzc5AAAAAAMAAAAAA5UDlQAFABoALwAAARcHJzUzAyInJicmNDc2NzYyFxYXFhQHBgcGJzI3Njc2NCcmJyYiBwYHBhQXFhcWAg2iI7EyGXFhXzc5OTdfYeJhXzc5OTdfYXFkVVMxMjIxU1XIVVMxMjIxU1UCCaIksfr9ZTk3X2HiYV83OTk3X2HiYV83OTIyMVNVyFVTMTIyMVNVyFVTMTIAAAMAAAAAA5UDlQAUABgAIQAAJSInJicmNDc2NzYyFxYXFhQHBgcGAxMzEwMyNjQmIg4BFgH0cWFfNzk5N19h4mFfNzk5N19hkQU2BSAQFRUgFQEWUzk3X2HiYV83OTk3X2HiYV83OQKV/sQBPP43Fh8VFR8WAAAAAAQAAAAAA5UDlQAUACkALQA2AAAlIicmJyY0NzY3NjIXFhcWFAcGBwYnMjc2NzY0JyYnJiIHBgcGFBcWFxYTMxEjEyImNDYyFhQGAfRxYV83OTk3X2HiYV83OTk3X2FxZFVTMTIyMVNVyFVTMTIyMVNVSzIyGREZGSIZGVM5N19h4mFfNzk5N19h4mFfNzkyMjFTVchVUzEyMjFTVchVUzEyAcL+3QFNGCMYGCMYAAAAAwAAAAADlQOVABQAKQA1AAAlIicmJyY0NzY3NjIXFhcWFAcGBwYnMjc2NzY0JyYnJiIHBgcGFBcWFxYTFwcnByc3JzcXNxcB9HFhXzc5OTdfYeJhXzc5OTdfYXFkVVMxMjIxU1XIVVMxMjIxU1WHgiOCgiOCgiOCgiNTOTdfYeJhXzc5OTdfYeJhXzc5MjIxU1XIVVMxMjIxU1XIVVMxMgFvgiOCgiOCgiOCgiMAAAACAAAAAANUA0IAGAAlAAABFwcnDgEjIicmJyY0NzY3NjIXFhcWFRQGJzQuASIOARQeATI+AQKoqyOsJ180T0RCJycnJ0JEn0RCJiglDUFvg29BQW+Db0EBYKwjrCAjKCZCRJ9EQicnJydCRE82YZdBb0FBb4NvQUFvAAAAAgAAAAADlQOVAAsAIAAAATcnBycHFwcXNxc3AyInJicmNDc2NzYyFxYXFhQHBgcGAiB9LH19LH19LH19LKlxYV83OTk3X2HiYV83OTk3X2EB9H0sfX0sfX0sfX0s/tw5N19h4mFfNzk5N19h4mFfNzkAAAACAAAAAAOVA5UAFAAcAAAlIicmJyY0NzY3NjIXFhcWFAcGBwYDJzcnBwYfAQH0cWFfNzk5N19h4mFfNzk5N19hHoqKK7UBAbVTOTdfYeJhXzc5OTdfYeJhXzc5ARKPjy27AQG6AAAAAAUAAAAAA1cDbAAJAB0AJwArAC8AAAETHgEzITI2NxMzAw4BIyEiJicDIzU0NjMhMhYdASUyFh0BIzU0NjMHMxMjEzMDIwEaIgETDQEuDRMBIjIiAjAh/tIhMAIiVgwJApoJDP7xCQzQDAkVMhUyiTIVMgLd/cgOEhIOAjj9xSEuLiECOx4IDAwIHo4MCR0dCQz6/okBd/6JAAAAAAAAEADGAAEAAAAAAAEABAAAAAEAAAAAAAIABwAEAAEAAAAAAAMABAALAAEAAAAAAAQABAAPAAEAAAAAAAUACwATAAEAAAAAAAYABAAeAAEAAAAAAAoAKwAiAAEAAAAAAAsAEwBNAAMAAQQJAAEACABgAAMAAQQJAAIADgBoAAMAAQQJAAMACAB2AAMAAQQJAAQACAB+AAMAAQQJAAUAFgCGAAMAAQQJAAYACACcAAMAAQQJAAoAVgCkAAMAAQQJAAsAJgD6d2V1aVJlZ3VsYXJ3ZXVpd2V1aVZlcnNpb24gMS4wd2V1aUdlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC5odHRwOi8vZm9udGVsbG8uY29tAHcAZQB1AGkAUgBlAGcAdQBsAGEAcgB3AGUAdQBpAHcAZQB1AGkAVgBlAHIAcwBpAG8AbgAgADEALgAwAHcAZQB1AGkARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETAAZjaXJjbGUIZG93bmxvYWQEaW5mbwxzYWZlLXN1Y2Nlc3MJc2FmZS13YXJuB3N1Y2Nlc3MOc3VjY2Vzcy1jaXJjbGURc3VjY2Vzcy1uby1jaXJjbGUHd2FpdGluZw53YWl0aW5nLWNpcmNsZQR3YXJuC2luZm8tY2lyY2xlBmNhbmNlbAZzZWFyY2gFY2xlYXIEYmFjawZkZWxldGUAAAAA") format("truetype")}.uni-icon-success:before{content:"\EA06"}.uni-icon-success_circle:before{content:"\EA07"}.uni-icon-success_no_circle:before{content:"\EA08"}.uni-icon-safe_success:before{content:"\EA04"}.uni-icon-safe_warn:before{content:"\EA05"}.uni-icon-info:before{content:"\EA03"}.uni-icon-info_circle:before{content:"\EA0C"}.uni-icon-warn:before{content:"\EA0B"}.uni-icon-waiting:before{content:"\EA09"}.uni-icon-waiting_circle:before{content:"\EA0A"}.uni-icon-circle:before{content:"\EA01"}.uni-icon-cancel:before{content:"\EA0D"}.uni-icon-download:before{content:"\EA02"}.uni-icon-search:before{content:"\EA0E"}.uni-icon-clear:before{content:"\EA0F"}.uni-icon-safe_success,.uni-icon-success,.uni-icon-success_circle,.uni-icon-success_no_circle{color:#007aff}.uni-icon-safe_warn{color:#ffbe00}.uni-icon-info{color:#10aeff}.uni-icon-info_circle{color:#007aff}.uni-icon-warn{color:#f76260}.uni-icon-waiting,.uni-icon-waiting_circle{color:#10aeff}.uni-icon-circle{color:#c9c9c9}.uni-icon-cancel{color:#f43530}.uni-icon-download{color:#007aff}.uni-icon-clear,.uni-icon-search{color:#b2b2b2}uni-image{width:320px;height:240px;display:inline-block;overflow:hidden;position:relative}uni-image[hidden]{display:none}uni-image>div,uni-image>img{width:100%;height:100%}uni-image>img{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;display:block;position:absolute;top:0;left:0;opacity:0}uni-image>.uni-image-will-change{will-change:transform}uni-input{display:block;font-size:16px;line-height:1.4em;height:1.4em;min-height:1.4em;overflow:hidden}uni-input[hidden]{display:none}.uni-input-form,.uni-input-input,.uni-input-placeholder,.uni-input-wrapper{outline:none;border:none;padding:0;margin:0;text-decoration:inherit}.uni-input-form,.uni-input-wrapper{display:-webkit-box;display:-webkit-flex;display:flex;position:relative;width:100%;height:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.uni-input-input,.uni-input-placeholder{width:100%}.uni-input-placeholder{position:absolute;top:auto!important;left:0;color:grey;overflow:hidden;text-overflow:clip;white-space:pre;word-break:keep-all;pointer-events:none;line-height:inherit}.uni-input-input{position:relative;display:block;height:100%;background:none;color:inherit;opacity:1;font:inherit;line-height:inherit;letter-spacing:inherit;text-align:inherit;text-indent:inherit;text-transform:inherit;text-shadow:inherit}.uni-input-input[type=search]::-webkit-search-cancel-button,.uni-input-input[type=search]::-webkit-search-decoration{display:none}.uni-input-input::-webkit-inner-spin-button,.uni-input-input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.uni-input-input[type=number]{-moz-appearance:textfield}.uni-input-input:disabled{-webkit-text-fill-color:currentcolor}.uni-label-pointer{cursor:pointer}uni-movable-area{display:block;position:relative;width:10px;height:10px}uni-movable-area[hidden]{display:none}uni-movable-view{display:inline-block;width:10px;height:10px;top:0;left:0;position:absolute;cursor:grab}uni-movable-view[hidden]{display:none}uni-navigator{height:auto;width:auto;display:block;cursor:pointer}uni-navigator[hidden]{display:none}.navigator-hover{background-color:rgba(0,0,0,.1);opacity:.7}uni-picker-view-column{-webkit-flex:1;-webkit-box-flex:1;flex:1;position:relative;height:100%;overflow:hidden}uni-picker-view-column[hidden]{display:none}.uni-picker-view-group{height:100%;overflow:hidden}.uni-picker-view-mask{transform:translateZ(0);-webkit-transform:translateZ(0)}.uni-picker-view-indicator,.uni-picker-view-mask{position:absolute;left:0;width:100%;z-index:3;pointer-events:none}.uni-picker-view-mask{top:0;height:100%;margin:0 auto;background:-webkit-linear-gradient(top,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6)),-webkit-linear-gradient(bottom,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6));background:linear-gradient(180deg,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6)),linear-gradient(0deg,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6));background-position:top,bottom;background-size:100% 102px;background-repeat:no-repeat}.uni-picker-view-indicator{height:34px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.uni-picker-view-content{position:absolute;top:0;left:0;width:100%;will-change:transform;padding:102px 0;cursor:pointer}.uni-picker-view-content>*{height:34px;overflow:hidden}.uni-picker-view-indicator:before{top:0;border-top:1px solid #e5e5e5;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.uni-picker-view-indicator:after{bottom:0;border-bottom:1px solid #e5e5e5;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.uni-picker-view-indicator:after,.uni-picker-view-indicator:before{content:" ";position:absolute;left:0;right:0;height:1px;color:#e5e5e5}uni-picker-view{display:block}uni-picker-view .uni-picker-view-wrapper{display:-webkit-box;display:-webkit-flex;display:flex;position:relative;overflow:hidden;height:100%}uni-picker-view[hidden]{display:none}uni-progress{display:-webkit-flex;display:-webkit-box;display:flex;-webkit-align-items:center;-webkit-box-align:center;align-items:center}uni-progress[hidden]{display:none}.uni-progress-bar{-webkit-flex:1;-webkit-box-flex:1;flex:1}.uni-progress-inner-bar{width:0;height:100%}.uni-progress-info{margin-top:0;margin-bottom:0;min-width:2em;margin-left:15px;font-size:16px}uni-radio-group[hidden]{display:none}uni-radio{-webkit-tap-highlight-color:transparent;display:inline-block;cursor:pointer}uni-radio[hidden]{display:none}uni-radio[disabled]{cursor:not-allowed}uni-radio .uni-radio-wrapper{display:-webkit-inline-flex;display:-webkit-inline-box;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;align-items:center;vertical-align:middle}uni-radio .uni-radio-input{-webkit-appearance:none;appearance:none;margin-right:5px;outline:0;border:1px solid #d1d1d1;background-color:#fff;border-radius:50%;width:22px;height:22px;position:relative}@media (any-hover:hover){uni-radio:not([disabled]) .uni-radio-input:hover{border-color:var(--HOVER-BD-COLOR,#007aff)!important}}uni-radio .uni-radio-input.uni-radio-input-checked:before{font:normal normal normal 14px/1 uni;content:"\EA08";font-size:18px;position:absolute;top:50%;left:50%;transform:translate(-50%,-48%) scale(.73);-webkit-transform:translate(-50%,-48%) scale(.73)}uni-radio .uni-radio-input.uni-radio-input-disabled{background-color:#e1e1e1;border-color:#d1d1d1}uni-radio .uni-radio-input.uni-radio-input-disabled:before{color:#adadad}uni-radio-group{display:block}@-webkit-keyframes once-show{0%{top:0}}@keyframes once-show{0%{top:0}}uni-resize-sensor,uni-resize-sensor>div{position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden}uni-resize-sensor{display:block;z-index:-1;visibility:hidden;-webkit-animation:once-show 1ms;animation:once-show 1ms}uni-resize-sensor>div>div{position:absolute;left:0;top:0}uni-resize-sensor>div:first-child>div{width:100000px;height:100000px}uni-resize-sensor>div:last-child>div{width:200%;height:200%}uni-scroll-view{display:block;width:100%}uni-scroll-view[hidden]{display:none}.uni-scroll-view{position:relative;-webkit-overflow-scrolling:touch;max-height:inherit}.uni-scroll-view,.uni-scroll-view-content{width:100%;height:100%}.uni-scroll-view-refresher{position:relative;overflow:hidden}.uni-scroll-view-refresh{position:absolute;top:0;left:0;right:0;bottom:0;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;flex-direction:row}.uni-scroll-view-refresh,.uni-scroll-view-refresh-inner{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.uni-scroll-view-refresh-inner{line-height:0;width:40px;height:40px;border-radius:50%;background-color:#fff;box-shadow:0 1px 6px rgba(0,0,0,.117647),0 1px 4px rgba(0,0,0,.117647)}.uni-scroll-view-refresh__spinner{-webkit-transform-origin:center center;transform-origin:center center;-webkit-animation:uni-scroll-view-refresh-rotate 2s linear infinite;animation:uni-scroll-view-refresh-rotate 2s linear infinite}.uni-scroll-view-refresh__spinner>circle{stroke:currentColor;stroke-linecap:round;-webkit-animation:uni-scroll-view-refresh-dash 2s linear infinite;animation:uni-scroll-view-refresh-dash 2s linear infinite}@-webkit-keyframes uni-scroll-view-refresh-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes uni-scroll-view-refresh-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes uni-scroll-view-refresh-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes uni-scroll-view-refresh-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}uni-slider{margin:10px 18px;padding:0;display:block}uni-slider[hidden]{display:none}uni-slider .uni-slider-wrapper{display:-webkit-flex;display:-webkit-box;display:flex;-webkit-align-items:center;-webkit-box-align:center;align-items:center;min-height:16px}uni-slider .uni-slider-tap-area{-webkit-flex:1;-webkit-box-flex:1;flex:1;padding:8px 0}uni-slider .uni-slider-handle-wrapper{position:relative;height:2px;border-radius:5px;background-color:#e9e9e9;cursor:pointer;-webkit-tap-highlight-color:transparent}uni-slider .uni-slider-handle-wrapper,uni-slider .uni-slider-track{-webkit-transition:background-color .3s ease;transition:background-color .3s ease}uni-slider .uni-slider-track{height:100%;border-radius:6px;background-color:#007aff}uni-slider .uni-slider-handle,uni-slider .uni-slider-thumb{position:absolute;left:50%;top:50%;cursor:pointer;border-radius:50%;-webkit-transition:border-color .3s ease;transition:border-color .3s ease}uni-slider .uni-slider-handle{width:28px;height:28px;margin-top:-14px;margin-left:-14px;background-color:rgba(0,0,0,0);z-index:3;cursor:grab}uni-slider .uni-slider-thumb{z-index:2;box-shadow:0 0 4px rgba(0,0,0,.2)}uni-slider .uni-slider-step{position:absolute;width:100%;height:2px;background:rgba(0,0,0,0);z-index:1}uni-slider .uni-slider-value{width:3ch;color:#888;font-size:14px;margin-left:1em}uni-slider .uni-slider-disabled .uni-slider-track{background-color:#ccc}uni-slider .uni-slider-disabled .uni-slider-thumb{background-color:#fff;border-color:#ccc}uni-swiper-item{display:block;overflow:hidden;will-change:transform;position:absolute;width:100%;height:100%;cursor:grab}uni-swiper-item[hidden]{display:none}uni-swiper{display:block;height:150px}uni-swiper[hidden]{display:none}uni-swiper .uni-swiper-wrapper{overflow:hidden;position:relative;width:100%;height:100%;-webkit-transform:translateZ(0);transform:translateZ(0)}uni-swiper .uni-swiper-slides{position:absolute;left:0;top:0;right:0;bottom:0}uni-swiper .uni-swiper-slide-frame{position:absolute;left:0;top:0;width:100%;height:100%;will-change:transform}uni-swiper .uni-swiper-dots{position:absolute;font-size:0}uni-swiper .uni-swiper-dots-horizontal{left:50%;bottom:10px;text-align:center;white-space:nowrap;-webkit-transform:translate(-50%);transform:translate(-50%)}uni-swiper .uni-swiper-dots-horizontal .uni-swiper-dot{margin-right:8px}uni-swiper .uni-swiper-dots-horizontal .uni-swiper-dot:last-child{margin-right:0}uni-swiper .uni-swiper-dots-vertical{right:10px;top:50%;text-align:right;-webkit-transform:translateY(-50%);transform:translateY(-50%)}uni-swiper .uni-swiper-dots-vertical .uni-swiper-dot{display:block;margin-bottom:9px}uni-swiper .uni-swiper-dots-vertical .uni-swiper-dot:last-child{margin-bottom:0}uni-swiper .uni-swiper-dot{display:inline-block;width:8px;height:8px;cursor:pointer;-webkit-transition-property:background-color;transition-property:background-color;-webkit-transition-timing-function:ease;transition-timing-function:ease;background:rgba(0,0,0,.3);border-radius:50%}uni-swiper .uni-swiper-dot-active{background-color:#000}uni-swiper .uni-swiper-navigation{width:26px;height:26px;cursor:pointer;position:absolute;top:50%;margin-top:-13px;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-transition:all .2s;transition:all .2s;border-radius:50%;opacity:1}uni-swiper .uni-swiper-navigation-disabled{opacity:.35;cursor:not-allowed}uni-swiper .uni-swiper-navigation-hide{opacity:0;cursor:auto;pointer-events:none}uni-swiper .uni-swiper-navigation-prev{left:10px}uni-swiper .uni-swiper-navigation-prev i{margin-left:-1px;left:10px}uni-swiper .uni-swiper-navigation-prev.uni-swiper-navigation-vertical{top:18px;left:50%;margin-left:-13px}uni-swiper .uni-swiper-navigation-prev.uni-swiper-navigation-vertical i{-webkit-transform:rotate(90deg);transform:rotate(90deg);margin-left:auto;margin-top:-2px}uni-swiper .uni-swiper-navigation-next{right:10px}uni-swiper .uni-swiper-navigation-next i{-webkit-transform:rotate(180deg);transform:rotate(180deg)}uni-swiper .uni-swiper-navigation-next.uni-swiper-navigation-vertical{top:auto;bottom:5px;left:50%;margin-left:-13px}uni-swiper .uni-swiper-navigation-next.uni-swiper-navigation-vertical i{margin-top:2px;-webkit-transform:rotate(270deg);transform:rotate(270deg)}uni-switch{-webkit-tap-highlight-color:transparent;display:inline-block;cursor:pointer}uni-switch[hidden]{display:none}uni-switch[disabled]{cursor:not-allowed}uni-switch .uni-switch-wrapper{display:-webkit-inline-flex;display:-webkit-inline-box;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;align-items:center;vertical-align:middle}uni-switch .uni-switch-input{-webkit-appearance:none;appearance:none;position:relative;width:52px;height:32px;margin-right:5px;border:1px solid #dfdfdf;outline:0;border-radius:16px;box-sizing:border-box;background-color:#dfdfdf;-webkit-transition:background-color .1s,border .1s;transition:background-color .1s,border .1s}uni-switch[disabled] .uni-switch-input{opacity:.7}uni-switch .uni-switch-input:before{width:50px;background-color:#fdfdfd}uni-switch .uni-switch-input:after,uni-switch .uni-switch-input:before{content:" ";position:absolute;top:0;left:0;height:30px;border-radius:15px;transition:-webkit-transform .3s;-webkit-transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}uni-switch .uni-switch-input:after{width:30px;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.4)}uni-switch .uni-switch-input.uni-switch-input-checked{border-color:#007aff;background-color:#007aff}uni-switch .uni-switch-input.uni-switch-input-checked:before{-webkit-transform:scale(0);transform:scale(0)}uni-switch .uni-switch-input.uni-switch-input-checked:after{-webkit-transform:translateX(20px);transform:translateX(20px)}uni-switch .uni-checkbox-input{margin-right:5px;-webkit-appearance:none;appearance:none;outline:0;border:1px solid #d1d1d1;background-color:#fff;border-radius:3px;width:22px;height:22px;position:relative;color:#007aff}uni-switch:not([disabled]) .uni-checkbox-input:hover{border-color:#007aff}uni-switch .uni-checkbox-input.uni-checkbox-input-checked:before{font:normal normal normal 14px/1 uni;content:"\EA08";color:inherit;font-size:22px;position:absolute;top:50%;left:50%;transform:translate(-50%,-48%) scale(.73);-webkit-transform:translate(-50%,-48%) scale(.73)}uni-switch .uni-checkbox-input.uni-checkbox-input-disabled{background-color:#e1e1e1}uni-switch .uni-checkbox-input.uni-checkbox-input-disabled:before{color:#adadad}uni-text[selectable]{cursor:auto;user-select:text;-webkit-user-select:text}uni-textarea{width:300px;height:150px;display:block;position:relative;font-size:16px;line-height:normal;white-space:pre-wrap;word-break:break-all}uni-textarea[hidden]{display:none}.uni-textarea-compute,.uni-textarea-line,.uni-textarea-placeholder,.uni-textarea-textarea,.uni-textarea-wrapper{outline:none;border:none;padding:0;margin:0;text-decoration:inherit}.uni-textarea-wrapper{display:block;position:relative;width:100%;height:100%;min-height:inherit;overflow-y:hidden}.uni-textarea-compute,.uni-textarea-line,.uni-textarea-placeholder,.uni-textarea-textarea{position:absolute;width:100%;height:100%;left:0;top:0;white-space:inherit;word-break:inherit}.uni-textarea-placeholder{color:grey;overflow:hidden}.uni-textarea-compute,.uni-textarea-line{visibility:hidden;height:auto}.uni-textarea-line{width:1em}.uni-textarea-compute-auto-height{overflow-wrap:break-word}.uni-textarea-textarea{resize:none;background:none;color:inherit;opacity:1;font:inherit;line-height:inherit;letter-spacing:inherit;text-align:inherit;text-indent:inherit;text-transform:inherit;text-shadow:inherit}.uni-textarea-textarea-fix-margin{width:auto;right:0;margin:0 -3px}.uni-textarea-textarea:disabled{-webkit-text-fill-color:currentcolor}uni-ad{display:block;overflow:hidden}uni-ad[hidden]{display:none}uni-cover-image{display:block;line-height:1.2;overflow:hidden;pointer-events:auto}uni-cover-image,uni-cover-image img{height:100%;width:100%}uni-cover-image[hidden]{display:none}uni-cover-image .uni-cover-image{width:100%;height:100%;text-overflow:inherit;overflow:inherit;white-space:nowrap;-webkit-align-items:inherit;-webkit-box-align:inherit;align-items:inherit;-webkit-justify-content:inherit;-webkit-box-pack:inherit;justify-content:inherit;-webkit-flex-direction:inherit;-webkit-box-orient:inherit;-webkit-box-direction:inherit;flex-direction:inherit;font-size:0;display:inherit}uni-cover-view{display:block;line-height:1.2;overflow:hidden;white-space:nowrap;pointer-events:auto}uni-cover-view[hidden]{display:none}uni-cover-view .uni-cover-view{width:100%;height:100%;text-overflow:inherit;overflow:hidden;white-space:inherit;-webkit-align-items:inherit;-webkit-box-align:inherit;align-items:inherit;-webkit-justify-content:inherit;-webkit-box-pack:inherit;justify-content:inherit;-webkit-flex-direction:inherit;-webkit-box-orient:inherit;-webkit-box-direction:inherit;flex-direction:inherit;-webkit-flex-wrap:inherit;flex-wrap:inherit;display:inherit;overflow:inherit}.uni-map-control{position:absolute;width:0;height:0;top:0;left:0;z-index:999}.uni-map-control-icon{position:absolute;max-width:none}uni-map{position:relative;width:300px;height:150px;display:block}uni-map[hidden]{display:none}.amap-marker-label{padding:0;border:none;background-color:rgba(0,0,0,0)}.amap-marker>.amap-icon>img{left:0!important;top:0!important}uni-picker{position:relative;display:block;cursor:pointer}uni-picker[hidden]{display:none}uni-picker[disabled]{cursor:not-allowed}.uni-picker-container{display:none;position:fixed;left:0;right:0;top:0;bottom:0;box-sizing:border-box;z-index:999;font-size:16px}.uni-picker-container .uni-picker-custom *{box-sizing:border-box}.uni-picker-container .uni-picker-custom{position:fixed;left:0;bottom:0;-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:999;width:100%;background-color:#fff;visibility:hidden;-webkit-transition:visibility .3s,-webkit-transform .3s;transition:visibility .3s,-webkit-transform .3s;transition:transform .3s,visibility .3s;transition:transform .3s,visibility .3s,-webkit-transform .3s}.uni-picker-container .uni-picker-custom.uni-picker-toggle{visibility:visible;-webkit-transform:translate(0);transform:translate(0)}.uni-picker-container .uni-picker-content{position:relative;display:block;width:100%;height:238px;background-color:#fff}.uni-picker-container .uni-picker-item{padding:0;height:34px;line-height:34px;text-align:center;color:#000;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;cursor:pointer}.uni-picker-container .uni-picker-header{display:block;position:relative;text-align:center;width:100%;height:45px}.uni-picker-container .uni-picker-header:after{content:"";position:absolute;left:0;bottom:0;right:0;height:1px;clear:both;border-bottom:1px solid #e5e5e5;color:#e5e5e5;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.uni-picker-container .uni-picker-action{display:block;max-width:50%;top:0;height:100%;box-sizing:border-box;padding:0 14px;font-size:17px;line-height:45px;overflow:hidden;cursor:pointer}.uni-picker-container .uni-picker-action.uni-picker-action-cancel{float:left;color:#888}.uni-picker-container .uni-picker-action.uni-picker-action-confirm{float:right;color:#007aff}.uni-picker-container .uni-picker-select{display:none}.uni-picker-system{position:absolute;display:none;display:block;top:0;left:0;width:100%;height:100%;overflow:hidden}.uni-picker-system>input{position:absolute;border:none;height:100%;opacity:0;cursor:pointer}.uni-picker-system>input.firefox{top:0;left:0;width:100%}.uni-picker-system>input.chrome{top:0;left:0;width:2em;font-size:32px;height:32px}@media screen and (min-width:500px) and (min-height:500px){.uni-mask.uni-picker-mask{background:none}.uni-picker-container .uni-picker-custom{width:300px!important;left:50%;right:auto;top:50%;bottom:auto;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);opacity:0;border-radius:5px;-webkit-transition:opacity .3s,visibility .3s;transition:opacity .3s,visibility .3s;box-shadow:0 0 20px 5px rgba(0,0,0,.3)}.uni-picker-container .uni-picker-header{border-radius:5px 5px 0 0}.uni-picker-container .uni-picker-content{-webkit-transform:translate(0);transform:translate(0);overflow:hidden;border-radius:0 0 5px 5px}.uni-picker-container .uni-picker-custom.uni-picker-toggle{opacity:1;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.uni-selector-select .uni-picker-content,.uni-selector-select .uni-picker-header{display:none}.uni-selector-select .uni-picker-select{display:block;max-height:300px;overflow:auto;background-color:#fff;border-radius:5px;padding:6px 0}.uni-selector-select .uni-picker-item{padding:0 10px;color:#555}.uni-selector-select .uni-picker-item:hover{background-color:#f6f6f6}.uni-selector-select .uni-picker-item.selected{color:#007aff}}uni-video{width:300px;height:225px;display:inline-block;line-height:0;overflow:hidden;position:relative}uni-video[hidden]{display:none}.uni-video-container{width:100%;height:100%;background-color:#000;display:inline-block;position:absolute;top:0;left:0;overflow:hidden;object-position:inherit}.uni-video-container.uni-video-type-fullscreen{position:fixed;z-index:999}.uni-video-video{width:100%;height:100%;object-position:inherit}.uni-video-cover{bottom:0;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;align-items:center;background-color:rgba(1,1,1,.5);z-index:1}.uni-video-cover,.uni-video-slots{position:absolute;top:0;left:0;width:100%}.uni-video-slots{height:100%;overflow:hidden;pointer-events:none}.uni-video-cover-play-button{width:40px;height:40px;background-size:50%;background-repeat:no-repeat;background-position:50% 50%;cursor:pointer}.uni-video-cover-duration{color:#fff;font-size:16px;line-height:1;margin-top:10px}.uni-video-bar{height:44px;background-color:rgba(0,0,0,.5);overflow:hidden;position:absolute;bottom:0;right:0;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;padding:0 10px;z-index:0;-webkit-transform:translateZ(0);transform:translateZ(0)}.uni-video-bar.uni-video-bar-full{left:0}.uni-video-controls{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;margin:0 8.5px}.uni-video-control-button{width:13px;height:15px;padding:14.5px 12.5px 14.5px 12.5px;margin-left:-8.5px;box-sizing:content-box;cursor:pointer}.uni-video-control-button:after{content:"";display:block;width:100%;height:100%;background-size:100%;background-position:50% 50%;background-repeat:no-repeat}.uni-video-control-button.uni-video-control-button-play:after,.uni-video-cover-play-button{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAeCAYAAAAy2w7YAAAAAXNSR0IArs4c6QAAAWhJREFUSA1j+P///0cgBoHjQGzCQCsAtgJB/AMy5wCxGNXtQ9iBwvoA5BUCMQvVLEQxHpNzDSjkRhXLMM3GKrIeKKpEkYVYjcUu+AMo3ALE3GRZiN1MvKKPgbIRJFuG10j8koeA0gZEW4jfLIKyf4EqpgOxMEELCRpFnIJ3QGU5QMyM00LizCFa1SWgSkeslhFtBGkKVwGVy6FYSJp+klR/A6quB2JOkIWMIK0oNlOf8xBoZDE9LAI7nYn6HsBq4l96WHQEaLUpAyiOaASeAM2NgvuPBpaACt82IEYtfKls0UagecpwXyAzqGTRdaA57sjmYrAptAjUsCkGYlYMg9EFyLQI1IiZB8Ti6Obh5JNh0QmgHlOcBuKSIMGi50C18UDMiMssvOJEWPQLqKYbiHnxGkRIkoBF24DyaoTMIEoeh0W3geI+RBlArCI0iz4D+RVAzEasfqLVAQ19AcSg5LoYiKWI1kiiQgCMBLnEEcfDSgAAAABJRU5ErkJggg==")}.uni-video-control-button.uni-video-control-button-pause:after{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAgCAYAAAAffCjxAAAAAXNSR0IArs4c6QAAAFlJREFUSA3tksEKACAIQ7X//5zq98wOgQayum8QaGweHhMzG/6OujzKAymn+0LMqivu1XznWmX8/echTIyMyAgTwA72iIwwAexgj8gIE8CO3aMRbDPMaEy5BRGaKcZv8YxRAAAAAElFTkSuQmCC")}.uni-video-current-time,.uni-video-duration{height:14.5px;line-height:14.5px;margin-top:15px;margin-bottom:14.5px;font-size:12px;color:#cbcbcb}.uni-video-progress-container{-webkit-box-flex:2;-webkit-flex-grow:2;flex-grow:2;position:relative}.uni-video-progress{height:2px;margin:21px 12px;background-color:hsla(0,0%,100%,.4);position:relative;cursor:pointer}.uni-video-progress-buffered{position:absolute;left:0;top:0;width:0;height:100%;-webkit-transition:width .1s;transition:width .1s;background-color:hsla(0,0%,100%,.8)}.uni-video-ball{width:16px;height:16px;padding:14px;position:absolute;top:-21px;box-sizing:content-box;left:0;margin-left:-22px}.uni-video-inner{width:100%;height:100%;background-color:#fff;border-radius:50%}.uni-video-danmu-button{white-space:nowrap;line-height:1;padding:2px 10px;border:1px solid #fff;border-radius:5px;font-size:13px;color:#fff;margin:0 8.5px;cursor:pointer}.uni-video-danmu-button.uni-video-danmu-button-active{border-color:#48c23d;color:#48c23d}.uni-video-fullscreen{width:17px;height:17px;padding:8.5px;box-sizing:content-box;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAAAXNSR0IArs4c6QAAAQRJREFUWAnt1d0NwiAQB/CmS7hHX5zFxLF0Ah2hE/lg7BT4PyMJUj6Oyt299BIioZT7ARYG59wLpTXmoXOMGO/QecxtwyWW4o42AupGALkFdX1MkHxE3Q7jIbQPqNthQogpJoZkMLRlsn/gFMQEk4OoY0oQVUwNoobhQFQwgMxUKFkt0C8+Zy61d8SeR5iHWCLOwF/MCb8Tp//ex3QFsE1HlCfKFUX2OijNFMnPKD7k76YcBoL402Zh8B77+MjlXrVvwfglXA32b0MrRgxCE2nBiEJaMOIQLkYFwsGoQWoYVUgJow4pYD4Weq4ayBqfwDYQmnUK0301kITujuawu65/l2B5A4z3Qe+Ut7EBAAAAAElFTkSuQmCC");background-size:50%;background-position:50% 50%;background-repeat:no-repeat;cursor:pointer}.uni-video-fullscreen.uni-video-type-fullscreen{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAABBElEQVRYhcXWwQ3CMAwF0O+qOzAKQzAAl0pMxQQwQhmGKwcERxbgc4lEVdHUbm3zJR8qJemTo6YByS3JO8kjyQbGkHQpkOz4zcmK8YQ0BWDCkOxL+UDKombMYKwfZAkmDGLFhEIsmHCIFpMC0WDSIHOYVEgNkw6pYPIhE5j/QCoYF0g7eEkPYGej+cX82x/l6aIAIOb9CcrajrjFE/IAQGP1IgIRcYVsVs32+vx+nC9nWq6dAZDhOaPHBEDGh54O4w0pa9oxEZBFmCjIBGb6Qh4JMWGiIWpMBkSFyYLMYjIhNUw7N9GQi2aQiLxJHspjV+rl1hFrRp25uV2MRGQRBsAewPUD/HhJVOOuCzwAAAAASUVORK5CYII=")}.uni-video-danmu{position:absolute;top:0;left:0;bottom:0;width:100%;margin-top:14px;margin-bottom:44px;font-size:14px;line-height:14px;overflow:visible}.uni-video-danmu-item{line-height:1;position:absolute;color:#fff;white-space:nowrap;left:100%;-webkit-transform:translatex(0);transform:translatex(0);-webkit-transition-property:left,-webkit-transform;transition-property:left,-webkit-transform;transition-property:left,transform;transition-property:left,transform,-webkit-transform;-webkit-transition-duration:3s;transition-duration:3s;-webkit-transition-timing-function:linear;transition-timing-function:linear}.uni-video-toast{pointer-events:none;position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border-radius:5px;background-color:hsla(0,0%,100%,.8);color:#000;display:none}.uni-video-toast.uni-video-toast-volume{width:100px;height:100px;display:block}.uni-video-toast-volume .uni-video-toast-title{width:100%;font-size:12px;line-height:16px;text-align:center;margin-top:10px;display:block}.uni-video-toast-volume .uni-video-toast-icon{fill:#000;width:50%;height:50%;margin-left:25%;display:block}.uni-video-toast-volume .uni-video-toast-value{width:80px;height:5px;margin-top:5px;margin-left:10px}.uni-video-toast-volume .uni-video-toast-value>.uni-video-toast-value-content{overflow:hidden}.uni-video-toast-volume-grids{width:80px;height:5px}.uni-video-toast-volume-grids-item{float:left;width:7.1px;height:5px;background-color:#000}.uni-video-toast-volume-grids-item:not(:first-child){margin-left:1px}.uni-video-toast.uni-video-toast-progress{display:block;background-color:rgba(0,0,0,.8);color:#fff;font-size:14px;line-height:18px;padding:6px}uni-view{display:block}uni-view[hidden]{display:none}uni-web-view{display:-webkit-box;display:-webkit-flex;display:flex}uni-web-view.uni-webview--fullscreen{position:absolute;left:0;right:0;top:0;bottom:0}body::after{position:fixed;content:'';left:-1000px;top:-1000px;-webkit-animation:shadow-preload .1s;-webkit-animation-delay:3s;animation:shadow-preload .1s;animation-delay:3s}@-webkit-keyframes shadow-preload{0%{background-image:url(https://cdn.dcloud.net.cn/img/shadow-grey.png)}100%{background-image:url(https://cdn.dcloud.net.cn/img/shadow-grey.png)}}@keyframes shadow-preload{0%{background-image:url(https://cdn.dcloud.net.cn/img/shadow-grey.png)}100%{background-image:url(https://cdn.dcloud.net.cn/img/shadow-grey.png)}}
\ No newline at end of file
diff --git a/public/h5/static/js/chunk-vendors.e3b35fa1.js b/public/h5/static/js/chunk-vendors.e3b35fa1.js
new file mode 100644
index 0000000..92366ce
--- /dev/null
+++ b/public/h5/static/js/chunk-vendors.e3b35fa1.js
@@ -0,0 +1,7 @@
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-vendors"],{"00c2":function(t,e,n){"use strict";var r=n("bb80"),i=n("338c"),o=n("f660"),a=n("036b").indexOf,s=n("11bf"),c=r([].push);t.exports=function(t,e){var n,r=o(t),u=0,l=[];for(n in r)!i(s,n)&&i(r,n)&&c(l,n);while(e.length>u)i(r,n=e[u++])&&(~a(l,n)||c(l,n));return l}},"00ca":function(t,e,n){var r=n("56c8"),i=n("da1d"),o=i.concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},"0173":function(t,e,n){"use strict";var r,i,o=n("85c1"),a=n("29d8"),s=o.process,c=o.Deno,u=s&&s.versions||c&&c.version,l=u&&u.v8;l&&(r=l.split("."),i=r[0]>0&&r[0]<4?1:+(r[0]+r[1])),!i&&a&&(r=a.match(/Edge\/(\d+)/),(!r||r[1]>=74)&&(r=a.match(/Chrome\/(\d+)/),r&&(i=+r[1]))),t.exports=i},"01a2":function(t,e,n){"use strict";n("223c"),n("e5d4"),n("0768"),n("d4b5"),n("6994")},"036b":function(t,e,n){"use strict";var r=n("f660"),i=n("e34c"),o=n("1fc1"),a=function(t){return function(e,n,a){var s=r(e),c=o(s);if(0===c)return!t&&-1;var u,l=i(a,c);if(t&&n!==n){while(c>l)if(u=s[l++],u!==u)return!0}else for(;c>l;l++)if((t||l in s)&&s[l]===n)return t||l||0;return!t&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}},"03a0":function(t,e,n){"use strict";var r=n("bb80"),i=n("497b"),o=n("9e70"),a=n("862c"),s=r("".charAt),c=r("".charCodeAt),u=r("".slice),l=function(t){return function(e,n){var r,l,f=o(a(e)),d=i(n),h=f.length;return d<0||d>=h?t?"":void 0:(r=c(f,d),r<55296||r>56319||d+1===h||(l=c(f,d+1))<56320||l>57343?t?s(f,d):r:t?u(f,d,d+2):l-56320+(r-55296<<10)+65536)}};t.exports={codeAt:l(!1),charAt:l(!0)}},"03dc":function(t,e,n){"use strict";var r=n("03a0").charAt;t.exports=function(t,e,n){return e+(n?r(t,e).length:1)}},"0506":function(t,e,n){"use strict";n("5c47");var r=n("8bdb"),i=n("71e9"),o=n("474f"),a=n("e7e3"),s=n("9e70"),c=function(){var t=!1,e=/[ac]/;return e.exec=function(){return t=!0,/./.exec.apply(this,arguments)},!0===e.test("abc")&&t}(),u=/./.test;r({target:"RegExp",proto:!0,forced:!c},{test:function(t){var e=a(this),n=s(t),r=e.exec;if(!o(r))return i(u,e,n);var c=i(r,e,n);return null!==c&&(a(c),!0)}})},"0699":function(t,e,n){var r=n("d191"),i=n("d5ca"),o=n("c646"),a=n("29d5"),s=a("species");t.exports=function(t,e){var n,a=r(t).constructor;return void 0===a||o(n=r(a)[s])?e:i(n)}},"0768":function(t,e,n){"use strict";var r=n("8bdb"),i=n("338c"),o=n("ddd3"),a=n("52df"),s=n("8b3b"),c=n("5b2c"),u=s("symbol-to-string-registry");r({target:"Symbol",stat:!0,forced:!c},{keyFor:function(t){if(!o(t))throw new TypeError(a(t)+" is not a symbol");if(i(u,t))return u[t]}})},"07da":function(t,e,n){"use strict";var r=n("71e9"),i=n("e7e3"),o=n("474f"),a=n("ada5"),s=n("9ad8"),c=TypeError;t.exports=function(t,e){var n=t.exec;if(o(n)){var u=r(n,t,e);return null!==u&&i(u),u}if("RegExp"===a(t))return r(s,t,e);throw new c("RegExp#exec called on incompatible receiver")}},"08eb":function(t,e,n){"use strict";var r=n("8bdb"),i=n("3d77"),o=n("29ba"),a=!o((function(t){Array.from(t)}));r({target:"Array",stat:!0,forced:a},{from:i})},"0931":function(t,e,n){"use strict";var r=n("8c08"),i=r("match");t.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[i]=!1,"/./"[t](e)}catch(r){}}return!1}},"0b5a":function(t,e,n){"use strict";t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},"0c26":function(t,e,n){"use strict";var r=n("8bdb"),i=n("ee98").trim,o=n("8b27");r({target:"String",proto:!0,forced:o("trim")},{trim:function(){return i(this)}})},"0cc2":function(t,e,n){"use strict";var r=n("8bdb"),i=n("71e9"),o=n("a734"),a=n("8945"),s=n("474f"),c=n("4afb"),u=n("c337"),l=n("8c4f"),f=n("181d"),d=n("6aca"),h=n("81a9"),p=n("8c08"),v=n("799d"),g=n("5057"),m=a.PROPER,b=a.CONFIGURABLE,y=g.IteratorPrototype,_=g.BUGGY_SAFARI_ITERATORS,w=p("iterator"),x=function(){return this};t.exports=function(t,e,n,a,p,g,S){c(n,e,a);var k,C,T,O=function(t){if(t===p&&M)return M;if(!_&&t&&t in j)return j[t];switch(t){case"keys":return function(){return new n(this,t)};case"values":return function(){return new n(this,t)};case"entries":return function(){return new n(this,t)}}return function(){return new n(this)}},A=e+" Iterator",E=!1,j=t.prototype,I=j[w]||j["@@iterator"]||p&&j[p],M=!_&&I||O(p),P="Array"===e&&j.entries||I;if(P&&(k=u(P.call(new t)),k!==Object.prototype&&k.next&&(o||u(k)===y||(l?l(k,y):s(k[w])||h(k,w,x)),f(k,A,!0,!0),o&&(v[A]=x))),m&&"values"===p&&I&&"values"!==I.name&&(!o&&b?d(j,"name","values"):(E=!0,M=function(){return i(I,this)})),p)if(C={values:O("values"),keys:g?M:O("keys"),entries:O("entries")},S)for(T in C)(_||E||!(T in j))&&h(j,T,C[T]);else r({target:e,proto:!0,forced:_||E},C);return o&&!S||j[w]===M||h(j,w,M,{name:p}),v[e]=M,C}},"0e36":function(t,e,n){var r=n("d95b"),i=n("d970"),o=n("1e5d"),a=function(t){return function(e,n,a){var s,c=r(e),u=o(c),l=i(a,u);if(t&&n!=n){while(u>l)if(s=c[l++],s!=s)return!0}else for(;u>l;l++)if((t||l in c)&&c[l]===n)return t||l||0;return!t&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}},"0e40":function(t,e,n){"use strict";var r=n("86ca");t.exports=Math.fround||function(t){return r(t,1.1920928955078125e-7,34028234663852886e22,11754943508222875e-54)}},"0ee4":function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(r){"object"===typeof window&&(n=window)}t.exports=n},1001:function(t,e,n){"use strict";var r=n("bb80"),i=n("1099"),o=Math.floor,a=r("".charAt),s=r("".replace),c=r("".slice),u=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,l=/\$([$&'`]|\d{1,2})/g;t.exports=function(t,e,n,r,f,d){var h=n+t.length,p=r.length,v=l;return void 0!==f&&(f=i(f),v=u),s(d,v,(function(i,s){var u;switch(a(s,0)){case"$":return"$";case"&":return t;case"`":return c(e,0,n);case"'":return c(e,h);case"<":u=f[c(s,1,-1)];break;default:var l=+s;if(0===l)return i;if(l>p){var d=o(l/10);return 0===d?i:d<=p?void 0===r[d-1]?a(s,1):r[d-1]+a(s,1):i}u=r[l-1]}return void 0===u?"":u}))}},1099:function(t,e,n){"use strict";var r=n("862c"),i=Object;t.exports=function(t){return i(r(t))}},"114e":function(t,e,n){"use strict";var r=n("85c1"),i=n("181d");i(r.JSON,"JSON",!0)},"11bf":function(t,e,n){"use strict";t.exports={}},1297:function(t,e,n){"use strict";var r=n("bb80");t.exports=r({}.isPrototypeOf)},12973:function(t,e,n){"use strict";var r=n("7ddb"),i=r.aTypedArray,o=r.exportTypedArrayMethod,a=Math.floor;o("reverse",(function(){var t,e=i(this).length,n=a(e/2),r=0;while(r0?i(r(t),9007199254740991):0}},1535:function(t,e,n){var r=n("7aa6"),i=n("fdca"),o=/#|\.prototype\./,a=function(t,e){var n=c[s(t)];return n==l||n!=u&&(i(e)?r(e):!!e)},s=a.normalize=function(t){return String(t).replace(o,".").toLowerCase()},c=a.data={},u=a.NATIVE="N",l=a.POLYFILL="P";t.exports=a},"15d1":function(t,e,n){"use strict";var r=n("8bdb"),i=n("85c1"),o=n("6aa6"),a=n("bb80"),s=n("71e9"),c=n("af9e"),u=n("9e70"),l=n("7f28"),f=n("3b19").c2i,d=/[^\d+/a-z]/i,h=/[\t\n\f\r ]+/g,p=/[=]{1,2}$/,v=o("atob"),g=String.fromCharCode,m=a("".charAt),b=a("".replace),y=a(d.exec),_=!!v&&!c((function(){return"hi"!==v("aGk=")})),w=_&&c((function(){return""!==v(" ")})),x=_&&!c((function(){v("a")})),S=_&&!c((function(){v()})),k=_&&1!==v.length,C=!_||w||x||S||k;r({global:!0,bind:!0,enumerable:!0,forced:C},{atob:function(t){if(l(arguments.length,1),_&&!w&&!x)return s(v,i,t);var e,n,r,a=b(u(t),h,""),c="",S=0,k=0;if(a.length%4===0&&(a=b(a,p,"")),e=a.length,e%4===1||y(d,a))throw new(o("DOMException"))("The string is not correctly encoded","InvalidCharacterError");while(S>(-2*k&6)));return c}})},"175f":function(t,e,n){"use strict";var r=n("6aa6"),i=n("338c"),o=n("6aca"),a=n("1297"),s=n("8c4f"),c=n("3d8a"),u=n("e157"),l=n("dcda"),f=n("e7da"),d=n("5330"),h=n("8cb1"),p=n("ab4a"),v=n("a734");t.exports=function(t,e,n,g){var m=g?2:1,b=t.split("."),y=b[b.length-1],_=r.apply(null,b);if(_){var w=_.prototype;if(!v&&i(w,"cause")&&delete w.cause,!n)return _;var x=r("Error"),S=e((function(t,e){var n=f(g?e:t,void 0),r=g?new _(t):new _;return void 0!==n&&o(r,"message",n),h(r,S,r.stack,2),this&&a(w,this)&&l(r,this,S),arguments.length>m&&d(r,arguments[m]),r}));if(S.prototype=w,"Error"!==y?s?s(S,x):c(S,x,{name:!0}):p&&"stackTraceLimit"in _&&(u(S,_,"stackTraceLimit"),u(S,_,"prepareStackTrace")),c(S,_),!v)try{w.name!==y&&o(w,"name",y),w.constructor=S}catch(k){}return S}}},"177f":function(t,e,n){var r=n("85e5"),i=n("d10a");t.exports=function(t){if("Function"===r(t))return i(t)}},"17fc":function(t,e,n){"use strict";var r=n("ac5f"),i=n("8ae2"),o=n("1c06"),a=n("8c08"),s=a("species"),c=Array;t.exports=function(t){var e;return r(t)&&(e=t.constructor,i(e)&&(e===c||r(e.prototype))?e=void 0:o(e)&&(e=e[s],null===e&&(e=void 0))),void 0===e?c:e}},"181d":function(t,e,n){"use strict";var r=n("d6b1").f,i=n("338c"),o=n("8c08"),a=o("toStringTag");t.exports=function(t,e,n){t&&!n&&(t=t.prototype),t&&!i(t,a)&&r(t,a,{configurable:!0,value:e})}},"18e4":function(t,e,n){"use strict";n("6a54"),Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){var e=(0,i.default)(t,"string");return"symbol"===(0,r.default)(e)?e:String(e)};var r=o(n("fcf3")),i=o(n("fab0"));function o(t){return t&&t.__esModule?t:{default:t}}},"18f7":function(t,e,n){"use strict";var r=n("03a0").charAt,i=n("9e70"),o=n("235c"),a=n("0cc2"),s=n("97ed"),c=o.set,u=o.getterFor("String Iterator");a(String,"String",(function(t){c(this,{type:"String Iterator",string:i(t),index:0})}),(function(){var t,e=u(this),n=e.string,i=e.index;return i>=n.length?s(void 0,!0):(t=r(n,i),e.index+=t.length,s(t,!1))}))},1954:function(t,e,n){"use strict";var r=n("85c1"),i=n("9f9e"),o=n("7ddb"),a=n("af9e"),s=n("37ad"),c=r.Int8Array,u=o.aTypedArray,l=o.exportTypedArrayMethod,f=[].toLocaleString,d=!!c&&a((function(){f.call(new c(1))})),h=a((function(){return[1,2].toLocaleString()!==new c([1,2]).toLocaleString()}))||!a((function(){c.prototype.toLocaleString.call([1,2])}));l("toLocaleString",(function(){return i(f,d?s(u(this)):u(this),s(arguments))}),h)},1959:function(t,e,n){"use strict";var r=n("508d"),i=n("d7b8"),o=n("f0b5"),a=n("f439"),s=n("a5c6"),c=n("7c26"),u=n("59f8");r({target:"Promise",stat:!0,forced:u},{all:function(t){var e=this,n=a.f(e),r=n.resolve,u=n.reject,l=s((function(){var n=o(e.resolve),a=[],s=0,l=1;c(t,(function(t){var o=s++,c=!1;l++,i(n,e,t).then((function(t){c||(c=!0,a[o]=t,--l||r(a))}),u)})),--l||r(a)}));return l.error&&u(l.value),n.promise}})},"198e":function(t,e,n){"use strict";var r=n("7ddb"),i=n("323c"),o=n("af9e"),a=n("37ad"),s=r.aTypedArray,c=r.exportTypedArrayMethod,u=o((function(){new Int8Array(1).slice()}));c("slice",(function(t,e){var n=a(s(this),t,e),r=i(this),o=0,c=n.length,u=new r(c);while(c>o)u[o]=n[o++];return u}),u)},"1aad":function(t,e,n){"use strict";var r=Math.ceil,i=Math.floor;t.exports=Math.trunc||function(t){var e=+t;return(e>0?i:r)(e)}},"1ad7":function(t,e,n){var r=n("7aa6");t.exports=!r((function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")}))},"1ae3":function(t,e,n){var r=n("fdca"),i=n("c2d7"),o=i.all;t.exports=i.IS_HTMLDDA?function(t){return"object"==typeof t?null!==t:r(t)||t===o}:function(t){return"object"==typeof t?null!==t:r(t)}},"1b8e":function(t,e,n){var r=n("720d"),i=n("218d"),o=n("c646"),a=n("d459"),s=n("29d5"),c=s("iterator");t.exports=function(t){if(!o(t))return i(t,c)||i(t,"@@iterator")||a[r(t)]}},"1c06":function(t,e,n){"use strict";var r=n("474f");t.exports=function(t){return"object"==typeof t?null!==t:r(t)}},"1c16":function(t,e,n){"use strict";var r=n("3c7a"),i=RangeError;t.exports=function(t,e){var n=r(t);if(n%e)throw new i("Wrong offset");return n}},"1cb5":function(t,e,n){"use strict";var r=n("8c08"),i=n("e37c"),o=n("d6b1").f,a=r("unscopables"),s=Array.prototype;void 0===s[a]&&o(s,a,{configurable:!0,value:i(null)}),t.exports=function(t){s[a][t]=!0}},"1cf1":function(t,e,n){"use strict";var r=n("7ddb").exportTypedArrayMethod,i=n("af9e"),o=n("85c1"),a=n("bb80"),s=o.Uint8Array,c=s&&s.prototype||{},u=[].toString,l=a([].join);i((function(){u.call({})}))&&(u=function(){return l(this)});var f=c.toString!==u;r("toString",u,f)},"1d18":function(t,e,n){"use strict";n("6a54"),Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var r,i,o,a,s=[],c=!0,u=!1;try{if(o=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=o.call(n)).done)&&(s.push(r.value),s.length!==e);c=!0);}catch(l){u=!0,i=l}finally{try{if(!c&&null!=n["return"]&&(a=n["return"](),Object(a)!==a))return}finally{if(u)throw i}}return s}},n("01a2"),n("e39c"),n("bf0f"),n("844d"),n("18f7"),n("de6c"),n("aa9c")},"1d57":function(t,e,n){"use strict";var r=n("af9e");t.exports=!r((function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}))},"1ded":function(t,e,n){"use strict";var r=n("ab4a"),i=n("71e9"),o=n("346b"),a=n("0b5a"),s=n("f660"),c=n("f9ed"),u=n("338c"),l=n("2ba7"),f=Object.getOwnPropertyDescriptor;e.f=r?f:function(t,e){if(t=s(t),e=c(e),l)try{return f(t,e)}catch(n){}if(u(t,e))return a(!i(o.f,t,e),t[e])}},"1e4f":function(t,e,n){var r=n("29d5"),i=n("d459"),o=r("iterator"),a=Array.prototype;t.exports=function(t){return void 0!==t&&(i.Array===t||a[o]===t)}},"1e5d":function(t,e,n){var r=n("1501");t.exports=function(t){return r(t.length)}},"1eb8":function(t,e,n){"use strict";t.exports=function(t){return null===t||void 0===t}},"1faa":function(t,e,n){var r=n("7aa6");t.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},"1fc1":function(t,e,n){"use strict";var r=n("c435");t.exports=function(t){return r(t.length)}},"218d":function(t,e,n){var r=n("f0b5"),i=n("c646");t.exports=function(t,e){var n=t[e];return i(n)?void 0:r(n)}},"223c":function(t,e,n){"use strict";var r=n("8bdb"),i=n("85c1"),o=n("71e9"),a=n("bb80"),s=n("a734"),c=n("ab4a"),u=n("af71"),l=n("af9e"),f=n("338c"),d=n("1297"),h=n("e7e3"),p=n("f660"),v=n("f9ed"),g=n("9e70"),m=n("0b5a"),b=n("e37c"),y=n("ff4f"),_=n("80bb"),w=n("8449"),x=n("7d3c"),S=n("1ded"),k=n("d6b1"),C=n("a3fb"),T=n("346b"),O=n("81a9"),A=n("e4ca"),E=n("8b3b"),j=n("b223"),I=n("11bf"),M=n("d7b4"),P=n("8c08"),$=n("9917"),L=n("f259"),R=n("effb"),N=n("181d"),D=n("235c"),B=n("4d16").forEach,F=j("hidden"),z=D.set,W=D.getterFor("Symbol"),H=Object["prototype"],U=i.Symbol,q=U&&U["prototype"],V=i.RangeError,Y=i.TypeError,X=i.QObject,G=S.f,Q=k.f,K=w.f,J=T.f,Z=a([].push),tt=E("symbols"),et=E("op-symbols"),nt=E("wks"),rt=!X||!X["prototype"]||!X["prototype"].findChild,it=function(t,e,n){var r=G(H,e);r&&delete H[e],Q(t,e,n),r&&t!==H&&Q(H,e,r)},ot=c&&l((function(){return 7!==b(Q({},"a",{get:function(){return Q(this,"a",{value:7}).a}})).a}))?it:Q,at=function(t,e){var n=tt[t]=b(q);return z(n,{type:"Symbol",tag:t,description:e}),c||(n.description=e),n},st=function(t,e,n){t===H&&st(et,e,n),h(t);var r=v(e);return h(n),f(tt,r)?(n.enumerable?(f(t,F)&&t[F][r]&&(t[F][r]=!1),n=b(n,{enumerable:m(0,!1)})):(f(t,F)||Q(t,F,m(1,b(null))),t[F][r]=!0),ot(t,r,n)):Q(t,r,n)},ct=function(t,e){h(t);var n=p(e),r=y(n).concat(dt(n));return B(r,(function(e){c&&!o(ut,n,e)||st(t,e,n[e])})),t},ut=function(t){var e=v(t),n=o(J,this,e);return!(this===H&&f(tt,e)&&!f(et,e))&&(!(n||!f(this,e)||!f(tt,e)||f(this,F)&&this[F][e])||n)},lt=function(t,e){var n=p(t),r=v(e);if(n!==H||!f(tt,r)||f(et,r)){var i=G(n,r);return!i||!f(tt,r)||f(n,F)&&n[F][r]||(i.enumerable=!0),i}},ft=function(t){var e=K(p(t)),n=[];return B(e,(function(t){f(tt,t)||f(I,t)||Z(n,t)})),n},dt=function(t){var e=t===H,n=K(e?et:p(t)),r=[];return B(n,(function(t){!f(tt,t)||e&&!f(H,t)||Z(r,tt[t])})),r};u||(U=function(){if(d(q,this))throw new Y("Symbol is not a constructor");var t=arguments.length&&void 0!==arguments[0]?g(arguments[0]):void 0,e=M(t),n=function(t){var r=void 0===this?i:this;r===H&&o(n,et,t),f(r,F)&&f(r[F],e)&&(r[F][e]=!1);var a=m(1,t);try{ot(r,e,a)}catch(s){if(!(s instanceof V))throw s;it(r,e,a)}};return c&&rt&&ot(H,e,{configurable:!0,set:n}),at(e,t)},q=U["prototype"],O(q,"toString",(function(){return W(this).tag})),O(U,"withoutSetter",(function(t){return at(M(t),t)})),T.f=ut,k.f=st,C.f=ct,S.f=lt,_.f=w.f=ft,x.f=dt,$.f=function(t){return at(P(t),t)},c&&(A(q,"description",{configurable:!0,get:function(){return W(this).description}}),s||O(H,"propertyIsEnumerable",ut,{unsafe:!0}))),r({global:!0,constructor:!0,wrap:!0,forced:!u,sham:!u},{Symbol:U}),B(y(nt),(function(t){L(t)})),r({target:"Symbol",stat:!0,forced:!u},{useSetter:function(){rt=!0},useSimple:function(){rt=!1}}),r({target:"Object",stat:!0,forced:!u,sham:!c},{create:function(t,e){return void 0===e?b(t):ct(b(t),e)},defineProperty:st,defineProperties:ct,getOwnPropertyDescriptor:lt}),r({target:"Object",stat:!0,forced:!u},{getOwnPropertyNames:ft}),R(),N(U,"Symbol"),I[F]=!0},"22b6":function(t,e,n){"use strict";var r=n("8bdb"),i=n("ea07").values;r({target:"Object",stat:!0},{values:function(t){return i(t)}})},"235c":function(t,e,n){"use strict";var r,i,o,a=n("a20b"),s=n("85c1"),c=n("1c06"),u=n("6aca"),l=n("338c"),f=n("9b55"),d=n("b223"),h=n("11bf"),p=s.TypeError,v=s.WeakMap;if(a||f.state){var g=f.state||(f.state=new v);g.get=g.get,g.has=g.has,g.set=g.set,r=function(t,e){if(g.has(t))throw new p("Object already initialized");return e.facade=t,g.set(t,e),e},i=function(t){return g.get(t)||{}},o=function(t){return g.has(t)}}else{var m=d("state");h[m]=!0,r=function(t,e){if(l(t,m))throw new p("Object already initialized");return e.facade=t,u(t,m,e),e},i=function(t){return l(t,m)?t[m]:{}},o=function(t){return l(t,m)}}t.exports={set:r,get:i,has:o,enforce:function(t){return o(t)?i(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!c(e)||(n=i(e)).type!==t)throw new p("Incompatible receiver, "+t+" required");return n}}}},2378:function(t,e,n){"use strict";var r=n("7ddb"),i=n("4d16").find,o=r.aTypedArray,a=r.exportTypedArrayMethod;a("find",(function(t){return i(o(this),t,arguments.length>1?arguments[1]:void 0)}))},"23f4":function(t,e,n){"use strict";var r=n("ab4a"),i=n("85c1"),o=n("bb80"),a=n("8466"),s=n("dcda"),c=n("6aca"),u=n("e37c"),l=n("80bb").f,f=n("1297"),d=n("e629"),h=n("9e70"),p=n("52ac"),v=n("edb7"),g=n("e157"),m=n("81a9"),b=n("af9e"),y=n("338c"),_=n("235c").enforce,w=n("437f"),x=n("8c08"),S=n("b0a8"),k=n("cca9"),C=x("match"),T=i.RegExp,O=T.prototype,A=i.SyntaxError,E=o(O.exec),j=o("".charAt),I=o("".replace),M=o("".indexOf),P=o("".slice),$=/^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/,L=/a/g,R=/a/g,N=new T(L)!==L,D=v.MISSED_STICKY,B=v.UNSUPPORTED_Y,F=r&&(!N||D||S||k||b((function(){return R[C]=!1,T(L)!==L||T(R)===R||"/a/i"!==String(T(L,"i"))})));if(a("RegExp",F)){for(var z=function(t,e){var n,r,i,o,a,l,v=f(O,this),g=d(t),m=void 0===e,b=[],w=t;if(!v&&g&&m&&t.constructor===z)return t;if((g||f(O,t))&&(t=t.source,m&&(e=p(w))),t=void 0===t?"":h(t),e=void 0===e?"":h(e),w=t,S&&"dotAll"in L&&(r=!!e&&M(e,"s")>-1,r&&(e=I(e,/s/g,""))),n=e,D&&"sticky"in L&&(i=!!e&&M(e,"y")>-1,i&&B&&(e=I(e,/y/g,""))),k&&(o=function(t){for(var e,n=t.length,r=0,i="",o=[],a=u(null),s=!1,c=!1,l=0,f="";r<=n;r++){if(e=j(t,r),"\\"===e)e+=j(t,++r);else if("]"===e)s=!1;else if(!s)switch(!0){case"["===e:s=!0;break;case"("===e:E($,P(t,r+1))&&(r+=2,c=!0),i+=e,l++;continue;case">"===e&&c:if(""===f||y(a,f))throw new A("Invalid capture group name");a[f]=!0,o[o.length]=[f,l],c=!1,f="";continue}c?f+=e:i+=e}return[i,o]}(t),t=o[0],b=o[1]),a=s(T(t,e),v?this:O,z),(r||i||b.length)&&(l=_(a),r&&(l.dotAll=!0,l.raw=z(function(t){for(var e,n=t.length,r=0,i="",o=!1;r<=n;r++)e=j(t,r),"\\"!==e?o||"."!==e?("["===e?o=!0:"]"===e&&(o=!1),i+=e):i+="[\\s\\S]":i+=e+j(t,++r);return i}(t),n)),i&&(l.sticky=!0),b.length&&(l.groups=b)),t!==w)try{c(a,"source",""===w?"(?:)":w)}catch(x){}return a},W=l(T),H=0;W.length>H;)g(z,T,W[H++]);O.constructor=z,z.prototype=O,m(i,"RegExp",z,{constructor:!0})}w("RegExp")},2425:function(t,e,n){"use strict";n("e7d8")},"266a":function(t,e,n){"use strict";var r=n("af9e"),i=n("8c08"),o=n("ab4a"),a=n("a734"),s=i("iterator");t.exports=!r((function(){var t=new URL("b?a=1&b=2&c=3","http://a"),e=t.searchParams,n=new URLSearchParams("a=1&a=2&b=3"),r="";return t.pathname="c%20d",e.forEach((function(t,n){e["delete"]("b"),r+=n+t})),n["delete"]("a",2),n["delete"]("b",void 0),a&&(!t.toJSON||!n.has("a",1)||n.has("a",2)||!n.has("a",void 0)||n.has("b"))||!e.size&&(a||!o)||!e.sort||"http://a/c%20d?a=1&c=3"!==t.href||"3"!==e.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!e[s]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==r||"x"!==new URL("http://x",void 0).host}))},2779:function(t,e,n){"use strict";var r=n("508d"),i=n("c86b"),o=n("3a4b"),a=n("3c5d"),s=n("83b3").CONSTRUCTOR,c=n("7478"),u=i("Promise"),l=o&&!s;r({target:"Promise",stat:!0,forced:o||s},{resolve:function(t){return c(l&&this===u?a:this,t)}})},2797:function(t,e,n){"use strict";var r=n("85c1"),i=n("3de7"),o=n("fb6b"),a=n("f3f2"),s=n("6aca"),c=function(t){if(t&&t.forEach!==a)try{s(t,"forEach",a)}catch(e){t.forEach=a}};for(var u in i)i[u]&&c(r[u]&&r[u].prototype);c(o)},"27cc":function(t,e,n){var r=n("fdca"),i=n("415b"),o=n("472b"),a=n("a030");t.exports=function(t,e,n,s){s||(s={});var c=s.enumerable,u=void 0!==s.name?s.name:e;if(r(n)&&o(n,u,s),s.global)c?t[e]=n:a(e,n);else{try{s.unsafe?t[e]&&(c=!0):delete t[e]}catch(l){}c?t[e]=n:i.f(t,e,{value:n,enumerable:!1,configurable:!s.nonConfigurable,writable:!s.nonWritable})}return t}},"29ba":function(t,e,n){"use strict";var r=n("8c08"),i=r("iterator"),o=!1;try{var a=0,s={next:function(){return{done:!!a++}},return:function(){o=!0}};s[i]=function(){return this},Array.from(s,(function(){throw 2}))}catch(c){}t.exports=function(t,e){try{if(!e&&!o)return!1}catch(c){return!1}var n=!1;try{var r={};r[i]=function(){return{next:function(){return{done:n=!0}}}},t(r)}catch(c){}return n}},"29d5":function(t,e,n){var r=n("8394"),i=n("c62a"),o=n("77cd"),a=n("8fa1"),s=n("d9a7"),c=n("344f"),u=i("wks"),l=r.Symbol,f=l&&l["for"],d=c?l:l&&l.withoutSetter||a;t.exports=function(t){if(!o(u,t)||!s&&"string"!=typeof u[t]){var e="Symbol."+t;s&&o(l,t)?u[t]=l[t]:u[t]=c&&f?f(e):d(e)}return u[t]}},"29d8":function(t,e,n){"use strict";t.exports="undefined"!=typeof navigator&&String(navigator.userAgent)||""},"2b04":function(t,e,n){"use strict";var r=n("af9e");t.exports=function(t,e){var n=[][t];return!!n&&r((function(){n.call(null,e||function(){return 1},1)}))}},"2ba7":function(t,e,n){"use strict";var r=n("ab4a"),i=n("af9e"),o=n("3f57");t.exports=!r&&!i((function(){return 7!==Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a}))},"2c10":function(t,e,n){"use strict";var r=n("71e9"),i=n("7edc"),o=n("e7e3"),a=n("1eb8"),s=n("c435"),c=n("9e70"),u=n("862c"),l=n("60bc"),f=n("03dc"),d=n("07da");i("match",(function(t,e,n){return[function(e){var n=u(this),i=a(e)?void 0:l(e,t);return i?r(i,e,n):new RegExp(e)[t](c(n))},function(t){var r=o(this),i=c(t),a=n(e,r,i);if(a.done)return a.value;if(!r.global)return d(r,i);var u=r.unicode;r.lastIndex=0;var l,h=[],p=0;while(null!==(l=d(r,i))){var v=c(l[0]);h[p]=v,""===v&&(r.lastIndex=f(i,s(r.lastIndex),u)),p++}return 0===p?null:h}]}))},"2c57":function(t,e,n){"use strict";var r=n("85c1"),i=n("af9e"),o=n("bb80"),a=n("9e70"),s=n("ee98").trim,c=n("f072"),u=r.parseInt,l=r.Symbol,f=l&&l.iterator,d=/^[+-]?0x/i,h=o(d.exec),p=8!==u(c+"08")||22!==u(c+"0x16")||f&&!i((function(){u(Object(f))}));t.exports=p?function(t,e){var n=s(a(t));return u(n,e>>>0||(h(d,n)?16:10))}:u},"2c6b":function(t,e){t.exports=function(){throw new Error("define cannot be used indirect")}},"2e66":function(t,e,n){var r=n("fdca"),i=String,o=TypeError;t.exports=function(t){if("object"==typeof t||r(t))return t;throw o("Can't set "+i(t)+" as a prototype")}},"323c":function(t,e,n){"use strict";var r=n("7ddb"),i=n("5dfa"),o=r.aTypedArrayConstructor,a=r.getTypedArrayConstructor;t.exports=function(t){return o(i(t,a(t)))}},3242:function(t,e,n){"use strict";var r=n("17fc");t.exports=function(t,e){return new(r(t))(0===e?0:e)}},"330d":function(t,e,n){var r=n("1ad7"),i=Function.prototype,o=i.apply,a=i.call;t.exports="object"==typeof Reflect&&Reflect.apply||(r?a.bind(o):function(){return a.apply(o,arguments)})},"335a":function(t,e,n){var r=n("d10a"),i=n("d191"),o=n("2e66");t.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var t,e=!1,n={};try{t=r(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set),t(n,[]),e=n instanceof Array}catch(a){}return function(n,r){return i(n),o(r),e?t(n,r):n.__proto__=r,n}}():void 0)},"338c":function(t,e,n){"use strict";var r=n("bb80"),i=n("1099"),o=r({}.hasOwnProperty);t.exports=Object.hasOwn||function(t,e){return o(i(t),e)}},"344f":function(t,e,n){var r=n("d9a7");t.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},3462:function(t,e){var n=function(){this.head=null,this.tail=null};n.prototype={add:function(t){var e={item:t,next:null};this.head?this.tail.next=e:this.head=e,this.tail=e},get:function(){var t=this.head;if(t)return this.head=t.next,this.tail===t&&(this.tail=null),t.item}},t.exports=n},"346b":function(t,e,n){"use strict";var r={}.propertyIsEnumerable,i=Object.getOwnPropertyDescriptor,o=i&&!r.call({1:2},1);e.f=o?function(t){var e=i(this,t);return!!e&&e.enumerable}:r},3487:function(t,e,n){"use strict";var r=n("508d"),i=n("d7b8"),o=n("3a4b"),a=n("9360"),s=n("fdca"),c=n("9320"),u=n("8a29"),l=n("335a"),f=n("ebe8"),d=n("d1a8"),h=n("27cc"),p=n("29d5"),v=n("d459"),g=n("4c77"),m=a.PROPER,b=a.CONFIGURABLE,y=g.IteratorPrototype,_=g.BUGGY_SAFARI_ITERATORS,w=p("iterator"),x=function(){return this};t.exports=function(t,e,n,a,p,g,S){c(n,e,a);var k,C,T,O=function(t){if(t===p&&M)return M;if(!_&&t in j)return j[t];switch(t){case"keys":return function(){return new n(this,t)};case"values":return function(){return new n(this,t)};case"entries":return function(){return new n(this,t)}}return function(){return new n(this)}},A=e+" Iterator",E=!1,j=t.prototype,I=j[w]||j["@@iterator"]||p&&j[p],M=!_&&I||O(p),P="Array"==e&&j.entries||I;if(P&&(k=u(P.call(new t)),k!==Object.prototype&&k.next&&(o||u(k)===y||(l?l(k,y):s(k[w])||h(k,w,x)),f(k,A,!0,!0),o&&(v[A]=x))),m&&"values"==p&&I&&"values"!==I.name&&(!o&&b?d(j,"name","values"):(E=!0,M=function(){return i(I,this)})),p)if(C={values:O("values"),keys:g?M:O("keys"),entries:O("entries")},S)for(T in C)(_||E||!(T in j))&&h(j,T,C[T]);else r({target:e,proto:!0,forced:_||E},C);return o&&!S||j[w]===M||h(j,w,M,{name:p}),v[e]=M,C}},3671:function(t,e,n){var r=n("c86b");t.exports=r("document","documentElement")},3794:function(t,e,n){"use strict";var r=n("6aa6");t.exports=r("document","documentElement")},"37ad":function(t,e,n){"use strict";var r=n("bb80");t.exports=r([].slice)},3840:function(t,e,n){"use strict";var r,i,o,a=n("508d"),s=n("3a4b"),c=n("e8b8"),u=n("8394"),l=n("d7b8"),f=n("27cc"),d=n("335a"),h=n("ebe8"),p=n("f82c"),v=n("f0b5"),g=n("fdca"),m=n("1ae3"),b=n("9b8f"),y=n("0699"),_=n("fd1d").set,w=n("fac1"),x=n("4743"),S=n("a5c6"),k=n("3462"),C=n("7b05"),T=n("3c5d"),O=n("83b3"),A=n("f439"),E=O.CONSTRUCTOR,j=O.REJECTION_EVENT,I=O.SUBCLASSING,M=C.getterFor("Promise"),P=C.set,$=T&&T.prototype,L=T,R=$,N=u.TypeError,D=u.document,B=u.process,F=A.f,z=F,W=!!(D&&D.createEvent&&u.dispatchEvent),H=function(t){var e;return!(!m(t)||!g(e=t.then))&&e},U=function(t,e){var n,r,i,o=e.value,a=1==e.state,s=a?t.ok:t.fail,c=t.resolve,u=t.reject,f=t.domain;try{s?(a||(2===e.rejection&&G(e),e.rejection=1),!0===s?n=o:(f&&f.enter(),n=s(o),f&&(f.exit(),i=!0)),n===t.promise?u(N("Promise-chain cycle")):(r=H(n))?l(r,n,c,u):c(n)):u(o)}catch(d){f&&!i&&f.exit(),u(d)}},q=function(t,e){t.notified||(t.notified=!0,w((function(){var n,r=t.reactions;while(n=r.get())U(n,t);t.notified=!1,e&&!t.rejection&&Y(t)})))},V=function(t,e,n){var r,i;W?(r=D.createEvent("Event"),r.promise=e,r.reason=n,r.initEvent(t,!1,!0),u.dispatchEvent(r)):r={promise:e,reason:n},!j&&(i=u["on"+t])?i(r):"unhandledrejection"===t&&x("Unhandled promise rejection",n)},Y=function(t){l(_,u,(function(){var e,n=t.facade,r=t.value,i=X(t);if(i&&(e=S((function(){c?B.emit("unhandledRejection",r,n):V("unhandledrejection",n,r)})),t.rejection=c||X(t)?2:1,e.error))throw e.value}))},X=function(t){return 1!==t.rejection&&!t.parent},G=function(t){l(_,u,(function(){var e=t.facade;c?B.emit("rejectionHandled",e):V("rejectionhandled",e,t.value)}))},Q=function(t,e,n){return function(r){t(e,r,n)}},K=function(t,e,n){t.done||(t.done=!0,n&&(t=n),t.value=e,t.state=2,q(t,!0))},J=function(t,e,n){if(!t.done){t.done=!0,n&&(t=n);try{if(t.facade===e)throw N("Promise can't be resolved itself");var r=H(e);r?w((function(){var n={done:!1};try{l(r,e,Q(J,n,t),Q(K,n,t))}catch(i){K(n,i,t)}})):(t.value=e,t.state=1,q(t,!1))}catch(i){K({done:!1},i,t)}}};if(E&&(L=function(t){b(this,R),v(t),l(r,this);var e=M(this);try{t(Q(J,e),Q(K,e))}catch(n){K(e,n)}},R=L.prototype,r=function(t){P(this,{type:"Promise",done:!1,notified:!1,parent:!1,reactions:new k,rejection:!1,state:0,value:void 0})},r.prototype=f(R,"then",(function(t,e){var n=M(this),r=F(y(this,L));return n.parent=!0,r.ok=!g(t)||t,r.fail=g(e)&&e,r.domain=c?B.domain:void 0,0==n.state?n.reactions.add(r):w((function(){U(r,n)})),r.promise})),i=function(){var t=new r,e=M(t);this.promise=t,this.resolve=Q(J,e),this.reject=Q(K,e)},A.f=F=function(t){return t===L||void 0===t?new i(t):z(t)},!s&&g(T)&&$!==Object.prototype)){o=$.then,I||f($,"then",(function(t,e){var n=this;return new L((function(t,e){l(o,n,t,e)})).then(t,e)}),{unsafe:!0});try{delete $.constructor}catch(Z){}d&&d($,R)}a({global:!0,constructor:!0,wrap:!0,forced:E},{Promise:L}),h(L,"Promise",!1,!0),p("Promise")},3872:function(t,e,n){var r=n("c62a"),i=n("8fa1"),o=r("keys");t.exports=function(t){return o[t]||(o[t]=i(t))}},"3872e":function(t,e,n){"use strict";var r=n("f259");r("asyncIterator")},"39d8":function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t,e,n){e=(0,r.default)(e),e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n;return t},n("6a54");var r=function(t){return t&&t.__esModule?t:{default:t}}(n("18e4"))},"3a4b":function(t,e){t.exports=!1},"3b19":function(t,e,n){"use strict";var r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",i=r+"+/",o=r+"-_",a=function(t){for(var e={},n=0;n<64;n++)e[t.charAt(n)]=n;return e};t.exports={i2c:i,c2i:a(i),i2cUrl:o,c2iUrl:a(o)}},"3b78":function(t,e,n){var r=n("8394"),i=n("1ae3"),o=r.document,a=i(o)&&i(o.createElement);t.exports=function(t){return a?o.createElement(t):{}}},"3c5d":function(t,e,n){var r=n("8394");t.exports=r.Promise},"3c7a":function(t,e,n){"use strict";var r=n("497b"),i=RangeError;t.exports=function(t){var e=r(t);if(e<0)throw new i("The argument can't be less than 0");return e}},"3d77":function(t,e,n){"use strict";var r=n("ae5c"),i=n("71e9"),o=n("1099"),a=n("7f5f"),s=n("81a7"),c=n("8ae2"),u=n("1fc1"),l=n("85f7"),f=n("d67c"),d=n("5112"),h=Array;t.exports=function(t){var e=o(t),n=c(this),p=arguments.length,v=p>1?arguments[1]:void 0,g=void 0!==v;g&&(v=r(v,p>2?arguments[2]:void 0));var m,b,y,_,w,x,S=d(e),k=0;if(!S||this===h&&s(S))for(m=u(e),b=n?new this(m):h(m);m>k;k++)x=g?v(e[k],k):e[k],l(b,k,x);else for(b=n?new this:[],_=f(e,S),w=_.next;!(y=i(w,_)).done;k++)x=g?a(_,v,[y.value,k],!0):y.value,l(b,k,x);return b.length=k,b}},"3d8a":function(t,e,n){"use strict";var r=n("338c"),i=n("6ac9"),o=n("1ded"),a=n("d6b1");t.exports=function(t,e,n){for(var s=i(e),c=a.f,u=o.f,l=0;l=e.length?(t.target=void 0,u(void 0,!0)):u("keys"==n?r:"values"==n?e[r]:[r,e[r]],!1)}),"values");var p=o.Arguments=o.Array;if(i("keys"),i("values"),i("entries"),!l&&f&&"values"!==p.name)try{s(p,"name",{value:"values"})}catch(v){}},"3de7":function(t,e,n){"use strict";t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},"3efd":function(t,e,n){"use strict";var r=n("8bdb"),i=n("1099"),o=n("1fc1"),a=n("b2b1"),s=n("a830"),c=n("41c7"),u=1!==[].unshift(0),l=u||!function(){try{Object.defineProperty([],"length",{writable:!1}).unshift()}catch(t){return t instanceof TypeError}}();r({target:"Array",proto:!0,arity:1,forced:l},{unshift:function(t){var e=i(this),n=o(e),r=arguments.length;if(r){c(n+r);var u=n;while(u--){var l=u+r;u in e?e[l]=e[u]:s(e,l)}for(var f=0;f3)){if(p)return!0;if(g)return g<603;var t,e,n,r,i="";for(t=65;t<76;t++){switch(e=String.fromCharCode(t),t){case 66:case 69:case 70:case 72:n=3;break;case 68:case 71:n=4;break;default:n=2}for(r=0;r<47;r++)m.push({k:e+r,v:n})}for(m.sort((function(t,e){return e.v-t.v})),r=0;ru(n)?1:-1}}(t)),n=s(i),r=0;while(r9007199254740991)throw r("Maximum allowed index exceeded");return t}},4379:function(t,e,n){"use strict";var r=n("ac38"),i=n("323c");t.exports=function(t,e){return r(i(t),e)}},"437f":function(t,e,n){"use strict";var r=n("6aa6"),i=n("e4ca"),o=n("8c08"),a=n("ab4a"),s=o("species");t.exports=function(t){var e=r(t);a&&e&&!e[s]&&i(e,s,{configurable:!0,get:function(){return this}})}},"45da":function(t,e,n){"use strict";var r=n("8bdb"),i=n("71e9"),o=n("bb80"),a=n("862c"),s=n("474f"),c=n("1eb8"),u=n("e629"),l=n("9e70"),f=n("60bc"),d=n("52ac"),h=n("1001"),p=n("8c08"),v=n("a734"),g=p("replace"),m=TypeError,b=o("".indexOf),y=o("".replace),_=o("".slice),w=Math.max;r({target:"String",proto:!0},{replaceAll:function(t,e){var n,r,o,p,x,S,k,C,T,O=a(this),A=0,E=0,j="";if(!c(t)){if(n=u(t),n&&(r=l(a(d(t))),!~b(r,"g")))throw new m("`.replaceAll` does not allow non-global regexes");if(o=f(t,g),o)return i(o,t,O,e);if(v&&n)return y(l(O),t,e)}p=l(O),x=l(t),S=s(e),S||(e=l(e)),k=x.length,C=w(1,k),A=b(p,x);while(-1!==A)T=S?l(e(x,A,p)):h(x,p,A,[],void 0,e),j+=_(p,E,A)+T,E=A+k,A=A+C>p.length?-1:b(p,x,A+C);return E1?arguments[1]:void 0)}}),a("includes")},"471d":function(t,e,n){"use strict";var r=n("e7e3");t.exports=function(){var t=r(this),e="";return t.hasIndices&&(e+="d"),t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.dotAll&&(e+="s"),t.unicode&&(e+="u"),t.unicodeSets&&(e+="v"),t.sticky&&(e+="y"),e}},"472b":function(t,e,n){var r=n("7aa6"),i=n("fdca"),o=n("77cd"),a=n("1faa"),s=n("9360").CONFIGURABLE,c=n("97cf"),u=n("7b05"),l=u.enforce,f=u.get,d=Object.defineProperty,h=a&&!r((function(){return 8!==d((function(){}),"length",{value:8}).length})),p=String(String).split("String"),v=t.exports=function(t,e,n){"Symbol("===String(e).slice(0,7)&&(e="["+String(e).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),n&&n.getter&&(e="get "+e),n&&n.setter&&(e="set "+e),(!o(t,"name")||s&&t.name!==e)&&(a?d(t,"name",{value:e,configurable:!0}):t.name=e),h&&n&&o(n,"arity")&&t.length!==n.arity&&d(t,"length",{value:n.arity});try{n&&o(n,"constructor")&&n.constructor?a&&d(t,"prototype",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch(i){}var r=l(t);return o(r,"source")||(r.source=p.join("string"==typeof e?e:"")),t};Function.prototype.toString=v((function(){return i(this)&&f(this).source||c(this)}),"toString")},"473f":function(t,e,n){"use strict";var r=n("8bdb"),i=n("9a51").left,o=n("2b04"),a=n("0173"),s=n("db06"),c=!s&&a>79&&a<83,u=c||!o("reduce");r({target:"Array",proto:!0,forced:u},{reduce:function(t){var e=arguments.length;return i(this,t,e,e>1?arguments[1]:void 0)}})},4743:function(t,e,n){var r=n("8394");t.exports=function(t,e){var n=r.console;n&&n.error&&(1==arguments.length?n.error(t):n.error(t,e))}},"474f":function(t,e,n){"use strict";var r="object"==typeof document&&document.all;t.exports="undefined"==typeof r&&void 0!==r?function(t){return"function"==typeof t||t===r}:function(t){return"function"==typeof t}},4825:function(t,e,n){var r=n("d10a"),i=n("7aa6"),o=n("fdca"),a=n("720d"),s=n("c86b"),c=n("97cf"),u=function(){},l=[],f=s("Reflect","construct"),d=/^\s*(?:class|function)\b/,h=r(d.exec),p=!d.exec(u),v=function(t){if(!o(t))return!1;try{return f(u,l,t),!0}catch(e){return!1}},g=function(t){if(!o(t))return!1;switch(a(t)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return p||!!h(d,c(t))}catch(e){return!0}};g.sham=!0,t.exports=!f||i((function(){var t;return v(v.call)||!v(Object)||!v((function(){t=!0}))||t}))?g:v},"497b":function(t,e,n){"use strict";var r=n("1aad");t.exports=function(t){var e=+t;return e!==e||0===e?0:r(e)}},"49a5":function(t,e,n){var r=n("8394"),i=n("a030"),o=r["__core-js_shared__"]||i("__core-js_shared__",{});t.exports=o},"49fc":function(t,e,n){"use strict";var r=n("bb80"),i=/[^\0-\u007E]/,o=/[.\u3002\uFF0E\uFF61]/g,a="Overflow: input needs wider integers to process",s=RangeError,c=r(o.exec),u=Math.floor,l=String.fromCharCode,f=r("".charCodeAt),d=r([].join),h=r([].push),p=r("".replace),v=r("".split),g=r("".toLowerCase),m=function(t){return t+22+75*(t<26)},b=function(t,e,n){var r=0;t=n?u(t/700):t>>1,t+=u(t/e);while(t>455)t=u(t/35),r+=36;return u(r+36*t/(t+38))},y=function(t){var e=[];t=function(t){var e=[],n=0,r=t.length;while(n=55296&&i<=56319&&n=o&&ru((2147483647-c)/_))throw new s(a);for(c+=(y-o)*_,o=y,n=0;n2147483647)throw new s(a);if(r===o){var w=c,x=36;while(1){var S=x<=p?1:x>=p+26?26:x-p;if(wk;k++)if((h||k in w)&&(b=w[k],y=S(b,k,_),t))if(e)T[k]=y;else if(y)switch(t){case 3:return!0;case 5:return b;case 6:return k;case 2:u(T,b)}else switch(t){case 4:return!1;case 7:u(T,b)}return f?-1:i||l?l:T}};t.exports={forEach:l(0),map:l(1),filter:l(2),some:l(3),every:l(4),find:l(5),findIndex:l(6),filterReject:l(7)}},"4d8f":function(t,e,n){"use strict";var r=n("7ddb"),i=n("1fc1"),o=n("497b"),a=r.aTypedArray,s=r.exportTypedArrayMethod;s("at",(function(t){var e=a(this),n=i(e),r=o(t),s=r>=0?r:n+r;return s<0||s>=n?void 0:e[s]}))},"4db2":function(t,e,n){"use strict";var r=n("8bdb"),i=n("9f69"),o=n("af9e"),a=n("efa5"),s=n("e7e3"),c=n("e34c"),u=n("c435"),l=n("5dfa"),f=a.ArrayBuffer,d=a.DataView,h=d.prototype,p=i(f.prototype.slice),v=i(h.getUint8),g=i(h.setUint8),m=o((function(){return!new f(2).slice(1,void 0).byteLength}));r({target:"ArrayBuffer",proto:!0,unsafe:!0,forced:m},{slice:function(t,e){if(p&&void 0===e)return p(s(this),t);var n=s(this).byteLength,r=c(t,n),i=c(void 0===e?n:e,n),o=new(l(this,f))(u(i-r)),a=new d(this),h=new d(o),m=0;while(r1&&(s=c(s,o(arguments[1]))),s<0&&(s=n+s);s>=0;s--)if(s in e&&e[s]===t)return s||0;return-1}:u},"52ac":function(t,e,n){"use strict";var r=n("71e9"),i=n("338c"),o=n("1297"),a=n("471d"),s=RegExp.prototype;t.exports=function(t){var e=t.flags;return void 0!==e||"flags"in s||i(t,"flags")||!o(s,t)?e:r(a,t)}},"52df":function(t,e,n){"use strict";var r=String;t.exports=function(t){try{return r(t)}catch(e){return"Object"}}},5330:function(t,e,n){"use strict";var r=n("1c06"),i=n("6aca");t.exports=function(t,e){r(e)&&"cause"in e&&i(t,"cause",e.cause)}},5628:function(t,e,n){var r=n("1faa"),i=n("632d"),o=n("415b"),a=n("d191"),s=n("d95b"),c=n("9105");e.f=r&&!i?Object.defineProperties:function(t,e){a(t);var n,r=s(e),i=c(e),u=i.length,l=0;while(u>l)o.f(t,n=i[l++],r[n]);return t}},"569b":function(t,e,n){"use strict";var r=n("8c08"),i=r("toStringTag"),o={};o[i]="z",t.exports="[object z]"===String(o)},"56c8":function(t,e,n){var r=n("d10a"),i=n("77cd"),o=n("d95b"),a=n("0e36").indexOf,s=n("bd8a"),c=r([].push);t.exports=function(t,e){var n,r=o(t),u=0,l=[];for(n in r)!i(s,n)&&i(r,n)&&c(l,n);while(e.length>u)i(r,n=e[u++])&&(~a(l,n)||c(l,n));return l}},"57e2":function(t,e){var n=Math.ceil,r=Math.floor;t.exports=Math.trunc||function(t){var e=+t;return(e>0?r:n)(e)}},"59f8":function(t,e,n){var r=n("3c5d"),i=n("d47e"),o=n("83b3").CONSTRUCTOR;t.exports=o||!i((function(t){r.all(t).then(void 0,(function(){}))}))},"5a56":function(t,e,n){"use strict";var r=n("8bdb"),i=n("85c1"),o=n("6aa6"),a=n("0b5a"),s=n("d6b1").f,c=n("338c"),u=n("b720"),l=n("dcda"),f=n("e7da"),d=n("e6a2"),h=n("7e87"),p=n("ab4a"),v=n("a734"),g=o("Error"),m=o("DOMException"),b=function(){u(this,y);var t=arguments.length,e=f(t<1?void 0:arguments[0]),n=f(t<2?void 0:arguments[1],"Error"),r=new m(e,n),i=new g(e);return i.name="DOMException",s(r,"stack",a(1,h(i.stack,1))),l(r,this,b),r},y=b.prototype=m.prototype,_="stack"in new g("DOMException"),w="stack"in new m(1,2),x=m&&p&&Object.getOwnPropertyDescriptor(i,"DOMException"),S=!!x&&!(x.writable&&x.configurable),k=_&&!S&&!w;r({global:!0,constructor:!0,forced:v||k},{DOMException:k?b:m});var C=o("DOMException"),T=C.prototype;if(T.constructor!==C)for(var O in v||s(T,"constructor",a(1,C)),d)if(c(d,O)){var A=d[O],E=A.s;c(C,E)||s(C,E,a(6,A.c))}},"5ac7":function(t,e,n){"use strict";var r=n("8bdb"),i=n("bb80"),o=n("b6a1"),a=n("862c"),s=n("9e70"),c=n("0931"),u=i("".indexOf);r({target:"String",proto:!0,forced:!c("includes")},{includes:function(t){return!!~u(s(a(this)),s(o(t)),arguments.length>1?arguments[1]:void 0)}})},"5b2c":function(t,e,n){"use strict";var r=n("af71");t.exports=r&&!!Symbol["for"]&&!!Symbol.keyFor},"5c47":function(t,e,n){"use strict";var r=n("8bdb"),i=n("9ad8");r({target:"RegExp",proto:!0,forced:/./.exec!==i},{exec:i})},"5d56":function(t,e,n){"use strict";var r=n("bb80"),i=n("ac5f"),o=n("474f"),a=n("ada5"),s=n("9e70"),c=r([].push);t.exports=function(t){if(o(t))return t;if(i(t)){for(var e=t.length,n=[],r=0;r1?arguments[1]:void 0,(function(t,e){return new(o(t))(e)}))}))},"5ee2":function(t,e,n){"use strict";var r=n("8ae2"),i=n("52df"),o=TypeError;t.exports=function(t){if(r(t))return t;throw new o(i(t)+" is not a constructor")}},"5ef2":function(t,e,n){"use strict";var r=n("8bdb"),i=n("9f69"),o=n("036b").indexOf,a=n("2b04"),s=i([].indexOf),c=!!s&&1/s([1],1,-0)<0,u=c||!a("indexOf");r({target:"Array",proto:!0,forced:u},{indexOf:function(t){var e=arguments.length>1?arguments[1]:void 0;return c?s(this,t,e)||0:o(this,t,e)}})},"5fd9":function(t,e,n){"use strict";var r=n("29d8"),i=r.match(/firefox\/(\d+)/i);t.exports=!!i&&+i[1]},"60bc":function(t,e,n){"use strict";var r=n("7992"),i=n("1eb8");t.exports=function(t,e){var n=t[e];return i(n)?void 0:r(n)}},6158:function(t,e,n){"use strict";var r=n("ae5c"),i=n("7e41"),o=n("1099"),a=n("1fc1"),s=function(t){var e=1===t;return function(n,s,c){var u,l,f=o(n),d=i(f),h=a(d),p=r(s,c);while(h-- >0)if(u=d[h],l=p(u,h,f),l)switch(t){case 0:return u;case 1:return h}return e?-1:void 0}};t.exports={findLast:s(0),findLastIndex:s(1)}},"61a3":function(t,e,n){"use strict";var r=n("508d"),i=n("d7b8"),o=n("f439"),a=n("83b3").CONSTRUCTOR;r({target:"Promise",stat:!0,forced:a},{reject:function(t){var e=o.f(this);return i(e.reject,void 0,t),e.promise}})},6242:function(t,e,n){"use strict";n("6a54"),Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){if(Array.isArray(t))return t}},"62f7":function(t,e,n){"use strict";t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},6314:function(t,e,n){var r=n("c86b"),i=n("d10a"),o=n("00ca"),a=n("ed01"),s=n("d191"),c=i([].concat);t.exports=r("Reflect","ownKeys")||function(t){var e=o.f(s(t)),n=a.f;return n?c(e,n(t)):e}},"632d":function(t,e,n){var r=n("1faa"),i=n("7aa6");t.exports=r&&i((function(){return 42!=Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},"63b1":function(t,e,n){"use strict";var r=n("85c1"),i=n("9f69"),o=n("af9e"),a=n("7992"),s=n("b643"),c=n("7ddb"),u=n("5fd9"),l=n("8d24"),f=n("0173"),d=n("a700"),h=c.aTypedArray,p=c.exportTypedArrayMethod,v=r.Uint16Array,g=v&&i(v.prototype.sort),m=!!g&&!(o((function(){g(new v(2),null)}))&&o((function(){g(new v(2),{})}))),b=!!g&&!o((function(){if(f)return f<74;if(u)return u<67;if(l)return!0;if(d)return d<602;var t,e,n=new v(516),r=Array(516);for(t=0;t<516;t++)e=t%4,n[t]=515-t,r[t]=t-2*e+3;for(g(n,(function(t,e){return(t/4|0)-(e/4|0)})),t=0;t<516;t++)if(n[t]!==r[t])return!0}));p("sort",(function(t){return void 0!==t&&a(t),b?g(this,t):s(h(this),function(t){return function(e,n){return void 0!==t?+t(e,n)||0:n!==n?-1:e!==e?1:0===e&&0===n?1/e>0&&1/n<0?1:-1:e>n}}(t))}),!b||m)},"641a":function(t,e,n){"use strict";var r=n("7ddb"),i=n("4d16").findIndex,o=r.aTypedArray,a=r.exportTypedArrayMethod;a("findIndex",(function(t){return i(o(this),t,arguments.length>1?arguments[1]:void 0)}))},"64aa":function(t,e,n){"use strict";var r=n("8bdb"),i=n("a734"),o=n("ab4a"),a=n("85c1"),s=n("a1d4"),c=n("bb80"),u=n("8466"),l=n("338c"),f=n("dcda"),d=n("1297"),h=n("ddd3"),p=n("c215"),v=n("af9e"),g=n("80bb").f,m=n("1ded").f,b=n("d6b1").f,y=n("83fa"),_=n("ee98").trim,w=a["Number"],x=s["Number"],S=w.prototype,k=a.TypeError,C=c("".slice),T=c("".charCodeAt),O=function(t){var e=p(t,"number");return"bigint"==typeof e?e:A(e)},A=function(t){var e,n,r,i,o,a,s,c,u=p(t,"number");if(h(u))throw new k("Cannot convert a Symbol value to a number");if("string"==typeof u&&u.length>2)if(u=_(u),e=T(u,0),43===e||45===e){if(n=T(u,2),88===n||120===n)return NaN}else if(48===e){switch(T(u,1)){case 66:case 98:r=2,i=49;break;case 79:case 111:r=8,i=55;break;default:return+u}for(o=C(u,2),a=o.length,s=0;si)return NaN;return parseInt(o,r)}return+u},E=u("Number",!w(" 0o1")||!w("0b1")||w("+0x1")),j=function(t){return d(S,t)&&v((function(){y(t)}))},I=function(t){var e=arguments.length<1?0:w(O(t));return j(this)?f(Object(e),this,I):e};I.prototype=S,E&&!i&&(S.constructor=I),r({global:!0,constructor:!0,wrap:!0,forced:E},{Number:I});var M=function(t,e){for(var n,r=o?g(e):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,isFinite,isInteger,isNaN,isSafeInteger,parseFloat,parseInt,fromString,range".split(","),i=0;r.length>i;i++)l(e,n=r[i])&&!l(t,n)&&b(t,n,m(e,n))};i&&x&&M(s["Number"],x),(E||i)&&M(s["Number"],w)},"64e0":function(t,e,n){"use strict";var r=n("7ddb"),i=n("6158").findLast,o=r.aTypedArray,a=r.exportTypedArrayMethod;a("findLast",(function(t){return i(o(this),t,arguments.length>1?arguments[1]:void 0)}))},"668a":function(t,e,n){"use strict";var r=n("7ddb"),i=n("4d16").every,o=r.aTypedArray,a=r.exportTypedArrayMethod;a("every",(function(t){return i(o(this),t,arguments.length>1?arguments[1]:void 0)}))},"66b1":function(t,e,n){var r=n("57e2");t.exports=function(t){var e=+t;return e!==e||0===e?0:r(e)}},"66ee":function(t,e,n){var r=n("7aa6");t.exports=!r((function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}))},"68fd":function(t,e,n){"use strict";var r=n("8e02");t.exports=function(t){var e=r(t);return"BigInt64Array"===e||"BigUint64Array"===e}},6994:function(t,e,n){"use strict";var r=n("8bdb"),i=n("af71"),o=n("af9e"),a=n("7d3c"),s=n("1099"),c=!i||o((function(){a.f(1)}));r({target:"Object",stat:!0,forced:c},{getOwnPropertySymbols:function(t){var e=a.f;return e?e(s(t)):[]}})},"6a2b":function(t,e,n){"use strict";var r=n("1099"),i=n("e34c"),o=n("1fc1"),a=n("a830"),s=Math.min;t.exports=[].copyWithin||function(t,e){var n=r(this),c=o(n),u=i(t,c),l=i(e,c),f=arguments.length>2?arguments[2]:void 0,d=s((void 0===f?c:i(f,c))-l,c-u),h=1;l0)l in n?n[u]=n[l]:a(n,u),u+=h,l+=h;return n}},"6a50":function(t,e,n){"use strict";var r=n("8bdb"),i=n("85c1"),o=n("71e9"),a=n("ab4a"),s=n("9839"),c=n("7ddb"),u=n("efa5"),l=n("b720"),f=n("0b5a"),d=n("6aca"),h=n("f221"),p=n("c435"),v=n("cc36"),g=n("1c16"),m=n("7df8"),b=n("f9ed"),y=n("338c"),_=n("8e02"),w=n("1c06"),x=n("ddd3"),S=n("e37c"),k=n("1297"),C=n("8c4f"),T=n("80bb").f,O=n("b32e"),A=n("4d16").forEach,E=n("437f"),j=n("e4ca"),I=n("d6b1"),M=n("1ded"),P=n("ac38"),$=n("235c"),L=n("dcda"),R=$.get,N=$.set,D=$.enforce,B=I.f,F=M.f,z=i.RangeError,W=u.ArrayBuffer,H=W.prototype,U=u.DataView,q=c.NATIVE_ARRAY_BUFFER_VIEWS,V=c.TYPED_ARRAY_TAG,Y=c.TypedArray,X=c.TypedArrayPrototype,G=c.isTypedArray,Q=function(t,e){j(t,e,{configurable:!0,get:function(){return R(this)[e]}})},K=function(t){var e;return k(H,t)||"ArrayBuffer"===(e=_(t))||"SharedArrayBuffer"===e},J=function(t,e){return G(t)&&!x(e)&&e in t&&h(+e)&&e>=0},Z=function(t,e){return e=b(e),J(t,e)?f(2,t[e]):F(t,e)},tt=function(t,e,n){return e=b(e),!(J(t,e)&&w(n)&&y(n,"value"))||y(n,"get")||y(n,"set")||n.configurable||y(n,"writable")&&!n.writable||y(n,"enumerable")&&!n.enumerable?B(t,e,n):(t[e]=n.value,t)};a?(q||(M.f=Z,I.f=tt,Q(X,"buffer"),Q(X,"byteOffset"),Q(X,"byteLength"),Q(X,"length")),r({target:"Object",stat:!0,forced:!q},{getOwnPropertyDescriptor:Z,defineProperty:tt}),t.exports=function(t,e,n){var a=t.match(/\d+/)[0]/8,c=t+(n?"Clamped":"")+"Array",u="get"+t,f="set"+t,h=i[c],b=h,y=b&&b.prototype,_={},x=function(t,e){B(t,e,{get:function(){return function(t,e){var n=R(t);return n.view[u](e*a+n.byteOffset,!0)}(this,e)},set:function(t){return function(t,e,r){var i=R(t);i.view[f](e*a+i.byteOffset,n?m(r):r,!0)}(this,e,t)},enumerable:!0})};q?s&&(b=e((function(t,e,n,r){return l(t,y),L(function(){return w(e)?K(e)?void 0!==r?new h(e,g(n,a),r):void 0!==n?new h(e,g(n,a)):new h(e):G(e)?P(b,e):o(O,b,e):new h(v(e))}(),t,b)})),C&&C(b,Y),A(T(h),(function(t){t in b||d(b,t,h[t])})),b.prototype=y):(b=e((function(t,e,n,r){l(t,y);var i,s,c,u=0,f=0;if(w(e)){if(!K(e))return G(e)?P(b,e):o(O,b,e);i=e,f=g(n,a);var d=e.byteLength;if(void 0===r){if(d%a)throw new z("Wrong length");if(s=d-f,s<0)throw new z("Wrong length")}else if(s=p(r)*a,s+f>d)throw new z("Wrong length");c=s/a}else c=v(e),s=c*a,i=new W(s);N(t,{buffer:i,byteOffset:f,byteLength:s,length:c,view:new U(i)});while(u?@[\\\]^|]/,Z=/[\0\t\n\r #/:<>?@[\\\]^|]/,tt=/^[\u0000-\u0020]+/,et=/(^|[^\u0000-\u0020])[\u0000-\u0020]+$/,nt=/[\t\n\r]/g,rt=function(t){var e,n,r,i;if("number"==typeof t){for(e=[],n=0;n<4;n++)U(e,t%256),t=I(t/256);return L(e,".")}if("object"==typeof t){for(e="",r=function(t){for(var e=null,n=1,r=null,i=0,o=0;o<8;o++)0!==t[o]?(i>n&&(e=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(e=r,n=i),e}(t),n=0;n<8;n++)i&&0===t[n]||(i&&(i=!1),r===n?(e+=n?":":"::",i=!0):(e+=R(t[n],16),n<7&&(e+=":")));return"["+e+"]"}return t},it={},ot=p({},it,{" ":1,'"':1,"<":1,">":1,"`":1}),at=p({},ot,{"#":1,"?":1,"{":1,"}":1}),st=p({},at,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),ct=function(t,e){var n=m(t,0);return n>32&&n<127&&!h(e,t)?t:encodeURIComponent(t)},ut={ftp:21,file:null,http:80,https:443,ws:80,wss:443},lt=function(t,e){var n;return 2===t.length&&$(q,P(t,0))&&(":"===(n=P(t,1))||!e&&"|"===n)},ft=function(t){var e;return t.length>1&<(W(t,0,2))&&(2===t.length||"/"===(e=P(t,2))||"\\"===e||"?"===e||"#"===e)},dt=function(t){return"."===t||"%2e"===H(t)},ht=function(t){return t=H(t),".."===t||"%2e."===t||".%2e"===t||"%2e%2e"===t},pt={},vt={},gt={},mt={},bt={},yt={},_t={},wt={},xt={},St={},kt={},Ct={},Tt={},Ot={},At={},Et={},jt={},It={},Mt={},Pt={},$t={},Lt=function(t,e,n){var r,i,o,a=y(t);if(e){if(i=this.parse(a),i)throw new E(i);this.searchParams=null}else{if(void 0!==n&&(r=new Lt(n,!0)),i=this.parse(a,null,r),i)throw new E(i);o=O(new T),o.bindURL(this),this.searchParams=o}};Lt.prototype={type:"URL",parse:function(t,e,n){var i,o,a,s,c=this,u=e||pt,l=0,f="",d=!1,p=!1,m=!1;t=y(t),e||(c.scheme="",c.username="",c.password="",c.host=null,c.port=null,c.path=[],c.query=null,c.fragment=null,c.cannotBeABaseURL=!1,t=B(t,tt,""),t=B(t,et,"$1")),t=B(t,nt,""),i=v(t);while(l<=i.length){switch(o=i[l],u){case pt:if(!o||!$(q,o)){if(e)return"Invalid scheme";u=gt;continue}f+=H(o),u=vt;break;case vt:if(o&&($(V,o)||"+"===o||"-"===o||"."===o))f+=H(o);else{if(":"!==o){if(e)return"Invalid scheme";f="",u=gt,l=0;continue}if(e&&(c.isSpecial()!==h(ut,f)||"file"===f&&(c.includesCredentials()||null!==c.port)||"file"===c.scheme&&!c.host))return;if(c.scheme=f,e)return void(c.isSpecial()&&ut[c.scheme]===c.port&&(c.port=null));f="","file"===c.scheme?u=Ot:c.isSpecial()&&n&&n.scheme===c.scheme?u=mt:c.isSpecial()?u=wt:"/"===i[l+1]?(u=bt,l++):(c.cannotBeABaseURL=!0,D(c.path,""),u=Mt)}break;case gt:if(!n||n.cannotBeABaseURL&&"#"!==o)return"Invalid scheme";if(n.cannotBeABaseURL&&"#"===o){c.scheme=n.scheme,c.path=g(n.path),c.query=n.query,c.fragment="",c.cannotBeABaseURL=!0,u=$t;break}u="file"===n.scheme?Ot:yt;continue;case mt:if("/"!==o||"/"!==i[l+1]){u=yt;continue}u=xt,l++;break;case bt:if("/"===o){u=St;break}u=It;continue;case yt:if(c.scheme=n.scheme,o===r)c.username=n.username,c.password=n.password,c.host=n.host,c.port=n.port,c.path=g(n.path),c.query=n.query;else if("/"===o||"\\"===o&&c.isSpecial())u=_t;else if("?"===o)c.username=n.username,c.password=n.password,c.host=n.host,c.port=n.port,c.path=g(n.path),c.query="",u=Pt;else{if("#"!==o){c.username=n.username,c.password=n.password,c.host=n.host,c.port=n.port,c.path=g(n.path),c.path.length--,u=It;continue}c.username=n.username,c.password=n.password,c.host=n.host,c.port=n.port,c.path=g(n.path),c.query=n.query,c.fragment="",u=$t}break;case _t:if(!c.isSpecial()||"/"!==o&&"\\"!==o){if("/"!==o){c.username=n.username,c.password=n.password,c.host=n.host,c.port=n.port,u=It;continue}u=St}else u=xt;break;case wt:if(u=xt,"/"!==o||"/"!==P(f,l+1))continue;l++;break;case xt:if("/"!==o&&"\\"!==o){u=St;continue}break;case St:if("@"===o){d&&(f="%40"+f),d=!0,a=v(f);for(var b=0;b65535)return"Invalid port";c.port=c.isSpecial()&&x===ut[c.scheme]?null:x,f=""}if(e)return;u=jt;continue}return"Invalid port"}f+=o;break;case Ot:if(c.scheme="file","/"===o||"\\"===o)u=At;else{if(!n||"file"!==n.scheme){u=It;continue}switch(o){case r:c.host=n.host,c.path=g(n.path),c.query=n.query;break;case"?":c.host=n.host,c.path=g(n.path),c.query="",u=Pt;break;case"#":c.host=n.host,c.path=g(n.path),c.query=n.query,c.fragment="",u=$t;break;default:ft(L(g(i,l),""))||(c.host=n.host,c.path=g(n.path),c.shortenPath()),u=It;continue}}break;case At:if("/"===o||"\\"===o){u=Et;break}n&&"file"===n.scheme&&!ft(L(g(i,l),""))&&(lt(n.path[0],!0)?D(c.path,n.path[0]):c.host=n.host),u=It;continue;case Et:if(o===r||"/"===o||"\\"===o||"?"===o||"#"===o){if(!e&<(f))u=It;else if(""===f){if(c.host="",e)return;u=jt}else{if(s=c.parseHost(f),s)return s;if("localhost"===c.host&&(c.host=""),e)return;f="",u=jt}continue}f+=o;break;case jt:if(c.isSpecial()){if(u=It,"/"!==o&&"\\"!==o)continue}else if(e||"?"!==o)if(e||"#"!==o){if(o!==r&&(u=It,"/"!==o))continue}else c.fragment="",u=$t;else c.query="",u=Pt;break;case It:if(o===r||"/"===o||"\\"===o&&c.isSpecial()||!e&&("?"===o||"#"===o)){if(ht(f)?(c.shortenPath(),"/"===o||"\\"===o&&c.isSpecial()||D(c.path,"")):dt(f)?"/"===o||"\\"===o&&c.isSpecial()||D(c.path,""):("file"===c.scheme&&!c.path.length&<(f)&&(c.host&&(c.host=""),f=P(f,0)+":"),D(c.path,f)),f="","file"===c.scheme&&(o===r||"?"===o||"#"===o))while(c.path.length>1&&""===c.path[0])F(c.path);"?"===o?(c.query="",u=Pt):"#"===o&&(c.fragment="",u=$t)}else f+=ct(o,at);break;case Mt:"?"===o?(c.query="",u=Pt):"#"===o?(c.fragment="",u=$t):o!==r&&(c.path[0]+=ct(o,it));break;case Pt:e||"#"!==o?o!==r&&("'"===o&&c.isSpecial()?c.query+="%27":c.query+="#"===o?"%23":ct(o,it)):(c.fragment="",u=$t);break;case $t:o!==r&&(c.fragment+=ct(o,ot));break}l++}},parseHost:function(t){var e,n,r;if("["===P(t,0)){if("]"!==P(t,t.length-1))return"Invalid host";if(e=function(t){var e,n,r,i,o,a,s,c=[0,0,0,0,0,0,0,0],u=0,l=null,f=0,d=function(){return P(t,f)};if(":"===d()){if(":"!==P(t,1))return;f+=2,u++,l=u}while(d()){if(8===u)return;if(":"!==d()){e=n=0;while(n<4&&$(K,d()))e=16*e+j(d(),16),f++,n++;if("."===d()){if(0===n)return;if(f-=n,u>6)return;r=0;while(d()){if(i=null,r>0){if(!("."===d()&&r<4))return;f++}if(!$(Y,d()))return;while($(Y,d())){if(o=j(d(),10),null===i)i=o;else{if(0===i)return;i=10*i+o}if(i>255)return;f++}c[u]=256*c[u]+i,r++,2!==r&&4!==r||u++}if(4!==r)return;break}if(":"===d()){if(f++,!d())return}else if(d())return;c[u++]=e}else{if(null!==l)return;f++,u++,l=u}}if(null!==l){a=u-l,u=7;while(0!==u&&a>0)s=c[u],c[u--]=c[l+a-1],c[l+--a]=s}else if(8!==u)return;return c}(W(t,1,-1)),!e)return"Invalid host";this.host=e}else if(this.isSpecial()){if(t=b(t),$(J,t))return"Invalid host";if(e=function(t){var e,n,r,i,o,a,s,c=z(t,".");if(c.length&&""===c[c.length-1]&&c.length--,e=c.length,e>4)return t;for(n=[],r=0;r1&&"0"===P(i,0)&&(o=$(X,i)?16:8,i=W(i,8===o?1:2)),""===i)a=0;else{if(!$(10===o?Q:8===o?G:K,i))return t;a=j(i,o)}D(n,a)}for(r=0;r=M(256,5-e))return null}else if(a>255)return null;for(s=N(n),r=0;r1?arguments[1]:void 0,r=k(e,new Lt(t,!1,n));o||(e.href=r.serialize(),e.origin=r.getOrigin(),e.protocol=r.getProtocol(),e.username=r.getUsername(),e.password=r.getPassword(),e.host=r.getHost(),e.hostname=r.getHostname(),e.port=r.getPort(),e.pathname=r.getPathname(),e.search=r.getSearch(),e.searchParams=r.getSearchParams(),e.hash=r.getHash())},Nt=Rt.prototype,Dt=function(t,e){return{get:function(){return C(this)[t]()},set:e&&function(t){return C(this)[e](t)},configurable:!0,enumerable:!0}};if(o&&(f(Nt,"href",Dt("serialize","setHref")),f(Nt,"origin",Dt("getOrigin")),f(Nt,"protocol",Dt("getProtocol","setProtocol")),f(Nt,"username",Dt("getUsername","setUsername")),f(Nt,"password",Dt("getPassword","setPassword")),f(Nt,"host",Dt("getHost","setHost")),f(Nt,"hostname",Dt("getHostname","setHostname")),f(Nt,"port",Dt("getPort","setPort")),f(Nt,"pathname",Dt("getPathname","setPathname")),f(Nt,"search",Dt("getSearch","setSearch")),f(Nt,"searchParams",Dt("getSearchParams")),f(Nt,"hash",Dt("getHash","setHash"))),l(Nt,"toJSON",(function(){return C(this).serialize()}),{enumerable:!0}),l(Nt,"toString",(function(){return C(this).serialize()}),{enumerable:!0}),A){var Bt=A.createObjectURL,Ft=A.revokeObjectURL;Bt&&l(Rt,"createObjectURL",c(Bt,A)),Ft&&l(Rt,"revokeObjectURL",c(Ft,A))}_(Rt,"URL"),i({global:!0,constructor:!0,forced:!a,sham:!o},{URL:Rt})},"6be7":function(t,e,n){"use strict";var r=n("8bdb"),i=n("71e9"),o=n("1c06"),a=n("e7e3"),s=n("cfaf"),c=n("1ded"),u=n("c337");r({target:"Reflect",stat:!0},{get:function t(e,n){var r,l,f=arguments.length<3?e:arguments[2];return a(e)===f?e[n]:(r=c.f(e,n),r?s(r)?r.value:void 0===r.get?void 0:i(r.get,f):o(l=u(e))?t(l,n,f):void 0)}})},"6bfa":function(t,e,n){"use strict";var r=n("f660"),i=n("1cb5"),o=n("799d"),a=n("235c"),s=n("d6b1").f,c=n("0cc2"),u=n("97ed"),l=n("a734"),f=n("ab4a"),d=a.set,h=a.getterFor("Array Iterator");t.exports=c(Array,"Array",(function(t,e){d(this,{type:"Array Iterator",target:r(t),index:0,kind:e})}),(function(){var t=h(this),e=t.target,n=t.index++;if(!e||n>=e.length)return t.target=void 0,u(void 0,!0);switch(t.kind){case"keys":return u(n,!1);case"values":return u(e[n],!1)}return u([n,e[n]],!1)}),"values");var p=o.Arguments=o.Array;if(i("keys"),i("values"),i("entries"),!l&&f&&"values"!==p.name)try{s(p,"name",{value:"values"})}catch(v){}},"6c13":function(t,e,n){var r=n("c86b");t.exports=r("navigator","userAgent")||""},"6e4a":function(t,e,n){"use strict";var r=n("508d"),i=n("3a4b"),o=n("3c5d"),a=n("7aa6"),s=n("c86b"),c=n("fdca"),u=n("0699"),l=n("7478"),f=n("27cc"),d=o&&o.prototype,h=!!o&&a((function(){d["finally"].call({then:function(){}},(function(){}))}));if(r({target:"Promise",proto:!0,real:!0,forced:h},{finally:function(t){var e=u(this,s("Promise")),n=c(t);return this.then(n?function(n){return l(e,t()).then((function(){return n}))}:t,n?function(n){return l(e,t()).then((function(){throw n}))}:t)}}),!i&&c(o)){var p=s("Promise").prototype["finally"];d["finally"]!==p&&f(d,"finally",p,{unsafe:!0})}},"6f19":function(t,e,n){var r=n("6c13");t.exports=/(?:ipad|iphone|ipod).*applewebkit/i.test(r)},7054:function(t,e,n){"use strict";var r=n("e7e3"),i=n("df92"),o=TypeError;t.exports=function(t){if(r(this),"string"===t||"default"===t)t="string";else if("number"!==t)throw new o("Incorrect hint");return i(this,t)}},"70a5":function(t,e,n){var r=n("6c13"),i=n("8394");t.exports=/ipad|iphone|ipod/i.test(r)&&void 0!==i.Pebble},"71e9":function(t,e,n){"use strict";var r=n("8f26"),i=Function.prototype.call;t.exports=r?i.bind(i):function(){return i.apply(i,arguments)}},"720d":function(t,e,n){var r=n("d456"),i=n("fdca"),o=n("85e5"),a=n("29d5"),s=a("toStringTag"),c=Object,u="Arguments"==o(function(){return arguments}());t.exports=r?o:function(t){var e,n,r;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(n){}}(e=c(t),s))?n:u?o(e):"Object"==(r=o(e))&&i(e.callee)?"Arguments":r}},7257:function(t,e,n){"use strict";var r=n("db06");t.exports=function(t){try{if(r)return Function('return require("'+t+'")')()}catch(e){}}},7478:function(t,e,n){var r=n("d191"),i=n("1ae3"),o=n("f439");t.exports=function(t,e){if(r(t),i(e)&&e.constructor===t)return e;var n=o.f(t),a=n.resolve;return a(e),n.promise}},"77b2":function(t,e,n){var r=n("d10a");t.exports=r({}.isPrototypeOf)},"77cd":function(t,e,n){var r=n("d10a"),i=n("b510"),o=r({}.hasOwnProperty);t.exports=Object.hasOwn||function(t,e){return o(i(t),e)}},7934:function(t,e,n){"use strict";var r=n("569b"),i=n("8e02");t.exports=r?{}.toString:function(){return"[object "+i(this)+"]"}},7992:function(t,e,n){"use strict";var r=n("474f"),i=n("52df"),o=TypeError;t.exports=function(t){if(r(t))return t;throw new o(i(t)+" is not a function")}},7996:function(t,e,n){"use strict";var r=n("8bdb"),i=n("85c1"),o=n("181d");r({global:!0},{Reflect:{}}),o(i.Reflect,"Reflect",!0)},"799d":function(t,e,n){"use strict";t.exports={}},"7a76":function(t,e,n){"use strict";var r=n("8bdb"),i=n("85c1"),o=n("9f9e"),a=n("175f"),s=i["WebAssembly"],c=7!==new Error("e",{cause:7}).cause,u=function(t,e){var n={};n[t]=a(t,e,c),r({global:!0,constructor:!0,arity:1,forced:c},n)},l=function(t,e){if(s&&s[t]){var n={};n[t]=a("WebAssembly."+t,e,c),r({target:"WebAssembly",stat:!0,constructor:!0,arity:1,forced:c},n)}};u("Error",(function(t){return function(e){return o(t,this,arguments)}})),u("EvalError",(function(t){return function(e){return o(t,this,arguments)}})),u("RangeError",(function(t){return function(e){return o(t,this,arguments)}})),u("ReferenceError",(function(t){return function(e){return o(t,this,arguments)}})),u("SyntaxError",(function(t){return function(e){return o(t,this,arguments)}})),u("TypeError",(function(t){return function(e){return o(t,this,arguments)}})),u("URIError",(function(t){return function(e){return o(t,this,arguments)}})),l("CompileError",(function(t){return function(e){return o(t,this,arguments)}})),l("LinkError",(function(t){return function(e){return o(t,this,arguments)}})),l("RuntimeError",(function(t){return function(e){return o(t,this,arguments)}}))},"7aa6":function(t,e){t.exports=function(t){try{return!!t()}catch(e){return!0}}},"7b05":function(t,e,n){var r,i,o,a=n("c7dd"),s=n("8394"),c=n("1ae3"),u=n("d1a8"),l=n("77cd"),f=n("49a5"),d=n("3872"),h=n("bd8a"),p=s.TypeError,v=s.WeakMap;if(a||f.state){var g=f.state||(f.state=new v);g.get=g.get,g.has=g.has,g.set=g.set,r=function(t,e){if(g.has(t))throw p("Object already initialized");return e.facade=t,g.set(t,e),e},i=function(t){return g.get(t)||{}},o=function(t){return g.has(t)}}else{var m=d("state");h[m]=!0,r=function(t,e){if(l(t,m))throw p("Object already initialized");return e.facade=t,u(t,m,e),e},i=function(t){return l(t,m)?t[m]:{}},o=function(t){return l(t,m)}}t.exports={set:r,get:i,has:o,enforce:function(t){return o(t)?i(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!c(e)||(n=i(e)).type!==t)throw p("Incompatible receiver, "+t+" required");return n}}}},"7b97":function(t,e,n){"use strict";var r=n("bb80"),i=n("7ddb"),o=n("6a2b"),a=r(o),s=i.aTypedArray,c=i.exportTypedArrayMethod;c("copyWithin",(function(t,e){return a(s(this),t,e,arguments.length>2?arguments[2]:void 0)}))},"7c26":function(t,e,n){var r=n("dbc3"),i=n("d7b8"),o=n("d191"),a=n("e158"),s=n("1e4f"),c=n("1e5d"),u=n("77b2"),l=n("bef2"),f=n("1b8e"),d=n("e39d"),h=TypeError,p=function(t,e){this.stopped=t,this.result=e},v=p.prototype;t.exports=function(t,e,n){var g,m,b,y,_,w,x,S=n&&n.that,k=!(!n||!n.AS_ENTRIES),C=!(!n||!n.IS_RECORD),T=!(!n||!n.IS_ITERATOR),O=!(!n||!n.INTERRUPTED),A=r(e,S),E=function(t){return g&&d(g,"normal",t),new p(!0,t)},j=function(t){return k?(o(t),O?A(t[0],t[1],E):A(t[0],t[1])):O?A(t,E):A(t)};if(C)g=t.iterator;else if(T)g=t;else{if(m=f(t),!m)throw h(a(t)+" is not iterable");if(s(m)){for(b=0,y=c(t);y>b;b++)if(_=j(t[b]),_&&u(v,_))return _;return new p(!1)}g=l(t,m)}w=C?t.next:g.next;while(!(x=i(w,g)).done){try{_=j(x.value)}catch(I){d(g,"throw",I)}if("object"==typeof _&&_&&u(v,_))return _}return new p(!1)}},"7d2f":function(t,e,n){"use strict";var r=n("ab4a"),i=n("b0a8"),o=n("ada5"),a=n("e4ca"),s=n("235c").get,c=RegExp.prototype,u=TypeError;r&&i&&a(c,"dotAll",{configurable:!0,get:function(){if(this!==c){if("RegExp"===o(this))return!!s(this).dotAll;throw new u("Incompatible receiver, RegExp required")}}})},"7d3c":function(t,e,n){"use strict";e.f=Object.getOwnPropertySymbols},"7ddb":function(t,e,n){"use strict";var r,i,o,a=n("c89b"),s=n("ab4a"),c=n("85c1"),u=n("474f"),l=n("1c06"),f=n("338c"),d=n("8e02"),h=n("52df"),p=n("6aca"),v=n("81a9"),g=n("e4ca"),m=n("1297"),b=n("c337"),y=n("8c4f"),_=n("8c08"),w=n("d7b4"),x=n("235c"),S=x.enforce,k=x.get,C=c.Int8Array,T=C&&C.prototype,O=c.Uint8ClampedArray,A=O&&O.prototype,E=C&&b(C),j=T&&b(T),I=Object.prototype,M=c.TypeError,P=_("toStringTag"),$=w("TYPED_ARRAY_TAG"),L=a&&!!y&&"Opera"!==d(c.opera),R=!1,N={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},D={BigInt64Array:8,BigUint64Array:8},B=function(t){var e=b(t);if(l(e)){var n=k(e);return n&&f(n,"TypedArrayConstructor")?n["TypedArrayConstructor"]:B(e)}},F=function(t){if(!l(t))return!1;var e=d(t);return f(N,e)||f(D,e)};for(r in N)i=c[r],o=i&&i.prototype,o?S(o)["TypedArrayConstructor"]=i:L=!1;for(r in D)i=c[r],o=i&&i.prototype,o&&(S(o)["TypedArrayConstructor"]=i);if((!L||!u(E)||E===Function.prototype)&&(E=function(){throw new M("Incorrect invocation")},L))for(r in N)c[r]&&y(c[r],E);if((!L||!j||j===I)&&(j=E.prototype,L))for(r in N)c[r]&&y(c[r].prototype,j);if(L&&b(A)!==j&&y(A,j),s&&!f(j,P))for(r in R=!0,g(j,P,{configurable:!0,get:function(){return l(this)?this[$]:void 0}}),N)c[r]&&p(c[r],$,r);t.exports={NATIVE_ARRAY_BUFFER_VIEWS:L,TYPED_ARRAY_TAG:R&&$,aTypedArray:function(t){if(F(t))return t;throw new M("Target is not a typed array")},aTypedArrayConstructor:function(t){if(u(t)&&(!y||m(E,t)))return t;throw new M(h(t)+" is not a typed array constructor")},exportTypedArrayMethod:function(t,e,n,r){if(s){if(n)for(var i in N){var o=c[i];if(o&&f(o.prototype,t))try{delete o.prototype[t]}catch(a){try{o.prototype[t]=e}catch(u){}}}j[t]&&!n||v(j,t,n?e:L&&T[t]||e,r)}},exportTypedArrayStaticMethod:function(t,e,n){var r,i;if(s){if(y){if(n)for(r in N)if(i=c[r],i&&f(i,t))try{delete i[t]}catch(o){}if(E[t]&&!n)return;try{return v(E,t,n?e:L&&E[t]||e)}catch(o){}}for(r in N)i=c[r],!i||i[t]&&!n||v(i,t,e)}},getTypedArrayConstructor:B,isView:function(t){if(!l(t))return!1;var e=d(t);return"DataView"===e||f(N,e)||f(D,e)},isTypedArray:F,TypedArray:E,TypedArrayPrototype:j}},"7df8":function(t,e,n){"use strict";var r=Math.round;t.exports=function(t){var e=r(t);return e<0?0:e>255?255:255&e}},"7e41":function(t,e,n){"use strict";var r=n("bb80"),i=n("af9e"),o=n("ada5"),a=Object,s=r("".split);t.exports=i((function(){return!a("z").propertyIsEnumerable(0)}))?function(t){return"String"===o(t)?s(t,""):a(t)}:a},"7e87":function(t,e,n){"use strict";var r=n("bb80"),i=Error,o=r("".replace),a=function(t){return String(new i("zxcasd").stack)}(),s=/\n\s*at [^:]*:[^\n]*/,c=s.test(a);t.exports=function(t,e){if(c&&"string"==typeof t&&!i.prepareStackTrace)while(e--)t=o(t,s,"");return t}},"7e91":function(t,e,n){"use strict";var r=n("71e9"),i=n("e7e3"),o=n("60bc");t.exports=function(t,e,n){var a,s;i(t);try{if(a=o(t,"return"),!a){if("throw"===e)throw n;return n}a=r(a,t)}catch(c){s=!0,a=c}if("throw"===e)throw n;if(s)throw a;return i(a),n}},"7edc":function(t,e,n){"use strict";n("5c47");var r=n("71e9"),i=n("81a9"),o=n("9ad8"),a=n("af9e"),s=n("8c08"),c=n("6aca"),u=s("species"),l=RegExp.prototype;t.exports=function(t,e,n,f){var d=s(t),h=!a((function(){var e={};return e[d]=function(){return 7},7!==""[t](e)})),p=h&&!a((function(){var e=!1,n=/a/;return"split"===t&&(n={},n.constructor={},n.constructor[u]=function(){return n},n.flags="",n[d]=/./[d]),n.exec=function(){return e=!0,null},n[d](""),!e}));if(!h||!p||n){var v=/./[d],g=e(d,""[t],(function(t,e,n,i,a){var s=e.exec;return s===o||s===l.exec?h&&!a?{done:!0,value:r(v,e,n,i)}:{done:!0,value:r(t,n,e,i)}:{done:!1}}));i(String.prototype,t,g[0]),i(l,d,g[1])}f&&c(l[d],"sham",!0)}},"7edd":function(t,e,n){"use strict";var r=n("85c1"),i=n("af9e"),o=n("bb80"),a=n("7ddb"),s=n("6bfa"),c=n("8c08"),u=c("iterator"),l=r.Uint8Array,f=o(s.values),d=o(s.keys),h=o(s.entries),p=a.aTypedArray,v=a.exportTypedArrayMethod,g=l&&l.prototype,m=!i((function(){g[u].call([1])})),b=!!g&&g.values&&g[u]===g.values&&"values"===g.values.name,y=function(){return f(p(this))};v("entries",(function(){return h(p(this))}),m),v("keys",(function(){return d(p(this))}),m),v("values",y,m||!b,{name:"values"}),v(u,y,m||!b,{name:"values"})},"7f28":function(t,e,n){"use strict";var r=TypeError;t.exports=function(t,e){if(t"+t+"<\/script>"},p=function(t){t.write(h("")),t.close();var e=t.parentWindow.Object;return t=null,e},v=function(){try{r=new ActiveXObject("htmlfile")}catch(e){}v="undefined"!=typeof document?document.domain&&r?p(r):function(){var t,e=u("iframe");return e.style.display="none",c.appendChild(e),e.src=String("javascript:"),t=e.contentWindow.document,t.open(),t.write(h("document.F=Object")),t.close(),t.F}():p(r);var t=a.length;while(t--)delete v["prototype"][a[t]];return v()};s[f]=!0,t.exports=Object.create||function(t,e){var n;return null!==t?(d["prototype"]=i(t),n=new d,d["prototype"]=null,n[f]=t):n=v(),void 0===e?n:o.f(n,e)}},"84d6":function(t,e,n){"use strict";var r=n("1099"),i=n("e34c"),o=n("1fc1");t.exports=function(t){var e=r(this),n=o(e),a=arguments.length,s=i(a>1?arguments[1]:void 0,n),c=a>2?arguments[2]:void 0,u=void 0===c?n:i(c,n);while(u>s)e[s++]=t;return e}},8557:function(t,e,n){"use strict";var r=n("7ddb"),i=n("4d16").some,o=r.aTypedArray,a=r.exportTypedArrayMethod;a("some",(function(t){return i(o(this),t,arguments.length>1?arguments[1]:void 0)}))},8598:function(t,e,n){"use strict";var r=n("bb80"),i=n("7992"),o=n("1c06"),a=n("338c"),s=n("37ad"),c=n("8f26"),u=Function,l=r([].concat),f=r([].join),d={},h=function(t,e,n){if(!a(d,e)){for(var r=[],i=0;in||l!==l?c*(1/0):c*l}},"884b":function(t,e,n){"use strict";var r=n("338c"),i=n("81a9"),o=n("7054"),a=n("8c08"),s=a("toPrimitive"),c=Date.prototype;r(c,s)||i(c,s,o)},8945:function(t,e,n){"use strict";var r=n("ab4a"),i=n("338c"),o=Function.prototype,a=r&&Object.getOwnPropertyDescriptor,s=i(o,"name"),c=s&&"something"===function(){}.name,u=s&&(!r||r&&a(o,"name").configurable);t.exports={EXISTS:s,PROPER:c,CONFIGURABLE:u}},"8a29":function(t,e,n){var r=n("77cd"),i=n("fdca"),o=n("b510"),a=n("3872"),s=n("66ee"),c=a("IE_PROTO"),u=Object,l=u.prototype;t.exports=s?u.getPrototypeOf:function(t){var e=o(t);if(r(e,c))return e[c];var n=e.constructor;return i(n)&&e instanceof n?n.prototype:e instanceof u?l:null}},"8a8d":function(t,e,n){"use strict";var r=n("8bdb"),i=n("8c4f");r({target:"Object",stat:!0},{setPrototypeOf:i})},"8ae2":function(t,e,n){"use strict";var r=n("bb80"),i=n("af9e"),o=n("474f"),a=n("8e02"),s=n("6aa6"),c=n("ca99"),u=function(){},l=s("Reflect","construct"),f=/^\s*(?:class|function)\b/,d=r(f.exec),h=!f.test(u),p=function(t){if(!o(t))return!1;try{return l(u,[],t),!0}catch(e){return!1}},v=function(t){if(!o(t))return!1;switch(a(t)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return h||!!d(f,c(t))}catch(e){return!0}};v.sham=!0,t.exports=!l||i((function(){var t;return p(p.call)||!p(Object)||!p((function(){t=!0}))||t}))?v:p},"8b27":function(t,e,n){"use strict";var r=n("8945").PROPER,i=n("af9e"),o=n("f072");t.exports=function(t){return i((function(){return!!o[t]()||"
"!=="
"[t]()||r&&o[t].name!==t}))}},"8b3b":function(t,e,n){"use strict";var r=n("9b55");t.exports=function(t,e){return r[t]||(r[t]=e||{})}},"8bdb":function(t,e,n){"use strict";var r=n("85c1"),i=n("1ded").f,o=n("6aca"),a=n("81a9"),s=n("c9b7"),c=n("3d8a"),u=n("8466");t.exports=function(t,e){var n,l,f,d,h,p,v=t.target,g=t.global,m=t.stat;if(l=g?r:m?r[v]||s(v,{}):r[v]&&r[v].prototype,l)for(f in e){if(h=e[f],t.dontCallGetSet?(p=i(l,f),d=p&&p.value):d=l[f],n=u(g?f:v+(m?".":"#")+f,t.forced),!n&&void 0!==d){if(typeof h==typeof d)continue;c(h,d)}(t.sham||d&&d.sham)&&o(h,"sham",!0),a(l,f,h,t)}}},"8c08":function(t,e,n){"use strict";var r=n("85c1"),i=n("8b3b"),o=n("338c"),a=n("d7b4"),s=n("af71"),c=n("4f04"),u=r.Symbol,l=i("wks"),f=c?u["for"]||u:u&&u.withoutSetter||a;t.exports=function(t){return o(l,t)||(l[t]=s&&o(u,t)?u[t]:f("Symbol."+t)),l[t]}},"8c18":function(t,e,n){"use strict";var r=n("7ddb"),i=n("9a51").right,o=r.aTypedArray,a=r.exportTypedArrayMethod;a("reduceRight",(function(t){var e=arguments.length;return i(o(this),t,e,e>1?arguments[1]:void 0)}))},"8c4f":function(t,e,n){"use strict";var r=n("960c"),i=n("1c06"),o=n("862c"),a=n("a048");t.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var t,e=!1,n={};try{t=r(Object.prototype,"__proto__","set"),t(n,[]),e=n instanceof Array}catch(s){}return function(n,r){return o(n),a(r),i(n)?(e?t(n,r):n.__proto__=r,n):n}}():void 0)},"8cb1":function(t,e,n){"use strict";var r=n("6aca"),i=n("7e87"),o=n("417a"),a=Error.captureStackTrace;t.exports=function(t,e,n,s){o&&(a?a(t,e):r(t,"stack",i(n,s)))}},"8d0b":function(t,e,n){"use strict";n("6a54"),Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n1?arguments[1]:void 0)}})},"8fa1":function(t,e,n){var r=n("d10a"),i=0,o=Math.random(),a=r(1..toString);t.exports=function(t){return"Symbol("+(void 0===t?"":t)+")_"+a(++i+o,36)}},"8ff5":function(t,e,n){"use strict";var r=n("7ddb"),i=n("4d16").filter,o=n("4379"),a=r.aTypedArray,s=r.exportTypedArrayMethod;s("filter",(function(t){var e=i(a(this),t,arguments.length>1?arguments[1]:void 0);return o(this,e)}))},9105:function(t,e,n){var r=n("56c8"),i=n("da1d");t.exports=Object.keys||function(t){return r(t,i)}},"911a":function(t,e,n){"use strict";t.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!==t&&e!==e}},"926e":function(t,e,n){"use strict";var r=n("8bdb"),i=n("af9e"),o=n("1099"),a=n("c337"),s=n("1d57"),c=i((function(){a(1)}));r({target:"Object",stat:!0,forced:c,sham:!s},{getPrototypeOf:function(t){return a(o(t))}})},"92b3":function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},9320:function(t,e,n){"use strict";var r=n("4c77").IteratorPrototype,i=n("849d"),o=n("92b3"),a=n("ebe8"),s=n("d459"),c=function(){return this};t.exports=function(t,e,n,u){var l=e+" Iterator";return t.prototype=i(r,{next:o(+!u,n)}),a(t,l,!1,!0),s[l]=c,t}},9337:function(t,e,n){(function(t){var r=n("bdbb").default;n("6a54"),n("01a2"),n("e39c"),n("bf0f"),n("4e9b"),n("114e"),n("c240"),n("5ef2"),n("23f4"),n("7d2f"),n("5c47"),n("9c4e"),n("ab80"),n("0506"),n("e838"),n("2c10"),n("a1c1"),n("0c26"),n("e966"),n("c223"),n("dc8a"),n("2797"),n("aa9c"),n("8f71"),n("fd3c"),n("dd2b"),n("64aa"),n("de6c"),n("7a76"),n("c9b5"),n("4626"),n("22b6"),n("80e3"),n("4db2"),n("f7a5"),n("18f7"),n("9db6"),n("aa77"),n("d4b5"),n("473f"),n("15d1"),n("d5c6"),n("5a56"),n("f074"),n("4100"),n("08eb"),n("844d"),n("9a2c"),n("a644"),n("a03a"),n("3efd"),n("3872e"),n("926e"),n("8a8d"),n("dc69"),n("9480"),n("4d8f"),n("7b97"),n("668a"),n("c5b7"),n("8ff5"),n("2378"),n("641a"),n("64e0"),n("cce3"),n("efba"),n("d009"),n("bd7d"),n("7edd"),n("d798"),n("f547"),n("5e54"),n("b60a"),n("8c18"),n("12973"),n("f991"),n("198e"),n("8557"),n("63b1"),n("1954"),n("1cf1"),n("5ac7"),n("af8f"),n("c976"),n("dfcf"),n("bd06"),n("dc89"),n("2425"),n("6a88"),n("7996"),n("6be7"),n("45da"),function(i,o){"object"===r(e)&&"object"===r(t)?t.exports=o(n("d3b4"),n("9b8e"),n("bcdb")):n("2c6b")([,,],o)}("undefined"!==typeof self&&self,(function(t,e,n){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"===r(t)&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s="393d")}({"0071":function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n("340d"),i=n("71a4");function o(t){var e={};for(var n in t){var o=t[n];Object(r["k"])(o)&&(e[n]=Object(i["a"])(o),delete t[n])}return e}},"0126":function(t,e,n){"use strict";n.r(e),n.d(e,"getLaunchOptionsSync",(function(){return i})),n.d(e,"getEnterOptionsSync",(function(){return o}));var r=n("3d1e");function i(){return Object(r["e"])()}function o(){return Object(r["d"])()}},"01aa":function(t,e,n){"use strict";var r=n("e32e"),i=n.n(r);i.a},"01fd":function(t,e,n){"use strict";n.r(e),n.d(e,"getTheme",(function(){return i})),n.d(e,"getBrowserInfo",(function(){return d}));var r=n("340d");function i(){if(!0!==__uniConfig.darkmode)return Object(r["m"])(__uniConfig.darkmode)?__uniConfig.darkmode:"light";try{return window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark"}catch(t){return"light"}}var o=navigator.userAgent,a=/android/i.test(o),s=/iphone|ipad|ipod/i.test(o),c=o.match(/Windows NT ([\d|\d.\d]*)/i),u=/Macintosh|Mac/i.test(o),l=/Linux|X11/i.test(o),f=u&&navigator.maxTouchPoints>0;function d(){var t,e,n,r=navigator.language,d="phone";if(s){t="iOS";var h=o.match(/OS\s([\w_]+)\slike/);h&&(e=h[1].replace(/_/g,"."));var p=o.match(/\(([a-zA-Z]+);/);p&&(n=p[1])}else if(a){t="Android";var v=o.match(/Android[\s/]([\w\.]+)[;\s]/);v&&(e=v[1]);for(var g=o.match(/\((.+?)\)/),m=g?g[1].split(";"):o.split(" "),b=[/\bAndroid\b/i,/\bLinux\b/i,/\bU\b/i,/^\s?[a-z][a-z]$/i,/^\s?[a-z][a-z]-[a-z][a-z]$/i,/\bwv\b/i,/\/[\d\.,]+$/,/^\s?[\d\.,]+$/,/\bBrowser\b/i,/\bMobile\b/i],y=0;y0){n=_.split("Build")[0].trim();break}for(var w=void 0,x=0;x-1&&t.indexOf("MSIE")>-1,n=t.indexOf("Edge")>-1&&!e,r=t.indexOf("Trident")>-1&&t.indexOf("rv:11.0")>-1;if(e){var i=new RegExp("MSIE (\\d+\\.\\d+);");i.test(t);var o=parseFloat(RegExp.$1);return o>6?o:6}return n?-1:r?11:-1}());if("-1"!==E)A="IE";else for(var j=["Version","Firefox","Chrome","Edge{0,1}"],I=["Safari","Firefox","Chrome","Edge"],M=0;M=0&&a.splice(e,1)}}function l(e){s.push(e),t.warn('The "uni.onUIStyleChange" API is deprecated, please use "uni.onThemeChange". Learn more: https://uniapp.dcloud.net.cn/api/system/theme.')}Object(i["d"])(o["b"],(function(t){a.forEach((function(e){Object(r["a"])(e,t)}))})),Object(i["d"])("onUIStyleChange",(function(t){s.forEach((function(e){Object(r["a"])(e,t)}))}))}.call(this,n("418b")["default"])},"04d4":function(t,e,n){"use strict";var r=n("340d"),i=n("b435");e["a"]={props:{dashArray:{type:Array,default:function(){return[0,0]}},points:{type:Array,required:!0},strokeWidth:{type:Number,default:1},strokeColor:{type:String,default:"#000000"},fillColor:{type:String,default:"#00000000"},zIndex:{type:Number,default:0}},mounted:function(){var t=this,e=this.$parent;e.mapReady((function(){t.drawPolygon(),Object.keys(t.$props).forEach((function(e){t.$watch(e,(function(){t.drawPolygon()}),{deep:!0})}))}))},methods:{drawPolygon:function(){var t=this.points,e=this.strokeWidth,n=this.strokeColor,o=this.dashArray,a=this.fillColor,s=this.zIndex,c=this.$parent,u=c._maps,l=c._map,f=t.map((function(t){var e=t.latitude,n=t.longitude;return i["c"]?[n,e]:new u.LatLng(e,n)})),d=Object(r["j"])(a),h=d.r,p=d.g,v=d.b,g=d.a,m=Object(r["j"])(n),b=m.r,y=m.g,_=m.b,w=m.a,x={clickable:!0,cursor:"crosshair",editable:!1,map:l,fillColor:"",path:f,strokeColor:"",strokeDashStyle:o.some((function(t){return t>0}))?"dash":"solid",strokeWeight:e,visible:!0,zIndex:s};u.Color?(x.fillColor=new u.Color(h,p,v,g),x.strokeColor=new u.Color(b,y,_,w)):(x.fillColor="rgb(".concat(h,", ").concat(p,", ").concat(v,")"),x.fillOpacity=g,x.strokeColor="rgb(".concat(b,", ").concat(y,", ").concat(_,")"),x.strokeOpacity=w),this.polygonIns?this.polygonIns.setOptions(x):this.polygonIns=new u.Polygon(x)}},beforeDestroy:function(){this.polygonIns.setMap(null),this.polygonIns=null},render:function(){return null}}},"04ed":function(t,e,n){},"050f":function(t,e,n){"use strict";var r=Object.create(null),i=n("1fe9");i.keys().forEach((function(t){Object.assign(r,i(t))}));var o=r,a=n("b15e");e["a"]=Object.assign(Object.create(null),o,a["a"])},"0671":function(t,e,n){"use strict";var r=n("24f2"),i=n.n(r);i.a},"0680":function(t,e,n){"use strict";(function(t,e,r){var i=n("951c"),o=n.n(i),a=n("eeff");function s(t,e){for(var n=0;n.5&&e._A<=.5?o.forEach((function(t){t.color=a})):s<=.5&&e._A>.5&&o.forEach((function(t){t.color="#fff"})),e._A=s,r&&(r.style.opacity=s),n.backgroundColor="rgba(".concat(e._R,",").concat(e._G,",").concat(e._B,",").concat(s,")"),l.forEach((function(t,e){var n=u[e],r=n.match(/[\d+\.]+/g);r[3]=(1-s)*(4===r.length?r[3]:1),t.backgroundColor="rgba(".concat(r,")")})))}))}else if("float"===this.type){for(var h=this.$el.querySelectorAll(".uni-btn-icon"),p=[],v=0;v-1&&this.selectionEndNumber>-1&&"number"!==t.type&&(t.selectionStart=this.selectionStartNumber,t.selectionEnd=this.selectionEndNumber)},_checkCursor:function(){var t=this._field;this.focusSync&&this.selectionStartNumber<0&&this.selectionEndNumber<0&&this.cursorNumber>-1&&"number"!==t.type&&(t.selectionEnd=t.selectionStart=this.cursorNumber)}}}}).call(this,n("31d2"))},"0c61":function(t,e,n){},"0cac":function(t,e,n){},"0db3":function(t,e,n){"use strict";(function(t){function r(e,n){return n?e?e.$el:n.$el:t.error("page is not ready")}function i(t){return t.matches||(t.matches=t.matchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector||t.webkitMatchesSelector||function(t){var e=(this.document||this.ownerDocument).querySelectorAll(t),n=e.length;while(--n>=0&&e.item(n)!==this);return n>-1}),t}n.d(e,"b",(function(){return r})),n.d(e,"a",(function(){return i}))}).call(this,n("418b")["default"])},"0db8":function(t,e,n){"use strict";function r(t,e){for(var n=this.$children,i=n.length,o=arguments.length,a=new Array(o>2?o-2:0),s=2;s2?i-2:0),a=2;a2?n-2:0),o=2;o0&&(n.currentTime=t)}));var i=["canplay","pause","seeking","seeked","timeUpdate"];["canplay","play","pause","ended","timeUpdate","error","waiting","seeking","seeked"].forEach((function(t){n.addEventListener(t.toLowerCase(),(function(){e._stoping&&i.indexOf(t)>=0||e._events["on".concat(t.substr(0,1).toUpperCase()).concat(t.substr(1))].forEach((function(t){t()}))}),!1)}))}return function(t,e,n){e&&i(t.prototype,e),n&&i(t,n)}(t,[{key:"play",value:function(){this._stoping=!1,this._audio.play()}},{key:"pause",value:function(){this._audio.pause()}},{key:"stop",value:function(){this._stoping=!0,this._audio.pause(),this._audio.currentTime=0,this._events.onStop.forEach((function(t){t()}))}},{key:"seek",value:function(t){this._stoping=!1,t=Number(t),"number"!==typeof t||isNaN(t)||(this._audio.currentTime=t)}},{key:"destroy",value:function(){this.stop()}}]),t}();function c(){return new s}a.forEach((function(t){s.prototype[t]=function(e){"function"===typeof e&&this._events[t].push(e)}})),["offCanplay","offPlay","offPause","offStop","offEnded","offTimeUpdate","offError","offWaiting","offSeeking","offSeeked"].forEach((function(t){s.prototype[t]=function(e){var n=this._events[t.replace("off","on")],r=n.indexOf(e);r>=0&&n.splice(r,1)}}))},1332:function(t,e,n){},1720:function(t,e,n){"use strict";var r=n("a187"),i=n.n(r);i.a},1867:function(t,e,n){"use strict";var r=n("9a78"),i=n.n(r);i.a},"1c3e":function(t,e,n){"use strict";n.r(e),n.d(e,"onNetworkStatusChange",(function(){return a})),n.d(e,"offNetworkStatusChange",(function(){return s}));var r=n("9131"),i=n("745a"),o=[];function a(t){o.push(t)}function s(t){if(t){var e=o.indexOf(t);e>=0&&o.splice(e,1)}}Object(i["d"])("onNetworkStatusChange",(function(t){o.forEach((function(e){Object(r["a"])(e,t)}))}))},"1d2e":function(t,e,n){"use strict";n.r(e),function(t,r){var i=n("0372");e["default"]={data:function(){return{showToast:{visible:!1}}},created:function(){var e=this,n="",o=function(t){return function(r){n=t,setTimeout((function(){e.showToast=r}),10)}};t.on("onShowToast",o("onShowToast")),t.on("onShowLoading",o("onShowLoading"));var a=function(t){return function(){if(n){var o="";if("onHideToast"===t&&"onShowToast"!==n?o=Object(i["g"])("uni.showToast.unpaired"):"onHideLoading"===t&&"onShowLoading"!==n&&(o=Object(i["g"])("uni.showLoading.unpaired")),o)return r.warn(o);n="",setTimeout((function(){e.showToast.visible=!1}),10)}}};t.on("onHidePopup",a("onHidePopup")),t.on("onHideToast",a("onHideToast")),t.on("onHideLoading",a("onHideLoading"))}}}.call(this,n("2c9f"),n("418b")["default"])},"1da9":function(t){t.exports=JSON.parse('{"uni.app.quit":"再按一次退出应用","uni.async.error":"连接服务器超时,点击屏幕重试","uni.showActionSheet.cancel":"取消","uni.showToast.unpaired":"请注意 showToast 与 hideToast 必须配对使用","uni.showLoading.unpaired":"请注意 showLoading 与 hideLoading 必须配对使用","uni.showModal.cancel":"取消","uni.showModal.confirm":"确定","uni.chooseImage.cancel":"取消","uni.chooseImage.sourceType.album":"从相册选择","uni.chooseImage.sourceType.camera":"拍摄","uni.chooseVideo.cancel":"取消","uni.chooseVideo.sourceType.album":"从相册选择","uni.chooseVideo.sourceType.camera":"拍摄","uni.chooseFile.notUserActivation":"文件选择器对话框只能在由用户激活时显示","uni.previewImage.cancel":"取消","uni.previewImage.button.save":"保存图像","uni.previewImage.save.success":"保存图像到相册成功","uni.previewImage.save.fail":"保存图像到相册失败","uni.setClipboardData.success":"内容已复制","uni.scanCode.title":"扫码","uni.scanCode.album":"相册","uni.scanCode.fail":"识别失败","uni.scanCode.flash.on":"轻触照亮","uni.scanCode.flash.off":"轻触关闭","uni.startSoterAuthentication.authContent":"指纹识别中...","uni.startSoterAuthentication.waitingContent":"无法识别","uni.picker.done":"完成","uni.picker.cancel":"取消","uni.video.danmu":"弹幕","uni.video.volume":"音量","uni.button.feedback.title":"问题反馈","uni.button.feedback.send":"发送","uni.chooseLocation.search":"搜索地点","uni.chooseLocation.cancel":"取消"}')},"1daa":function(t,e,n){"use strict";function r(t,e,n,r){var i,o=document.createElement("script"),a=e.callback||"callback",s="__callback"+Date.now()+Math.random().toString().slice(2),c=e.timeout||3e4;function u(){clearTimeout(i),delete window[s],o.remove()}window[s]=function(t){"function"===typeof n&&n(t),u()},o.onerror=function(){"function"===typeof r&&r(),u()},i=setTimeout((function(){"function"===typeof r&&r(),u()}),c),o.src=t+(t.indexOf("?")>=0?"&":"?")+a+"="+s,document.body.appendChild(o)}n.d(e,"a",(function(){return r}))},"1efd":function(t,e,n){"use strict";n.r(e),n.d(e,"getWindowInfo",(function(){return a}));var r=n("8d7d"),i=n("f621"),o=n.n(i);function a(){var t=window.screen,e=window.devicePixelRatio,n=/^Apple/.test(navigator.vendor)&&"number"===typeof window.orientation,i=n&&90===Math.abs(window.orientation),a=n?Math[i?"max":"min"](t.width,t.height):t.width,s=n?Math[i?"min":"max"](t.height,t.width):t.height,c=Math.min(window.innerWidth,document.documentElement.clientWidth,a)||a,u=window.innerHeight,l=o.a.top,f={left:o.a.left,right:c-o.a.right,top:o.a.top,bottom:u-o.a.bottom,width:c-o.a.left-o.a.right,height:u-o.a.top-o.a.bottom},d=Object(r["a"])(),h=d.top,p=d.bottom;return u-=h,u-=p,{windowTop:h,windowBottom:p,windowWidth:c,windowHeight:u,pixelRatio:e,screenWidth:a,screenHeight:s,statusBarHeight:l,safeArea:f,safeAreaInsets:{top:o.a.top,right:o.a.right,bottom:o.a.bottom,left:o.a.left},screenTop:s-u}}},"1f8a":function(t,e,n){"use strict";n.r(e);var r=n("909e"),i={name:"Radio",mixins:[r["a"],r["f"]],props:{checked:{type:[Boolean,String],default:!1},id:{type:String,default:""},disabled:{type:[Boolean,String],default:!1},value:{type:String,default:""},color:{type:String,default:"#007AFF"},backgroundColor:{type:String,default:""},borderColor:{type:String,default:""},activeBackgroundColor:{type:String,default:""},activeBorderColor:{type:String,default:""},iconColor:{type:String,default:"#ffffff"}},data:function(){return{radioChecked:this.checked,radioValue:this.value}},computed:{radioStyle:function(){if(this.disabled)return{backgroundColor:"#E1E1E1",borderColor:"#D1D1D1"};var t={};return this.radioChecked?(t.color=this.iconColor,t.backgroundColor=this.activeBackgroundColor||this.color,t.borderColor=this.activeBorderColor||t.backgroundColor):(this.borderColor&&(t.borderColor=this.borderColor),this.backgroundColor&&(t.backgroundColor=this.backgroundColor)),t}},watch:{checked:function(t){this.radioChecked=t},value:function(t){this.radioValue=t}},listeners:{"label-click":"_onClick","@label-click":"_onClick"},created:function(){this.$dispatch("RadioGroup","uni-radio-group-update",{type:"add",vm:this}),this.$dispatch("Form","uni-form-group-update",{type:"add",vm:this})},beforeDestroy:function(){this.$dispatch("RadioGroup","uni-radio-group-update",{type:"remove",vm:this}),this.$dispatch("Form","uni-form-group-update",{type:"remove",vm:this})},methods:{_onClick:function(t){this.disabled||this.radioChecked||(this.radioChecked=!0,this.$dispatch("RadioGroup","uni-radio-change",t,this))},_resetFormData:function(){this.radioChecked=this.min}}},o=i,a=(n("9854"),n("8844")),s=Object(a["a"])(o,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("uni-radio",t._g({attrs:{id:t.id,disabled:t.disabled},on:{click:t._onClick}},t.$listeners),[n("div",{staticClass:"uni-radio-wrapper",style:{"--HOVER-BD-COLOR":t.radioChecked?t.radioStyle.borderColor:t.activeBorderColor}},[n("div",{staticClass:"uni-radio-input",class:{"uni-radio-input-checked":t.radioChecked,"uni-radio-input-disabled":t.disabled},style:t.radioStyle}),t._t("default")],2)])}),[],!1,null,null,null);e["default"]=s.exports},"1fdf":function(t,e,n){},"1fe9":function(t,e,n){var r={"./base/base64.js":"78b7","./base/can-i-use.js":"9bd9","./base/interceptor.js":"c9da","./base/upx2px.js":"c165","./context/audio.js":"e748","./context/background-audio.js":"86d3","./context/canvas.js":"6352","./context/create-map-context.js":"ed2c","./context/create-video-context.js":"e68a","./context/editor.js":"5883","./context/inner-audio.js":"beab","./device/network.js":"1c3e","./device/theme.js":"0426","./keyboard/get-selected-text-range.js":"7958","./keyboard/keyboard.js":"7068","./media/preview-image.js":"7317","./media/recorder.js":"d91a","./network/download-file.js":"cf97","./network/request.js":"dc02","./network/socket.js":"32a0","./network/update.js":"c4cd","./network/upload-file.js":"bceb","./plugin/__f__.js":"61a5","./plugin/push.js":"9f56","./ui/create-animation.js":"a2f6","./ui/create-intersection-observer.js":"a6f2","./ui/create-media-query-observer.js":"a874","./ui/create-selector-query.js":"8379","./ui/load-font-face.js":"fdcd","./ui/locale.js":"ebda","./ui/page-scroll-to.js":"3313","./ui/set-page-meta.js":"be92","./ui/tab-bar.js":"e87f","./ui/window.js":"ccdf"};function i(t){var e=o(t);return n(e)}function o(t){if(!n.o(r,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return r[t]}i.keys=function(){return Object.keys(r)},i.resolve=o,t.exports=i,i.id="1fe9"},2066:function(t,e,n){"use strict";n.r(e);var r={name:"SwiperItem",props:{itemId:{type:String,default:""}},mounted:function(){var t=this.$el;t.style.position="absolute",t.style.width="100%",t.style.height="100%";var e=this.$vnode._callbacks;e&&e.forEach((function(t){t()}))}},i=r,o=(n("95bd"),n("8844")),a=Object(o["a"])(i,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("uni-swiper-item",t._g({},t.$listeners),[t._t("default")],2)}),[],!1,null,null,null);e["default"]=a.exports},"211f":function(t,e,n){"use strict";n.r(e),function(t){n.d(e,"uploadFile",(function(){return s}));var r=n("bdee");function i(t,e){for(var n=0;n=0&&this._callbacks.splice(e,1)}},{key:"abort",value:function(){this._isAbort=!0,this._xhr&&(this._xhr.abort(),delete this._xhr)}}]),t}();function s(e,n){var i=e.url,o=e.file,s=e.filePath,c=e.name,u=e.files,l=e.header,f=e.formData,d=e.timeout,h=void 0===d?__uniConfig.networkTimeout&&__uniConfig.networkTimeout.uploadFile||6e4:d,p=t,v=p.invokeCallbackHandler,g=new a(null,n);return Array.isArray(u)&&u.length||(u=[{name:c,file:o,uri:s}]),Promise.all(u.map((function(t){var e=t.file,n=t.uri;return e instanceof Blob?Promise.resolve(Object(r["a"])(e)):Object(r["f"])(n)}))).then((function(t){var e,r=new XMLHttpRequest,o=new FormData;Object.keys(f).forEach((function(t){o.append(t,f[t])})),Object.values(u).forEach((function(e,n){var r=e.name,i=t[n];o.append(r||"file",i,i.name||"file-".concat(Date.now()))})),r.open("POST",i),Object.keys(l).forEach((function(t){r.setRequestHeader(t,l[t])})),r.upload.onprogress=function(t){g._callbacks.forEach((function(e){var n=t.loaded,r=t.total,i=Math.round(n/r*100);e({progress:i,totalBytesSent:n,totalBytesExpectedToSend:r})}))},r.onerror=function(){clearTimeout(e),v(n,{errMsg:"uploadFile:fail"})},r.onabort=function(){clearTimeout(e),v(n,{errMsg:"uploadFile:fail abort"})},r.onload=function(){clearTimeout(e);var t=r.status;v(n,{errMsg:"uploadFile:ok",statusCode:t,data:r.responseText||r.response})},g._isAbort?v(n,{errMsg:"uploadFile:fail abort"}):(e=setTimeout((function(){r.upload.onprogress=r.onload=r.onabort=r.onerror=null,g.abort(),v(n,{errMsg:"uploadFile:fail timeout"})}),h),r.send(o),g._xhr=r)})).catch((function(){setTimeout((function(){v(n,{errMsg:"uploadFile:fail file error"})}),0)})),g}}.call(this,n("2c9f"))},"21f5":function(t,e,n){},2214:function(t,e,n){"use strict";(function(t){n.d(e,"a",(function(){return y})),n.d(e,"b",(function(){return _})),n.d(e,"d",(function(){return w})),n.d(e,"c",(function(){return k}));var r=n("340d"),i=n("71a4"),o=n("d334"),a=n("0071"),s=n("8b82"),c=n("41cb");function u(t,e,n){var r="".concat(e,":fail ").concat(t);if(-1===n)throw new Error(r);return"number"===typeof n&&y(n,{errMsg:r}),!1}var l=[{name:"callback",type:Function,required:!0}],f=["beforeValidate","beforeAll","beforeSuccess"];function d(t,e,n){var i=s["a"][t];if(!i&&Object(o["a"])(t)&&(i=l),i){if(Array.isArray(i)&&Array.isArray(e)){var a=Object.create(null),d=Object.create(null),h=e.length;i.forEach((function(t,n){a[t.name]=t,h>n&&(d[t.name]=e[n])})),i=a,e=d}if(Object(r["k"])(i.beforeValidate)){var p=i.beforeValidate(e);if(p)return u(p,t,n)}for(var v=Object.keys(i),g=0;g1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!Object(r["l"])(e))return{params:e};e=Object.assign({},e);var o=Object(a["a"])(e),s=o.success,c=o.fail,u=o.cancel,l=o.complete,f=Object(r["k"])(s),d=Object(r["k"])(c),v=Object(r["k"])(u),g=Object(r["k"])(l);if(!f&&!d&&!v&&!g)return{params:e};var m={};for(var b in n){var y=n[b];Object(r["k"])(y)&&(m[b]=Object(i["b"])(y))}var _=m.beforeSuccess,w=m.afterSuccess,x=m.beforeFail,S=m.afterFail,k=m.beforeCancel,C=m.afterCancel,T=m.beforeAll,O=m.afterAll,A=h++,E="api."+t+"."+A,j=function(n){if(n.errMsg=n.errMsg||t+":ok",-1!==n.errMsg.indexOf(":ok"))n.errMsg=t+":ok";else if(-1!==n.errMsg.indexOf(":cancel"))n.errMsg=t+":cancel";else if(-1!==n.errMsg.indexOf(":fail")){var i="",o=n.errMsg.indexOf(" ");o>-1&&(i=n.errMsg.substr(o)),n.errMsg=t+":fail"+i}Object(r["k"])(T)&&T(n);var a=n.errMsg;0===a.indexOf(t+":ok")?(Object(r["k"])(_)&&_(n,e),f&&s(n),Object(r["k"])(w)&&w(n)):0===a.indexOf(t+":cancel")?(n.errMsg=n.errMsg.replace(t+":cancel",t+":fail cancel"),d&&c(n),Object(r["k"])(k)&&k(n),v&&u(n),Object(r["k"])(C)&&C(n)):0===a.indexOf(t+":fail")&&(Object(r["k"])(x)&&x(n),d&&c(n),Object(r["k"])(S)&&S(n)),g&&l(n),Object(r["k"])(O)&&O(n)};return p[A]={name:E,callback:j},{params:e,callbackId:A}}function b(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=m(t,e,n),o=i.params,a=i.callbackId;return Object(r["l"])(o)&&!d(t,o,a)?{params:o,callbackId:!1}:{params:o,callbackId:a}}function y(t,e,n){if("number"===typeof t){var r=p[t];if(r)return r.keepAlive||delete p[t],r.callback(e,n)}return e}function _(t){delete p[t]}function w(e){return function(n){t.error("API `"+e+"` is not yet implemented")}}function x(t,e){var n=s["a"][t];n&&(Object(r["k"])(n.beforeAll)&&(e.beforeAll=n.beforeAll),Object(r["k"])(n.beforeSuccess)&&(e.beforeSuccess=n.beforeSuccess))}var S=["getPushClientId","onPushMessage","offPushMessage"];function k(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return S.indexOf(t)>-1||!Object(r["k"])(e)?e:(x(t,n),function(){for(var i=arguments.length,a=new Array(i),s=0;s0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=[],i=a();if(!i)return n&&t.error("app is not ready"),[];var o=i.$children[0];if(o&&o.$children.length){var s=o.$children.find((function(t){return"TabBar"===t.$options.name})),c=o.$children.find((function(t){return"Layout"===t.$options.name}));c&&(o=c),o.$children.forEach((function(t){if(s!==t&&t.$children.length&&"Page"===t.$children[0].$options.name&&t.$children[0].$slots.page){var n=t.$children[0].$children.find((function(t){return"PageBody"===t.$options.name})),o=n&&n.$children.find((function(t){return!!t.$page}));if(o){var a=!0;!e&&s&&o.$page&&o.$page.meta.isTabBar&&(i.$route.meta&&i.$route.meta.isTabBar?i.$route.path!==o.$page.path&&(a=!1):s.__path__!==o.$page.path&&(a=!1)),a&&r.push(o)}}}))}var u=r.length;if(u>1){var l=r[u-1];l.$page.path!==i.$route.path&&r.splice(u-1,1)}return r}function c(t,e,n){o=e,o.$vm=e,o.globalData=o.$options.globalData||{},Object(r["d"])(t,o),Object(i["a"])(o,n)}}).call(this,n("418b")["default"])},"27d2":function(t,e,n){},"283d":function(t,e,n){"use strict";var r=n("b62a"),i=n.n(r);i.a},"286e":function(t,e,n){"use strict";n.r(e),function(t){n.d(e,"getFileInfo",(function(){return a}));var r=n("bdee"),i=t,o=i.invokeCallbackHandler;function a(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.filePath,n=arguments.length>1?arguments[1]:void 0;Object(r["f"])(e).then((function(t){o(n,{errMsg:"getFileInfo:ok",size:t.size})})).catch((function(t){o(n,{errMsg:"getFileInfo:fail "+t.message})}))}}.call(this,n("2c9f"))},"2a78":function(t,e,n){"use strict";n.r(e);var r=n("9f62"),i=r["a"],o=(n("d638"),n("8844")),a=Object(o["a"])(i,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("uni-label",t._g({class:{"uni-label-pointer":t.pointer},on:{click:t._onClick}},t.$listeners),[t._t("default")],2)}),[],!1,null,null,null);e["default"]=a.exports},"2ace":function(t,e,n){"use strict";(function(t){var r=n("340d");e["a"]={props:{id:{type:String,default:""}},created:function(){var t=this;this._addListeners(this.id),this.$watch("id",(function(e,n){t._removeListeners(n,!0),t._addListeners(e,!0)}))},beforeDestroy:function(){this._removeListeners(this.id)},methods:{_addListeners:function(e,n){var i=this;if(!n||e){var o=this.$options.listeners;Object(r["l"])(o)&&Object.keys(o).forEach((function(r){n?0!==r.indexOf("@")&&0!==r.indexOf("uni-")&&t.on("uni-".concat(r,"-").concat(i.$page.id,"-").concat(e),i[o[r]]):0===r.indexOf("@")?i.$on("uni-".concat(r.substr(1)),i[o[r]]):0===r.indexOf("uni-")?t.on(r,i[o[r]]):e&&t.on("uni-".concat(r,"-").concat(i.$page.id,"-").concat(e),i[o[r]])}))}},_removeListeners:function(e,n){var i=this;if(!n||e){var o=this.$options.listeners;Object(r["l"])(o)&&Object.keys(o).forEach((function(r){n?0!==r.indexOf("@")&&0!==r.indexOf("uni-")&&t.off("uni-".concat(r,"-").concat(i.$page.id,"-").concat(e),i[o[r]]):0===r.indexOf("@")?i.$off("uni-".concat(r.substr(1)),i[o[r]]):0===r.indexOf("uni-")?t.off(r,i[o[r]]):e&&t.off("uni-".concat(r,"-").concat(i.$page.id,"-").concat(e),i[o[r]])}))}}}}}).call(this,n("31d2"))},"2be0":function(t,e,n){"use strict";n.d(e,"a",(function(){return u}));var r=n("340d"),i=n("909e");function o(){this.$dispatch("Form","uni-form-group-update",{type:"add",vm:this})}function a(){this.$dispatch("Form","uni-form-group-update",{type:"remove",vm:this})}var s={name:"uni://form-field",init:function(t,e){e.constructor.options.props&&e.constructor.options.props.name&&e.constructor.options.props.value||(e.constructor.options.props||(e.constructor.options.props={}),e.constructor.options.props.name||(e.constructor.options.props.name=t.props.name={type:String}),e.constructor.options.props.value||(e.constructor.options.props.value=t.props.value={type:null})),t.propsData||(t.propsData={});var n=e.$vnode;if(n&&n.data&&n.data.attrs&&(Object(r["i"])(n.data.attrs,"name")&&(t.propsData.name=n.data.attrs.name),Object(r["i"])(n.data.attrs,"value")&&(t.propsData.value=n.data.attrs.value)),!e.constructor.options.methods||!e.constructor.options.methods._getFormData){e.constructor.options.methods||(e.constructor.options.methods={}),t.methods||(t.methods={});var s={_getFormData:function(){return this.name?{key:this.name,value:this.value}:{}},_resetFormData:function(){this.value=""}};Object.assign(e.constructor.options.methods,s),Object.assign(t.methods,s),Object.assign(e.constructor.options.methods,i["a"].methods),Object.assign(t.methods,i["a"].methods);var c=t.created;e.constructor.options.created=t.created=c?[].concat(o,c):[o];var u=t.beforeDestroy;e.constructor.options.beforeDestroy=t.beforeDestroy=u?[].concat(a,u):[a]}}};var c=function(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}({},s.name,s);function u(t,e){t.behaviors.forEach((function(n){var r=c[n];r&&r.init(t,e)}))}},"2c9f":function(t,e,n){"use strict";n.r(e),n.d(e,"on",(function(){return c})),n.d(e,"off",(function(){return u})),n.d(e,"once",(function(){return l})),n.d(e,"emit",(function(){return f})),n.d(e,"subscribe",(function(){return d})),n.d(e,"unsubscribe",(function(){return h})),n.d(e,"subscribeHandler",(function(){return p}));var r=n("951c"),i=n.n(r),o=n("2214");n.d(e,"invokeCallbackHandler",(function(){return o["a"]})),n.d(e,"removeCallbackHandler",(function(){return o["b"]}));var a=n("89ec");n.d(e,"publishHandler",(function(){return a["b"]}));var s=new i.a,c=s.$on.bind(s),u=s.$off.bind(s),l=s.$once.bind(s),f=s.$emit.bind(s);function d(t,e){return c("view."+t,e)}function h(t,e){return u("view."+t,e)}function p(t,e,n){return f("view."+t,e,n)}},"2d10":function(t,e,n){},"2daf":function(t,e,n){"use strict";n.r(e),function(t){function r(){return window.location.protocol+"//"+window.location.host}function i(e,n){var i=e.src,o=t,a=o.invokeCallbackHandler,s=new Image,c=i;s.onload=function(){a(n,{errMsg:"getImageInfo:ok",width:s.naturalWidth,height:s.naturalHeight,path:0===c.indexOf("/")?r()+c:c})},s.onerror=function(t){a(n,{errMsg:"getImageInfo:fail"})},s.src=i}n.d(e,"getImageInfo",(function(){return i}))}.call(this,n("2c9f"))},"2eb1":function(t,e,n){"use strict";var r=n("0c61"),i=n.n(r);i.a},"2f5c":function(t,e,n){"use strict";n.r(e),n.d(e,"TEMP_PATH",(function(){return r}));var r=""},"31d2":function(t,e,n){"use strict";n.r(e),n.d(e,"on",(function(){return p})),n.d(e,"off",(function(){return v})),n.d(e,"once",(function(){return g})),n.d(e,"emit",(function(){return m})),n.d(e,"subscribe",(function(){return b})),n.d(e,"unsubscribe",(function(){return y})),n.d(e,"subscribeHandler",(function(){return _})),n.d(e,"publishHandler",(function(){return d["a"]}));var r=n("951c"),i=n.n(r);var o=n("49c2"),a=n("d661"),s=n("c08f"),c={setPageMeta:function(t){var e=t.pageStyle,n=t.rootFontSize,r=document.querySelector("uni-page-body")||document.body;r.setAttribute("style",e),n&&document.documentElement.style.fontSize!==n&&(document.documentElement.style.fontSize=n)},requestComponentInfo:o["a"],requestComponentObserver:a["b"],destroyComponentObserver:a["a"],requestMediaQueryObserver:s["b"],destroyMediaQueryObserver:s["a"]},u=n("493f"),l=n("fa95"),f=n("83ee");var d=n("a805"),h=new i.a,p=h.$on.bind(h),v=h.$off.bind(h),g=h.$once.bind(h),m=h.$emit.bind(h);function b(t,e){return p("service."+t,e)}function y(t,e){return v("service."+t,e)}function _(t,e,n){m("service."+t,e,n)}(function(t){Object.keys(c).forEach((function(e){t(e,c[e])})),t("pageScrollTo",u["c"]),t("loadFontFace",l["a"]),Object(f["a"])(t)})(b)},"32a0":function(t,e,n){"use strict";n.r(e),n.d(e,"connectSocket",(function(){return l})),n.d(e,"sendSocketMessage",(function(){return f})),n.d(e,"closeSocket",(function(){return d})),n.d(e,"onSocketOpen",(function(){return h})),n.d(e,"onSocketError",(function(){return p})),n.d(e,"onSocketMessage",(function(){return v})),n.d(e,"onSocketClose",(function(){return g}));var r=n("9131"),i=n("745a");function o(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},e=t.success,n=t.fail,r=t.complete,i=arguments.length>1?arguments[1]:void 0,o={errMsg:i};/:ok$/.test(i)?"function"===typeof e&&e(o):"function"===typeof n&&n(o),"function"===typeof r&&r(o)}}]),t}(),s=Object.create(null),c=[],u=Object.create(null);function l(t,e){var n=Object(i["c"])("createSocketTask",t),o=n.socketTaskId,u=new a(o);return s[o]=u,c.push(u),setTimeout((function(){Object(r["a"])(e,{errMsg:"connectSocket:ok"})}),0),u}function f(t,e){var n=c[0];if(n&&n.readyState===n.OPEN)return Object(i["c"])("operateSocketTask",Object.assign({},t,{operationType:"send",socketTaskId:n.id}));Object(r["a"])(e,{errMsg:"sendSocketMessage:fail WebSocket is not connected"})}function d(t,e){var n=c[0];if(n)return n.readyState=n.CLOSING,Object(i["c"])("operateSocketTask",Object.assign({},t,{operationType:"close",socketTaskId:n.id}));Object(r["a"])(e,{errMsg:"closeSocket:fail WebSocket is not connected"})}function h(t){u.open=t}function p(t){u.error=t}function v(t){u.message=t}function g(t){u.close=t}Object(i["d"])("onSocketTaskStateChange",(function(t){var e=t.socketTaskId,n=t.state,i=t.data,o=t.code,a=t.reason,l=(t.errMsg,s[e]);if(l){var f="message"===n?{data:i}:"close"===n?{code:o,reason:a}:{};if("open"===n&&(l.readyState=l.OPEN),l===c[0]&&u[n]&&Object(r["a"])(u[n],f),"error"===n||"close"===n){l.readyState=l.CLOSED,delete s[e];var d=c.indexOf(l);d>=0&&c.splice(d,1)}l._callbacks[n].forEach((function(t){"function"===typeof t&&t(f)}))}}))},3313:function(t,e,n){"use strict";n.r(e),function(t){function r(e){var n=getCurrentPages();return n.length&&t.publishHandler("pageScrollTo",e,n[n.length-1].$page.id),{}}n.d(e,"pageScrollTo",(function(){return r}))}.call(this,n("2c9f"))},"33b2":function(t,e,n){"use strict";function r(t){var e=t.service;return{service:e,provider:[]}}n.r(e),n.d(e,"getProvider",(function(){return r}))},"33e2":function(t,e,n){"use strict";n.r(e);var r=n("44f1"),i=n.n(r),o=n("909e");function a(t,e,n,r,i,o,a){try{var s=t[o](a),c=s.value}catch(u){return void n(u)}s.done?e(c):Promise.resolve(c).then(r,i)}function s(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;nthis.CACHE_TIME}}]),t}();l(f,"IC",0),l(f,"IS",0),Object.assign(f.prototype,{URL:"https://hac1.dcloud.net.cn/ah5",KEY:"uni_app_ad_config",CACHE_TIME:6e5,ERROR_INVALID_ADPID:{"-5002":"invalid adpid"}});var d=function(){function t(){s(this,t),this._instance=null,this._adConfig=null,this._guid=null}return u(t,null,[{key:"instance",get:function(){return null==this._instance&&(this._instance=new t,this._instance._init()),this._instance}}]),u(t,[{key:"_init",value:function(){var t=this._getConfig();null!==t&&t.guid?this._guid=t.guid:(this._guid=this._newGUID(),this._setConfig(this._guid))}},{key:"get",value:function(t){this._process(Object.assign(t,{d:location.hostname,i:this._guid}))}},{key:"_process",value:function(t){uni.request({url:this.URL,method:"GET",data:t,dataType:"json",success:function(){}})}},{key:"_newGUID",value:function(){for(var t="",e="xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx",n=0;nparseInt(this.widescreenWidth),this._loadData(),d.instance.get({h:__uniConfig.compilerVersion,a:this.adpid,at:-3,ic:f.IC,is:f.IS})},beforeDestroy:function(){this._clearCheckTimer(),this.$refs.container.innerHTML="",this._shanhuAd&&delete this._shanhuAd},methods:{_onhandle:function(t){this._report(41)},_reset:function(){this._pd={},this._pl=[],this._pi=0,this._clearCheckTimer(),this.$refs.container.innerHTML="",this._isReady=!1},_loadData:function(t){var e=this;this._reset();var n=t||this.adpid,r=this._isWidescreen&&this.adpidWidescreen||n;f.instance.get(r,(function(t,n){e._ab=t,e._pl=n,e._renderAd()}),(function(t){e.$trigger("error",{},t)}))},_renderAd:function(){var t=this;if(!(this._pi>this._pl.length-1)){var e=this._pl[this._pi],n=this._ab[e.a1][e.t],r=n.script;this._currentChannel=e.a1;var i=this._randomId(),o=this._createView(i);"10023"===e.a1?h.instance.load(e.t,r,(function(){t._renderShanhu(i,e)}),(function(e){t.$trigger("error",{},e)})):"10010"===e.a1?h.instance.load(e.t,r,(function(){t._renderBaidu(i,e.a2)}),(function(e){t.$trigger("error",{},e)})):"10012"===e.a1?this._renderScript(o,r):h.instance.load(e.t,r,(function(){t._renderAdView(i,r.s,e)}),(function(e){t.$trigger("error",{},e)}))}},_createView:function(t){var e=document.createElement("div");return e.setAttribute("id",t),e.setAttribute("class",t),this.$refs.container.innerHTML="",this.$refs.container.append(e),e},_renderScript:function(t,e){var n=document.createElement("script");for(var r in e)n.setAttribute(r,e[r]);t.appendChild(n),this._startCheckTimer()},_renderBaidu:function(t,e){(window.slotbydup=window.slotbydup||[]).push({id:e,container:t,async:!0}),this._startCheckTimer()},_renderAdView:function(t,e,n){var r=window;e.split(".").reduce((function(t,e){return r=t,t[e]}),window).bind(r)(n.a2,t,2),this._startCheckTimer()},_renderShanhu:function(t,e){var n=this,r=new window.CoralAdv({app_id:e.a2,placement_id:e.a3,type:e.a4,display_type:e.a5,container_id:t,count:e.a6||1});r.ready().then(function(){var t=function(t){return function(){var e=this,n=arguments;return new Promise((function(r,i){var o=t.apply(e,n);function s(t){a(o,r,i,s,c,"next",t)}function c(t){a(o,r,i,s,c,"throw",t)}s(void 0)}))}}(i.a.mark((function t(e){return i.a.wrap((function(t){while(1)switch(t.prev=t.next){case 0:0===e.ret?n.$trigger("load",{},{}):n.$trigger("error",{},e);case 1:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}()).catch((function(t){n.$trigger("error",{},t)})),this._startCheckTimer()},_renderNext:function(){this._pi>=this._pl.length-1||(this._pi++,this._renderAd())},_checkRender:function(){var t=this.$refs.container.children.length>0&&this.$refs.container.clientHeight>40;return t&&this._report(40,this._currentChannel),t},_startCheckTimer:function(){var t=this;this._clearCheckTimer(),this._checkTimer=setInterval((function(){if(t._checkTimerCount++,t._checkTimerCount>=5)return t._clearCheckTimer(),void t._renderNext();t._checkRender()&&t._clearCheckTimer()}),1e3)},_clearCheckTimer:function(){this._checkTimerCount=0,null!=this._checkTimer&&(window.clearInterval(this._checkTimer),this._checkTimer=null)},_report:function(t,e){var n={h:__uniConfig.compilerVersion,a:this.adpid,at:t};e&&(n.t=e),d.instance.get(n)},_randomId:function(){for(var t="",e=0;e<4;e++)t+=(65536*(1+Math.random())|0).toString(16).substring(1);return"_u"+t}}},v=p,g=(n("c885"),n("8844")),m=Object(g["a"])(v,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("uni-ad",t._g(t._b({},"uni-ad",t.attrs,!1),t.$listeners),[n("div",{ref:"container",staticClass:"uni-ad-container",on:{click:t._onhandle}})])}),[],!1,null,null,null);e["default"]=m.exports},"340d":function(t,e,n){"use strict";n.d(e,"t",(function(){return i})),n.d(e,"k",(function(){return p})),n.d(e,"m",(function(){return v})),n.d(e,"l",(function(){return m})),n.d(e,"i",(function(){return b})),n.d(e,"v",(function(){return y})),n.d(e,"p",(function(){return w})),n.d(e,"b",(function(){return S})),n.d(e,"c",(function(){return k})),n.d(e,"r",(function(){return C})),n.d(e,"h",(function(){return T})),n.d(e,"g",(function(){return O})),n.d(e,"x",(function(){return A})),n.d(e,"d",(function(){return E})),n.d(e,"u",(function(){return j})),n.d(e,"n",(function(){return I})),n.d(e,"f",(function(){return M})),n.d(e,"w",(function(){return u})),n.d(e,"s",(function(){return P})),n.d(e,"j",(function(){return R})),n.d(e,"e",(function(){return D})),n.d(e,"q",(function(){return B})),n.d(e,"a",(function(){return H})),n.d(e,"o",(function(){return V}));var r,i=!1;try{var o={};Object.defineProperty(o,"passive",{get:function(){i=!0}}),window.addEventListener("test-passive",null,o)}catch(Y){}var a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",s=/^(?:[A-Za-z\d+/]{4})*?(?:[A-Za-z\d+/]{2}(?:==)?|[A-Za-z\d+/]{3}=?)?$/;function c(){var t,e=uni.getStorageSync("uni_id_token")||"",n=e.split(".");if(!e||3!==n.length)return{uid:null,role:[],permission:[],tokenExpired:0};try{t=JSON.parse(function(t){return decodeURIComponent(r(t).split("").map((function(t){return"%"+("00"+t.charCodeAt(0).toString(16)).slice(-2)})).join(""))}(n[1]))}catch(r){throw new Error("获取当前用户信息出错,详细错误信息为:"+r.message)}return t.tokenExpired=1e3*t.exp,delete t.exp,delete t.iat,t}function u(t){t.prototype.uniIDHasRole=function(t){var e=c(),n=e.role;return n.indexOf(t)>-1},t.prototype.uniIDHasPermission=function(t){var e=c(),n=e.permission;return this.uniIDHasRole("admin")||n.indexOf(t)>-1},t.prototype.uniIDTokenValid=function(){var t=c(),e=t.tokenExpired;return e>Date.now()}}r="function"!==typeof atob?function(t){if(t=String(t).replace(/[\t\n\f\r ]+/g,""),!s.test(t))throw new Error("Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.");var e;t+="==".slice(2-(3&t.length));for(var n,r,i="",o=0;o>16&255):64===r?String.fromCharCode(e>>16&255,e>>8&255):String.fromCharCode(e>>16&255,e>>8&255,255&e);return i}:atob;var l=Object.prototype.toString,f=Object.prototype.hasOwnProperty,d=function(t){return t>9?t:"0"+t},h=Array.isArray;function p(t){return"function"===typeof t}function v(t){return"string"===typeof t}Object.assign;var g=v;function m(t){return"[object Object]"===l.call(t)}function b(t,e){return f.call(t,e)}function y(t){return l.call(t).slice(8,-1)}function _(t){var e=Object.create(null);return function(n){var r=e[n];return r||(e[n]=t(n))}}function w(t){var e,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return function(){if(t){for(var r=arguments.length,i=new Array(r),o=0;o0&&void 0!==arguments[0]?arguments[0]:"";return(""+t).replace(/[^\x00-\xff]/g,"**").length}function O(t){var e=t.date,n=void 0===e?new Date:e,r=t.mode,i=void 0===r?"date":r;return"time"===i?d(n.getHours())+":"+d(n.getMinutes()):n.getFullYear()+"-"+d(n.getMonth()+1)+"-"+d(n.getDate())}function A(t,e){for(var n in e)t.style[n]=e[n]}function E(t,e){var n,r=function(){var r=arguments,i=this;clearTimeout(n);var o=function(){return t.apply(i,r)};n=setTimeout(o,e)};return r.cancel=function(){clearTimeout(n)},r}function j(t,e){var n,r,i=0,o=function(){for(var o=this,a=arguments.length,s=new Array(a),c=0;ct.length)&&(e=t.length);for(var n=0,r=new Array(e);n0&&void 0!==arguments[0]?arguments[0]:{},e={};return Object.keys(t).forEach((function(n){try{e[n]=N(t[n])}catch(Y){e[n]=t[n]}})),e}function B(t){if("function"===typeof t)return window.plus?t():void document.addEventListener("plusready",t)}var F=0,z={};function W(t,e){var n=z[t]||{};delete z[t];var r=e.errMsg||"";new RegExp("\\:\\s*fail").test(r)?n.fail&&n.fail(e):n.success&&n.success(e),n.complete&&n.complete(e)}var H={warp:function(t){return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=String(F++);z[n]={success:e.success,fail:e.fail,complete:e.complete};var r=Object.assign({},e),i=t.bind(this)(r,n);i&&W(n,i)}},invoke:W},U={black:"rgba(0,0,0,0.4)",white:"rgba(255,255,255,0.4)"};function q(t,e,n){if(g(e)&&e.startsWith("@")){var r=e.replace("@",""),i=t[r]||e;switch(n){case"titleColor":i=function(t){return"black"===t?"#000000":"#ffffff"}(i);break;case"borderStyle":i=function(t){return t&&t in U?U[t]:t}(i);break;default:break}return i}return e}function V(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"light",r=e[n],i={};return"undefined"!==typeof r&&t?(Object.keys(t).forEach((function(o){var a=t[o];i[o]=function(){return m(a)?V(a,e,n):h(a)?a.map((function(t){return m(t)?V(t,e,n):q(r,t)})):q(r,a,o)}()})),i):t}},3596:function(t,e,n){},"36a6":function(t,e,n){},"383e":function(t,e,n){"use strict";n.r(e);var r=n("39bd"),i=n("340d");function o(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function a(t){for(var e=1;ethis.displayMultipleItemsNumber},circularEnabled:function(){return this.circular&&this.swiperEnabled}},watch:{vertical:function(){this._resetLayout()},circular:function(){this._resetLayout()},intervalNumber:function(t){this._timer&&(this._cancelSchedule(),this._scheduleAutoplay())},current:function(t){this._currentCheck()},currentSync:function(t,e){this._currentChanged(t,e),this.$emit("update:current",t),this._setNavigationState()},currentItemId:function(t){this._currentCheck()},currentItemIdSync:function(t){this.$emit("update:currentItemId",t)},displayMultipleItemsNumber:function(){this._resetLayout()},navigation:{immediate:!0,handler:function(t){this.isNavigationAuto="auto"===t,this.hideNavigation=!0!==t||this.isNavigationAuto,this._navigationSwiperAddMouseEvent()}},items:function(){this._setNavigationState()},swiperEnabled:function(t){t||(this.prevDisabled=!0,this.nextDisabled=!0,this.isNavigationAuto&&(this.hideNavigation=!0))}},created:function(){this._invalid=!0,this._viewportPosition=0,this._viewportMoveRatio=1,this._animating=null,this._requestedAnimation=!1,this._userDirectionChecked=!1,this._contentTrackViewport=0,this._contentTrackSpeed=0,this._contentTrackT=0},mounted:function(){var t=this;this._currentCheck(),this.touchtrack(this.$refs.slidesWrapper,"_handleContentTrack",!0),this._resetLayout(),this.$watch((function(){return t.autoplay&&!t.userTracking}),this._inintAutoplay),this._inintAutoplay(this.autoplay&&!this.userTracking),this.$watch("items.length",this._resetLayout),this._navigationSwiperAddMouseEvent()},beforeDestroy:function(){this._cancelSchedule(),cancelAnimationFrame(this._animationFrame)},methods:{_inintAutoplay:function(t){t?this._scheduleAutoplay():this._cancelSchedule()},_currentCheck:function(){var t=-1;if(this.currentItemId)for(var e=0,n=this.items;ei/2?1:0)}var o=this.items[t];o&&this._itemReady(o,(function(){var t=n.currentItemIdSync=o.componentInstance.itemId||"";n.$trigger("change",{},{current:n.currentSync,currentItemId:t,source:r})}))},_scheduleAutoplay:function(){var t=this;this._cancelSchedule(),!this._isMounted||this._invalid||this.items.length<=this.displayMultipleItemsNumber||(this._timer=setTimeout((function e(){t._timer=null,t.currentChangeSource="autoplay",t.circularEnabled?t.currentSync=t._normalizeCurrentValue(t.currentSync+1):t.currentSync=t.currentSync+t.displayMultipleItemsNumbere-this.displayMultipleItemsNumber)return e-this.displayMultipleItemsNumber;return n},_upx2px:function(t){return/\d+[ur]px$/i.test(t)&&t.replace(/\d+[ur]px$/i,(function(t){return"".concat(uni.upx2px(parseFloat(t)),"px")})),t||""},_resetLayout:function(){if(this._isMounted){this._cancelSchedule(),this._endViewportAnimation();for(var t=this.items,e=0;e0&&this._viewportMoveRatio<1||(this._viewportMoveRatio=1)}var i=this._viewportPosition;this._viewportPosition=-2;var o=this.currentSync;o>=0?(this._invalid=!1,this.userTracking?(this._updateViewport(i+o-this._contentTrackViewport),this._contentTrackViewport=o):(this._updateViewport(o),this.autoplay&&this._scheduleAutoplay())):(this._invalid=!0,this._updateViewport(-this.displayMultipleItemsNumber-1))}},_checkCircularLayout:function(t){if(!this._invalid)for(var e=this.items,n=e.length,r=t+this.displayMultipleItemsNumber,i=0;i=this.items.length&&(t-=this.items.length),t=this._transitionStart%1>.5||this._transitionStart<0?t-1:t,this.$trigger("transition",{},{dx:this.vertical?0:t*i.offsetWidth,dy:this.vertical?t*i.offsetHeight:0})},_animateFrameFuncProto:function(){var t=this;if(this._animating){var e=this._animating,n=e.toPos,r=e.acc,i=e.endTime,o=e.source,a=i-Date.now();if(a<=0){this._updateViewport(n),this._animating=null,this._requestedAnimation=!1,this._transitionStart=null;var s=this.items[this.currentSync];s&&this._itemReady(s,(function(){var e=s.componentInstance.itemId||"";t.$trigger("animationfinish",{},{current:t.currentSync,currentItemId:e,source:o})}))}else{var c=r*a*a/2,u=n+c;this._updateViewport(u),this._animationFrame=requestAnimationFrame(this._animateFrameFuncProto.bind(this))}}else this._requestedAnimation=!1},_animateViewport:function(t,e,n){this._cancelViewportAnimation();var r=this.durationNumber,i=this.items.length,o=this._viewportPosition;if(this.circularEnabled)if(n<0){for(;ot;)o-=i}else if(n>0){for(;o>t;)o-=i;for(;o+it;)o-=i;o+i-ti)&&(r<0?r=-o(-r):r>i&&(r=i+o(r-i)),e._contentTrackSpeed=0),e._updateViewport(r)}var s=this._contentTrackT-n||1;this.vertical?a(-t.dy/this.$refs.slideFrame.offsetHeight,-t.ddy/s):a(-t.dx/this.$refs.slideFrame.offsetWidth,-t.ddx/s)},_handleTrackEnd:function(t){this.userTracking=!1;var e=this._contentTrackSpeed/Math.abs(this._contentTrackSpeed),n=0;!t&&Math.abs(this._contentTrackSpeed)>.2&&(n=.5*e);var r=this._normalizeCurrentValue(this._viewportPosition+n);t?this._updateViewport(this._contentTrackViewport):(this.currentChangeSource="touch",this.currentSync=r,this._animateViewport(r,"touch",0!==n?n:0===r&&this.circularEnabled&&this._viewportPosition>=1?1:0))},_handleContentTrack:function(t){if(!this.disableTouch&&this.items.length&&!this._invalid){if("start"===t.detail.state)return this.userTracking=!0,this._userDirectionChecked=!1,this._handleTrackStart();if("end"===t.detail.state)return this._handleTrackEnd(!1);if("cancel"===t.detail.state)return this._handleTrackEnd(!0);if(this.userTracking){if(!this._userDirectionChecked){this._userDirectionChecked=!0;var e=Math.abs(t.detail.dx),n=Math.abs(t.detail.dy);if((e>=n&&this.vertical||e<=n&&!this.vertical)&&(this.userTracking=!1),!this.userTracking)return void(this.autoplay&&this._scheduleAutoplay())}return this._handleTrackMove(t.detail),!1}}},_onSwiperDotClick:function(t){this._animateViewport(this.currentSync=t,this.currentChangeSource="click",this.circularEnabled?1:0)},_navigationClick:function(t,e,n){if(t.stopPropagation(),!n){var r=this.items.length,i=this.currentSync;switch(e){case"prev":i--,i<0&&this.circularEnabled&&(i=r-1);break;case"next":i++,i>=r&&this.circularEnabled&&(i=0);break}this._onSwiperDotClick(i)}},_navigationMouseMove:function(t){var e=this;clearTimeout(this.hideNavigationTimer);var n,r=t.clientX,i=t.clientY,o=this.$refs.slidesWrapper.getBoundingClientRect(),a=o.left,s=o.right,c=o.top,u=o.bottom,l=o.width,f=o.height;n=this.vertical?!(i-c=t}},render:function(t){var e=this,n=[],r=[];this.$slots.default&&Object(i["f"])(this.$slots.default,t).forEach((function(t){t.componentOptions&&"v-uni-swiper-item"===t.componentOptions.tag&&r.push(t)}));for(var o=function(r,i){var o=e.currentSync;n.push(t("div",{on:{click:function(){return e._onSwiperDotClick(r)}},class:{"uni-swiper-dot":!0,"uni-swiper-dot-active":r=o||r0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;return Array.isArray(t[e])&&t[e].length}function s(t){var e={},n=t.__vue__;function i(t,n){var i=t.$attrs;for(var o in i)if(o.startsWith("data-")){var a=Object(r["b"])(o.substr(5).toLowerCase()),s=i[o];e[a]=n?s:e[a]||s}}if(n){var o=n;while(o&&o.$el===t)i(o),o=o.$children[0];var a=n.$parent;while(a&&a.$el===t)i(a,!0),a=a.$parent}else e=Object.assign({},t.dataset,t.__uniDataset);return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=JSON.parse(JSON.stringify(t)),n=Object.keys(e),r=n.length;if(r)for(var i=0;i=0&&i.splice(e,1)}i.length||a()}}.call(this,n("2c9f"))},"39bd":function(t,e,n){"use strict";var r=function(t,e,n,r){t.addEventListener(e,(function(t){"function"===typeof n&&!1===n(t)&&(t.preventDefault(),t.stopPropagation())}),{capture:r,passive:!1})};e["a"]={beforeDestroy:function(){document.removeEventListener("mousemove",this.__mouseMoveEventListener),document.removeEventListener("mouseup",this.__mouseUpEventListener)},methods:{touchtrack:function(t,e,n){var i,o,a,s=this,c=this,u=0,l=0,f=0,d=0,h=function(t,n,r,i){if(!1===c[e]({target:t.target,currentTarget:t.currentTarget,preventDefault:t.preventDefault.bind(t),stopPropagation:t.stopPropagation.bind(t),touches:t.touches,changedTouches:t.changedTouches,detail:{state:n,x:r,y:i,dx:r-u,dy:i-l,ddx:r-f,ddy:i-d,timeStamp:t.timeStamp}}))return!1},p=null;r(t,"touchstart",(function(t){if(o=!0,1===t.touches.length&&!p)return p=t,u=f=t.touches[0].pageX,l=d=t.touches[0].pageY,h(t,"start",u,l)})),r(t,"mousedown",(function(t){if(a=!0,!o&&!p)return p=t,u=f=t.pageX,l=d=t.pageY,h(t,"start",u,l)})),r(t,"touchmove",(function(t){if(1===t.touches.length&&p){var e=h(t,"move",t.touches[0].pageX,t.touches[0].pageY);return f=t.touches[0].pageX,d=t.touches[0].pageY,e}}));var v=this.__clickEventListener=function(t){t.preventDefault(),t.stopPropagation()},g=this.__mouseMoveEventListener=function(t){if(!o&&a&&p){!i&&(Math.abs(f-u)>2||Math.abs(d-l)>2)&&(document.addEventListener("click",v,!0),i=!0);var e=h(t,"move",t.pageX,t.pageY);return f=t.pageX,d=t.pageY,e}};document.addEventListener("mousemove",g),r(t,"touchend",(function(t){if(0===t.touches.length&&p)return o=!1,p=null,h(t,"end",t.changedTouches[0].pageX,t.changedTouches[0].pageY)}));var m=this.__mouseUpEventListener=function(t){if(a=!1,!o&&p)return i&&setTimeout((function(){document.removeEventListener("click",s.__clickEventListener,!0),i=!1}),0),p=null,h(t,"end",t.pageX,t.pageY)};document.addEventListener("mouseup",m),r(t,"touchcancel",(function(t){if(p){o=!1;var e=p;return p=null,h(t,n?"cancel":"end",e.touches[0].pageX,e.touches[0].pageY)}}))}}}},"3a3e":function(t,e,n){"use strict";n.r(e);var r=n("909e"),i={name:"RadioGroup",mixins:[r["a"],r["f"]],props:{name:{type:String,default:""}},data:function(){return{radioList:[]}},listeners:{"@radio-change":"_changeHandler","@radio-group-update":"_radioGroupUpdateHandler"},mounted:function(){this._resetRadioGroupValue(this.radioList.length-1)},created:function(){this.$dispatch("Form","uni-form-group-update",{type:"add",vm:this})},beforeDestroy:function(){this.$dispatch("Form","uni-form-group-update",{type:"remove",vm:this})},methods:{_changeHandler:function(t,e){var n=this.radioList.indexOf(e);this._resetRadioGroupValue(n,!0),this.$trigger("change",t,{value:e.radioValue})},_radioGroupUpdateHandler:function(t){if("add"===t.type)this.radioList.push(t.vm);else{var e=this.radioList.indexOf(t.vm);this.radioList.splice(e,1)}},_resetRadioGroupValue:function(t,e){var n=this;this.radioList.forEach((function(r,i){i!==t&&(e?n.radioList[i].radioChecked=!1:n.radioList.forEach((function(t,e){i>=e||n.radioList[e].radioChecked&&(n.radioList[i].radioChecked=!1)})))}))},_getFormData:function(){var t={};if(""!==this.name){var e="";this.radioList.forEach((function(t){t.radioChecked&&(e=t.value)})),t.value=e,t.key=this.name}return t}}},o=i,a=(n("01aa"),n("8844")),s=Object(a["a"])(o,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("uni-radio-group",t._g({},t.$listeners),[t._t("default")],2)}),[],!1,null,null,null);e["default"]=s.exports},"3acf":function(t,e,n){"use strict";n.r(e),n.d(e,"pageScrollTo",(function(){return r}));var r={scrollTop:{type:Number},duration:{type:Number,default:300,validator:function(t,e){e.duration=Math.max(0,t)}}}},"3b2d":function(t,e,n){"use strict";n.r(e),n.d(e,"$on",(function(){return s})),n.d(e,"$off",(function(){return c})),n.d(e,"$once",(function(){return u})),n.d(e,"$emit",(function(){return l}));var r=n("951c"),i=n.n(r),o=new i.a;function a(t,e,n){return t[e].apply(t,n)}function s(){return a(o,"$on",Array.prototype.slice.call(arguments))}function c(){return a(o,"$off",Array.prototype.slice.call(arguments))}function u(){return a(o,"$once",Array.prototype.slice.call(arguments))}function l(){return a(o,"$emit",Array.prototype.slice.call(arguments))}},"3b8d":function(t,e,n){"use strict";n.r(e),n.d(e,"scanCode",(function(){return r}));var r={onlyFromCamera:{type:Boolean},scanType:{type:Array},autoDecodeCharSet:{type:Boolean},sound:{type:String,default:"none"},autoZoom:{type:Boolean,default:!0}}},"3bbb":function(t,e,n){"use strict";n.r(e),n.d(e,"compressVideo",(function(){return i}));var r=n("4738"),i={src:{type:String,required:!0,validator:function(t,e){e.src=Object(r["a"])(t)}},quality:{type:String},bitrate:{type:Number},fps:{type:Number},resolution:{type:Number}}},"3bd6":function(t,e,n){"use strict";n.r(e),n.d(e,"setTabBarItem",(function(){return a})),n.d(e,"setTabBarStyle",(function(){return s})),n.d(e,"hideTabBar",(function(){return c})),n.d(e,"showTabBar",(function(){return u})),n.d(e,"hideTabBarRedDot",(function(){return l})),n.d(e,"showTabBarRedDot",(function(){return f})),n.d(e,"removeTabBarBadge",(function(){return d})),n.d(e,"setTabBarBadge",(function(){return h}));var r=n("340d"),i=n("4738"),o={type:Number,required:!0},a={index:o,text:{type:String},iconPath:{type:String},selectedIconPath:{type:String},pagePath:{type:String}},s={color:{type:String},selectedColor:{type:String},backgroundColor:{type:String},backgroundImage:{type:String,validator:function(t,e){t&&!/^(linear|radial)-gradient\(.+?\);?$/.test(t)&&(e.backgroundImage=Object(i["a"])(t))}},backgroundRepeat:{type:String},borderStyle:{type:String,validator:function(t,e){t&&(e.borderStyle="black"===t?"black":"white")}}},c={animation:{type:Boolean,default:!1}},u={animation:{type:Boolean,default:!1}},l={index:o},f={index:o},d={index:o},h={index:o,text:{type:String,required:!0,validator:function(t,e){Object(r["h"])(t)>=4&&(e.text="...")}}}},"3c5f":function(t,e,n){"use strict";var r=n("df50"),i=n.n(r);i.a},"3d1e":function(t,e,n){"use strict";(function(t){n.d(e,"e",(function(){return u})),n.d(e,"d",(function(){return l})),n.d(e,"a",(function(){return d}));var r=n("cff9"),i=n("2626");n.d(e,"b",(function(){return i["b"]})),n.d(e,"c",(function(){return i["c"]}));var o=Object.assign;function a(){return{path:"",query:{},scene:1001,referrerInfo:{appId:"",extraData:{}}}}var s=a(),c=a();function u(){return c}function l(){return s}function f(t){var e=t.path,n=t.query,r=t.referrerInfo;return o(c,{path:e,query:n||{},referrerInfo:r||{}}),o(s,c),c}function d(e,n,o){return{created:function(){Object(i["a"])(e,this,n),o.meta.name||t.emit("onPageNotFound",{path:o.path,query:o.query,isEntryPage:!0})},beforeMount:function(){this.$el=document.getElementById("app")},mounted:function(){f({path:this.$route.meta&&this.$route.meta.pagePath,query:this.$route.query}),Object(r["a"])(this,"onLaunch",c),Object(r["a"])(this,"onShow",s)}}}}).call(this,n("2c9f"))},"3d8f":function(t,e,n){"use strict";var r=n("f5e7"),i=n.n(r);i.a},"3e92":function(t,e,n){"use strict";var r=n("d0aa"),i=n.n(r);i.a},"3fc5":function(t,e,n){"use strict";n.r(e),n.d(e,"downloadFile",(function(){return r}));var r={url:{type:String,required:!0},header:{type:Object,validator:function(t,e){e.header=t||{}}}}},"418b":function(t,e,n){"use strict";n.r(e),function(t){var n=Array.prototype.unshift;function r(t){return n.call(t,"[system]"),t}function i(e){return function(){var n=!0;"debug"!==e||__uniConfig.debug||(n=!1),n&&t.console[e].apply(t.console,r(arguments))}}e["default"]={log:i("log"),info:i("info"),warn:i("warn"),debug:i("debug"),error:i("error")}}.call(this,n("0ee4"))},"418c":function(t,e,n){"use strict";n.r(e),function(t){n.d(e,"setNavigationBarColor",(function(){return o})),n.d(e,"showNavigationBarLoading",(function(){return a})),n.d(e,"hideNavigationBarLoading",(function(){return s})),n.d(e,"setNavigationBarTitle",(function(){return c}));var r=n("d4ee");function i(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=Object(r["getPageHolder"])(n.__page__);if(i)switch(e){case"setNavigationBarColor":var o=n.frontColor,a=n.backgroundColor,s=n.animation,c=s.duration,u=s.timingFunc;o&&(i.navigationBar.textColor="#000000"===o?"black":"white"),a&&(i.navigationBar.backgroundColor=a),t.emit("onNavigationBarChange",{textColor:"#000000"===o?"#000":"#fff",backgroundColor:i.navigationBar.backgroundColor}),i.navigationBar.duration=c+"ms",i.navigationBar.timingFunc=u;break;case"showNavigationBarLoading":i.navigationBar.loading=!0;break;case"hideNavigationBarLoading":i.navigationBar.loading=!1;break;case"setNavigationBarTitle":var l=n.title;i.navigationBar.titleText=l,Object(r["isCurrentPage"])(i)&&(document.title=l),t.emit("onNavigationBarChange",{titleText:l});break}return{}}function o(t){return i("setNavigationBarColor",t)}function a(t){return i("showNavigationBarLoading",t)}function s(t){return i("hideNavigationBarLoading",t)}function c(t){return i("setNavigationBarTitle",t)}}.call(this,n("2c9f"))},"41cb":function(t,e,n){"use strict";n.d(e,"a",(function(){return a}));var i=n("340d");function o(t){return o="function"===typeof Symbol&&"symbol"===r(Symbol.iterator)?function(t){return r(t)}:function(t){return t&&"function"===typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":r(t)},o(t)}function a(t,e,n){var r=e[t],o=!Object(i["i"])(n,t),a=n[t],c=function(t,e){if(!Array.isArray(e))return f(e,t)?0:-1;for(var n=0,r=e.length;n-1&&o&&!Object(i["i"])(r,"default")&&(a=!1),void 0===a&&Object(i["i"])(r,"default")){var u=r.default;a=Object(i["k"])(u)?u():u,n[t]=a}return s(r,t,a,o,n)}function s(t,e,n,r,i){if(t.required&&r)return"Missing required parameter `".concat(e,"`");if(null==n&&!t.required){var o=t.validator;return o?o(n,i):void 0}var a=t.type,s=!a||!0===a,c=[];if(a){Array.isArray(a)||(a=[a]);for(var l=0;l=0||("Object"===r?Object(i["l"])(t):"Array"===r?Array.isArray(t):t instanceof e||Object(i["v"])(t)===l(e));return{valid:n,expectedType:r}}function l(t){var e=t&&t.toString().match(/^\s*function (\w+)/);return e?e[1]:""}function f(t,e){return l(t)===l(e)}function d(t,e,n){var r="parameter `".concat(t,"`.")+" Expected ".concat(n.join(", ")),o=n[0],a=Object(i["v"])(e),s=h(e,o),c=h(e,a);return 1===n.length&&v(o)&&!function(){for(var t=arguments.length,e=new Array(t),n=0;n1||this._handleHoverStart(t)},_hoverMousedown:function(t){this._hoverTouch||(this._handleHoverStart(t),window.addEventListener("mouseup",this._hoverMouseup))},_handleHoverStart:function(t){var e=this;t._hoverPropagationStopped||this.hoverClass&&"none"!==this.hoverClass&&!this.disabled&&(this.hoverStopPropagation&&(t._hoverPropagationStopped=!0),this._hoverTouch=!0,this._hoverStartTimer=setTimeout((function(){e.hovering=!0,e._hoverTouch||e._hoverReset()}),this.hoverStartTime))},_hoverMouseup:function(){this._hoverTouch&&(this._handleHoverEnd(),window.removeEventListener("mouseup",this._hoverMouseup))},_hoverTouchEnd:function(){this._handleHoverEnd()},_handleHoverEnd:function(){this._hoverTouch=!1,this.hovering&&this._hoverReset()},_hoverReset:function(){var t=this;requestAnimationFrame((function(){clearTimeout(t._hoverStayTimer),t._hoverStayTimer=setTimeout((function(){t.hovering=!1}),t.hoverStayTime)}))},_hoverTouchCancel:function(){this._hoverTouch=!1,this.hovering=!1,clearTimeout(this._hoverStartTimer)}}}},"43df":function(t,e,n){"use strict";n.r(e),n.d(e,"saveFile",(function(){return i})),n.d(e,"getFileInfo",(function(){return a})),n.d(e,"getSavedFileInfo",(function(){return s})),n.d(e,"removeSavedFile",(function(){return c}));var r=n("4738"),i={tempFilePath:{type:String,required:!0,validator:function(t,e){e.tempFilePath=Object(r["a"])(t)}}},o=["md5","sha1"],a={filePath:{type:String,required:!0,validator:function(t,e){e.filePath=Object(r["a"])(t)}},digestAlgorithm:{type:String,validator:function(t,e){e.digestAlgorithm=o.includes(t)?t:o[0]},default:o[0]}},s={filePath:{type:String,required:!0,validator:function(t,e){e.filePath=Object(r["a"])(t)}}},c={filePath:{type:String,required:!0,validator:function(t,e){e.filePath=Object(r["a"])(t)}}}},4442:function(t,e,n){var i=function(t){"use strict";var e,n=Object.prototype,i=n.hasOwnProperty,o="function"===typeof Symbol?Symbol:{},a=o.iterator||"@@iterator",s=o.asyncIterator||"@@asyncIterator",c=o.toStringTag||"@@toStringTag";function u(t,e,n,r){var i=e&&e.prototype instanceof v?e:v,o=Object.create(i.prototype),a=new O(r||[]);return o._invoke=function(t,e,n){var r=f;return function(i,o){if(r===d)throw new Error("Generator is already running");if(r===h){if("throw"===i)throw o;return E()}n.method=i,n.arg=o;while(1){var a=n.delegate;if(a){var s=k(a,n);if(s){if(s===p)continue;return s}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(r===f)throw r=h,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r=d;var c=l(t,e,n);if("normal"===c.type){if(r=n.done?h:"suspendedYield",c.arg===p)continue;return{value:c.arg,done:n.done}}"throw"===c.type&&(r=h,n.method="throw",n.arg=c.arg)}}}(t,n,a),o}function l(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(i){return{type:"throw",arg:i}}}t.wrap=u;var f="suspendedStart",d="executing",h="completed",p={};function v(){}function g(){}function m(){}var b={};b[a]=function(){return this};var y=Object.getPrototypeOf,_=y&&y(y(A([])));_&&_!==n&&i.call(_,a)&&(b=_);var w=m.prototype=v.prototype=Object.create(b);function x(t){["next","throw","return"].forEach((function(e){t[e]=function(t){return this._invoke(e,t)}}))}function S(t,e){function n(o,a,s,c){var u=l(t[o],t,a);if("throw"!==u.type){var f=u.arg,d=f.value;return d&&"object"===r(d)&&i.call(d,"__await")?e.resolve(d.__await).then((function(t){n("next",t,s,c)}),(function(t){n("throw",t,s,c)})):e.resolve(d).then((function(t){f.value=t,s(f)}),(function(t){return n("throw",t,s,c)}))}c(u.arg)}var o;this._invoke=function(t,r){function i(){return new e((function(e,i){n(t,r,e,i)}))}return o=o?o.then(i,i):i()}}function k(t,n){var r=t.iterator[n.method];if(r===e){if(n.delegate=null,"throw"===n.method){if(t.iterator["return"]&&(n.method="return",n.arg=e,k(t,n),"throw"===n.method))return p;n.method="throw",n.arg=new TypeError("The iterator does not provide a 'throw' method")}return p}var i=l(r,t.iterator,n.arg);if("throw"===i.type)return n.method="throw",n.arg=i.arg,n.delegate=null,p;var o=i.arg;return o?o.done?(n[t.resultName]=o.value,n.next=t.nextLoc,"return"!==n.method&&(n.method="next",n.arg=e),n.delegate=null,p):o:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,p)}function C(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function T(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function O(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(C,this),this.reset(!0)}function A(t){if(t){var n=t[a];if(n)return n.call(t);if("function"===typeof t.next)return t;if(!isNaN(t.length)){var r=-1,o=function n(){while(++r=0;--o){var a=this.tryEntries[o],s=a.completion;if("root"===a.tryLoc)return r("end");if(a.tryLoc<=this.prev){var c=i.call(a,"catchLoc"),u=i.call(a,"finallyLoc");if(c&&u){if(this.prev=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&i.call(r,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),T(n),p}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var i=r.arg;T(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(t,n,r){return this.delegate={iterator:A(t),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=e),p}},t}(t.exports);try{regeneratorRuntime=i}catch(o){Function("r","regeneratorRuntime = r")(i)}},4498:function(t,e,n){"use strict";function r(){var t=document.getElementById("#clipboard"),e=t?t.value:void 0;return e?{data:e,errMsg:"getClipboardData:ok"}:{errMsg:"getClipboardData:fail"}}function i(t){var e=t.data,n=document.getElementById("#clipboard");n&&n.remove();var r=document.createElement("textarea");r.setAttribute("inputmode","none"),r.id="#clipboard",r.style.position="fixed",r.style.top="-9999px",r.style.zIndex="-9999",document.body.appendChild(r),r.value=e,r.select(),r.setSelectionRange(0,r.value.length);var i=document.execCommand("Copy",!1,null);return r.blur(),i?{errMsg:"setClipboardData:ok"}:{errMsg:"setClipboardData:fail"}}n.r(e),n.d(e,"getClipboardData",(function(){return r})),n.d(e,"setClipboardData",(function(){return i}))},"44b9":function(t,e,n){"use strict";n.r(e),n.d(e,"compressImage",(function(){return i}));var r=n("4738"),i={src:{type:String,required:!0,validator:function(t,e){e.src=Object(r["a"])(t)}}}},"44f1":function(t,e,n){t.exports=n("4442")},"45a2":function(t,e,n){"use strict";n.r(e);var r=n("951c"),i=n.n(r),o=n("7d96"),a=o["a"],s=(n("8a24"),n("8844")),c=Object(s["a"])(a,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("uni-app",{class:{"uni-app--showtabbar":t.showTabBar,"uni-app--maxwidth":t.showMaxWidth}},[n("layout",{ref:"layout",attrs:{"router-key":t.key,"keep-alive-include":t.keepAliveInclude},on:{maxWidth:t.onMaxWidth,layout:t.onLayout}}),t.hasTabBar?n("tab-bar",t._b({directives:[{name:"show",rawName:"v-show",value:t.showTabBar,expression:"showTabBar"}],ref:"tabBar"},"tab-bar",t.tabBarOptions,!1)):t._e(),t.$options.components.Toast?n("toast",t._b({},"toast",t.showToast,!1)):t._e(),t.$options.components.ActionSheet?n("action-sheet",t._b({on:{close:t._onActionSheetClose}},"action-sheet",t.showActionSheet,!1)):t._e(),t.$options.components.Modal?n("modal",t._b({on:{close:t._onModalClose}},"modal",t.showModal,!1)):t._e(),t.$options.components.PreviewImage?n("preview-image",t._b({on:{close:t._onPreviewClose}},"preview-image",t.previewImage,!1)):t._e(),t.sysComponents&&t.sysComponents.length?t._l(t.sysComponents,(function(t,e){return n(t,{key:e,tag:"component"})})):t._e()],2)}),[],!1,null,null,null),u=c.exports,l=n("e5b3"),f=l["a"],d=(n("fc7c"),Object(s["a"])(f,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("uni-page",{attrs:{"data-page":t.$route.meta.pagePath}},["none"!==t.navigationBar.type?n("page-head",t._b({},"page-head",t.navigationBar,!1)):t._e(),t.enablePullDownRefresh?n("page-refresh",{ref:"refresh",attrs:{color:t.refreshOptions.color,offset:t.refreshOptions.offset}}):t._e(),t.enablePullDownRefresh?n("page-body",{nativeOn:{touchstart:function(e){return t._touchstart(e)},touchmove:function(e){return t._touchmove(e)},touchend:function(e){return t._touchend(e)},touchcancel:function(e){return t._touchend(e)}}},[t._t("page")],2):n("page-body",[t._t("page")],2)],1)}),[],!1,null,null,null)),h=d.exports,p=n("0372"),v={name:"AsyncError",mixins:[p["c"]],methods:{_onClick:function(){window.location.reload()}}},g=v,m=(n("5505"),Object(s["a"])(g,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"uni-async-error",on:{click:t._onClick}},[t._v(" "+t._s(t.$$t("uni.async.error"))+" ")])}),[],!1,null,null,null)),b=m.exports,y={name:"AsyncLoading"},_=(n("d937"),Object(s["a"])(y,(function(){var t=this;t.$createElement;return t._self._c,t._m(0)}),[function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"uni-async-loading"},[e("i",{staticClass:"uni-loading"})])}],!1,null,null,null)),w=_.exports,x=n("8b77"),S=x["a"],k=Object(s["a"])(S,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.hasTabBar?n("uni-tabbar",{directives:[{name:"show",rawName:"v-show",value:t.showTabBar,expression:"showTabBar"}]},[n("div",{staticClass:"uni-tabbar",style:{"flex-direction":"vertical"===t.direction?"column":"row",backgroundColor:t.tabBarOptions.backgroundColor}},[t._l(t.tabBarOptions.list,(function(e,r){return[!1!==e.visible?n("div",{key:e.pagePath,staticClass:"uni-tabbar__item",on:{click:function(n){return t._switchTab(e,r)}}},[n("div",{staticClass:"uni-tabbar__bd"},[t.showIcon&&e.iconPath?n("div",{staticClass:"uni-tabbar__icon",class:{"uni-tabbar__icon__diff":!e.text}},[n("img",{attrs:{src:t._getRealPath(t.selectedIndex===r?e.selectedIconPath:e.iconPath)}}),e.redDot?n("div",{staticClass:"uni-tabbar__reddot",class:{"uni-tabbar__badge":!!e.badge}},[t._v(" "+t._s(e.badge)+" ")]):t._e()]):t._e(),e.text?n("div",{staticClass:"uni-tabbar__label",style:{color:t.selectedIndex===r?t.tabBarOptions.selectedColor:t.tabBarOptions.color,fontSize:t.showIcon&&e.iconPath?"10px":"14px"}},[t._v(" "+t._s(e.text)+" "),!e.redDot||t.showIcon&&e.iconPath?t._e():n("div",{staticClass:"uni-tabbar__reddot",class:{"uni-tabbar__badge":!!e.badge}},[t._v(" "+t._s(e.badge)+" ")])]):t._e()])]):t._e()]}))],2)]):t._e()}),[],!1,null,null,null),C=k.exports,T=n("4ed4"),O=T["a"],A=(n("b16b"),Object(s["a"])(O,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"uni-system-choose-location"},[n("v-uni-map",{staticClass:"map",attrs:{latitude:t.latitude,longitude:t.longitude,"show-location":"",libraries:["places"]},on:{updated:t.getList,regionchange:t.onRegionChange}},[n("div",{staticClass:"map-location",style:t.locationStyle}),n("div",{staticClass:"map-move",on:{click:t.moveToLocation}},[n("i",[t._v("")])])]),n("div",{staticClass:"nav"},[n("div",{staticClass:"nav-btn back",on:{click:t.back}},[n("i",{staticClass:"uni-btn-icon"},[t._v("")])]),n("div",{staticClass:"nav-btn confirm",class:{disable:!t.selected},on:{click:t.choose}},[n("i",{staticClass:"uni-btn-icon"},[t._v("")])])]),n("div",{staticClass:"menu"},[n("div",{staticClass:"search"},[n("v-uni-input",{staticClass:"search-input",attrs:{placeholder:t.$$t("uni.chooseLocation.search")},on:{focus:function(e){t.searching=!0},input:t.input},model:{value:t.keyword,callback:function(e){t.keyword=e},expression:"keyword"}}),t.searching?n("div",{staticClass:"search-btn",on:{click:function(e){t.searching=!1,t.keyword=""}}},[t._v(" "+t._s(t.$$t("uni.chooseLocation.cancel"))+" ")]):t._e()],1),n("v-uni-scroll-view",{staticClass:"list",attrs:{"scroll-y":""},on:{scrolltolower:t.loadMore}},[t.loading?n("div",{staticClass:"list-loading"},[n("i",{staticClass:"uni-loading"})]):t._e(),t._l(t.list,(function(e,r){return n("div",{key:r,staticClass:"list-item",class:{selected:t.selectedIndex===r},on:{click:function(n){t.selectedIndex=r,t.latitude=e.latitude,t.longitude=e.longitude}}},[n("div",{staticClass:"list-item-title"},[t._v(" "+t._s(e.name)+" ")]),n("div",{staticClass:"list-item-detail"},[t._v(" "+t._s(t._f("distance")(e.distance))+t._s(e.address)+" ")])])}))],2)],1)],1)}),[],!1,null,null,null)),E=A.exports,j=n("b435"),I={name:"SystemOpenLocation",data:function(){var t=this.$route.query,e=t.latitude,n=t.longitude,r=t.scale,i=void 0===r?18:r,o=t.name,a=void 0===o?"":o,s=t.address,c=void 0===s?"":s;return{latitude:e,longitude:n,scale:i,name:a,address:c,center:{latitude:e,longitude:n},marker:{id:1,latitude:e,longitude:n,iconPath:j["b"],width:32,height:52},location:{id:2,latitude:0,longitude:0,iconPath:j["a"],width:44,height:44}}},mounted:function(){var t=this;uni.getLocation({type:"gcj02",success:function(e){var n=e.latitude,r=e.longitude;t.location.latitude=n,t.location.longitude=r}})},methods:{onRegionChange:function(t){var e=t.detail.centerLocation;e&&(this.center.latitude=e.latitude,this.center.longitude=e.longitude)},setCenter:function(t){var e=t.latitude,n=t.longitude;this.center.latitude=e,this.center.longitude=n},back:function(){getApp().$router.back()},nav:function(){var t=Object(j["e"])(),e="";if(t.type===j["d"].GOOGLE){var n=this.location.latitude?"&origin=".concat(this.location.latitude,"%2C").concat(this.location.longitude):"";e="https://www.google.com/maps/dir/?api=1".concat(n,"&destination=").concat(this.latitude,"%2C").concat(this.longitude)}else if(t.type===j["d"].QQ){var r=this.location.latitude?"&fromcoord=".concat(this.location.latitude,"%2C").concat(this.location.longitude,"&from=").concat(encodeURIComponent("我的位置")):"";e="https://apis.map.qq.com/uri/v1/routeplan?type=drive".concat(r,"&tocoord=").concat(this.latitude,"%2C").concat(this.longitude,"&to=").concat(encodeURIComponent(this.name||"目的地"),"&ref=").concat(t.key)}else if(t.type===j["d"].AMAP){var i=this.location.latitude?"from=".concat(this.location.longitude,",").concat(this.location.latitude,",").concat(encodeURIComponent("我的位置"),"&"):"";e="https://uri.amap.com/navigation?".concat(i,"to=").concat(this.longitude,",").concat(this.latitude,",").concat(encodeURIComponent(this.name||"目的地"))}window.open(e)}}},M=I,P=(n("724c"),Object(s["a"])(M,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"uni-system-open-location"},[n("v-uni-map",{staticClass:"map",attrs:{latitude:t.center.latitude,longitude:t.center.longitude,markers:[t.marker,t.location]},on:{regionchange:t.onRegionChange}},[n("div",{staticClass:"map-move",on:{click:function(e){return t.setCenter(t.location)}}},[n("i",[t._v("")])])]),n("div",{staticClass:"info"},[n("div",{staticClass:"name",on:{click:function(e){return t.setCenter(t.marker)}}},[t._v(" "+t._s(t.name)+" ")]),n("div",{staticClass:"address",on:{click:function(e){return t.setCenter(t.marker)}}},[t._v(" "+t._s(t.address)+" ")]),n("div",{staticClass:"nav",on:{click:t.nav}},[n("svg",{attrs:{width:"26",height:"26",viewBox:"0 0 1024 1024",version:"1.1",xmlns:"http://www.w3.org/2000/svg"}},[n("path",{attrs:{d:"M896 544c-207.807 0-388.391 82.253-480 203.149V173.136l201.555 201.555c12.412 12.412 32.723 12.412 45.136 0 12.412-12.412 12.412-32.723 0-45.136L408.913 75.777a31.93 31.93 0 0 0-2.222-2.468c-6.222-6.222-14.429-9.324-22.631-9.308l-0.059-0.002-0.059 0.002c-8.202-0.016-16.409 3.085-22.631 9.308a31.93 31.93 0 0 0-2.222 2.468l-253.78 253.778c-12.412 12.412-12.412 32.723 0 45.136 12.412 12.412 32.723 12.412 45.136 0L352 173.136V928c0 17.6 14.4 32 32 32s32-14.4 32-32c0-176.731 214.903-320 480-320 17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32z",fill:"#ffffff"}})])])]),n("div",{staticClass:"nav-btn-back",on:{click:t.back}},[n("i",{staticClass:"uni-btn-icon"},[t._v("")])])],1)}),[],!1,null,null,null)),$=P.exports,L={ChooseLocation:E,OpenLocation:$};i.a.component(u.name,u),i.a.component(h.name,h),i.a.component(b.name,b),i.a.component(w.name,w),i.a.component(C.name,C),Object.keys(L).forEach((function(t){var e=L[t];i.a.component(e.name,e)}))},"466b":function(t,e,n){},4705:function(t,e,n){"use strict";(function(t){var r,i=n("909e"),o=n("7cce"),a=n("dfa7"),s=n("bdee");function c(t){return function(t){if(Array.isArray(t))return u(t)}(t)||function(t){if("undefined"!==typeof Symbol&&Symbol.iterator in Object(t))return Array.from(t)}(t)||function(t,e){if(t){if("string"===typeof t)return u(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(n):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?u(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return r||(r=document.createElement("canvas")),r.width=t,r.height=e,r}e["a"]={name:"Canvas",mixins:[i["g"]],props:{canvasId:{type:String,default:""},disableScroll:{type:[Boolean,String],default:!1},hidpi:{type:Boolean,default:!0}},data:function(){return{actionsWaiting:!1}},computed:{id:function(){return this.canvasId},_listeners:function(){var t=this,e=Object.assign({},this.$listeners);return["touchstart","touchmove","touchend"].forEach((function(n){var r=e[n],i=[];r&&i.push((function(e){t.$trigger(n,Object.assign({},e,{touches:f(e.currentTarget,e.touches),changedTouches:f(e.currentTarget,e.changedTouches)}))})),t.disableScroll&&"touchmove"===n&&i.push(t._touchmove),e[n]=i})),e},pixelRatio:function(){return this.hidpi?o["a"]:1}},created:function(){this._actionsDefer=[],this._images={}},mounted:function(){this._resize()},beforeDestroy:function(){var t=this.$refs.canvas;t.height=t.width=0},methods:{_handleSubscribe:function(t){var e=t.type,n=t.data,r=void 0===n?{}:n,i=this[e];0!==e.indexOf("_")&&"function"===typeof i&&i(r)},_resize:function(t){var e=this.$refs.canvas,n=!t||e.width!==Math.floor(t.width*this.pixelRatio)||e.height!==Math.floor(t.height*this.pixelRatio);if(n)if(e.width>0&&e.height>0){var r=e.getContext("2d"),i=r.getImageData(0,0,e.width,e.height);Object(o["b"])(e,this.hidpi),r.putImageData(i,0,0)}else Object(o["b"])(e,this.hidpi)},_touchmove:function(t){t.preventDefault()},actionsChanged:function(e){var n=this,r=e.actions,i=e.reserve,o=e.callbackId,a=this;if(r)if(this.actionsWaiting)this._actionsDefer.push([r,i,o]);else{var s=this.$refs.canvas,u=s.getContext("2d");i||(u.fillStyle="#000000",u.strokeStyle="#000000",u.shadowColor="#000000",u.shadowBlur=0,u.shadowOffsetX=0,u.shadowOffsetY=0,u.setTransform(1,0,0,1,0,0),u.clearRect(0,0,s.width,s.height)),this.preloadImage(r);var f=function(t){var e=r[t],i=e.method,s=e.data;if(/^set/.test(i)&&"setTransform"!==i){var f,d=i[3].toLowerCase()+i.slice(4);if("fillStyle"===d||"strokeStyle"===d){if("normal"===s[0])f=l(s[1]);else if("linear"===s[0]){var v=u.createLinearGradient.apply(u,c(s[1]));s[2].forEach((function(t){var e=t[0],n=l(t[1]);v.addColorStop(e,n)})),f=v}else if("radial"===s[0]){var g=s[1][0],m=s[1][1],b=s[1][2],y=u.createRadialGradient(g,m,0,g,m,b);s[2].forEach((function(t){var e=t[0],n=l(t[1]);y.addColorStop(e,n)})),f=y}else if("pattern"===s[0]){var _=n.checkImageLoaded(s[1],r.slice(t+1),o,(function(t){t&&(u[d]=u.createPattern(t,s[2]))}));return _?"continue":"break"}u[d]=f}else if("globalAlpha"===d)u[d]=s[0]/255;else if("shadow"===d)h=["shadowOffsetX","shadowOffsetY","shadowBlur","shadowColor"],s.forEach((function(t,e){u[h[e]]="shadowColor"===h[e]?l(t):t}));else if("fontSize"===d){var w=u.__font__||u.font;u.__font__=u.font=w.replace(/\d+\.?\d*px/,s[0]+"px")}else"lineDash"===d?(u.setLineDash(s[0]),u.lineDashOffset=s[1]||0):"textBaseline"===d?("normal"===s[0]&&(s[0]="alphabetic"),u[d]=s[0]):"font"===d?u.__font__=u.font=s[0]:u[d]=s[0]}else if("fillPath"===i||"strokePath"===i)i=i.replace(/Path/,""),u.beginPath(),s.forEach((function(t){u[t.method].apply(u,t.data)})),u[i]();else if("fillText"===i)u.fillText.apply(u,s);else if("drawImage"===i){if(p=function(){var e=c(s),n=e[0],i=e.slice(1);if(a._images=a._images||{},!a.checkImageLoaded(n,r.slice(t+1),o,(function(t){t&&u.drawImage.apply(u,[t].concat(c(i.slice(4,8)),c(i.slice(0,4))))})))return"break"}(),"break"===p)return"break"}else"clip"===i?(s.forEach((function(t){u[t.method].apply(u,t.data)})),u.clip()):u[i].apply(u,s)};t:for(var d=0;d1&&(s.multiple="multiple"),1===n.length&&"camera"===n[0]&&(s.capture="camera"),s}},"493f":function(t,e,n){"use strict";(function(t){n.d(e,"b",(function(){return o})),n.d(e,"c",(function(){return a})),n.d(e,"a",(function(){return c}));var r,i=n("a805");function o(t){t.preventDefault()}function a(t){var e=t.scrollTop,n=t.selector,r=t.duration;if("undefined"===typeof e){var i=document.querySelector(n);if(i){var o=i.getBoundingClientRect(),a=o.top,s=o.height;e=a+window.pageYOffset,e-=s}}var c=document.documentElement,u=c.clientHeight,l=c.scrollHeight;e=Math.min(e,l-u),0!==r?window.scrollY!==e&&function t(n){if(n<=0)window.scrollTo(0,e);else{var r=e-window.scrollY;requestAnimationFrame((function(){window.scrollTo(0,window.scrollY+r/n*10),t(n-10)}))}}(r):c.scrollTop=document.body.scrollTop=e}var s=0;function c(e,n){var o=n.enablePageScroll,a=n.enablePageReachBottom,c=n.onReachBottomDistance,u=n.enableTransparentTitleNView,l=!1,f=!1,d=!0;function h(){var t=document.documentElement.scrollHeight,e=window.innerHeight,n=window.scrollY,r=n>0&&t>e&&n+e+c>=t,i=Math.abs(t-s)>c;return!r||f&&!i?(!r&&f&&(f=!1),!1):(s=t,f=!0,!0)}function p(){var n=getCurrentPages();if(n.length&&n[n.length-1].$page.id===e){var s=window.pageYOffset;o&&Object(i["a"])("onPageScroll",{scrollTop:s},e),u&&t.emit("onPageScroll",{scrollTop:s}),a&&d&&(c()||(r=setTimeout(c,300))),l=!1}function c(){if(h())return Object(i["a"])("onReachBottom",{},e),d=!1,setTimeout((function(){d=!0}),350),!0}}return function(){clearTimeout(r),l||requestAnimationFrame(p),l=!0}}}).call(this,n("31d2"))},"49c2":function(t,e,n){"use strict";(function(t){n.d(e,"a",(function(){return u}));var r=n("38ce"),i=n("340d"),o=n("8d7d"),a=n("0db3");function s(t,e){var n={},a=Object(o["a"])(),s=a.top;if(e.id&&(n.id=t.id),e.dataset&&(n.dataset=Object(r["b"])(t)),e.rect||e.size){var c=t.getBoundingClientRect();e.rect&&(n.left=c.left,n.right=c.right,n.top=c.top-s,n.bottom=c.bottom-s),e.size&&(n.width=c.width,n.height=c.height)}if(Array.isArray(e.properties)){var u=t.__vue__&&t.__vue__.$props;u&&e.properties.forEach((function(t){"string"===typeof t&&(t=Object(i["b"])(t),null!=u[t]&&(n[t]=u[t]))}))}if(e.scrollOffset&&("UNI-SCROLL-VIEW"===t.tagName&&t.__vue__&&t.__vue__.getScrollPosition?Object.assign(n,t.__vue__.getScrollPosition()):(n.scrollLeft=0,n.scrollTop=0,n.scrollHeight=0,n.scrollWidth=0)),Array.isArray(e.computedStyle)){var l=getComputedStyle(t);e.computedStyle.forEach((function(t){n[t]=l[t]}))}return e.context&&t.__vue__&&t.__vue__._getContextInfo&&(n.context=t.__vue__._getContextInfo()),n}function c(t,e,n,r,i){var o=Object(a["a"])(Object(a["b"])(e,t));if(!o||o&&8===o.nodeType)return r?null:[];if(r){var c=o.matches(n)?o:o.querySelector(n);return c?s(c,i):null}var u=[],l=o.querySelectorAll(n);return l&&l.length&&(u=[].map.call(l,(function(t){return s(t,i)}))),o.matches(n)&&u.unshift(s(o,i)),u}function u(e,n){var r,i=e.reqId,o=e.reqs;if(n._isVue)r=n;else{var a=getCurrentPages(),s=a.find((function(t){return t.$page.id===n}));if(!s)throw new Error("Not Found:Page[".concat(n,"]"));r=s.$vm}var u=[];o.forEach((function(t){var e=t.component,n=t.selector,i=t.single,o=t.fields;0===e?u.push(function(t){var e={};if(t.id&&(e.id=""),t.dataset&&(e.dataset={}),t.rect&&(e.left=0,e.right=0,e.top=0,e.bottom=0),t.size&&(e.width=document.documentElement.clientWidth,e.height=document.documentElement.clientHeight),t.scrollOffset){var n=document.documentElement,r=document.body;e.scrollLeft=n.scrollLeft||r.scrollLeft||0,e.scrollTop=n.scrollTop||r.scrollTop||0,e.scrollHeight=n.scrollHeight||r.scrollHeight||0,e.scrollWidth=n.scrollWidth||r.scrollWidth||0}return e}(o)):u.push(c(r,e,n,i,o))})),t.publishHandler("onRequestComponentInfo",{reqId:i,res:u})}}).call(this,n("31d2"))},"49df":function(t,e,n){"use strict";n.r(e);var r=[],i=n("2432");i.keys().forEach((function(t){"./index.js"!==t&&r.push(i(t).default)})),e["default"]=r},"4a3f":function(t,e,n){"use strict";n.r(e),function(t){function r(e,n){var r=e.filePath,i=t,o=i.invokeCallbackHandler;window.open(r),o(n,{errMsg:"openDocument:ok"})}n.d(e,"openDocument",(function(){return r}))}.call(this,n("2c9f"))},"4b21":function(t,e,n){"use strict";(function(t){n.d(e,"a",(function(){return i}));var r=n("d97d");function i(e){e=function(t){return t.replace(/<\?xml.*\?>\n/,"").replace(/\n/,"").replace(/\n/,"")}(e);var n=[],i={node:"root",children:[]};return Object(r["a"])(e,{start:function(t,e,r){var o={name:t};if(0!==e.length&&(o.attrs=function(t){return t.reduce((function(t,e){var n=e.value,r=e.name;return n.match(/ /)&&-1===["style","src"].indexOf(r)&&(n=n.split(" ")),t[r]?Array.isArray(t[r])?t[r].push(n):t[r]=[t[r],n]:t[r]=n,t}),{})}(e)),r){var a=n[0]||i;a.children||(a.children=[]),a.children.push(o)}else n.unshift(o)},end:function(e){var r=n.shift();if(r.name!==e&&t.error("invalid state: mismatch end tag"),0===n.length)i.children.push(r);else{var o=n[0];o.children||(o.children=[]),o.children.push(r)}},chars:function(t){var e={type:"text",text:t};if(0===n.length)i.children.push(e);else{var r=n[0];r.children||(r.children=[]),r.children.push(e)}},comment:function(t){var e={node:"comment",text:t},r=n[0];r&&(r.children||(r.children=[]),r.children.push(e))}}),i.children}}).call(this,n("418b")["default"])},"4b7e":function(t,e,n){var r={"./base/base64.js":"53f9","./base/can-i-use.js":"5bcf","./base/event-bus.js":"fd5d","./base/interceptor.js":"9879","./base/upx2px.js":"6856","./context/canvas.js":"e0ec","./context/context.js":"6625","./device/add-phone-contact.js":"cedc","./device/make-phone-call.js":"6f73","./device/scan-code.js":"3b8d","./device/set-clipboard-data.js":"51e5","./file/file.js":"43df","./file/open-document.js":"09f0","./location/choose-location.js":"ec60","./location/get-location.js":"e0f9","./location/open-location.js":"d280","./media/choose-file.js":"925f","./media/choose-image.js":"dac9","./media/choose-video.js":"a111","./media/compress-image.js":"44b9","./media/compress-video.js":"3bbb","./media/get-image-info.js":"61d8","./media/get-video-info.js":"9bfe","./media/preview-image.js":"4ca1","./media/save-image-to-photos-album.js":"03d0","./network/download-file.js":"3fc5","./network/request.js":"b32f","./network/socket.js":"123c","./network/upload-file.js":"b75a","./plugin/get-provider.js":"90f0","./plugin/load-sub-package.js":"a8a7","./plugin/pre-login.js":"5f30","./route/route.js":"6bd7","./storage/storage.js":"67c3","./ui/load-font-face.js":"c6eb","./ui/navigation-bar.js":"796c","./ui/page-scroll-to.js":"3acf","./ui/popup.js":"f60b","./ui/tab-bar.js":"3bd6"};function i(t){var e=o(t);return n(e)}function o(t){if(!n.o(r,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return r[t]}i.keys=function(){return Object.keys(r)},i.resolve=o,t.exports=i,i.id="4b7e"},"4ba6":function(t,e,n){"use strict";function r(t,e,n){return t>e-n&&t0){var u=(-n-Math.sqrt(o))/(2*r),l=(-n+Math.sqrt(o))/(2*r),f=(e-u*t)/(l-u),d=t-f;return{x:function(t){var e,n;return t===this._t&&(e=this._powER1T,n=this._powER2T),this._t=t,e||(e=this._powER1T=Math.pow(Math.E,u*t)),n||(n=this._powER2T=Math.pow(Math.E,l*t)),d*e+f*n},dx:function(t){var e,n;return t===this._t&&(e=this._powER1T,n=this._powER2T),this._t=t,e||(e=this._powER1T=Math.pow(Math.E,u*t)),n||(n=this._powER2T=Math.pow(Math.E,l*t)),d*u*e+f*l*n}}}var h=Math.sqrt(4*r*i-n*n)/(2*r),p=-n/2*r,v=t,g=(e-p*t)/h;return{x:function(t){return Math.pow(Math.E,p*t)*(v*Math.cos(h*t)+g*Math.sin(h*t))},dx:function(t){var e=Math.pow(Math.E,p*t),n=Math.cos(h*t),r=Math.sin(h*t);return e*(g*h*n-v*h*r)+p*e*(g*r+v*n)}}},o.prototype.x=function(t){return void 0===t&&(t=((new Date).getTime()-this._startTime)/1e3),this._solution?this._endPosition+this._solution.x(t):0},o.prototype.dx=function(t){return void 0===t&&(t=((new Date).getTime()-this._startTime)/1e3),this._solution?this._solution.dx(t):0},o.prototype.setEnd=function(t,e,n){if(n||(n=(new Date).getTime()),t!==this._endPosition||!i(e,.4)){e=e||0;var r=this._endPosition;this._solution&&(i(e,.4)&&(e=this._solution.dx((n-this._startTime)/1e3)),r=this._solution.x((n-this._startTime)/1e3),i(e,.4)&&(e=0),i(r,.4)&&(r=0),r+=this._endPosition),this._solution&&i(r-t,.4)&&i(e,.4)||(this._endPosition=t,this._solution=this._solve(r-this._endPosition,e),this._startTime=n)}},o.prototype.snap=function(t){this._startTime=(new Date).getTime(),this._endPosition=t,this._solution={x:function(){return 0},dx:function(){return 0}}},o.prototype.done=function(t){return t||(t=(new Date).getTime()),r(this.x(),this._endPosition,.4)&&i(this.dx(),.4)},o.prototype.reconfigure=function(t,e,n){this._m=t,this._k=e,this._c=n,this.done()||(this._solution=this._solve(this.x()-this._endPosition,this.dx()),this._startTime=(new Date).getTime())},o.prototype.springConstant=function(){return this._k},o.prototype.damping=function(){return this._c},o.prototype.configuration=function(){return[{label:"Spring Constant",read:this.springConstant.bind(this),write:function(t,e){t.reconfigure(1,e,t.damping())}.bind(this,this),min:100,max:1e3},{label:"Damping",read:this.damping.bind(this),write:function(t,e){t.reconfigure(1,t.springConstant(),e)}.bind(this,this),min:1,max:500}]}},"4c68":function(t,e,n){"use strict";n.r(e);var r=n("909e"),i=n("340d"),o=n("0372"),a=!!i["t"]&&{passive:!1},s={NONE:"none",STOP:"stop",VOLUME:"volume",PROGRESS:"progress"},c={name:"Video",filters:{time:function(t){t=t>0&&t<1/0?t:0;var e=Math.floor(t/3600),n=Math.floor(t%3600/60),r=Math.floor(t%3600%60);e=(e<10?"0":"")+e,n=(n<10?"0":"")+n,r=(r<10?"0":"")+r;var i=n+":"+r;return"00"!==e&&(i=e+":"+i),i}},mixins:[o["c"],r["g"],r["d"]],props:{id:{type:String,default:""},src:{type:String,default:""},duration:{type:[Number,String],default:""},controls:{type:[Boolean,String],default:!0},danmuList:{type:Array,default:function(){return[]}},danmuBtn:{type:[Boolean,String],default:!1},enableDanmu:{type:[Boolean,String],default:!1},autoplay:{type:[Boolean,String],default:!1},loop:{type:[Boolean,String],default:!1},muted:{type:[Boolean,String],default:!1},objectFit:{type:String,default:"contain"},poster:{type:String,default:""},direction:{type:[String,Number],default:""},showProgress:{type:Boolean,default:!0},initialTime:{type:[String,Number],default:0},showFullscreenBtn:{type:[Boolean,String],default:!0},pageGesture:{type:[Boolean,String],default:!1},enableProgressGesture:{type:[Boolean,String],default:!0},showPlayBtn:{type:[Boolean,String],default:!0},showCenterPlayBtn:{type:[Boolean,String],default:!0}},data:function(){return{start:!1,playing:!1,currentTime:0,durationTime:0,progress:0,touching:!1,enableDanmuSync:Boolean(this.enableDanmu),controlsVisible:!0,fullscreen:!1,controlsTouching:!1,touchStartOrigin:{x:0,y:0},gestureType:s.NONE,currentTimeOld:0,currentTimeNew:0,volumeOld:null,volumeNew:null,buffered:0,isSafari:/^Apple/.test(navigator.vendor)}},computed:{centerPlayBtnShow:function(){return this.showCenterPlayBtn&&!this.start},controlsShow:function(){return!this.centerPlayBtnShow&&this.controls&&this.controlsVisible},autoHideContorls:function(){return this.controlsShow&&this.playing&&!this.controlsTouching},srcSync:function(){return this.$getRealPath(this.src)}},watch:{enableDanmuSync:function(t){this.$emit("update:enableDanmu",t)},autoHideContorls:function(t){t?this.autoHideStart():this.autoHideEnd()},srcSync:function(t){this.playing=!1,this.currentTime=0},currentTime:function(){this.updateProgress()},duration:function(){this.updateProgress()},buffered:function(t){0!==t&&this.$trigger("progress",{},{buffered:t})}},created:function(){this.otherData={danmuList:[],danmuIndex:{time:0,index:-1},hideTiming:null};var t=this.otherData.danmuList=JSON.parse(JSON.stringify(this.danmuList||[]));t.sort((function(t,e){return(t.time||0)-(e.time||0)}))},mounted:function(){var t,e,n,r=this,i=this,o=!0,s=this.$refs.ball;function c(r){var a=r.targetTouches[0],s=a.pageX,c=a.pageY;if(o&&Math.abs(s-t)100&&(f=100),i.progress=f,r.preventDefault(),r.stopPropagation()}}function u(t){i.controlsTouching=!1,i.touching&&(s.removeEventListener("touchmove",c,a),o||(t.preventDefault(),t.stopPropagation(),i.seek(i.$refs.video.duration*i.progress/100)),i.touching=!1)}s.addEventListener("touchstart",(function(i){r.controlsTouching=!0;var u=i.targetTouches[0];t=u.pageX,e=u.pageY,n=r.progress,o=!0,r.touching=!0,s.addEventListener("touchmove",c,a)})),s.addEventListener("touchend",u),s.addEventListener("touchcancel",u)},beforeDestroy:function(){this.triggerFullscreen(!1),clearTimeout(this.otherData.hideTiming)},methods:{_handleSubscribe:function(t){var e,n=t.type,r=t.data,i=void 0===r?{}:r;switch(n){case"seek":e=i.position;break;case"sendDanmu":e=i;break;case"playbackRate":e=i.rate;break}["play","pause","seek","sendDanmu","playbackRate","requestFullScreen","exitFullScreen"].indexOf(n)>=0&&this[n](e)},trigger:function(){this.playing?this.$refs.video.pause():this.$refs.video.play()},play:function(){this.start=!0,this.$refs.video.play()},pause:function(){this.$refs.video.pause()},seek:function(t){t=Number(t),"number"!==typeof t||isNaN(t)||(this.$refs.video.currentTime=t)},clickProgress:function(t){var e=this.$refs.progress,n=t.target,r=t.offsetX;while(n!==e)r+=n.offsetLeft,n=n.parentNode;var i=e.offsetWidth,o=0;r>=0&&r<=i&&(o=r/i,this.seek(this.$refs.video.duration*o))},triggerDanmu:function(){this.enableDanmuSync=!this.enableDanmuSync},playDanmu:function(t){var e=document.createElement("p");e.className="uni-video-danmu-item",e.innerText=t.text;var n="bottom: ".concat(100*Math.random(),"%;color: ").concat(t.color,";");e.setAttribute("style",n),this.$refs.danmu.appendChild(e),setTimeout((function(){n+="left: 0;-webkit-transform: translateX(-100%);transform: translateX(-100%);",e.setAttribute("style",n),setTimeout((function(){e.remove()}),4e3)}),17)},sendDanmu:function(t){var e=this.otherData;e.danmuList.splice(e.danmuIndex.index+1,0,{text:String(t.text),color:t.color,time:this.$refs.video.currentTime||0})},playbackRate:function(t){this.$refs.video.playbackRate=t},triggerFullscreen:function(t){var e,n=this.$refs.container,r=this.$refs.video;t?!document.fullscreenEnabled&&!document.webkitFullscreenEnabled||this.isSafari&&!this.userInteract?r.webkitEnterFullScreen?r.webkitEnterFullScreen():(e=!0,n.remove(),n.classList.add("uni-video-type-fullscreen"),document.body.appendChild(n)):n[document.fullscreenEnabled?"requestFullscreen":"webkitRequestFullscreen"]():document.fullscreenEnabled||document.webkitFullscreenEnabled?document.fullscreenElement?document.exitFullscreen():document.webkitFullscreenElement&&document.webkitExitFullscreen():r.webkitExitFullScreen?r.webkitExitFullScreen():(e=!0,n.remove(),n.classList.remove("uni-video-type-fullscreen"),this.$el.appendChild(n)),e&&this.emitFullscreenChange(t)},onFullscreenChange:function(t,e){e&&document.fullscreenEnabled||this.emitFullscreenChange(!(!document.fullscreenElement&&!document.webkitFullscreenElement))},emitFullscreenChange:function(t){this.fullscreen=t,this.$trigger("fullscreenchange",{},{fullScreen:t,direction:"vertical"})},requestFullScreen:function(){this.triggerFullscreen(!0)},exitFullScreen:function(){this.triggerFullscreen(!1)},onDurationChange:function(t){var e=t.target;this.durationTime=e.duration},onLoadedMetadata:function(t){var e=Number(this.initialTime)||0,n=t.target;e>0&&(n.currentTime=e),this.$trigger("loadedmetadata",t,{width:n.videoWidth,height:n.videoHeight,duration:n.duration}),this.onProgress(t)},onProgress:function(t){var e=t.target,n=e.buffered;n.length&&(this.buffered=n.end(n.length-1)/e.duration*100)},onWaiting:function(t){this.$trigger("waiting",t,{})},onVideoError:function(t){this.playing=!1,this.$trigger("error",t,{})},onPlay:function(t){this.start=!0,this.playing=!0,this.$trigger("play",t,{})},onPause:function(t){this.playing=!1,this.$trigger("pause",t,{})},onEnded:function(t){this.playing=!1,this.$trigger("ended",t,{})},onTimeUpdate:function(t){var e=t.target,n=this.otherData,r=this.currentTime=e.currentTime,i=n.danmuIndex,o={time:r,index:i.index},a=n.danmuList;if(r>i.time)for(var s=i.index+1;s=(c.time||0)))break;o.index=s,this.playing&&this.enableDanmuSync&&this.playDanmu(c)}else if(r-1;u--){var l=a[u];if(!(r<=(l.time||0)))break;o.index=u-1}n.danmuIndex=o,this.$trigger("timeupdate",t,{currentTime:r,duration:e.duration})},triggerControls:function(){this.controlsVisible=!this.controlsVisible},touchstart:function(t){var e=t.targetTouches[0];this.touchStartOrigin={x:e.pageX,y:e.pageY},this.gestureType=s.NONE,this.volumeOld=null,this.currentTimeOld=this.currentTimeNew=0},touchmove:function(t){function e(){t.stopPropagation(),t.preventDefault()}this.fullscreen&&e();var n=this.gestureType;if(n!==s.STOP){var r=t.targetTouches[0],i=r.pageX,o=r.pageY,a=this.touchStartOrigin;if(n===s.PROGRESS?this.changeProgress(i-a.x):n===s.VOLUME&&this.changeVolume(o-a.y),n===s.NONE)if(Math.abs(i-a.x)>Math.abs(o-a.y)){if(!this.enableProgressGesture)return void(this.gestureType=s.STOP);this.gestureType=s.PROGRESS,this.currentTimeOld=this.currentTimeNew=this.$refs.video.currentTime,this.fullscreen||e()}else{if(!this.pageGesture)return void(this.gestureType=s.STOP);this.gestureType=s.VOLUME,this.volumeOld=this.$refs.video.volume,this.fullscreen||e()}}},touchend:function(t){this.gestureType!==s.NONE&&this.gestureType!==s.STOP&&(t.stopPropagation(),t.preventDefault()),this.gestureType===s.PROGRESS&&this.currentTimeOld!==this.currentTimeNew&&(this.$refs.video.currentTime=this.currentTimeNew),this.gestureType=s.NONE},changeProgress:function(t){var e=this.$refs.video.duration,n=t/600*e+this.currentTimeOld;n<0?n=0:n>e&&(n=e),this.currentTimeNew=n},changeVolume:function(t){var e,n=this.volumeOld;"number"===typeof n&&(e=n-t/200,e<0?e=0:e>1&&(e=1),this.$refs.video.volume=e,this.volumeNew=e)},autoHideStart:function(){var t=this;this.otherData.hideTiming=setTimeout((function(){t.controlsVisible=!1}),3e3)},autoHideEnd:function(){var t=this.otherData;t.hideTiming&&(clearTimeout(t.hideTiming),t.hideTiming=null)},updateProgress:function(){this.touching||(this.progress=this.currentTime/this.durationTime*100)}}},u=c,l=(n("a61d"),n("8844")),f=Object(l["a"])(u,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("uni-video",t._g({attrs:{id:t.id}},t.$listeners),[n("div",{ref:"container",staticClass:"uni-video-container",on:{touchstart:t.touchstart,touchend:t.touchend,touchmove:t.touchmove,fullscreenchange:function(e){return e.stopPropagation(),t.onFullscreenChange(e)},webkitfullscreenchange:function(e){return e.stopPropagation(),t.onFullscreenChange(e,!0)}}},[n("video",t._b({ref:"video",staticClass:"uni-video-video",style:{objectFit:t.objectFit},attrs:{loop:t.loop,src:t.srcSync,poster:t.poster,autoplay:t.autoplay,"webkit-playsinline":"",playsinline:""},domProps:{muted:t.muted},on:{click:t.triggerControls,durationchange:t.onDurationChange,loadedmetadata:t.onLoadedMetadata,progress:t.onProgress,waiting:t.onWaiting,error:t.onVideoError,play:t.onPlay,pause:t.onPause,ended:t.onEnded,timeupdate:t.onTimeUpdate,webkitbeginfullscreen:function(e){return t.emitFullscreenChange(!0)},x5videoenterfullscreen:function(e){return t.emitFullscreenChange(!0)},webkitendfullscreen:function(e){return t.emitFullscreenChange(!1)},x5videoexitfullscreen:function(e){return t.emitFullscreenChange(!1)}}},"video",t.$attrs,!1)),n("div",{directives:[{name:"show",rawName:"v-show",value:t.controlsShow,expression:"controlsShow"}],staticClass:"uni-video-bar uni-video-bar-full",on:{click:function(t){t.stopPropagation()}}},[n("div",{staticClass:"uni-video-controls"},[n("div",{directives:[{name:"show",rawName:"v-show",value:t.showPlayBtn,expression:"showPlayBtn"}],staticClass:"uni-video-control-button",class:{"uni-video-control-button-play":!t.playing,"uni-video-control-button-pause":t.playing},on:{click:function(e){return e.stopPropagation(),t.trigger(e)}}}),n("div",{directives:[{name:"show",rawName:"v-show",value:t.showProgress,expression:"showProgress"}],staticClass:"uni-video-current-time"},[t._v(" "+t._s(t._f("time")(t.currentTime))+" ")]),n("div",{directives:[{name:"show",rawName:"v-show",value:t.showProgress,expression:"showProgress"}],ref:"progress",staticClass:"uni-video-progress-container",on:{click:function(e){return e.stopPropagation(),t.clickProgress(e)}}},[n("div",{staticClass:"uni-video-progress"},[n("div",{staticClass:"uni-video-progress-buffered",style:{width:t.buffered+"%"}}),n("div",{ref:"ball",staticClass:"uni-video-ball",style:{left:t.progress+"%"}},[n("div",{staticClass:"uni-video-inner"})])])]),n("div",{directives:[{name:"show",rawName:"v-show",value:t.showProgress,expression:"showProgress"}],staticClass:"uni-video-duration"},[t._v(" "+t._s(t._f("time")(t.duration||t.durationTime))+" ")])]),t.danmuBtn?n("div",{staticClass:"uni-video-danmu-button",class:{"uni-video-danmu-button-active":t.enableDanmuSync},on:{click:function(e){return e.stopPropagation(),t.triggerDanmu(e)}}},[t._v(" "+t._s(t.$$t("uni.video.danmu"))+" ")]):t._e(),n("div",{directives:[{name:"show",rawName:"v-show",value:t.showFullscreenBtn,expression:"showFullscreenBtn"}],staticClass:"uni-video-fullscreen",class:{"uni-video-type-fullscreen":t.fullscreen},on:{click:function(e){return e.stopPropagation(),t.triggerFullscreen(!t.fullscreen)}}})]),n("div",{directives:[{name:"show",rawName:"v-show",value:t.start&&t.enableDanmuSync,expression:"start&&enableDanmuSync"}],ref:"danmu",staticClass:"uni-video-danmu",staticStyle:{"z-index":"0"}}),t.centerPlayBtnShow?n("div",{staticClass:"uni-video-cover",on:{click:function(t){t.stopPropagation()}}},[n("div",{staticClass:"uni-video-cover-play-button",on:{click:function(e){return e.stopPropagation(),t.play(e)}}}),n("p",{staticClass:"uni-video-cover-duration"},[t._v(" "+t._s(t._f("time")(t.duration||t.durationTime))+" ")])]):t._e(),n("div",{staticClass:"uni-video-toast",class:{"uni-video-toast-volume":"volume"===t.gestureType}},[n("div",{staticClass:"uni-video-toast-title"},[t._v(" "+t._s(t.$$t("uni.video.volume"))+" ")]),n("svg",{staticClass:"uni-video-toast-icon",attrs:{width:"200px",height:"200px",viewBox:"0 0 1024 1024",version:"1.1",xmlns:"http://www.w3.org/2000/svg"}},[n("path",{attrs:{d:"M475.400704 201.19552l0 621.674496q0 14.856192-10.856448 25.71264t-25.71264 10.856448-25.71264-10.856448l-190.273536-190.273536-149.704704 0q-14.856192 0-25.71264-10.856448t-10.856448-25.71264l0-219.414528q0-14.856192 10.856448-25.71264t25.71264-10.856448l149.704704 0 190.273536-190.273536q10.856448-10.856448 25.71264-10.856448t25.71264 10.856448 10.856448 25.71264zm219.414528 310.837248q0 43.425792-24.28416 80.851968t-64.2816 53.425152q-5.71392 2.85696-14.2848 2.85696-14.856192 0-25.71264-10.570752t-10.856448-25.998336q0-11.999232 6.856704-20.284416t16.570368-14.2848 19.427328-13.142016 16.570368-20.284416 6.856704-32.569344-6.856704-32.569344-16.570368-20.284416-19.427328-13.142016-16.570368-14.2848-6.856704-20.284416q0-15.427584 10.856448-25.998336t25.71264-10.570752q8.57088 0 14.2848 2.85696 39.99744 15.427584 64.2816 53.139456t24.28416 81.137664zm146.276352 0q0 87.422976-48.56832 161.41824t-128.5632 107.707392q-7.428096 2.85696-14.2848 2.85696-15.427584 0-26.284032-10.856448t-10.856448-25.71264q0-22.284288 22.284288-33.712128 31.997952-16.570368 43.425792-25.141248 42.283008-30.855168 65.995776-77.423616t23.712768-99.136512-23.712768-99.136512-65.995776-77.423616q-11.42784-8.57088-43.425792-25.141248-22.284288-11.42784-22.284288-33.712128 0-14.856192 10.856448-25.71264t25.71264-10.856448q7.428096 0 14.856192 2.85696 79.99488 33.712128 128.5632 107.707392t48.56832 161.41824zm146.276352 0q0 131.42016-72.566784 241.41312t-193.130496 161.989632q-7.428096 2.85696-14.856192 2.85696-14.856192 0-25.71264-10.856448t-10.856448-25.71264q0-20.570112 22.284288-33.712128 3.999744-2.285568 12.85632-5.999616t12.85632-5.999616q26.284032-14.2848 46.854144-29.140992 70.281216-51.996672 109.707264-129.705984t39.426048-165.132288-39.426048-165.132288-109.707264-129.705984q-20.570112-14.856192-46.854144-29.140992-3.999744-2.285568-12.85632-5.999616t-12.85632-5.999616q-22.284288-13.142016-22.284288-33.712128 0-14.856192 10.856448-25.71264t25.71264-10.856448q7.428096 0 14.856192 2.85696 120.563712 51.996672 193.130496 161.989632t72.566784 241.41312z"}})]),n("div",{staticClass:"uni-video-toast-value"},[n("div",{staticClass:"uni-video-toast-value-content",style:{width:100*t.volumeNew+"%"}},[n("div",{staticClass:"uni-video-toast-volume-grids"},t._l(10,(function(t,e){return n("div",{key:e,staticClass:"uni-video-toast-volume-grids-item"})})),0)])])]),n("div",{staticClass:"uni-video-toast",class:{"uni-video-toast-progress":"progress"==t.gestureType}},[n("div",{staticClass:"uni-video-toast-title"},[t._v(" "+t._s(t._f("time")(t.currentTimeNew))+" / "+t._s(t._f("time")(t.durationTime))+" ")])]),n("div",{staticClass:"uni-video-slots"},[t._t("default")],2)])])}),[],!1,null,null,null);e["default"]=f.exports},"4ca1":function(t,e,n){"use strict";n.r(e),n.d(e,"previewImage",(function(){return i}));var r=n("4738"),i={urls:{type:Array,required:!0,validator:function(t,e){var n;if(e.urls=t.map((function(t){if("string"===typeof t)return Object(r["a"])(t);n=!0})),n)return"url is not string"}},current:{type:[String,Number],validator:function(t,e){"number"===typeof t?e.current=t>0&&t=0&&this._callbacks.splice(e,1)}},{key:"abort",value:function(){this._xhr&&(this._xhr.abort(),delete this._xhr)}}]),t}();function s(e,n){var i,o=e.url,s=e.header,c=e.timeout,u=void 0===c?__uniConfig.networkTimeout&&__uniConfig.networkTimeout.request||6e4:c,l=t,f=l.invokeCallbackHandler,d=new XMLHttpRequest,h=new a(d);return d.open("GET",o,!0),Object.keys(s).forEach((function(t){d.setRequestHeader(t,s[t])})),d.responseType="blob",d.onload=function(){clearTimeout(i);var t,e=d.status,a=this.response,s=d.getResponseHeader("content-disposition");if(s){var c=s.match(/filename="?(\S+)"?\b/);c&&(t=c[1])}a.name=t||Object(r["c"])(o),f(n,{errMsg:"downloadFile:ok",statusCode:e,tempFilePath:Object(r["b"])(a)})},d.onabort=function(){clearTimeout(i),f(n,{errMsg:"downloadFile:fail abort"})},d.onerror=function(){clearTimeout(i),f(n,{errMsg:"downloadFile:fail"})},d.onprogress=function(t){h._callbacks.forEach((function(e){var n=t.loaded,r=t.total,i=Math.round(n/r*100);e({progress:i,totalBytesWritten:n,totalBytesExpectedToWrite:r})}))},d.send(),i=setTimeout((function(){d.onprogress=d.onload=d.onabort=d.onerror=null,h.abort(),f(n,{errMsg:"downloadFile:fail timeout"})}),u),h}}.call(this,n("2c9f"))},"4d5a":function(t,e,n){"use strict";n.r(e),function(t){n.d(e,"redirectTo",(function(){return c})),n.d(e,"navigateTo",(function(){return u})),n.d(e,"navigateBack",(function(){return l})),n.d(e,"reLaunch",(function(){return f})),n.d(e,"switchTab",(function(){return d})),n.d(e,"preloadPage",(function(){return h}));var r=n("38ce"),i=n("c879"),o=t,a=o.invokeCallbackHandler;function s(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e.url,o=e.delta,a=e.events,c=e.exists,u=e.animationType,l=e.animationDuration,f=e.from,d=void 0===f?"navigateBack":f,h=e.detail,p=getApp().$router;switch(delete p.$eventChannel,t){case"redirectTo":if("back"===c){var v=Object(r["a"])(n);if(-1!==v){var g=getCurrentPages().length-1-v;if(g>0)return s("navigateBack",{delta:g})}}p.replace({type:t,path:n});break;case"navigateTo":return p.$eventChannel=Object(i["a"])(a),p.push({type:t,path:n,animationType:u,animationDuration:l}),{errMsg:t+":ok",eventChannel:p.$eventChannel};case"navigateBack":var m=!0,b=getCurrentPages();if(b.length){var y=b[b.length-1];Object(r["c"])(y.$options,"onBackPress")&&!0===y.__call_hook("onBackPress",{from:d})&&(m=!1)}m&&(o>1&&(p._$delta=o),p.go(-o,{animationType:u,animationDuration:l}));break;case"reLaunch":p.replace({type:t,path:n});break;case"switchTab":p.replace({type:t,path:n,params:{detail:h}});break}return{errMsg:t+":ok"}}function c(t){return s("redirectTo",t)}function u(t){return s("navigateTo",t)}function l(t){return s("navigateBack",t)}function f(t){return s("reLaunch",t)}function d(t){return s("switchTab",t)}function h(t,e){var n=t.url,r=n.split("?")[0].replace(/\//g,"-");__uniConfig.__webpack_chunk_load__(r.substr(1)).then((function(){a(e,{url:n,errMsg:"preloadPage:ok"})})).catch((function(t){a(e,{url:n,errMsg:"preloadPage:fail "+t})}))}}.call(this,n("2c9f"))},"4dc6":function(t,e,n){"use strict";var r=n("655d"),i=n.n(r);i.a},"4e46":function(t,e,n){"use strict";n.d(e,"a",(function(){return c}));var r=n("951c"),i=n.n(r),o=n("0372"),a=n("b405"),s=__uniConfig.tabBar||{};__uniConfig.tabBar=i.a.observable(Object(a["d"])(Object(o["f"])(s))),Object(a["c"])((function(){var t=Object(a["d"])(Object(o["f"])(s));__uniConfig.tabBar.backgroundColor=t.backgroundColor,__uniConfig.tabBar.borderStyle=t.borderStyle,__uniConfig.tabBar.color=t.color,__uniConfig.tabBar.selectedColor=t.selectedColor,__uniConfig.tabBar.blurEffect=t.blurEffect,__uniConfig.tabBar.midButton=t.midButton,t.list&&t.list.length&&__uniConfig.tabBar.list.length&&t.list.forEach((function(t,e){__uniConfig.tabBar.list[e].iconPath=t.iconPath,__uniConfig.tabBar.list[e].selectedIconPath=t.selectedIconPath}))}));var c=__uniConfig.tabBar},"4ed4":function(t,e,n){"use strict";(function(t,r){var i=n("340d"),o=n("1daa"),a=n("0372"),s=n("b435");e["a"]={name:"SystemChooseLocation",filters:{distance:function(t){return t>100?"".concat(t>1e3?(t/1e3).toFixed(1)+"k":t.toFixed(0),"m | "):t>0?"<100m | ":""}},mixins:[a["c"]],data:function(){var t=this.$route.query,e=t.latitude,n=t.longitude;return{latitude:e,longitude:n,pageSize:20,pageIndex:1,hasNextPage:!0,nextPage:null,selectedIndex:-1,list:[],keyword:"",searching:!1,loading:!0,adcode:"",locationStyle:'background-image: url("'.concat(s["b"],'")')}},computed:{selected:function(){return this.list[this.selectedIndex]},boundary:function(){return this.adcode?"region(".concat(this.adcode,",1,").concat(this.latitude,",").concat(this.longitude,")"):"nearby(".concat(this.latitude,",").concat(this.longitude,",5000)")}},created:function(){var t=this;this.latitude&&this.longitude||this.moveToLocation(),this.search=Object(i["d"])((function(){t.reset(),t.keyword&&t.getList()}),1e3),this.$watch("searching",(function(e){t.reset(),e||t.getList()}))},methods:{choose:function(){this.selected&&(t.publishHandler("onChooseLocation",Object.assign({},this.selected)),getApp().$router.back())},back:function(){t.publishHandler("onChooseLocation",null),getApp().$router.back()},moveToLocation:function(){uni.getLocation({type:"gcj02",success:this.move.bind(this),fail:function(){}})},onRegionChange:function(t){var e=t.detail.centerLocation;e&&this.move(e)},pushData:function(t){var e=this;t.forEach((function(t){e.list.push({name:t.title||t.name,address:t.address,distance:t._distance||t.distance,latitude:t.location.lat,longitude:t.location.lng})}))},getList:function(){var t=this;this.loading=!0;var e=Object(s["e"])();if(e.type===s["d"].GOOGLE){if(this.pageIndex>1&&this.nextPage)return void this.nextPage();var n=new window.google.maps.places.PlacesService(document.createElement("div"));n[this.searching?"textSearch":"nearbySearch"]({location:{lat:this.latitude,lng:this.longitude},query:this.keyword,radius:5e3},(function(e,n,r){t.loading=!1,e&&e.length&&e.forEach((function(e){t.list.push({name:e.name||"",address:e.vicinity||e.formatted_address||"",distance:0,latitude:e.geometry.location.lat(),longitude:e.geometry.location.lng()})})),r&&(r.hasNextPage?t.nextPage=function(){r.nextPage()}:t.hasNextPage=!1)}))}else if(e.type===s["d"].QQ){var i=this.searching?"https://apis.map.qq.com/ws/place/v1/search?output=jsonp&key=".concat(e.key,"&boundary=").concat(this.boundary,"&keyword=").concat(this.keyword,"&page_size=").concat(this.pageSize,"&page_index=").concat(this.pageIndex):"https://apis.map.qq.com/ws/geocoder/v1/?output=jsonp&key=".concat(e.key,"&location=").concat(this.latitude,",").concat(this.longitude,"&get_poi=1&poi_options=page_size=").concat(this.pageSize,";page_index=").concat(this.pageIndex);Object(o["a"])(i,{callback:"callback"},(function(e){if(t.loading=!1,t.searching&&"data"in e&&e.data.length)t.pushData(e.data);else if("result"in e){var n=e.result;t.adcode=n.ad_info?n.ad_info.adcode:"",n.pois&&t.pushData(n.pois),t.list.length===t.pageSize*t.pageIndex&&(t.hasNextPage=!1)}}),(function(){t.loading=!1}))}else if(e.type===s["d"].AMAP){var a=this;window.AMap.plugin("AMap.PlaceSearch",(function(){if(a.longitude&&a.latitude){var t=new window.AMap.PlaceSearch({city:"全国",pageSize:10,pageIndex:a.pageIndex}),e=a.searching?a.keyword:"",n=a.searching?5e4:5e3;t.searchNearBy(e,[a.longitude,a.latitude],n,(function(t,e){"error"===t?r.error(e):"no_data"===t?a.hasNextPage=!1:a.pushData(e.poiList.pois)}))}a.loading=!1}))}},loadMore:function(){!this.loading&&this.hasNextPage&&(this.pageIndex++,this.getList())},reset:function(){this.selectedIndex=-1,this.pageIndex=1,this.hasNextPage=!0,this.nextPage=null,this.list=[]},move:function(t){var e=t.latitude,n=t.longitude;this.latitude=e,this.longitude=n,this.searching||(this.reset(),this.getList())},input:function(){this.search()}}}}).call(this,n("31d2"),n("418b")["default"])},"4ef5":function(t){t.exports=JSON.parse('{"uni.app.quit":"再按一次退出應用","uni.async.error":"連接服務器超時,點擊屏幕重試","uni.showActionSheet.cancel":"取消","uni.showToast.unpaired":"請注意 showToast 與 hideToast 必須配對使用","uni.showLoading.unpaired":"請注意 showLoading 與 hideLoading 必須配對使用","uni.showModal.cancel":"取消","uni.showModal.confirm":"確定","uni.chooseImage.cancel":"取消","uni.chooseImage.sourceType.album":"從相冊選擇","uni.chooseImage.sourceType.camera":"拍攝","uni.chooseVideo.cancel":"取消","uni.chooseVideo.sourceType.album":"從相冊選擇","uni.chooseVideo.sourceType.camera":"拍攝","uni.chooseFile.notUserActivation":"文件選擇器對話框只能在由用戶激活時顯示","uni.previewImage.cancel":"取消","uni.previewImage.button.save":"保存圖像","uni.previewImage.save.success":"保存圖像到相冊成功","uni.previewImage.save.fail":"保存圖像到相冊失敗","uni.setClipboardData.success":"內容已復制","uni.scanCode.title":"掃碼","uni.scanCode.album":"相冊","uni.scanCode.fail":"識別失敗","uni.scanCode.flash.on":"輕觸照亮","uni.scanCode.flash.off":"輕觸關閉","uni.startSoterAuthentication.authContent":"指紋識別中...","uni.startSoterAuthentication.waitingContent":"無法識別","uni.picker.done":"完成","uni.picker.cancel":"取消","uni.video.danmu":"彈幕","uni.video.volume":"音量","uni.button.feedback.title":"問題反饋","uni.button.feedback.send":"發送","uni.chooseLocation.search":"搜索地點","uni.chooseLocation.cancel":"取消"}')},"4f2e":function(t,e,n){"use strict";n.r(e);var r={name:"CoverView",props:{scrollTop:{type:[String,Number],default:0}},watch:{scrollTop:function(t){this.setScrollTop(t)}},mounted:function(){this.setScrollTop(this.scrollTop)},methods:{setScrollTop:function(t){var e=this.$refs.content;"scroll"===getComputedStyle(e).overflowY&&(e.scrollTop=this._upx2pxNum(t))},_upx2pxNum:function(t){return/\d+[ur]px$/i.test(t)&&t.replace(/\d+[ur]px$/i,(function(t){return uni.upx2px(parseFloat(t))})),parseFloat(t)||0}}},i=r,o=(n("ca54"),n("8844")),a=Object(o["a"])(i,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("uni-cover-view",t._g({attrs:{"scroll-top":t.scrollTop}},t.$listeners),[n("div",{ref:"content",staticClass:"uni-cover-view"},[t._t("default")],2)])}),[],!1,null,null,null);e["default"]=a.exports},"4fcb":function(t,e,n){"use strict";n.r(e),function(t){var r=n("340d");e["default"]={data:function(){return{showModal:{visible:!1}}},created:function(){var e=this;t.on("onShowModal",(function(t,n){e.showModal=t,e.onModalCloseCallback=n})),t.on("onHidePopup",(function(t){e.showModal.visible=!1}))},methods:{_onModalClose:function(t){this.showModal.visible=!1,Object(r["k"])(this.onModalCloseCallback)&&this.onModalCloseCallback(t)}}}}.call(this,n("2c9f"))},"508e":function(t,e,n){"use strict";n.d(e,"a",(function(){return a}));var r=n("cff9"),i=n("6564");function o(t,e){var n=t.name,r=t.arg;"postMessage"===n||uni[n](r)}function a(t,e){var n=e.getApp,a=e.getCurrentPages;function s(t,e){var n=a();n.length&&Object(r["b"])(n[n.length-1],t,e)}function c(t){return function(e){s(t,e)}}t("onError",(function(t){Object(r["a"])(n(),"onError",t)})),t("onPageNotFound",(function(t){Object(r["a"])(n(),"onPageNotFound",t)})),t("onAppEnterBackground",(function(){Object(r["a"])(n(),"onHide"),s("onHide")})),t("onAppEnterForeground",(function(t){Object(r["a"])(n(),"onShow",t);var e=a();0!==e.length&&s("onShow")})),t("onResize",(function(t,e){var n=a().find((function(t){return t.$page.id===e}));n&&Object(r["b"])(n,"onResize",t)})),t("onPullDownRefresh",(function(t,e){var n=a().find((function(t){return t.$page.id===e}));n&&(Object(i["setPullDownRefreshPageId"])(e),Object(r["b"])(n,"onPullDownRefresh"))})),t("onTabItemTap",c("onTabItemTap")),t("onNavigationBarButtonTap",c("onNavigationBarButtonTap")),t("onNavigationBarSearchInputChanged",c("onNavigationBarSearchInputChanged")),t("onNavigationBarSearchInputConfirmed",c("onNavigationBarSearchInputConfirmed")),t("onNavigationBarSearchInputClicked",c("onNavigationBarSearchInputClicked")),t("onNavigationBarSearchInputFocusChanged",c("onNavigationBarSearchInputFocusChanged")),t("onWebInvokeAppService",o)}},"50d3":function(t,e,n){"use strict";n.r(e);var r=n("951c"),i=n.n(r),o=n("4738"),a=n("cce2"),s={methods:{$getRealPath:function(t){return t?Object(o["a"])(t):t},$trigger:function(t,e,n){this.$emit(t,a["b"].call(this,t,e,n,this.$el,this.$el))}}};function c(t){return function(t){if(Array.isArray(t))return u(t)}(t)||function(t){if("undefined"!==typeof Symbol&&Symbol.iterator in Object(t))return Array.from(t)}(t)||function(t,e){if(t){if("string"===typeof t)return u(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(n):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?u(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=0&&(a.length=1),f.push("".concat(o,"(").concat(a.join(","),")"));else if(r.concat(i).includes(a[0])){o=a[0];var s=a[1];u[o]=i.includes(o)?l(s):s}})),u.transform=u.webkitTransform=f.join(" "),u.transition=u.webkitTransition=Object.keys(u).map((function(t){return"".concat(function(t){return t.replace(/[A-Z]/g,(function(t){return"-".concat(t.toLowerCase())})).replace("webkit","-webkit")}(t)," ").concat(s.duration,"ms ").concat(s.timingFunction," ").concat(s.delay,"ms")})).join(","),u.transformOrigin=u.webkitTransformOrigin=a.transformOrigin,u}(e);Object.keys(s).forEach((function(e){t.$el.style[e]=s[e]})),n+=1,n0&&void 0!==arguments[0]?arguments[0]:"/",e=decodeURI(window.location.pathname),n=window.location.search,r=window.location.hash;return"/"===t[t.length-1]&&e===t.substring(0,t.length-1)&&(e=t,window.history.replaceState({},"",t+n+r)),t&&0===e.indexOf(t)&&(e=e.slice(t.length)),(e||"/")+n+r}e["default"]={install:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=n.routes;e.config.devtools&&"undefined"!==typeof window&&-1!==window.navigator.userAgent.toLowerCase().indexOf("hbuilderx")&&(e.config.devtools=!1),Object(u["a"])(e),Object(c["a"])(e),Object(f["w"])(e),"undefined"!==typeof __UNI_ROUTER_BASE__&&(__uniConfig.router.base=__UNI_ROUTER_BASE__);var v=d(r),g=new i.a({id:v,mode:__uniConfig.router.mode,base:__uniConfig.router.base,routes:r,scrollBehavior:function(t,e,n){if(n)return n;if(t&&e&&t.meta.isTabBar&&e.meta.isTabBar){var r=Object(l["b"])(t.params.__id__);if(r)return r}return{x:0,y:0}}}),m=[],b=g.match("history"===__uniConfig.router.mode?p(__uniConfig.router.base):h());if(b.meta.name&&(b.meta.id?m.push(b.meta.name+"-"+b.meta.id):m.push(b.meta.name+"-"+(v+1))),b.meta&&b.meta.name&&(document.body.className="uni-body "+b.meta.name,b.meta.isNVue)){var y="nvue-dir-"+__uniConfig.nvue["flex-direction"];document.body.setAttribute("nvue",""),document.body.setAttribute(y,"")}e.mixin({beforeCreate:function(){var n=this.$options;if("app"===n.mpType){n.data=function(){return{keepAliveInclude:m}};var i=Object(a["a"])(e,r,b);Object.keys(i).forEach((function(t){n[t]=n[t]?[].concat(i[t],n[t]):[i[t]]})),n.router=g,Array.isArray(n.onError)&&0!==n.onError.length||(n.onError=[function(e){t.error(e)}])}else if(Object(o["d"])(this)){var c=Object(s["a"])();Object.keys(c).forEach((function(t){n.mpOptions?n[t]=n[t]?[].concat(n[t],c[t]):[c[t]]:n[t]=n[t]?[].concat(c[t],n[t]):[c[t]]}))}else this.$parent&&this.$parent.__page__&&(this.__page__=this.$parent.__page__)}}),Object.defineProperty(e.prototype,"$page",{get:function(){return this.__page__}}),e.prototype.createSelectorQuery=function(){return uni.createSelectorQuery().in(this)},e.prototype.createIntersectionObserver=function(t){return uni.createIntersectionObserver(this,t)},e.prototype.createMediaQueryObserver=function(t){return uni.createMediaQueryObserver(this,t)},e.use(i.a)}}}.call(this,n("418b")["default"])},"51e5":function(t,e,n){"use strict";n.r(e),n.d(e,"setClipboardData",(function(){return i}));var r=n("0372"),i={data:{type:String,required:!0},showToast:{type:Boolean,default:!0},beforeSuccess:function(t,e){if(e.showToast){var n=Object(r["g"])("uni.setClipboardData.success");n&&uni.showToast({title:n,icon:"success",mask:!1,style:{width:void 0}})}}}},"526c":function(t,e,n){"use strict";var r=n("b91d"),i=n.n(r);i.a},"53f9":function(t,e,n){"use strict";n.r(e),n.d(e,"base64ToArrayBuffer",(function(){return r})),n.d(e,"arrayBufferToBase64",(function(){return i}));var r=[{name:"base64",type:String,required:!0}],i=[{name:"arrayBuffer",type:[ArrayBuffer,Uint8Array],required:!0}]},"541c":function(t,e,n){"use strict";n.r(e),function(t){function r(e,n,r,i){var o=n.$page.id;t.publishHandler(o+"-map-"+e,{mapId:e,type:r,data:i},o)}n.d(e,"operateMapPlayer",(function(){return r}))}.call(this,n("2c9f"))},5505:function(t,e,n){"use strict";var r=n("c93f"),i=n.n(r);i.a},5556:function(t,e,n){"use strict";var r=n("68d2"),i=n.n(r);i.a},"56ae":function(t,e,n){"use strict";function i(t){return i="function"===typeof Symbol&&"symbol"===r(Symbol.iterator)?function(t){return r(t)}:function(t){return t&&"function"===typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":r(t)},i(t)}n.r(e),n.d(e,"setStorage",(function(){return a})),n.d(e,"setStorageSync",(function(){return s})),n.d(e,"getStorage",(function(){return c})),n.d(e,"getStorageSync",(function(){return u})),n.d(e,"removeStorage",(function(){return l})),n.d(e,"removeStorageSync",(function(){return f})),n.d(e,"clearStorage",(function(){return d})),n.d(e,"clearStorageSync",(function(){return h})),n.d(e,"getStorageInfo",(function(){return p})),n.d(e,"getStorageInfoSync",(function(){return v}));function o(t){try{var e="string"===typeof t?JSON.parse(t):t,n=e.type;if(["object","string","number","boolean","undefined"].indexOf(n)>=0){var r=Object.keys(e);if(2===r.length&&"data"in e){if(i(e.data)===n)return e.data;if("object"===n&&/^\d{4}-\d{2}-\d{2}T\d{2}\:\d{2}\:\d{2}\.\d{3}Z$/.test(e.data))return new Date(e.data)}else if(1===r.length)return""}}catch(a){}}function a(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.key,n=t.data,r=i(n),o="string"===r?n:JSON.stringify({type:r,data:n});try{localStorage.setItem(e,o)}catch(a){return{errMsg:"setStorage:fail ".concat(a)}}return{errMsg:"setStorage:ok"}}function s(t,e){a({key:t,data:e})}function c(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.key,n=localStorage&&localStorage.getItem(e);if("string"!==typeof n)return{data:"",errMsg:"getStorage:fail"};var r=n;try{var i=JSON.parse(n),a=o(i);void 0!==a&&(r=a)}catch(s){}return{data:r,errMsg:"getStorage:ok"}}function u(t){var e=c({key:t});return e.data}function l(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.key;return localStorage&&localStorage.removeItem(e),{errMsg:"removeStorage:ok"}}function f(t){l({key:t})}function d(){return localStorage&&localStorage.clear(),{errMsg:"clearStorage:ok"}}function h(){d()}function p(){for(var t=localStorage&&localStorage.length||0,e=[],n=0,r=0;rt.length)&&(e=t.length);for(var n=0,r=new Array(e);n should have url attribute when using navigateTo, redirectTo, reLaunch or switchTab")}}}}).call(this,n("418b")["default"])},"5db9":function(t,e,n){"use strict";var r=n("ea72"),i=r["a"],o=(n("5f77"),n("8844")),a=Object(o["a"])(i,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("uni-tabbar",{class:["uni-tabbar-"+t.position]},[n("div",{staticClass:"uni-tabbar",style:{backgroundColor:t.tabbarBackgroundColor,"backdrop-filter":"none"!==t.blurEffect?"blur(10px)":t.blurEffect}},[n("div",{staticClass:"uni-tabbar-border",style:{backgroundColor:t.borderColor}}),t._l(t.visibleList,(function(e,r){return n("div",{key:e.isMidButton?r:e.pagePath,staticClass:"uni-tabbar__item",style:e.isMidButton?{flex:"0 0 "+e.width,position:"relative"}:{},on:{click:function(n){return t._switchTab(e,r)}}},[e.isMidButton?n("div",{staticClass:"uni-tabbar__mid",style:t._uniTabbarBdStyle(e)},[e.iconPath?n("img",{style:{width:e.iconWidth,height:e.iconWidth},attrs:{src:t._getRealPath(e.iconPath)}}):t._e()]):t._e(),n("div",{staticClass:"uni-tabbar__bd",style:{height:t.height}},[t.getIconPath(e,r)||e.iconfont||e.iconPath||e.isMidButton?n("div",{staticClass:"uni-tabbar__icon",class:{"uni-tabbar__icon__diff":!e.text},style:{width:t.iconWidth,height:t.iconWidth}},[e.iconfont?n("div",{staticClass:"uni-tabbar__iconfont",style:{color:t.selectedIndex===r?e.iconfont.selectedColor:e.iconfont.color,fontSize:e.iconfont.fontSize||t.iconWidth}},[t._v(" "+t._s(t.selectedIndex===r?e.iconfont.selectedText:e.iconfont.text)+" ")]):e.isMidButton?t._e():n("img",{attrs:{src:t._getRealPath(t.getIconPath(e,r))}})]):t._e(),e.text?n("div",{staticClass:"uni-tabbar__label",style:{color:t.selectedIndex===r?t.selectedColor:t.color,fontSize:t.fontSize,lineHeight:e.iconPath?"normal":1.8,marginTop:e.iconPath?t.spacing:"inherit"}},[t._v(" "+t._s(e.text)+" ")]):t._e(),e.redDot?n("div",{staticClass:"uni-tabbar__reddot",class:{"uni-tabbar__badge":!!e.badge}},[t._v(" "+t._s(e.badge)+" ")]):t._e()])])}))],2),n("div",{staticClass:"uni-placeholder",style:{height:t.height}})])}),[],!1,null,null,null),s=a.exports,c=n("e16e"),u=c["a"],l=(n("5556"),Object(o["a"])(u,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.responsive?n("uni-layout",{class:{"uni-app--showlayout":t.showLayout,"uni-app--showtopwindow":t.showTopWindow,"uni-app--showleftwindow":t.showLeftWindow,"uni-app--showrightwindow":t.showRightWindow}},[t.topWindow?n("uni-top-window",{directives:[{name:"show",rawName:"v-show",value:t.showTopWindow||t.apiShowTopWindow,expression:"showTopWindow || apiShowTopWindow"}]},[n("div",{ref:"topWindow",staticClass:"uni-top-window",style:t.topWindowStyle},[n("v-uni-top-window",t._b({ref:"top",attrs:{"navigation-bar-title-text":t.navigationBarTitleText},on:{"hook:mounted":t.onTopWindowInit}},"v-uni-top-window",t.bindWindow,!1))],1),n("div",{staticClass:"uni-top-window--placeholder",style:{height:t.topWindowHeight}})]):t._e(),n("uni-content",[n("uni-main",[n("keep-alive",{attrs:{include:t.keepAliveInclude}},[n("router-view",{key:t.routerKey})],1)],1),t.leftWindow?n("uni-left-window",{directives:[{name:"show",rawName:"v-show",value:t.showLeftWindow||t.apiShowLeftWindow,expression:"showLeftWindow || apiShowLeftWindow"}],ref:"leftWindow",style:t.leftWindowStyle,attrs:{"data-show":t.apiShowLeftWindow}},[t.apiShowLeftWindow?n("div",{staticClass:"uni-mask",on:{click:function(e){t.apiShowLeftWindow=!1}}}):t._e(),n("div",{staticClass:"uni-left-window"},[n("v-uni-left-window",t._b({ref:"left",on:{"hook:mounted":t.onLeftWindowInit}},"v-uni-left-window",t.bindWindow,!1))],1)]):t._e(),t.rightWindow?n("uni-right-window",{directives:[{name:"show",rawName:"v-show",value:t.showRightWindow||t.apiShowRightWindow,expression:"showRightWindow || apiShowRightWindow"}],ref:"rightWindow",style:t.rightWindowStyle,attrs:{"data-show":t.apiShowRightWindow}},[t.apiShowRightWindow?n("div",{staticClass:"uni-mask",on:{click:function(e){t.apiShowRightWindow=!1}}}):t._e(),n("div",{staticClass:"uni-right-window"},[n("v-uni-right-window",t._b({ref:"right",on:{"hook:mounted":t.onRightWindowInit}},"v-uni-right-window",t.bindWindow,!1))],1)]):t._e()],1)],1):n("keep-alive",{attrs:{include:t.keepAliveInclude}},[n("router-view",{key:t.routerKey})],1)}),[],!1,null,null,null)),f=l.exports,d=n("dad6"),h=d["a"],p=(n("cbd0"),Object(o["a"])(h,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("transition",{attrs:{name:"uni-fade"}},[t.visible?n("uni-toast",{attrs:{"data-duration":t.duration}},[t.mask?n("div",{staticClass:"uni-mask",staticStyle:{background:"transparent"},on:{touchmove:function(t){t.preventDefault()}}}):t._e(),t.image||t.iconClass?n("div",{staticClass:"uni-toast"},[t.image?n("img",{staticClass:"uni-toast__icon",attrs:{src:t.image}}):n("i",{staticClass:"uni-icon_toast",class:t.iconClass}),n("p",{staticClass:"uni-toast__content"},[t._v(" "+t._s(t.title)+" ")])]):n("div",{staticClass:"uni-sample-toast"},[n("p",{staticClass:"uni-simple-toast__text"},[t._v(" "+t._s(t.title)+" ")])])]):t._e()],1)}),[],!1,null,null,null)),v=p.exports,g=n("a409"),m=n("7687"),b=n("b405");var y={light:{cancelColor:"#000000"},dark:{cancelColor:"rgb(170, 170, 170)"}};function _(t){this.cancelColor_=y[t].cancelColor}var w={name:"Modal",components:{keypress:m["a"]},mixins:[g["default"]],props:{title:{type:String,default:""},content:{type:String,default:""},showCancel:{type:Boolean,default:!0},cancelText:{type:String,default:"Cancel"},cancelColor:{type:String,default:"#000000"},confirmText:{type:String,default:"OK"},confirmColor:{type:String,default:"#007aff"},visible:{type:Boolean,default:!1},editable:{type:Boolean,default:!1},placeholderText:{type:String,default:""}},data:function(){return{cancelColor_:"#000"}},watch:{visible:function(t){t?(this.cancelColor_=this.$parent.showModal.cancelColor,"#000"===this.$parent.showModal.cancelColor&&("dark"===Object(b["a"])()&&this._onThemeChange({theme:"dark"}),Object(b["c"])(this._onThemeChange))):Object(b["b"])(this._onThemeChange)}},methods:{_onThemeChange:function(t){var e=t.theme;_.call(this,e)},_close:function(t){var e=function(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}({},t,!0);this.editable&&"confirm"===t&&(e.content=this.$refs.editContent.value),this.$emit("close",e)}}},x=w,S=(n("96b9"),Object(o["a"])(x,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("transition",{attrs:{name:"uni-fade"}},[n("uni-modal",{directives:[{name:"show",rawName:"v-show",value:t.visible,expression:"visible"}],on:{touchmove:function(t){t.preventDefault()}}},[n("div",{staticClass:"uni-mask"}),n("div",{staticClass:"uni-modal"},[t.title?n("div",{staticClass:"uni-modal__hd"},[n("strong",{staticClass:"uni-modal__title",domProps:{textContent:t._s(t.title)}})]):t._e(),t.editable?n("textarea",{ref:"editContent",staticClass:"uni-modal__textarea",attrs:{rows:"1",placeholder:t.placeholderText},domProps:{value:t.content}}):n("div",{staticClass:"uni-modal__bd",domProps:{textContent:t._s(t.content)},on:{touchmove:function(t){t.stopPropagation()}}}),n("div",{staticClass:"uni-modal__ft"},[t.showCancel?n("div",{staticClass:"uni-modal__btn uni-modal__btn_default",style:{color:t.cancelColor_},on:{click:function(e){return t._close("cancel")}}},[t._v(" "+t._s(t.cancelText)+" ")]):t._e(),n("div",{staticClass:"uni-modal__btn uni-modal__btn_primary",style:{color:t.confirmColor},on:{click:function(e){return t._close("confirm")}}},[t._v(" "+t._s(t.confirmText)+" ")])])]),n("keypress",{attrs:{disable:!t.visible},on:{esc:function(e){return t._close("cancel")},enter:function(e){!t.editable&&t._close("confirm")}}})],1)],1)}),[],!1,null,null,null)),k=S.exports,C=n("a202"),T=n("0372"),O=n("39bd"),A=n("c700"),E=n("d4c9"),j=n("4ba6"),I=n("6f75");var M={light:{listItemColor:"#000000",cancelItemColor:"#000000"},dark:{listItemColor:"rgba(255, 255, 255, 0.8)",cancelItemColor:"rgba(255, 255, 255)"}};function P(t){var e=this;["listItemColor","cancelItemColor"].forEach((function(n){e[n]=M[t][n]}))}var $={name:"ActionSheet",components:{keypress:m["a"]},mixins:[T["c"],C["default"],O["a"],A["a"]],props:{title:{type:String,default:""},itemList:{type:Array,default:function(){return[]}},itemColor:{type:String,default:"#000000"},popover:{type:Object,default:null},visible:{type:Boolean,default:!1}},data:function(){return{HEIGHT:260,contentHeight:0,titleHeight:0,deltaY:0,scrollTop:0,listItemColor:"#000000",cancelItemColor:"#000000"}},watch:{visible:function(t){var e=this;t?(this.$nextTick((function(){e.title&&(e.titleHeight=document.querySelector(".uni-actionsheet__title").offsetHeight),e._scroller.update(),e.contentHeight=e.$refs.content.clientHeight-e.HEIGHT,document.querySelectorAll(".uni-actionsheet__cell").forEach((function(t){(function(t){var e=0,n=0;t.addEventListener("touchstart",(function(t){var r=t.changedTouches[0];e=r.clientX,n=r.clientY})),t.addEventListener("touchend",(function(t){var r=t.changedTouches[0];if(Math.abs(r.clientX-e)<20&&Math.abs(r.clientY-n)<20){var i=new CustomEvent("click",{bubbles:!0,cancelable:!0,target:t.target,currentTarget:t.currentTarget});["screenX","screenY","clientX","clientY","pageX","pageY"].forEach((function(t){i[t]=r[t]})),t.target.dispatchEvent(i)}}))})(t)}))})),this.listItemColor=this.cancelItemColor=this.itemColor,"#000"===this.$parent.showActionSheet.itemColor&&("dark"===Object(b["a"])()&&this._onThemeChange({theme:"dark"}),Object(b["c"])(this._onThemeChange))):Object(b["b"])(this._onThemeChange)}},mounted:function(){var t=this;this.touchtrack(this.$refs.content,"_handleTrack",!0),this.$nextTick((function(){t.initScroller(t.$refs.content,{enableY:!0,friction:new E["a"](1e-4),spring:new j["a"](2,90,20),onScroll:function(e){t.scrollTop=e.target.scrollTop}})})),Object(I["b"])()},methods:{_onThemeChange:function(t){var e=t.theme;P.call(this,e)},_close:function(t){this.$emit("close",t)},_handleTrack:function(t){if(this._scroller)switch(t.detail.state){case"start":this._handleTouchStart(t),Object(I["a"])({disable:!0});break;case"move":this._handleTouchMove(t);break;case"end":case"cancel":this._handleTouchEnd(t),Object(I["a"])({disable:!1})}},_handleWheel:function(t){var e=this.deltaY+t.deltaY;Math.abs(e)>10?(this.scrollTop+=e/3,this.scrollTop=this.scrollTop>=this.contentHeight?this.contentHeight:this.scrollTop<=0?0:this.scrollTop,this._scroller.scrollTo(this.scrollTop)):this.deltaY=e,t.preventDefault()}}},L=$,R=(n("5fe8"),Object(o["a"])(L,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("uni-actionsheet",{on:{touchmove:function(t){t.preventDefault()}}},[n("transition",{attrs:{name:"uni-fade"}},[n("div",{directives:[{name:"show",rawName:"v-show",value:t.visible,expression:"visible"}],staticClass:"uni-mask uni-actionsheet__mask",on:{click:function(e){return t._close(-1)}}})]),n("div",{staticClass:"uni-actionsheet",class:{"uni-actionsheet_toggle":t.visible},style:t.popupStyle.content},[n("div",{ref:"main",staticClass:"uni-actionsheet__menu",on:{wheel:t._handleWheel}},[t.title?n("div",{staticClass:"uni-actionsheet__cell",style:{height:t.titleHeight+"px"}}):t._e(),t.title?n("div",{staticClass:"uni-actionsheet__title"},[t._v(" "+t._s(t.title)+" ")]):t._e(),n("div",{style:{maxHeight:t.HEIGHT+"px",overflow:"hidden"}},[n("div",{ref:"content"},t._l(t.itemList,(function(e,r){return n("div",{key:r,staticClass:"uni-actionsheet__cell",style:{color:t.listItemColor},on:{click:function(e){return t._close(r)}}},[t._v(" "+t._s(e)+" ")])})),0)])]),n("div",{staticClass:"uni-actionsheet__action"},[n("div",{staticClass:"uni-actionsheet__cell",style:{color:t.cancelItemColor},on:{click:function(e){return t._close(-1)}}},[t._v(" "+t._s(t.$$t("uni.showActionSheet.cancel"))+" ")])]),n("div",{style:t.popupStyle.triangle})]),n("keypress",{attrs:{disable:!t.visible},on:{esc:function(e){return t._close(-1)}}})],1)}),[],!1,null,null,null)),N=R.exports,D={name:"ImageView",props:{src:{type:String,default:""}},data:function(){return{direction:"none"}},created:function(){this.scale=1,this.imgWidth=0,this.imgHeight=0,this.width=0,this.height=0},methods:{onScale:function(t){var e=t.detail.scale;this.scale=e},onImgLoad:function(t){var e=t.target,n=e.getBoundingClientRect();this.imgWidth=n.width,this.imgHeight=n.height},onTouchStart:function(t){var e=this.$el,n=e.getBoundingClientRect();this.width=n.width,this.height=n.height,this.checkDirection(t)},onTouchEnd:function(t){var e=this.scale,n=e*this.imgWidth>this.width,r=e*this.imgHeight>this.height;this.direction=n&&r?"all":n?"horizontal":r?"vertical":"none",this.checkDirection(t)},checkDirection:function(t){var e=this.direction;"all"!==e&&"horizontal"!==e||t.stopPropagation()}}},B=D,F=(n("1867"),Object(o["a"])(B,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("v-uni-movable-area",{staticClass:"image-view-area",nativeOn:{touchstart:function(e){return t.onTouchStart(e)},touchmove:function(e){return t.checkDirection(e)},touchend:function(e){return t.onTouchEnd(e)}}},[n("v-uni-movable-view",{staticClass:"image-view-view",attrs:{direction:t.direction,inertia:"",scale:"","scale-min":"1","scale-max":"4"},on:{scale:t.onScale}},[n("img",{staticClass:"image-view-img",attrs:{src:t.src},on:{load:t.onImgLoad}})])],1)}),[],!1,null,null,null)),z=F.exports,W={name:"PreviewImage",components:{imageView:z},props:{visible:{type:Boolean,default:!1},urls:{type:Array,default:function(){return[]}},current:{type:[String,Number],default:0}},data:function(){return{index:0}},watch:{visible:function(t){if(t){var e="number"===typeof this.current?this.current:this.urls.indexOf(this.current);this.index=e<0?0:e}}},mounted:function(){var t=this,e=0,n=0;this.$el.addEventListener("mousedown",(function(r){t.preventDefault=!1,e=r.clientX,n=r.clientY})),this.$el.addEventListener("mouseup",(function(r){(Math.abs(r.clientX-e)>20||Math.abs(r.clientY-n)>20)&&(t.preventDefault=!0)}))},methods:{_click:function(){this.preventDefault||this.$emit("close")}}},H=W,U=(n("4213"),Object(o["a"])(H,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.visible?n("div",{staticClass:"uni-system-preview-image",on:{click:t._click}},[n("v-uni-swiper",{staticClass:"uni-system-preview-image-swiper",attrs:{navigation:"auto",current:t.index,"indicator-dots":!1,autoplay:!1},on:{"update:current":function(e){t.index=e}}},t._l(t.urls,(function(t,e){return n("v-uni-swiper-item",{key:e},[n("image-view",{attrs:{src:t}})],1)})),1),t._m(0)],1):t._e()}),[function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"nav-btn-back"},[n("i",{staticClass:"uni-btn-icon"},[t._v("")])])}],!1,null,null,null)),q=U.exports,V={Toast:v,Modal:k,ActionSheet:N,PreviewImage:q};function Y(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function X(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}e["a"]=function(t){for(var e=1;e1?n-1:0),i=1;it.length)&&(e=t.length);for(var n=0,r=new Array(e);n=0?p:255,[f,d,h,p]}return i.error("unsupported color:"+t),[0,0,0,255]}function _(t,e){this.type="pattern",this.data=t,this.colorStop=e}var w=function(){function t(e,n){h(this,t),this.type=e,this.data=n,this.colorStop=[]}return v(t,[{key:"addColorStop",value:function(t,e){this.colorStop.push([t,y(e)])}}]),t}();function x(t){this.width=t}var S=function(){function t(e,n){h(this,t),this.id=e,this.pageId=n,this.actions=[],this.path=[],this.subpath=[],this.currentTransform=[],this.currentStepAnimates=[],this.drawingState=[],this.state={lineDash:[0,0],shadowOffsetX:0,shadowOffsetY:0,shadowBlur:0,shadowColor:[0,0,0,0],font:"10px sans-serif",fontSize:10,fontWeight:"normal",fontStyle:"normal",fontFamily:"sans-serif"}}return v(t,[{key:"draw",value:function(){var t,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1?arguments[1]:void 0,r=f(this.actions);this.actions=[],this.path=[],"function"===typeof n&&(t=g.push(n)),m(this.id,this.pageId,"actionsChanged",{actions:r,reserve:e,callbackId:t})}},{key:"createLinearGradient",value:function(t,e,n,r){return new w("linear",[t,e,n,r])}},{key:"createCircularGradient",value:function(t,e,n){return new w("radial",[t,e,n])}},{key:"createPattern",value:function(t,e){if(void 0===e)i.error("Failed to execute 'createPattern' on 'CanvasContext': 2 arguments required, but only 1 present.");else{if(!(["repeat","repeat-x","repeat-y","no-repeat"].indexOf(e)<0))return new _(t,e);i.error("Failed to execute 'createPattern' on 'CanvasContext': The provided type ('"+e+"') is not one of 'repeat', 'no-repeat', 'repeat-x', or 'repeat-y'.")}}},{key:"measureText",value:function(t){var e,n=this.state.font;return e=function(t,e){var n=document.createElement("canvas"),r=n.getContext("2d");return r.font=e,r.measureText(t).width||0}(t,n),new x(e)}},{key:"save",value:function(){this.actions.push({method:"save",data:[]}),this.drawingState.push(this.state)}},{key:"restore",value:function(){this.actions.push({method:"restore",data:[]}),this.state=this.drawingState.pop()||{lineDash:[0,0],shadowOffsetX:0,shadowOffsetY:0,shadowBlur:0,shadowColor:[0,0,0,0],font:"10px sans-serif",fontSize:10,fontWeight:"normal",fontStyle:"normal",fontFamily:"sans-serif"}}},{key:"beginPath",value:function(){this.path=[],this.subpath=[],this.path.push({method:"beginPath",data:[]})}},{key:"moveTo",value:function(t,e){this.path.push({method:"moveTo",data:[t,e]}),this.subpath=[[t,e]]}},{key:"lineTo",value:function(t,e){0===this.path.length&&0===this.subpath.length?this.path.push({method:"moveTo",data:[t,e]}):this.path.push({method:"lineTo",data:[t,e]}),this.subpath.push([t,e])}},{key:"quadraticCurveTo",value:function(t,e,n,r){this.path.push({method:"quadraticCurveTo",data:[t,e,n,r]}),this.subpath.push([n,r])}},{key:"bezierCurveTo",value:function(t,e,n,r,i,o){this.path.push({method:"bezierCurveTo",data:[t,e,n,r,i,o]}),this.subpath.push([i,o])}},{key:"arc",value:function(t,e,n,r,i){var o=arguments.length>5&&void 0!==arguments[5]&&arguments[5];this.path.push({method:"arc",data:[t,e,n,r,i,o]}),this.subpath.push([t,e])}},{key:"rect",value:function(t,e,n,r){this.path.push({method:"rect",data:[t,e,n,r]}),this.subpath=[[t,e]]}},{key:"arcTo",value:function(t,e,n,r,i){this.path.push({method:"arcTo",data:[t,e,n,r,i]}),this.subpath.push([n,r])}},{key:"clip",value:function(){this.actions.push({method:"clip",data:f(this.path)})}},{key:"closePath",value:function(){this.path.push({method:"closePath",data:[]}),this.subpath.length&&(this.subpath=[this.subpath.shift()])}},{key:"clearActions",value:function(){this.actions=[],this.path=[],this.subpath=[]}},{key:"getActions",value:function(){var t=f(this.actions);return this.clearActions(),t}},{key:"lineDashOffset",set:function(t){this.actions.push({method:"setLineDashOffset",data:[t]})}},{key:"globalCompositeOperation",set:function(t){this.actions.push({method:"setGlobalCompositeOperation",data:[t]})}},{key:"shadowBlur",set:function(t){this.actions.push({method:"setShadowBlur",data:[t]})}},{key:"shadowColor",set:function(t){this.actions.push({method:"setShadowColor",data:[t]})}},{key:"shadowOffsetX",set:function(t){this.actions.push({method:"setShadowOffsetX",data:[t]})}},{key:"shadowOffsetY",set:function(t){this.actions.push({method:"setShadowOffsetY",data:[t]})}},{key:"font",set:function(t){var e=this;this.state.font=t;var n=t.match(/^(([\w\-]+\s)*)(\d+r?px)(\/(\d+\.?\d*(r?px)?))?\s+(.*)/);if(n){var r=n[1].trim().split(/\s/),o=parseFloat(n[3]),a=n[7],s=[];r.forEach((function(t,n){["italic","oblique","normal"].indexOf(t)>-1?(s.push({method:"setFontStyle",data:[t]}),e.state.fontStyle=t):["bold","normal"].indexOf(t)>-1?(s.push({method:"setFontWeight",data:[t]}),e.state.fontWeight=t):0===n?(s.push({method:"setFontStyle",data:["normal"]}),e.state.fontStyle="normal"):1===n&&c()})),1===r.length&&c(),r=s.map((function(t){return t.data[0]})).join(" "),this.state.fontSize=o,this.state.fontFamily=a,this.actions.push({method:"setFont",data:["".concat(r," ").concat(o,"px ").concat(a)]})}else i.warn("Failed to set 'font' on 'CanvasContext': invalid format.");function c(){s.push({method:"setFontWeight",data:["normal"]}),e.state.fontWeight="normal"}},get:function(){return this.state.font}},{key:"fillStyle",set:function(t){this.setFillStyle(t)}},{key:"strokeStyle",set:function(t){this.setStrokeStyle(t)}},{key:"globalAlpha",set:function(t){t=Math.floor(255*parseFloat(t)),this.actions.push({method:"setGlobalAlpha",data:[t]})}},{key:"textAlign",set:function(t){this.actions.push({method:"setTextAlign",data:[t]})}},{key:"lineCap",set:function(t){this.actions.push({method:"setLineCap",data:[t]})}},{key:"lineJoin",set:function(t){this.actions.push({method:"setLineJoin",data:[t]})}},{key:"lineWidth",set:function(t){this.actions.push({method:"setLineWidth",data:[t]})}},{key:"miterLimit",set:function(t){this.actions.push({method:"setMiterLimit",data:[t]})}},{key:"textBaseline",set:function(t){this.actions.push({method:"setTextBaseline",data:[t]})}}]),t}();function k(e,n){if(n)return new S(e,n.$page.id);var r=Object(s["a"])();if(r)return new S(e,r);t.emit("onError","createCanvasContext:fail")}function C(t,e){var n=t.canvasId,r=t.x,i=t.y,o=t.width,a=t.height,u=Object(s["a"])();if(u){var l=g.push((function(t){var n=t.data;n&&n.length&&(t.data=new Uint8ClampedArray(n)),Object(c["a"])(e,t)}));m(n,u,"getImageData",{x:r,y:i,width:o,height:a,callbackId:l})}else Object(c["a"])(e,{errMsg:"canvasGetImageData:fail"})}function T(t,e){var n=t.canvasId,r=t.data,i=t.x,o=t.y,a=t.width,u=t.height,l=Object(s["a"])();if(l){var f=g.push((function(t){Object(c["a"])(e,t)}));r=Array.prototype.slice.call(r),m(n,l,"putImageData",{data:r,x:i,y:o,width:a,height:u,compressed:void 0,callbackId:f})}else Object(c["a"])(e,{errMsg:"canvasPutImageData:fail"})}function O(t,e){var n=t.x,r=void 0===n?0:n,i=t.y,o=void 0===i?0:i,a=t.width,l=t.height,f=t.destWidth,d=t.destHeight,h=t.canvasId,p=t.fileType,v=t.quality,b=Object(s["a"])();if(b){var y=g.push((function(t){Object(c["a"])(e,t)})),_="".concat(u["TEMP_PATH"],"/canvas");m(h,b,"toTempFilePath",{x:r,y:o,width:a,height:l,destWidth:f,destHeight:d,fileType:p,quality:v,dirname:_,callbackId:y})}else Object(c["a"])(e,{errMsg:"canvasToTempFilePath:fail"})}[].concat(["scale","rotate","translate","setTransform","transform"],["drawImage","fillText","fill","stroke","fillRect","strokeRect","clearRect","strokeText"]).forEach((function(t){S.prototype[t]=function(t){switch(t){case"fill":case"stroke":return function(){this.actions.push({method:t+"Path",data:f(this.path)})};case"fillRect":return function(t,e,n,r){this.actions.push({method:"fillPath",data:[{method:"rect",data:[t,e,n,r]}]})};case"strokeRect":return function(t,e,n,r){this.actions.push({method:"strokePath",data:[{method:"rect",data:[t,e,n,r]}]})};case"fillText":case"strokeText":return function(e,n,r,i){var o=[e.toString(),n,r];"number"===typeof i&&o.push(i),this.actions.push({method:t,data:o})};case"drawImage":return function(e,n,r,i,o,a,s,c,u){var l;function f(t){return"number"===typeof t}void 0===u&&(a=n,s=r,c=i,u=o,n=void 0,r=void 0,i=void 0,o=void 0),l=f(n)&&f(r)&&f(i)&&f(o)?[e,a,s,c,u,n,r,i,o]:f(c)&&f(u)?[e,a,s,c,u]:[e,a,s],this.actions.push({method:t,data:l})};default:return function(){for(var e=arguments.length,n=new Array(e),r=0;re-n&&tthis._t&&(t=this._t,this._lastDt=t);var e=this._x_v*t+.5*this._x_a*Math.pow(t,2)+this._x_s,n=this._y_v*t+.5*this._y_a*Math.pow(t,2)+this._y_s;return(this._x_a>0&ðis._endPositionX)&&(e=this._endPositionX),(this._y_a>0&&nthis._endPositionY)&&(n=this._endPositionY),{x:e,y:n}},s.prototype.ds=function(t){return void 0===t&&(t=((new Date).getTime()-this._startTime)/1e3),t>this._t&&(t=this._t),{dx:this._x_v+this._x_a*t,dy:this._y_v+this._y_a*t}},s.prototype.delta=function(){return{x:-1.5*Math.pow(this._x_v,2)/this._x_a||0,y:-1.5*Math.pow(this._y_v,2)/this._y_a||0}},s.prototype.dt=function(){return-this._x_v/this._x_a},s.prototype.done=function(){var t=i(this.s().x,this._endPositionX)||i(this.s().y,this._endPositionY)||this._lastDt===this._t;return this._lastDt=null,t},s.prototype.setEnd=function(t,e){this._endPositionX=t,this._endPositionY=e},s.prototype.reconfigure=function(t,e){this._m=t,this._f=1e3*e},c.prototype._solve=function(t,e){var n=this._c,r=this._m,i=this._k,o=n*n-4*r*i;if(0===o){var a=-n/(2*r),s=t,c=e/(a*t);return{x:function(t){return(s+c*t)*Math.pow(Math.E,a*t)},dx:function(t){var e=Math.pow(Math.E,a*t);return a*(s+c*t)*e+c*e}}}if(o>0){var u=(-n-Math.sqrt(o))/(2*r),l=(-n+Math.sqrt(o))/(2*r),f=(e-u*t)/(l-u),d=t-f;return{x:function(t){var e,n;return t===this._t&&(e=this._powER1T,n=this._powER2T),this._t=t,e||(e=this._powER1T=Math.pow(Math.E,u*t)),n||(n=this._powER2T=Math.pow(Math.E,l*t)),d*e+f*n},dx:function(t){var e,n;return t===this._t&&(e=this._powER1T,n=this._powER2T),this._t=t,e||(e=this._powER1T=Math.pow(Math.E,u*t)),n||(n=this._powER2T=Math.pow(Math.E,l*t)),d*u*e+f*l*n}}}var h=Math.sqrt(4*r*i-n*n)/(2*r),p=-n/2*r,v=t,g=(e-p*t)/h;return{x:function(t){return Math.pow(Math.E,p*t)*(v*Math.cos(h*t)+g*Math.sin(h*t))},dx:function(t){var e=Math.pow(Math.E,p*t),n=Math.cos(h*t),r=Math.sin(h*t);return e*(g*h*n-v*h*r)+p*e*(g*r+v*n)}}},c.prototype.x=function(t){return void 0===t&&(t=((new Date).getTime()-this._startTime)/1e3),this._solution?this._endPosition+this._solution.x(t):0},c.prototype.dx=function(t){return void 0===t&&(t=((new Date).getTime()-this._startTime)/1e3),this._solution?this._solution.dx(t):0},c.prototype.setEnd=function(t,e,n){if(n||(n=(new Date).getTime()),t!==this._endPosition||!o(e,.1)){e=e||0;var r=this._endPosition;this._solution&&(o(e,.1)&&(e=this._solution.dx((n-this._startTime)/1e3)),r=this._solution.x((n-this._startTime)/1e3),o(e,.1)&&(e=0),o(r,.1)&&(r=0),r+=this._endPosition),this._solution&&o(r-t,.1)&&o(e,.1)||(this._endPosition=t,this._solution=this._solve(r-this._endPosition,e),this._startTime=n)}},c.prototype.snap=function(t){this._startTime=(new Date).getTime(),this._endPosition=t,this._solution={x:function(){return 0},dx:function(){return 0}}},c.prototype.done=function(t){return t||(t=(new Date).getTime()),i(this.x(),this._endPosition,.1)&&o(this.dx(),.1)},c.prototype.reconfigure=function(t,e,n){this._m=t,this._k=e,this._c=n,this.done()||(this._solution=this._solve(this.x()-this._endPosition,this.dx()),this._startTime=(new Date).getTime())},c.prototype.springConstant=function(){return this._k},c.prototype.damping=function(){return this._c},c.prototype.configuration=function(){return[{label:"Spring Constant",read:this.springConstant.bind(this),write:function(t,e){t.reconfigure(1,e,t.damping())}.bind(this,this),min:100,max:1e3},{label:"Damping",read:this.damping.bind(this),write:function(t,e){t.reconfigure(1,t.springConstant(),e)}.bind(this,this),min:1,max:500}]},u.prototype.setEnd=function(t,e,n,r){var i=(new Date).getTime();this._springX.setEnd(t,r,i),this._springY.setEnd(e,r,i),this._springScale.setEnd(n,r,i),this._startTime=i},u.prototype.x=function(){var t=((new Date).getTime()-this._startTime)/1e3;return{x:this._springX.x(t),y:this._springY.x(t),scale:this._springScale.x(t)}},u.prototype.done=function(){var t=(new Date).getTime();return this._springX.done(t)&&this._springY.done(t)&&this._springScale.done(t)},u.prototype.reconfigure=function(t,e,n){this._springX.reconfigure(t,e,n),this._springY.reconfigure(t,e,n),this._springScale.reconfigure(t,e,n)};var l=n("6f75"),f=!1;function d(t){f||(f=!0,requestAnimationFrame((function(){t(),f=!1})))}function h(t,e){return+((1e3*t-1e3*e)/1e3).toFixed(1)}function p(t,e,n){var r={id:0,cancelled:!1};return function e(n,r,i,o){if(!n||!n.cancelled){i(r);var a=t.done();a||n.cancelled||(n.id=requestAnimationFrame(e.bind(null,n,r,i,o))),a&&o&&o(r)}}(r,t,e,n),{cancel:function(t){t&&t.id&&cancelAnimationFrame(t.id),t&&(t.cancelled=!0)}.bind(null,r),model:t}}var v={name:"MovableView",mixins:[r["a"]],props:{direction:{type:String,default:"none"},inertia:{type:[Boolean,String],default:!1},outOfBounds:{type:[Boolean,String],default:!1},x:{type:[Number,String],default:0},y:{type:[Number,String],default:0},damping:{type:[Number,String],default:20},friction:{type:[Number,String],default:2},disabled:{type:[Boolean,String],default:!1},scale:{type:[Boolean,String],default:!1},scaleMin:{type:[Number,String],default:.1},scaleMax:{type:[Number,String],default:10},scaleValue:{type:[Number,String],default:1},animation:{type:[Boolean,String],default:!0}},data:function(){return{xSync:this._getPx(this.x),ySync:this._getPx(this.y),scaleValueSync:Number(this.scaleValue)||1,width:0,height:0,minX:0,minY:0,maxX:0,maxY:0}},computed:{dampingNumber:function(){var t=Number(this.damping);return isNaN(t)?20:t},frictionNumber:function(){var t=Number(this.friction);return isNaN(t)||t<=0?2:t},scaleMinNumber:function(){var t=Number(this.scaleMin);return isNaN(t)?.1:t},scaleMaxNumber:function(){var t=Number(this.scaleMax);return isNaN(t)?10:t},xMove:function(){return"all"===this.direction||"horizontal"===this.direction},yMove:function(){return"all"===this.direction||"vertical"===this.direction}},watch:{x:function(t){this.xSync=this._getPx(t)},xSync:function(t){this._setX(t)},y:function(t){this.ySync=this._getPx(t)},ySync:function(t){this._setY(t)},disabled:function(){this.__handleTouchStart()},scaleValue:function(t){this.scaleValueSync=Number(t)||0},scaleValueSync:function(t){this._setScaleValue(t)},scaleMinNumber:function(){this._setScaleMinOrMax()},scaleMaxNumber:function(){this._setScaleMinOrMax()}},created:function(){this._offset={x:0,y:0},this._scaleOffset={x:0,y:0},this._translateX=0,this._translateY=0,this._scale=1,this._oldScale=1,this._STD=new u(1,9*Math.pow(this.dampingNumber,2)/40,this.dampingNumber),this._friction=new s(1,this.frictionNumber),this._declineX=new a,this._declineY=new a,this.__touchInfo={historyX:[0,0],historyY:[0,0],historyT:[0,0]}},mounted:function(){this.touchtrack(this.$el,"_onTrack"),this.setParent(),this._friction.reconfigure(1,this.frictionNumber),this._STD.reconfigure(1,9*Math.pow(this.dampingNumber,2)/40,this.dampingNumber),this.$el.style.transformOrigin="center",Object(l["b"])()},methods:{_getPx:function(t){return/\d+[ur]px$/i.test(t)?uni.upx2px(parseFloat(t)):Number(t)||0},_setX:function(t){if(this.xMove){if(t+this._scaleOffset.x===this._translateX)return this._translateX;this._SFA&&this._SFA.cancel(),this._animationTo(t+this._scaleOffset.x,this.ySync+this._scaleOffset.y,this._scale)}return t},_setY:function(t){if(this.yMove){if(t+this._scaleOffset.y===this._translateY)return this._translateY;this._SFA&&this._SFA.cancel(),this._animationTo(this.xSync+this._scaleOffset.x,t+this._scaleOffset.y,this._scale)}return t},_setScaleMinOrMax:function(){if(!this.scale)return!1;this._updateScale(this._scale,!0),this._updateOldScale(this._scale)},_setScaleValue:function(t){return!!this.scale&&(t=this._adjustScale(t),this._updateScale(t,!0),this._updateOldScale(t),t)},__handleTouchStart:function(){this._isScaling||this.disabled||(Object(l["a"])({disable:!0}),this._FA&&this._FA.cancel(),this._SFA&&this._SFA.cancel(),this.__touchInfo.historyX=[0,0],this.__touchInfo.historyY=[0,0],this.__touchInfo.historyT=[0,0],this.xMove&&(this.__baseX=this._translateX),this.yMove&&(this.__baseY=this._translateY),this.$el.style.willChange="transform",this._checkCanMove=null,this._firstMoveDirection=null,this._isTouching=!0)},__handleTouchMove:function(t){var e=this;if(!this._isScaling&&!this.disabled&&this._isTouching){var n=this._translateX,r=this._translateY;if(null===this._firstMoveDirection&&(this._firstMoveDirection=Math.abs(t.detail.dx/t.detail.dy)>1?"htouchmove":"vtouchmove"),this.xMove&&(n=t.detail.dx+this.__baseX,this.__touchInfo.historyX.shift(),this.__touchInfo.historyX.push(n),this.yMove||null!==this._checkCanMove||(this._checkCanMove=Math.abs(t.detail.dx/t.detail.dy)<1)),this.yMove&&(r=t.detail.dy+this.__baseY,this.__touchInfo.historyY.shift(),this.__touchInfo.historyY.push(r),this.xMove||null!==this._checkCanMove||(this._checkCanMove=Math.abs(t.detail.dy/t.detail.dx)<1)),this.__touchInfo.historyT.shift(),this.__touchInfo.historyT.push(t.detail.timeStamp),!this._checkCanMove){t.preventDefault();var i="touch";nthis.maxX&&(this.outOfBounds?(i="touch-out-of-bounds",n=this.maxX+this._declineX.x(n-this.maxX)):n=this.maxX),rthis.maxY&&(this.outOfBounds?(i="touch-out-of-bounds",r=this.maxY+this._declineY.x(r-this.maxY)):r=this.maxY),d((function(){e._setTransform(n,r,e._scale,i)}))}}},__handleTouchEnd:function(){var t=this;if(!this._isScaling&&!this.disabled&&this._isTouching&&(Object(l["a"])({disable:!1}),this.$el.style.willChange="auto",this._isTouching=!1,!this._checkCanMove&&!this._revise("out-of-bounds")&&this.inertia)){var e=1e3*(this.__touchInfo.historyX[1]-this.__touchInfo.historyX[0])/(this.__touchInfo.historyT[1]-this.__touchInfo.historyT[0]),n=1e3*(this.__touchInfo.historyY[1]-this.__touchInfo.historyY[0])/(this.__touchInfo.historyT[1]-this.__touchInfo.historyT[0]);this._friction.setV(e,n),this._friction.setS(this._translateX,this._translateY);var r=this._friction.delta().x,i=this._friction.delta().y,o=r+this._translateX,a=i+this._translateY;othis.maxX&&(o=this.maxX,a=this._translateY+(this.maxX-this._translateX)*i/r),athis.maxY&&(a=this.maxY,o=this._translateX+(this.maxY-this._translateY)*r/i),this._friction.setEnd(o,a),this._FA=p(this._friction,(function(){var e=t._friction.s(),n=e.x,r=e.y;t._setTransform(n,r,t._scale,"friction")}),(function(){t._FA.cancel()}))}},_onTrack:function(t){switch(t.detail.state){case"start":this.__handleTouchStart();break;case"move":this.__handleTouchMove(t);break;case"end":this.__handleTouchEnd()}},_getLimitXY:function(t,e){var n=!1;return t>this.maxX?(t=this.maxX,n=!0):tthis.maxY?(e=this.maxY,n=!0):e3&&void 0!==arguments[3]?arguments[3]:"",i=arguments.length>4?arguments[4]:void 0,o=arguments.length>5?arguments[5]:void 0;null!==t&&"NaN"!==t.toString()&&"number"===typeof t||(t=this._translateX||0),null!==e&&"NaN"!==e.toString()&&"number"===typeof e||(e=this._translateY||0),t=Number(t.toFixed(1)),e=Number(e.toFixed(1)),n=Number(n.toFixed(1)),this._translateX===t&&this._translateY===e||i||this.$trigger("change",{},{x:h(t,this._scaleOffset.x),y:h(e,this._scaleOffset.y),source:r}),this.scale||(n=this._scale),n=this._adjustScale(n),n=+n.toFixed(3),o&&n!==this._scale&&this.$trigger("scale",{},{x:t,y:e,scale:n});var a="translateX("+t+"px) translateY("+e+"px) translateZ(0px) scale("+n+")";this.$el.style.transform=a,this.$el.style.webkitTransform=a,this._translateX=t,this._translateY=e,this._scale=n}}},g=v,m=(n("5e27"),n("8844")),b=Object(m["a"])(g,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("uni-movable-view",t._g({},t.$listeners),[n("v-uni-resize-sensor",{on:{resize:t.setParent}}),t._t("default")],2)}),[],!1,null,null,null);e["default"]=b.exports},"65db":function(t,e,n){},6625:function(t,e,n){"use strict";n.r(e),n.d(e,"createAudioContext",(function(){return i})),n.d(e,"createVideoContext",(function(){return o})),n.d(e,"createMapContext",(function(){return a})),n.d(e,"createCanvasContext",(function(){return s}));var r=[{name:"id",type:String,required:!0}],i=r,o=r,a=r,s=[{name:"canvasId",type:String,required:!0},{name:"componentInstance",type:Object}]},6729:function(t,e,n){},6773:function(t,e,n){"use strict";n.r(e),function(t,r){n.d(e,"chooseImage",(function(){return f}));var i=n("bdee"),o=n("0372"),a=n("493d"),s=n("909e"),c=t,u=c.invokeCallbackHandler,l=null;function f(t,e){var n=t.count,c=t.sourceType,f=t.extension;l&&(document.body.removeChild(l),l=null),l=Object(a["default"])({count:n,sourceType:c,extension:f,type:"image"}),document.body.appendChild(l),l.addEventListener("cancel",(function(){u(e,{errMsg:"chooseImage:fail cancel"})})),l.addEventListener("change",(function(t){for(var r=[],o=t.target.files.length,a=function(e){var o=t.target.files[e],a=void 0;Object.defineProperty(o,"path",{get:function(){return a=a||Object(i["b"])(o),a}}),e0?e.join("="):"";r.push(n+"="+encodeURIComponent(i))})),r.length?t+"?"+r.join("&"):t}(e),"unPreloadPage"!==t)if("preloadPage"!==t){if(r===e&&"appLaunch"!==n.openType)return"".concat(r," locked");__uniConfig.ready&&!1!==__uniConfig.enableNavigatorLock&&(r=e)}else if(a.meta.isTabBar){var s=getCurrentPages(!0),c=(a.alias||a.path).substr(1);if(s.find((function(t){return t.route===c})))return"tabBar page `"+c+"` already exists"}}}function a(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.assign({url:{type:String,required:!0,validator:o(t)},beforeAll:function(){r=""}},e)}function s(t){return{animationType:{type:String,validator:function(e){if(e&&-1===t.indexOf(e))return"`"+e+"` is not supported for `animationType` (supported values are: `"+t.join("`|`")+"`)"}},animationDuration:{type:Number}}}var c=a("redirectTo"),u=a("reLaunch"),l=a("navigateTo",s(["slide-in-right","slide-in-left","slide-in-top","slide-in-bottom","fade-in","zoom-out","zoom-fade-out","pop-in","none"])),f=a("switchTab"),d=Object.assign({delta:{type:Number,validator:function(t,e){t=parseInt(t)||1,e.delta=Math.min(getCurrentPages().length-1,t)}}},s(["slide-out-right","slide-out-left","slide-out-top","slide-out-bottom","fade-out","zoom-in","zoom-fade-in","pop-out","none"])),h={url:{type:String,required:!0,validator:o("preloadPage")}},p={url:{type:String,required:!0,validator:o("unPreloadPage")}}},"6c36":function(t,e,n){"use strict";n.r(e),function(t){function r(e,n){var r=t,i=r.invokeCallbackHandler;getApp().$router.push({type:"navigateTo",path:"/choose-location",query:e},(function(){t.subscribe("onChooseLocation",(function e(r){t.unsubscribe("onChooseLocation",e),i(n,r?Object.assign(r,{errMsg:"chooseLocation:ok"}):{errMsg:"chooseLocation:fail"})}))}),(function(){i(n,{errMsg:"chooseLocation:fail"})}))}n.d(e,"chooseLocation",(function(){return r}))}.call(this,n("2c9f"))},"6d4b":function(t,e,n){"use strict";(function(t){n.d(e,"a",(function(){return s}));var r,i=n("b435"),o=n("d359"),a={};function s(e,n){var s=Object(i["e"])();if(s.key){var c=a[s.type]=a[s.type]||[];if(r)n(r);else if(window[s.type]&&window[s.type].maps)r=i["c"]?window[s.type]:window[s.type].maps,r.Callout=r.Callout||Object(o["a"])(r),n(r);else if(c.length)c.push(n);else{c.push(n);var u=window,l="__map_callback__"+s.type;u[l]=function(){delete u[l],r=i["c"]?window[s.type]:window[s.type].maps,r.Callout=Object(o["a"])(r),c.forEach((function(t){return t(r)})),c.length=0};var f=document.createElement("script"),d=function(t){return{qq:"https://map.qq.com/api/js?v=2.exp&",google:"https://maps.googleapis.com/maps/api/js?",AMap:"https://webapi.amap.com/maps?v=2.0&"}[t]}(s.type);s.type===i["d"].QQ&&e.push("geometry"),e.length&&(d+="libraries=".concat(e.join("%2C"),"&")),i["c"]&&function(t){window._AMapSecurityConfig={securityJsCode:t.securityJsCode||"",serviceHost:t.serviceHost||""}}(s),f.src="".concat(d,"key=").concat(s.key,"&callback=").concat(l),f.onerror=function(){t.error("Map load failed.")},document.body.appendChild(f)}}else t.error("Map key not configured.")}}).call(this,n("418b")["default"])},"6ddd":function(t,e,n){},"6f73":function(t,e,n){"use strict";n.r(e),n.d(e,"makePhoneCall",(function(){return r}));var r={phoneNumber:{type:String,required:!0,validator:function(t){if(!t)return"makePhoneCall:fail parameter error: parameter.phoneNumber should not be empty String;"}}}},"6f75":function(t,e,n){"use strict";function r(){}function i(t){t.disable}n.d(e,"b",(function(){return r})),n.d(e,"a",(function(){return i}))},7068:function(t,e,n){"use strict";n.r(e),n.d(e,"onKeyboardHeightChange",(function(){return a})),n.d(e,"offKeyboardHeightChange",(function(){return s}));var r,i=n("9131"),o=n("745a");function a(t){Object(i["b"])(r),r=t}function s(){r=null}Object(o["d"])("onKeyboardHeightChange",(function(t){r&&Object(i["a"])(r,t)}))},"70bc":function(t,e,n){},"71a4":function(t,e,n){"use strict";(function(t){function r(e){return function(){try{return e.apply(e,arguments)}catch(n){t.error(n)}}}function i(e){return function(){try{return e.apply(e,arguments)}catch(n){t.error(n)}}}n.d(e,"b",(function(){return r})),n.d(e,"a",(function(){return i}))}).call(this,n("418b")["default"])},"71be":function(t,e,n){"use strict";n.d(e,"a",(function(){return a}));var r=n("340d"),i=n("cff9"),o=n("9798");function a(){return{created:function(){var t=Object(r["e"])(this.$route.query);(function(t,e){var n=t.$route;t.route=n.meta.pagePath,t.options||(t.options=e);var i=Object(r["i"])(n.params,"__id__")?n.params.__id__:n.meta.id,a=n.fullPath;n.meta.isEntry&&-1===a.indexOf(n.meta.pagePath)&&(a="/"+n.meta.pagePath+a.replace("/","")),t.__page__={id:i,path:n.path,route:n.meta.pagePath,fullPath:a,options:e,meta:Object.assign({},n.meta)};var s=t.$router.$eventChannel||new o["a"];t.getOpenerEventChannel=function(){return s},t.$vm=t,t.$root=t,t.$holder=t.$parent.$parent,t.$mp={mpType:"page",page:t,query:{},status:""}})(this,t),Object(i["b"])(this,"onLoad",t),Object(i["b"])(this,"onShow")}}}},"724c":function(t,e,n){"use strict";var r=n("5a2d"),i=n.n(r);i.a},7317:function(t,e,n){"use strict";n.r(e),n.d(e,"previewImage",(function(){return a})),n.d(e,"closePreviewImage",(function(){return s}));var r=n("745a"),i="longPressActionsCallback",o={};function a(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return o=t.longPressActions||{},(o.success||o.fail||o.complete)&&(o.callbackId=i),Object(r["c"])("previewImagePlus",t)}function s(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object(r["c"])("closePreviewImagePlus",t)}Object(r["d"])(i,(function(t){var e=t.errMsg||"";new RegExp("\\:\\s*fail").test(e)?o.fail&&o.fail(t):o.success&&o.success(t),o.complete&&o.complete(t)}))},"745a":function(t,e,n){"use strict";(function(t){n.d(e,"c",(function(){return i})),n.d(e,"d",(function(){return o})),n.d(e,"b",(function(){return a})),n.d(e,"a",(function(){return s}));var r=n("b15e");function i(t){for(var e=arguments.length,n=new Array(e>1?e-1:0),i=1;it.length)&&(e=t.length);for(var n=0,r=new Array(e);n0?v.PICKER:v.SELECT},system:function(){if(this.mode===h.DATE&&!Object.values(p).includes(this.fields)&&this.isDesktop&&/win|mac/i.test(navigator.platform)){if("Google Inc."===navigator.vendor)return"chrome";if(/Firefox/.test(navigator.userAgent))return"firefox"}return""}},watch:{visible:function(t){var e=this;t?(clearTimeout(this.__contentVisibleDelay),this.contentVisible=t,this._select()):this.__contentVisibleDelay=setTimeout((function(){e.contentVisible=t}),300)},value:function(){this._setValueSync()},mode:function(){this._setValueSync()},range:function(){this._setValueSync()},valueSync:function(){this._setValueArray()},valueArray:function(t){var e=this;if(this.mode===h.TIME||this.mode===h.DATE){var n=this.mode===h.TIME?this._getTimeValue:this._getDateValue,r=this.valueArray,i=this.startArray,o=this.endArray;if(this.mode===h.DATE){var a=this.dateArray,s=a[2].length,c=Number(a[2][r[2]])||1,u=new Date("".concat(a[0][r[0]],"/").concat(a[1][r[1]],"/").concat(c)).getDate();un(o)&&this._cloneArray(r,o)}t.forEach((function(t,n){t!==e.oldValueArray[n]&&(e.oldValueArray[n]=t,e.mode===h.MULTISELECTOR&&e.$trigger("columnchange",{},{column:n,value:t}))}))}},created:function(){this.$dispatch("Form","uni-form-group-update",{type:"add",vm:this}),this._createTime(),this._createDate(),this._setValueSync()},beforeDestroy:function(){this.$refs.picker.remove(),this.$dispatch("Form","uni-form-group-update",{type:"remove",vm:this})},methods:{_show:function(t){var e=this;if(!this.disabled){this.valueChangeSource="";var n=this.$refs.picker;n.remove(),(document.querySelector("uni-app")||document.body).appendChild(n),n.style.display="block";var r=t.currentTarget.getBoundingClientRect();this.popover={top:r.top,left:r.left,width:r.width,height:r.height},setTimeout((function(){e.visible=!0}),20)}},_getFormData:function(){return{value:this.valueSync,key:this.name}},_resetFormData:function(){switch(this.mode){case h.SELECTOR:this.valueSync=0;break;case h.MULTISELECTOR:this.valueSync=this.value.map((function(t){return 0}));break;case h.DATE:case h.TIME:this.valueSync="";break;default:break}},_createTime:function(){var t=[],e=[];t.splice(0,t.length);for(var n=0;n<24;n++)t.push((n<10?"0":"")+n);e.splice(0,e.length);for(var r=0;r<60;r++)e.push((r<10?"0":"")+r);this.timeArray.push(t,e)},_createDate:function(){for(var t=[],e=function(t){var e=(new Date).getFullYear(),n=e-150,r=e+150;if(t.start){var i=new Date(t.start).getFullYear();!isNaN(i)&&ir&&(r=o)}return{start:n,end:r}}(this),n=e.start,r=e.end;n<=r;n++)t.push(String(n));for(var i=[],o=1;o<=12;o++)i.push((o<10?"0":"")+o);for(var a=[],s=1;s<=31;s++)a.push((s<10?"0":"")+s);this.dateArray.push(t,i,a)},_getTimeValue:function(t){return 60*t[0]+t[1]},_getDateValue:function(t){return 31*t[0]*12+31*(t[1]||0)+(t[2]||0)},_cloneArray:function(t,e){for(var n=0;na?0:o)}break;case h.TIME:case h.DATE:this.valueSync=String(t);break;default:var s=Number(t);this.valueSync=s<0?0:s;break}},_setValueArray:function(){var t,e=this.valueSync;switch(this.mode){case h.MULTISELECTOR:t=u(e);break;case h.TIME:t=this._getDateValueArray(e,Object(o["g"])({mode:h.TIME}));break;case h.DATE:t=this._getDateValueArray(e,Object(o["g"])({mode:h.DATE}));break;default:t=[e];break}this.oldValueArray=u(t),this.valueArray=u(t)},_getValue:function(){var t=this,e=this.valueArray;switch(this.mode){case h.SELECTOR:return e[0];case h.MULTISELECTOR:return e.map((function(t){return t}));case h.TIME:return this.valueArray.map((function(e,n){return t.timeArray[n][e]})).join(":");case h.DATE:return this.valueArray.map((function(e,n){return t.dateArray[n][e]})).join("-")}},_getDateValueArray:function(t,e){var n,r=this.mode===h.DATE?"-":":",i=this.mode===h.DATE?this.dateArray:this.timeArray;if(this.mode===h.TIME)n=2;else switch(this.fields){case p.YEAR:n=1;break;case p.MONTH:n=2;break;default:n=3;break}for(var o=String(t).split(r),a=[],s=0;s=0&&(a=e?this._getDateValueArray(e):a.map((function(){return 0}))),a},_change:function(){this._close(),this.valueChangeSource="click";var t=this._getValue();this.valueSync=Array.isArray(t)?t.map((function(t){return t})):t,this.$trigger("change",{},{value:t})},_cancel:function(t){if("firefox"===this.system){var e=this.popover,n=e.top,r=e.left,i=e.width,o=e.height,a=t.pageX,s=t.pageY;if(a>r&&an&&s0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;e.animation={duration:t.duration||0,timingFunc:t.timingFunc||"linear"}}}},o={title:{type:String,required:!0}}},"7aa4":function(t,e,n){},"7aa9":function(t,e,n){"use strict";n.r(e);var r=n("4b21"),i=n("340d"),o=n("4738"),a={a:"",abbr:"",address:"",article:"",aside:"",b:"",bdi:"",bdo:["dir"],big:"",blockquote:"",br:"",caption:"",center:"",cite:"",code:"",col:["span","width"],colgroup:["span","width"],dd:"",del:"",div:"",dl:"",dt:"",em:"",fieldset:"",font:"",footer:"",h1:"",h2:"",h3:"",h4:"",h5:"",h6:"",header:"",hr:"",i:"",img:["alt","src","height","width"],ins:"",label:"",legend:"",li:"",mark:"",nav:"",ol:["start","type"],p:"",pre:"",q:"",rt:"",ruby:"",s:"",section:"",small:"",span:"",strong:"",sub:"",sup:"",table:["width"],tbody:"",td:["colspan","height","rowspan","width"],tfoot:"",th:["colspan","height","rowspan","width"],thead:"",tr:["colspan","height","rowspan","width"],tt:"",u:"",ul:""},s={amp:"&",gt:">",lt:"<",nbsp:" ",quot:'"',apos:"'"};function c(t){return t.replace(/&(([a-zA-Z]+)|(#x{0,1}[\da-zA-Z]+));/gi,(function(t,e){if(Object(i["i"])(s,e)&&s[e])return s[e];if(/^#[0-9]{1,4}$/.test(e))return String.fromCharCode(e.slice(1));if(/^#x[0-9a-f]{1,4}$/i.test(e))return String.fromCharCode("0"+e.slice(1));var n=document.createElement("div");return n.innerHTML=t,n.innerText||n.textContent}))}function u(t,e,n){return"img"===t&&"src"===e?Object(o["a"])(n):n}function l(t,e,n,r){return t.forEach((function(t){if(Object(i["l"])(t))if(Object(i["i"])(t,"type")&&"node"!==t.type)"text"===t.type&&"string"===typeof t.text&&""!==t.text&&e.appendChild(document.createTextNode(c(t.text)));else{if("string"!==typeof t.name||!t.name)return;var o=t.name.toLowerCase();if(!Object(i["i"])(a,o))return;var s=document.createElement(o);if(!s)return;var f=t.attrs;if(n&&s.setAttribute(n,""),Object(i["l"])(f)){var d=a[o]||[];Object.keys(f).forEach((function(t){var e=f[t];switch(t){case"class":Array.isArray(e)&&(e=e.join(" "));case"style":s.setAttribute(t,e);break;default:-1!==d.indexOf(t)&&s.setAttribute(t,u(o,t,e))}}))}(function(t,e,n){["a","img"].includes(t.name)&&n&&(e.setAttribute("onClick","return false;"),e.addEventListener("click",(function(e){n(e,{node:t}),e.stopPropagation()}),!0))})(t,s,r);var h=t.children;Array.isArray(h)&&h.length&&l(t.children,s,n,r),e.appendChild(s)}})),e}var f={name:"RichText",props:{nodes:{type:[Array,String],default:function(){return[]}}},watch:{nodes:function(t){this._renderNodes(t)}},mounted:function(){this._renderNodes(this.nodes)},methods:{_renderNodes:function(t){var e="",n=this;while(n)!e&&(e=n.$options._scopeId),n=n.$parent;var i=!!this.$listeners.itemclick;if(this._isMounted){"string"===typeof t&&(t=Object(r["a"])(t));var o=l(t,document.createDocumentFragment(),e,i&&this.triggerItemClick);o.appendChild(this.$refs.sensor.$el);var a=this.$refs.content;a.innerHTML="",a.appendChild(o)}},_updateView:function(){window.dispatchEvent(new CustomEvent("updateview"))},triggerItemClick:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.$trigger("itemclick",t,e)}}},d=f,h=n("8844"),p=Object(h["a"])(d,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("uni-rich-text",t._g({},t.$listeners),[n("div",{ref:"content"},[n("v-uni-resize-sensor",{ref:"sensor",on:{resize:function(e){return t._updateView()}}})],1)])}),[],!1,null,null,null);e["default"]=p.exports},"7cce":function(t,e,n){"use strict";n.d(e,"a",(function(){return i})),n.d(e,"b",(function(){return a}));var r=n("340d"),i=function(){var t=document.createElement("canvas");t.height=t.width=0;var e=t.getContext("2d"),n=e.backingStorePixelRatio||e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1;return(window.devicePixelRatio||1)/n}(),o=CanvasRenderingContext2D.prototype;function a(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];t.width=t.offsetWidth*(e?i:1),t.height=t.offsetHeight*(e?i:1),t.__hidpi__=e,t.__context2d__=t.getContext("2d"),t.__context2d__.__hidpi__=e}o.drawImageByCanvas=function(t){return function(e,n,r,o,a,s,c,u,l,f){if(!this.__hidpi__)return t.apply(this,arguments);n*=i,r*=i,o*=i,a*=i,s*=i,c*=i,u=f?u*i:u,l=f?l*i:l,t.call(this,e,n,r,o,a,s,c,u,l)}}(o.drawImage),1!==i&&(function(t,e){for(var n in t)Object(r["i"])(t,n)&&e(t[n],n)}({fillRect:"all",clearRect:"all",strokeRect:"all",moveTo:"all",lineTo:"all",arc:[0,1,2],arcTo:"all",bezierCurveTo:"all",isPointinPath:"all",isPointinStroke:"all",quadraticCurveTo:"all",rect:"all",translate:"all",createRadialGradient:"all",createLinearGradient:"all",transform:[4,5],setTransform:[4,5]},(function(t,e){o[e]=function(e){return function(){if(!this.__hidpi__)return e.apply(this,arguments);var n=Array.prototype.slice.call(arguments);if("all"===t)n=n.map((function(t){return t*i}));else if(Array.isArray(t))for(var r=0;r10&&(t=2*Math.round(t/2)),t}var a={name:"Image",props:{src:{type:String,default:""},mode:{type:String,default:"scaleToFill"},lazyLoad:{type:[Boolean,String],default:!1},draggable:{type:Boolean,default:!1}},data:function(){return{originalWidth:0,originalHeight:0,originalStyle:{width:"",height:""},contentPath:""}},computed:{ratio:function(){return this.originalWidth&&this.originalHeight?this.originalWidth/this.originalHeight:0},style:function(){var t="auto",e="";switch(this.mode){case"aspectFit":t="contain",e="center center";break;case"aspectFill":t="cover",e="center center";break;case"widthFix":case"heightFix":t="100% 100%";break;case"top":e="center top";break;case"bottom":e="center bottom";break;case"center":e="center center";break;case"left":e="left center";break;case"right":e="right center";break;case"top left":e="left top";break;case"top right":e="right top";break;case"bottom left":e="left bottom";break;case"bottom right":e="right bottom";break;default:t="100% 100%",e="0% 0%";break}return{"background-image":this.contentPath?'url("'.concat(this.contentPath,'")'):"none","background-position":e,"background-size":t,"background-repeat":"no-repeat"}}},watch:{src:function(t,e){this._loadImage()},mode:function(t,e){"widthFix"!==e&&"heightFix"!==e||this._resetSize(),"widthFix"!==t&&"heightFix"!==t||this._fixSize()},contentPath:function(t){!t&&this.__img&&(this.__img.remove(),delete this.__img)}},mounted:function(){this.originalStyle.width=this.$el.style.width||"",this.originalStyle.height=this.$el.style.height||"",this._loadImage()},beforeDestroy:function(){this._clearImage()},methods:{_fixSize:function(){if(this.ratio){var t=this.$el;if("widthFix"===this.mode){var e=t.offsetWidth;e&&(t.style.height=o(e/this.ratio)+"px")}else if("heightFix"===this.mode){var n=t.offsetHeight;n&&(t.style.width=o(n*this.ratio)+"px")}}window.dispatchEvent(new CustomEvent("updateview"))},_resetSize:function(){this.$el.style.width=this.originalStyle.width,this.$el.style.height=this.originalStyle.height},_resetData:function(){this.originalWidth=0,this.originalHeight=0,this.contentPath=""},_loadImage:function(){var t=this,e=this.$getRealPath(this.src);if(e){var n=this._img=this._img||new Image;n.onload=function(r){t._img=null;var i=t.originalWidth=n.width,o=t.originalHeight=n.height;t._fixSize(),t.contentPath=e,n.draggable=t.draggable,t.__img&&t.__img.remove(),t.__img=n,t.$el.appendChild(n),t.$trigger("load",r,{width:i,height:o})},n.onerror=function(e){t._img=null,t._resetData(),t.$trigger("error",e,{errMsg:"GET ".concat(t.src," 404 (Not Found)")})},n.src=e}else this._clearImage(),this._resetData()},_clearImage:function(){var t=this._img;t&&(t.onload=null,t.onerror=null,this._img=null)}}},s=a,c=(n("4dc6"),n("8844")),u=Object(c["a"])(s,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("uni-image",t._g({},t.$listeners),[n("div",{ref:"content",style:t.style}),"widthFix"===t.mode||"heightFix"===t.mode?n("v-uni-resize-sensor",{ref:"sensor",on:{resize:function(e){return t._fixSize()}}}):t._e()],1)}),[],!1,null,null,null);e["default"]=u.exports},"7fd2":function(t,e,n){"use strict";n.r(e),function(t,r){n.d(e,"chooseFile",(function(){return f}));var i=n("bdee"),o=n("0372"),a=n("493d"),s=n("909e"),c=t,u=c.invokeCallbackHandler,l=null;function f(t,e){var n=t.count,c=t.sourceType,f=t.type,d=t.extension;l&&(document.body.removeChild(l),l=null),l=Object(a["default"])({count:n,sourceType:c,type:f,extension:d}),document.body.appendChild(l),l.addEventListener("cancel",(function(){u(e,{errMsg:"chooseFile:fail cancel"})})),l.addEventListener("change",(function(t){for(var r=[],o=t.target.files.length,a=function(e){var o=t.target.files[e],a=void 0;Object.defineProperty(o,"path",{get:function(){return a=a||Object(i["b"])(o),a}}),e100&&(t=100),t}},watch:{realPercent:function(t,e){this.strokeTimer&&clearInterval(this.strokeTimer),this.lastPercent=e||0,this._activeAnimation()}},created:function(){this._activeAnimation()},methods:{_activeAnimation:function(){var t=this;this.active?(this.currentPercent=this.activeMode===r.activeMode?0:this.lastPercent,this.strokeTimer=setInterval((function(){t.currentPercent+1>t.realPercent?(t.currentPercent=t.realPercent,t.strokeTimer&&clearInterval(t.strokeTimer)):t.currentPercent+=1}),parseFloat(this.duration))):this.currentPercent=this.realPercent}}},o=i,a=(n("a18d"),n("8844")),s=Object(a["a"])(o,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("uni-progress",t._g({staticClass:"uni-progress"},t.$listeners),[n("div",{staticClass:"uni-progress-bar",style:t.outerBarStyle},[n("div",{staticClass:"uni-progress-inner-bar",style:t.innerBarStyle})]),t.showInfo?[n("p",{staticClass:"uni-progress-info"},[t._v(" "+t._s(t.currentPercent)+"% ")])]:t._e()],2)}),[],!1,null,null,null);e["default"]=s.exports},8076:function(t,e,n){"use strict";n.r(e),function(t){n.d(e,"previewImage",(function(){return a})),n.d(e,"closePreviewImage",(function(){return s}));var r=t,i=r.emit,o=r.invokeCallbackHandler;function a(t,e){i("onShowPreviewImage",t,(function(t){o(e,{errMsg:"previewImage:ok"})}))}function s(t,e){i("onClosePreviewImage",(function(){o(e,{errMsg:"closePreviewImage:ok"})}))}}.call(this,n("2c9f"))},"81ff":function(t,e,n){"use strict";n.r(e),n.d(e,"vibrateLong",(function(){return i})),n.d(e,"vibrateShort",(function(){return o}));var r=!!window.navigator.vibrate;function i(){return r&&window.navigator.vibrate(400)?{errMsg:"vibrateLong:ok"}:{errMsg:"vibrateLong:fail"}}function o(){return r&&window.navigator.vibrate(15)?{errMsg:"vibrateShort:ok"}:{errMsg:"vibrateShort:fail"}}},"82f1":function(t,e,n){"use strict";n.r(e),function(t){n.d(e,"getVideoInfo",(function(){return i}));var r=n("bdee");function i(e,n){var i=e.src,o=t,a=o.invokeCallbackHandler;Object(r["f"])(i,!0).then((function(t){return t})).catch((function(){return{}})).then((function(t){var e=t.size?{size:t.size,errMsg:"getVideoInfo:ok"}:{errMsg:"getVideoInfo:fail"},r=document.createElement("video");if(void 0!==r.onloadedmetadata){var o=setTimeout((function(){r.onloadedmetadata=null,r.onerror=null,a(n,e)}),i.startsWith("data:")||i.startsWith("blob:")?300:3e3);r.onloadedmetadata=function(){clearTimeout(o),r.onerror=null,a(n,Object.assign(e,{size:Math.ceil((t?t.size:0)/1024),duration:r.duration||0,width:r.videoWidth||0,height:r.videoHeight||0,errMsg:"getVideoInfo:ok"}))},r.onerror=function(){clearTimeout(o),r.onloadedmetadata=null,a(n,e)},r.src=i}else a(n,e)}))}}.call(this,n("2c9f"))},8379:function(t,e,n){"use strict";n.r(e),n.d(e,"createSelectorQuery",(function(){return g}));var r=n("340d"),i=n("745a"),o=n("6352"),a=n("ed2c"),s=n("e68a"),c=n("5883");function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){for(var n=0;n2&&void 0!==arguments[2]&&arguments[2],r=document.getElementById(e);r&&n&&(r.parentNode.removeChild(r),r=null),r||(r=document.createElement("style"),r.type="text/css",e&&(r.id=e),document.getElementsByTagName("head")[0].appendChild(r)),r.appendChild(document.createTextNode(t))}n.d(e,"a",(function(){return r}))},"86d3":function(t,e,n){"use strict";n.r(e),n.d(e,"getBackgroundAudioManager",(function(){return f}));var r=n("745a");function i(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};if(!r){var e=["touchstart","touchmove","touchend","mousedown","mouseup"];e.forEach((function(t){document.addEventListener(t,(function(){!s&&c(!0),s++,setTimeout((function(){!--s&&c(!1)}),0)}),o)})),r=!0}a.push(t)}e["a"]={data:function(){return{userInteract:!1}},mounted:function(){u(this)},beforeDestroy:function(){(function(t){var e=a.indexOf(t);e>=0&&a.splice(e,1)})(this)},addInteractListener:u,getStatus:function(){return!!s}}},"89ce":function(t,e,n){"use strict";n.r(e),function(t){n.d(e,"request",(function(){return s}));var r=n("340d");function i(t,e){for(var n=0;n-1&&(this.selectedIndex=n)}}},methods:{_getRealPath:function(t){return/^([a-z-]+:)?\/\//i.test(t)||/^data:.*,.*/.test(t)||0===t.indexOf("/")||(t="/"+t),Object(r["a"])(t)},_switchTab:function(e,n){var r=e.text,i=e.pagePath;this.selectedIndex=n;var o="/"+i;o===__uniRoutes[0].alias&&(o="/");var a={index:n,text:r,pagePath:i};this.$emit("onTabItemTap",a),this.$route.path===o&&t.emit("onTabItemTap",a)}}}}).call(this,n("2c9f"))},"8b82":function(t,e,n){"use strict";var r=Object.create(null),i=n("4b7e");i.keys().forEach((function(t){Object.assign(r,i(t))})),e["a"]=r},"8c7c":function(e,n){e.exports=t},"8cbb":function(t,e,n){"use strict";var r=n("27d2"),i=n.n(r);i.a},"8d7d":function(t,e,n){"use strict";n.d(e,"a",(function(){return a}));var r=n("c80c"),i=n("f621"),o=n.n(i);function a(){if(uni.canIUse("css.var")){var t=document.documentElement.style,e=parseInt((t.getPropertyValue("--window-top").match(/\d+/)||["0"])[0]),n=parseInt((t.getPropertyValue("--window-bottom").match(/\d+/)||["0"])[0]),i=parseInt((t.getPropertyValue("--window-left").match(/\d+/)||["0"])[0]),a=parseInt((t.getPropertyValue("--window-right").match(/\d+/)||["0"])[0]),s=parseInt((t.getPropertyValue("--top-window-height").match(/\d+/)||["0"])[0]);return{top:(e?e+o.a.top:0)+(s||0),bottom:n?n+o.a.bottom:0,left:i?i+o.a.left:0,right:a?a+o.a.right:0}}var c=0,u=0,l=getCurrentPages();if(l.length){var f=l[l.length-1].$parent.$parent,d=f.navigationBar.type;c="default"===d||"float"===d?r["a"]:0}var h=getApp();return h&&(u=h.$children[0]&&h.$children[0].showTabBar?r["d"]:0),{top:c,bottom:u,left:0,right:0}}},"8def":function(t,e,n){"use strict";var r=n("70bc"),i=n.n(r);i.a},"8f2f":function(t,e,n){"use strict";function r(t,e){if(e){if(0===e.indexOf("/"))return e}else{if(e=t,0===e.indexOf("/"))return e;var n=getCurrentPages();t=n.length?n[n.length-1].$page.route:""}if(0===e.indexOf("./"))return r(t,e.substr(2));for(var i=e.split("/"),o=i.length,a=0;a0?t.split("/"):[];return s.splice(s.length-a-1,a+1),"/"+s.concat(i).join("/")}n.d(e,"a",(function(){return r}))},"8f80":function(t,e,n){"use strict";n.r(e);var r=n("fa54"),i=r["a"],o=(n("f08e"),n("8844")),a=Object(o["a"])(i,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("uni-scroll-view",t._g({},t.$listeners),[n("div",{ref:"wrap",staticClass:"uni-scroll-view"},[n("div",{ref:"main",staticClass:"uni-scroll-view",style:{"overflow-x":t.scrollX?"auto":"hidden","overflow-y":t.scrollY?"auto":"hidden"}},[n("div",{ref:"content",staticClass:"uni-scroll-view-content"},[t.refresherEnabled?n("div",{ref:"refresherinner",staticClass:"uni-scroll-view-refresher",style:{"background-color":t.refresherBackground,height:t.refresherHeight+"px"}},["none"!==t.refresherDefaultStyle?n("div",{staticClass:"uni-scroll-view-refresh"},[n("div",{staticClass:"uni-scroll-view-refresh-inner"},["pulling"==t.refreshState?n("svg",{key:"refresh__icon",staticClass:"uni-scroll-view-refresh__icon",style:{transform:"rotate("+t.refreshRotate+"deg)"},attrs:{fill:"#2BD009",width:"24",height:"24",viewBox:"0 0 24 24"}},[n("path",{attrs:{d:"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"}}),n("path",{attrs:{d:"M0 0h24v24H0z",fill:"none"}})]):t._e(),"refreshing"==t.refreshState?n("svg",{key:"refresh__spinner",staticClass:"uni-scroll-view-refresh__spinner",attrs:{width:"24",height:"24",viewBox:"25 25 50 50"}},[n("circle",{staticStyle:{color:"#2bd009"},attrs:{cx:"50",cy:"50",r:"20",fill:"none","stroke-width":"3"}})]):t._e()])]):t._e(),"none"==t.refresherDefaultStyle?t._t("refresher"):t._e()],2):t._e(),t._t("default")],2)])])])}),[],!1,null,null,null);e["default"]=a.exports},"8fc6":function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n("7553"),i=n("cff9");function o(t,e){e.getApp;var n=e.getCurrentPages;function o(t){return function(e,r){r=parseInt(r);var o=n(),a=o.find((function(t){return t.$page.id===r}));a&&Object(i["b"])(a,t,e)}}var a=Object(r["a"])("requestComponentInfo");var s=Object(r["a"])("requestComponentObserver");var c=Object(r["a"])("requestMediaQueryObserver");t("onPageReady",o("onReady")),t("onPageScroll",o("onPageScroll")),t("onReachBottom",o("onReachBottom")),t("onRequestComponentInfo",(function(t){var e=t.reqId,n=t.res,r=a.pop(e);r&&r(n)})),t("onRequestComponentObserver",(function(t){var e=t.reqId,n=t.reqEnd,r=t.res,i=s.get(e);if(i){if(n)return void s.pop(e);i(r)}})),t("onRequestMediaQueryObserver",(function(t){var e=t.reqId,n=t.reqEnd,r=t.res,i=c.get(e);if(i){if(n)return void c.pop(e);i(r)}}))}},"909e":function(t,e,n){"use strict";var r=n("0db8");n.d(e,"a",(function(){return r["a"]}));var i=n("2ace");n.d(e,"f",(function(){return i["a"]}));var o=n("4335");n.d(e,"c",(function(){return o["a"]}));var a=n("23a1");n.d(e,"g",(function(){return a["a"]}));var s=n("0e4a");n.d(e,"e",(function(){return s["a"]}));var c=n("0c40");n.d(e,"b",(function(){return c["a"]}));var u=n("88a8");n.d(e,"d",(function(){return u["a"]}))},"90f0":function(t,e,n){"use strict";n.r(e),n.d(e,"getProvider",(function(){return i}));var r={OAUTH:"OAUTH",SHARE:"SHARE",PAYMENT:"PAYMENT",PUSH:"PUSH"},i={service:{type:String,required:!0,validator:function(t,e){if(t=(t||"").toUpperCase(),t&&Object.values(r).indexOf(t)<0)return"service error"}}}},9131:function(t,e,n){"use strict";(function(t){function r(){var e;return(e=t).invokeCallbackHandler.apply(e,arguments)}function i(e){return t.removeCallbackHandler(e)}n.d(e,"a",(function(){return r})),n.d(e,"b",(function(){return i}))}).call(this,n("2c9f"))},9151:function(t,e){(function(){"use strict";for(var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n=new Uint8Array(256),r=0;r>2],o+=t[(3&r[n])<<4|r[n+1]>>4],o+=t[(15&r[n+1])<<2|r[n+2]>>6],o+=t[63&r[n+2]];return i%3===2?o=o.substring(0,o.length-1)+"=":i%3===1&&(o=o.substring(0,o.length-2)+"=="),o},e.decode=function(t){var e,r,i,o,a,s=.75*t.length,c=t.length,u=0;"="===t[t.length-1]&&(s--,"="===t[t.length-2]&&s--);var l=new ArrayBuffer(s),f=new Uint8Array(l);for(e=0;e>4,f[u++]=(15&i)<<4|o>>2,f[u++]=(3&o)<<6|63&a;return l}})()},"923d":function(t,e,n){"use strict";(function(t){var r=n("84ed"),i=n("4738"),o=n("0854"),a={forward:"",back:"",share:"",favorite:"",home:"",menu:"",close:""};e["a"]={name:"PageHead",mixins:[o["a"]],props:{backButton:{type:Boolean,default:!0},backgroundColor:{type:String,default:function(){return"transparent"===this.type?"#000":"#F8F8F8"}},textColor:{type:String,default:"#fff"},titleText:{type:String,default:""},duration:{type:String,default:"0"},timingFunc:{type:String,default:""},loading:{type:Boolean,default:!1},titleSize:{type:String,default:"16px"},type:{default:"default",validator:function(t){return-1!==["default","transparent","float"].indexOf(t)}},coverage:{type:String,default:"132px"},buttons:{type:Array,default:function(){return[]}},searchInput:{type:[Object,Boolean],default:function(){return!1}},titleImage:{type:String,default:""},titlePenetrate:{type:Boolean,default:!1},shadow:{type:Object,default:function(){return{}}}},data:function(){return{focus:!1,text:"",composing:!1,showPlaceholder:!1}},computed:{btns:function(){var t=this,e=[],n={};return this.buttons.length&&this.buttons.forEach((function(o){var a=Object.assign({},o);if(a.fontSrc&&!a.fontFamily){var s,c=a.fontSrc=Object(i["a"])(a.fontSrc);if(c in n)s=n[c];else{s="font".concat(Date.now()),n[c]=s;var u='@font-face{font-family: "'.concat(s,'";src: url("').concat(c,'") format("truetype")}');Object(r["a"])(u,"uni-btn-font-"+s)}a.fontFamily=s}a.color="transparent"===t.type?"#fff":a.color||t.textColor;var l=a.fontSize||("transparent"===t.type||/\\u/.test(a.text)?"22px":"27px");/\d$/.test(l)&&(l+="px"),a.fontSize=l,a.fontWeight=a.fontWeight||"normal",e.push(a)})),e},headClass:function(){var t=this.shadow.colorType,e={"uni-page-head-transparent":"transparent"===this.type,"uni-page-head-titlePenetrate":this.titlePenetrate,"uni-page-head-shadow":t};return t&&(e["uni-page-head-shadow-".concat(t)]=t),e}},mounted:function(){var e=this;if(this.searchInput){var n=this.$refs.input;n.$watch("composing",(function(t){e.composing=t})),n.$watch("valueSync",(function(t){e.showPlaceholder=!!t})),this.searchInput.disabled?n.$el.addEventListener("click",(function(){t.emit("onNavigationBarSearchInputClicked","")})):(n.$refs.input.addEventListener("keyup",(function(n){"ENTER"===n.key.toUpperCase()&&t.emit("onNavigationBarSearchInputConfirmed",{text:e.text})})),n.$refs.input.addEventListener("focus",(function(){t.emit("onNavigationBarSearchInputFocusChanged",{focus:!0})})),n.$refs.input.addEventListener("blur",(function(){t.emit("onNavigationBarSearchInputFocusChanged",{focus:!1})})))}},methods:{_back:function(){1===getCurrentPages().length?uni.reLaunch({url:"/"}):uni.navigateBack({from:"backbutton"})},_onBtnClick:function(e){t.emit("onNavigationBarButtonTap",Object.assign({},this.btns[e],{index:e}))},_formatBtnFontText:function(t){return t.fontSrc&&t.fontFamily?t.text.replace("\\u",""):a[t.type]?a[t.type]:t.text||""},_formatBtnStyle:function(t){var e={color:t.color,fontSize:t.fontSize,fontWeight:t.fontWeight};return t.fontFamily&&(e.fontFamily=t.fontFamily),e},_focus:function(){this.focus=!0},_blur:function(){this.focus=!1},_input:function(e){t.emit("onNavigationBarSearchInputChanged",{text:e})},_clearInput:function(){this.text="",this._input(this.text)}}}}).call(this,n("2c9f"))},"925f":function(t,e,n){"use strict";n.r(e),n.d(e,"chooseFile",(function(){return o}));var r=["all","image","video"],i=["album","camera"],o={count:{type:Number,required:!1,default:100,validator:function(t,e){t<=0&&(e.count=100)}},sourceType:{type:Array,required:!1,default:i,validator:function(t,e){t=t.filter((function(t){return i.includes(t)})),e.sourceType=t.length?t:i}},type:{type:String,required:!1,default:"all",validator:function(t,e){r.includes(t)||(e.type=r[0]),e.type="all"===e.type?e.type="*":e.type}},extension:{type:Array,validator:function(t,e){if(t){if(0===t.length)return"param extension should not be empty."}else"all"!==e.type&&"*"!==e.type&&e.type?e.extension=["*"]:e.extension=[""]}}}},"951c":function(t,n){t.exports=e},9593:function(t,e,n){"use strict";var r=n("83c2"),i=n.n(r);i.a},"95bd":function(t,e,n){"use strict";var r=n("1fdf"),i=n.n(r);i.a},9602:function(t,e,n){"use strict";n.r(e),function(t){var r=n("38ce"),i=n("cce2"),o=n("2be0"),a=n("f98c");function s(){t.publishHandler("onPageReady",{},this.$page.id)}e["default"]={install:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};e.routes,Object(i["a"])();var n=function(t,e){for(var n=t.target;n&&n!==e;n=n.parentNode)if(n.tagName&&0===n.tagName.indexOf("UNI-"))break;return n};t.prototype.$handleEvent=function(t){if(t instanceof Event){var e=n(t,this.$el);t=i["b"].call(this,t.type,t,{},e||t.target,t.currentTarget)}return t},t.prototype.$getComponentDescriptor=function(t,e){return Object(a["a"])(t||this,e)},Object.defineProperty(t.prototype,"$ownerInstance",{get:function(){return this.$getComponentDescriptor(this)}}),t.prototype.$handleWxsEvent=function(t){if(t instanceof Event){var e=t.currentTarget,r=e&&(e.__vue__||e),o=e&&r.$getComponentDescriptor&&r.$getComponentDescriptor(r,!1),a=t;t=i["b"].call(this,a.type,a,{},n(a,this.$el)||a.target,a.currentTarget),t.instance=o,t.preventDefault=function(){return a.preventDefault()},t.stopPropagation=function(){return a.stopPropagation()}}return t},t.mixin({beforeCreate:function(){var t=this,e=this.$options,n=e.wxs;n&&Object.keys(n).forEach((function(e){t[e]=n[e]})),e.behaviors&&e.behaviors.length&&Object(o["a"])(e,this),Object(r["d"])(this)&&(e.mounted=e.mounted?[].concat(s,e.mounted):[s])}})}}}.call(this,n("31d2"))},"96b9":function(t,e,n){"use strict";var r=n("c194"),i=n.n(r);i.a},9798:function(t,e,n){"use strict";function r(t,e){for(var n=0;n1?e-1:0),r=1;r0;)this.emit.apply(this,[t].concat(e.shift()))}},{key:"_addListener",value:function(t,e,n){(this.listener[t]||(this.listener[t]=[])).push({fn:n,type:e})}}]),t}()},"97af":function(t,e,n){"use strict";(function(t){n.d(e,"b",(function(){return c})),n.d(e,"a",(function(){return v}));var r=n("cff9");function i(t){-1===this.keepAliveInclude.indexOf(t)&&this.keepAliveInclude.push(t)}var o=[];function a(t){if("number"===typeof t)o=this.keepAliveInclude.splice(-(t-1)).map((function(t){return parseInt(t.split("-").pop())}));else{var e=this.keepAliveInclude.indexOf(t);-1!==e&&this.keepAliveInclude.splice(e,1)}}var s=Object.create(null);function c(t){return s[t]}function u(t){s[t]={x:window.pageXOffset,y:window.pageYOffset}}function l(t,e,n){e&&n&&e.meta.isTabBar&&n.meta.isTabBar&&u(n.params.__id__);for(var i=getCurrentPages(),o=i.length-1;o>=0;o--){var s=i[o],c=s.$page.meta;c.isTabBar||(a.call(this,c.name+"-"+s.$page.id),Object(r["b"])(s,"onUnload"))}}function f(t){__uniConfig.reLaunch=(__uniConfig.reLaunch||1)+1;for(var e=getCurrentPages(!0),n=e.length-1;n>=0;n--)Object(r["b"])(e[n],"onUnload"),e[n].$destroy();this.keepAliveInclude=[],s=Object.create(null)}var d=[];function h(t,e,n,r){d=getCurrentPages(!0);var o=e.params.__id__,s=t.params.__id__,c=t.meta.name+"-"+s;if(s===o&&"reLaunch"!==t.type)t.fullPath!==e.fullPath?(i.call(this,c),n()):n(!1);else if(t.meta.id&&t.meta.id!==s)n({path:t.path,replace:!0});else{var u=e.meta.name+"-"+o;switch(t.type){case"navigateTo":break;case"redirectTo":a.call(this,u),e.meta&&e.meta.isQuit&&(t.meta.isQuit=!0,t.meta.isEntry=!!e.meta.isEntry);break;case"switchTab":l.call(this,r,t,e);break;case"reLaunch":f.call(this,c),t.meta.isQuit=!0;break;default:o&&o>s&&(a.call(this,u),this.$router._$delta>1&&a.call(this,this.$router._$delta));break}if("reLaunch"!==t.type&&"redirectTo"!==t.type&&e.meta.id&&i.call(this,u),i.call(this,c),t.meta&&t.meta.name){document.body.className="uni-body "+t.meta.name;var h="nvue-dir-"+__uniConfig.nvue["flex-direction"];t.meta.isNVue?(document.body.setAttribute("nvue",""),document.body.setAttribute(h,"")):(document.body.removeAttribute("nvue"),document.body.removeAttribute(h))}n()}}function p(e,n){var i,a=n.params.__id__,s=e.params.__id__;function c(t){if(t){Object(r["b"])(t,"onUnload");var e=d.indexOf(t);e>=0&&d.splice(e,1)}}switch(i=n.meta.isSet?d.find((function(t){return t.$page.meta.pagePath===n.meta.pagePath})):d.find((function(t){return t.$page.id===a})),e.type){case"navigateTo":i&&Object(r["b"])(i,"onHide");break;case"redirectTo":c(i);break;case"switchTab":n.meta.isTabBar&&i&&Object(r["b"])(i,"onHide");break;case"reLaunch":break;default:a&&a>s&&(c(i),this.$router._$delta>1&&o.reverse().forEach((function(t){var e=d.find((function(e){return e.$page.id===t}));c(e)})));break}if(delete this.$router._$delta,o.length=0,"reLaunch"!==e.type){var u,l=getCurrentPages(!0);u=e.meta.isSet?l.find((function(t){return t.$page.meta.pagePath===e.meta.pagePath})):l.find((function(t){return t.$page.id===s})),u&&(setTimeout((function(){t.emit("onNavigationBarChange",u.$parent.$parent.navigationBar),Object(r["b"])(u,"onShow")}),0),document.title=u.$parent.$parent.navigationBar.titleText)}}function v(t,e){t.$router.beforeEach((function(n,r,i){h.call(t,n,r,i,e)})),t.$router.afterEach((function(e,n){p.call(t,e,n)}))}}).call(this,n("2c9f"))},"97c3":function(t,e,n){"use strict";function r(t){if(0===t.indexOf("#")){var e=t.substr(1);return function(t){return!(!t.componentInstance||t.componentInstance.id!==e)||!(!t.data||!t.data.attrs||t.data.attrs.id!==e)}}if(0===t.indexOf(".")){var n=t.substr(1);return function(t){return t.data&&function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return e?-1!==e.split(i).indexOf(t):n&&"string"===typeof n?-1!==n.split(i).indexOf(t):void 0}(n,t.data.staticClass,t.data.class)}}}n.d(e,"a",(function(){return o}));var i=/\s+/;function o(t){t.prototype.createIntersectionObserver=function(t){return uni.createIntersectionObserver(this,t)},t.prototype.createMediaQueryObserver=function(t){return uni.createMediaQueryObserver(this,t)},t.prototype.selectComponent=function(t){return function t(e,n){if(n(e.$vnode||e._vnode))return e;for(var r=e.$children,i=0;it.length)&&(e=t.length);for(var n=0,r=new Array(e);n-1&&h.splice(e,1)}else h.length=0}},"9f62":function(t,e,n){"use strict";(function(t){var r=n("909e");e["a"]={name:"Label",mixins:[r["a"]],props:{for:{type:String,default:""}},computed:{pointer:function(){return this.for||this.$slots.default&&this.$slots.default.length}},methods:{_onClick:function(e){var n=/^uni-(checkbox|radio|switch)-/.test(e.target.className);n||(n=/^uni-(checkbox|radio|switch|button)$/i.test(e.target.tagName)),n||(this.for?t.emit("uni-label-click-"+this.$page.id+"-"+this.for,e,!0):this.$broadcast(["Checkbox","Radio","Switch","Button"],"uni-label-click",e,!0))}}}}).call(this,n("31d2"))},"9f69":function(t,e,n){"use strict";n.r(e),function(t){n.d(e,"startLocationUpdate",(function(){return l})),n.d(e,"stopLocationUpdate",(function(){return f})),n.d(e,"onLocationChange",(function(){return d})),n.d(e,"offLocationChange",(function(){return h})),n.d(e,"onLocationChangeError",(function(){return p})),n.d(e,"offLocationChangeError",(function(){return v}));var r=n("b435"),i=t,o=i.invokeCallbackHandler,a=[],s=[],c=!1,u=0;function l(t,e){var n=t.type,i=void 0===n?"gcj02":n;if(!navigator.geolocation)return{errMsg:"startLocationUpdate:fail"};u=u||navigator.geolocation.watchPosition((function(t){c=!0,Object(r["f"])(i,t.coords).then((function(t){a.forEach((function(e){o(e,t)}))})).catch((function(t){s.forEach((function(e){o(e,{errMsg:"onLocationChange:fail ".concat(t.message)})}))}))}),(function(t){c||(o(e,{errMsg:"startLocationUpdate:fail ".concat(t.message)}),c=!0),s.forEach((function(e){o(e,{errMsg:"onLocationChange:fail ".concat(t.message)})}))})),setTimeout((function(){o(e,{errMsg:"startLocationUpdate:ok"})}),100)}function f(){return 0!==u&&(navigator.geolocation.clearWatch(u),c=!1,u=0),{}}function d(t){a.push(t)}function h(t){if(t){var e=a.indexOf(t);e>=0&&a.splice(e,1)}else a=[]}function p(t){s.push(t)}function v(t){if(t){var e=s.indexOf(t);e>=0&&s.splice(e,1)}else s=[]}}.call(this,n("2c9f"))},a004:function(t,e){t.exports=["uni-app","uni-layout","uni-content","uni-main","uni-top-window","uni-left-window","uni-right-window","uni-tabbar","uni-page","uni-page-head","uni-page-wrapper","uni-page-body","uni-page-refresh","uni-actionsheet","uni-modal","uni-toast","uni-resize-sensor","uni-shadow-root","uni-ad","uni-audio","uni-button","uni-camera","uni-canvas","uni-checkbox","uni-checkbox-group","uni-cover-image","uni-cover-view","uni-editor","uni-form","uni-functional-page-navigator","uni-icon","uni-image","uni-input","uni-label","uni-live-player","uni-live-pusher","uni-map","uni-movable-area","uni-movable-view","uni-navigator","uni-official-account","uni-open-data","uni-picker","uni-picker-view","uni-picker-view-column","uni-progress","uni-radio","uni-radio-group","uni-rich-text","uni-scroll-view","uni-slider","uni-swiper","uni-swiper-item","uni-switch","uni-text","uni-textarea","uni-video","uni-view","uni-web-view"]},a050:function(t,e,n){"use strict";n.r(e);var r=n("909e"),i=n("39bd"),o={add:function(t){var e,n,r;try{e=this.toString().split(".")[1].length}catch(i){e=0}try{n=t.toString().split(".")[1].length}catch(i){n=0}return r=Math.pow(10,Math.max(e,n)),(this*r+t*r)/r},sub:function(t){return this.add(-t)},mul:function(t){var e=0,n=this.toString(),r=t.toString();try{e+=n.split(".")[1].length}catch(i){}try{e+=r.split(".")[1].length}catch(i){}return Number(n.replace(".",""))*Number(r.replace(".",""))/Math.pow(10,e)},div:function(t){var e,n,i=0,o=0;try{i=this.toString().split(".")[1].length}catch(r){}try{o=t.toString().split(".")[1].length}catch(r){}return e=Number(this.toString().replace(".","")),n=Number(t.toString().replace(".","")),e/n*Math.pow(10,o-i)},mod:function(t){var e,n,r=0,i=0;try{r=this.toString().split(".")[1].length}catch(o){}try{i=t.toString().split(".")[1].length}catch(o){}var a=Math.pow(10,Math.abs(r-i));1==a&&(a=Math.pow(10,r)),e=(this*a).toString().split(".")[0],n=t*a;var s=(this*a).toString().split(".")[1]?(this*a).toString().split(".")[1]:"";return(e%n+s)/a}},a={name:"Slider",mixins:[r["a"],r["f"],i["a"]],props:{name:{type:String,default:""},id:{type:String,default:""},min:{type:[Number,String],default:0},max:{type:[Number,String],default:100},value:{type:[Number,String],default:0},step:{type:[Number,String],default:1},disabled:{type:[Boolean,String],default:!1},color:{type:String,default:"#e9e9e9"},backgroundColor:{type:String,default:"#e9e9e9"},activeColor:{type:String,default:"#007aff"},selectedColor:{type:String,default:"#007aff"},blockColor:{type:String,default:"#ffffff"},blockSize:{type:[Number,String],default:28},showValue:{type:[Boolean,String],default:!1}},data:function(){return{sliderValue:Number(this.value)}},computed:{setBlockStyle:function(){return{width:this.blockSize+"px",height:this.blockSize+"px",marginLeft:-this.blockSize/2+"px",marginTop:-this.blockSize/2+"px",left:this._getValueWidth(),backgroundColor:this.blockColor}},setBgColor:function(){return{backgroundColor:this._getBgColor()}},setBlockBg:function(){return{left:this._getValueWidth()}},setActiveColor:function(){return{backgroundColor:this._getActiveColor(),width:this._getValueWidth()}}},watch:{value:function(t){this.sliderValue=Number(t)}},mounted:function(){this.touchtrack(this.$refs["uni-slider-handle"],"_onTrack")},created:function(){this.$dispatch("Form","uni-form-group-update",{type:"add",vm:this})},beforeDestroy:function(){this.$dispatch("Form","uni-form-group-update",{type:"remove",vm:this})},methods:{_onUserChangedValue:function(t){var e=this.$refs["uni-slider-value"],n=getComputedStyle(e,null).marginLeft,r=e.offsetWidth;r+=parseInt(n);var i=this.$refs["uni-slider"],o=i.offsetWidth-(this.showValue?r:0),a=i.getBoundingClientRect().left,s=(t.x-a)*(this.max-this.min)/o+Number(this.min);this.sliderValue=this._filterValue(s)},_filterValue:function(t){var e=Number(this.max),n=Number(this.min);return te?e:o.mul.call(Math.round((t-n)/this.step),this.step)+n},_getValueWidth:function(){return 100*(this.sliderValue-this.min)/(this.max-this.min)+"%"},_getBgColor:function(){return"#e9e9e9"!==this.backgroundColor?this.backgroundColor:"#007aff"!==this.color?this.color:"#007aff"},_getActiveColor:function(){return"#007aff"!==this.activeColor?this.activeColor:"#e9e9e9"!==this.selectedColor?this.selectedColor:"#e9e9e9"},_onTrack:function(t){if(!this.disabled)return"move"===t.detail.state?(this._onUserChangedValue({x:t.detail.x}),this.$trigger("changing",t,{value:this.sliderValue}),!1):"end"===t.detail.state&&this.$trigger("change",t,{value:this.sliderValue})},_onClick:function(t){this.disabled||(this._onUserChangedValue(t),this.$trigger("change",t,{value:this.sliderValue}))},_resetFormData:function(){this.sliderValue=this.min},_getFormData:function(){var t={};return""!==this.name&&(t.value=this.sliderValue,t.key=this.name),t}}},s=a,c=(n("f2a9"),n("8844")),u=Object(c["a"])(s,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("uni-slider",t._g({ref:"uni-slider",attrs:{id:t.id},on:{click:t._onClick}},t.$listeners),[n("div",{staticClass:"uni-slider-wrapper"},[n("div",{staticClass:"uni-slider-tap-area"},[n("div",{staticClass:"uni-slider-handle-wrapper",style:t.setBgColor},[n("div",{ref:"uni-slider-handle",staticClass:"uni-slider-handle",style:t.setBlockBg}),n("div",{staticClass:"uni-slider-thumb",style:t.setBlockStyle}),n("div",{staticClass:"uni-slider-track",style:t.setActiveColor})])]),n("span",{directives:[{name:"show",rawName:"v-show",value:t.showValue,expression:"showValue"}],ref:"uni-slider-value",staticClass:"uni-slider-value"},[t._v(t._s(t.sliderValue))])]),t._t("default")],2)}),[],!1,null,null,null);e["default"]=u.exports},a111:function(t,e,n){"use strict";n.r(e),n.d(e,"chooseVideo",(function(){return i}));var r=["album","camera"],i={sourceType:{type:Array,required:!1,default:r,validator:function(t,e){t=t.filter((function(t){return r.includes(t)})),e.sourceType=t.length?t:r}},compressed:{type:Boolean,default:!0},maxDuration:{type:Number,default:60},camera:{type:String,default:"back"},extension:{type:Array,default:["*"],validator:function(t,e){if(0===t.length)return"param extension should not be empty."}}}},a187:function(t,e,n){},a18d:function(t,e,n){"use strict";var r=n("07b5"),i=n.n(r);i.a},a1d7:function(t,e,n){var r={"./audio/index.vue":"d55f","./button/index.vue":"d6fb","./canvas/index.vue":"63b1","./checkbox-group/index.vue":"d514","./checkbox/index.vue":"ca37","./editor/index.vue":"b1d2","./form/index.vue":"baa1","./icon/index.vue":"0abb","./image/index.vue":"7efa","./input/index.vue":"e0e1","./label/index.vue":"2a78","./movable-area/index.vue":"dbe8","./movable-view/index.vue":"65ce","./navigator/index.vue":"5c1f","./picker-view-column/index.vue":"e510","./picker-view/index.vue":"9eba","./progress/index.vue":"801b","./radio-group/index.vue":"3a3e","./radio/index.vue":"1f8a","./resize-sensor/index.vue":"120f","./rich-text/index.vue":"7aa9","./scroll-view/index.vue":"8f80","./slider/index.vue":"a050","./swiper-item/index.vue":"2066","./swiper/index.vue":"383e","./switch/index.vue":"c1f1","./text/index.vue":"e9d1","./textarea/index.vue":"da9d"};function i(t){var e=o(t);return n(e)}function o(t){if(!n.o(r,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return r[t]}i.keys=function(){return Object.keys(r)},i.resolve=o,t.exports=i,i.id="a1d7"},a202:function(t,e,n){"use strict";n.r(e),e["default"]={data:function(){return{popupWidth:0,popupHeight:0}},computed:{isDesktop:function(){return this.popupWidth>=500&&this.popupHeight>=500},popupStyle:function(){var t={},e=t.content={},n=t.triangle={},r=this.popover;function i(t){return Number(t)||0}if(this.isDesktop&&r){Object.assign(n,{position:"absolute",width:"0",height:"0","margin-left":"-6px","border-style":"solid"});var o=i(r.left),a=i(r.width?r.width:300),s=i(r.top),c=i(r.height),u=o+a/2;e.transform="none !important";var l=Math.max(0,u-a/2);e.left="".concat(l,"px"),r.width&&(e.width="".concat(a,"px"));var f=Math.max(12,u-l);f=Math.min(a-12,f),n.left="".concat(f,"px");var d=this.popupHeight/2;s+c-d>d-s?(e.top="auto",e.bottom="".concat(this.popupHeight-s+6,"px"),n.bottom="-6px",n["border-width"]="6px 6px 0 6px",n["border-color"]="#fcfcfd transparent transparent transparent"):(e.top="".concat(s+c+6,"px"),n.top="-6px",n["border-width"]="0 6px 6px 6px",n["border-color"]="transparent transparent #fcfcfd transparent")}return t}},mounted:function(){var t=this,e=function(){var e=uni.getSystemInfoSync(),n=e.windowWidth,r=e.windowHeight,i=e.windowTop;t.popupWidth=n,t.popupHeight=r+i};window.addEventListener("resize",e),e(),this.$once("hook:beforeDestroy",(function(){window.removeEventListener("resize",e)}))}}},a22f:function(t,e,n){"use strict";var r=n("21f5"),i=n.n(r);i.a},a2f6:function(t,e,n){"use strict";function r(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};this.options.rootMargin=["top","right","bottom","left"].map((function(e){return"".concat(Number(t[e])||0,"px")})).join(" ")}},{key:"relativeTo",value:function(t,e){return this.options.relativeToSelector=t,this._makeRootMargin(e),this}},{key:"relativeToViewport",value:function(t){return this.options.relativeToSelector=null,this._makeRootMargin(t),this}},{key:"observe",value:function(e,n){"function"===typeof n&&(this.options.selector=e,this.reqId=s.push(n),t.publishHandler("requestComponentObserver",{reqId:this.reqId,component:this.component,options:this.options},Object(i["a"])(this.component)?this.component:this.pageId))}},{key:"disconnect",value:function(){t.publishHandler("destroyComponentObserver",{reqId:this.reqId},Object(i["a"])(this.component)?this.component:this.pageId)}}]),e}();function l(t,e){return t._isVue||(e=t,t=null),new u(t||Object(o["b"])("createIntersectionObserver"),e)}}.call(this,n("2c9f"))},a770:function(t,e){(function(){"use strict";if("object"===("undefined"===typeof window?"undefined":r(window)))if("IntersectionObserver"in window&&"IntersectionObserverEntry"in window&&"intersectionRatio"in window.IntersectionObserverEntry.prototype)"isIntersecting"in window.IntersectionObserverEntry.prototype||Object.defineProperty(window.IntersectionObserverEntry.prototype,"isIntersecting",{get:function(){return this.intersectionRatio>0}});else{var t=window.document,e=[];i.prototype.THROTTLE_TIMEOUT=100,i.prototype.POLL_INTERVAL=null,i.prototype.USE_MUTATION_OBSERVER=!0,i.prototype.observe=function(t){var e=this._observationTargets.some((function(e){return e.element==t}));if(!e){if(!t||1!=t.nodeType)throw new Error("target must be an Element");this._registerInstance(),this._observationTargets.push({element:t,entry:null}),this._monitorIntersections(),this._checkForIntersections()}},i.prototype.unobserve=function(t){this._observationTargets=this._observationTargets.filter((function(e){return e.element!=t})),this._observationTargets.length||(this._unmonitorIntersections(),this._unregisterInstance())},i.prototype.disconnect=function(){this._observationTargets=[],this._unmonitorIntersections(),this._unregisterInstance()},i.prototype.takeRecords=function(){var t=this._queuedEntries.slice();return this._queuedEntries=[],t},i.prototype._initThresholds=function(t){var e=t||[0];return Array.isArray(e)||(e=[e]),e.sort().filter((function(t,e,n){if("number"!=typeof t||isNaN(t)||t<0||t>1)throw new Error("threshold must be a number between 0 and 1 inclusively");return t!==n[e-1]}))},i.prototype._parseRootMargin=function(t){var e=t||"0px",n=e.split(/\s+/).map((function(t){var e=/^(-?\d*\.?\d+)(px|%)$/.exec(t);if(!e)throw new Error("rootMargin must be specified in pixels or percent");return{value:parseFloat(e[1]),unit:e[2]}}));return n[1]=n[1]||n[0],n[2]=n[2]||n[0],n[3]=n[3]||n[1],n},i.prototype._monitorIntersections=function(){this._monitoringIntersections||(this._monitoringIntersections=!0,this.POLL_INTERVAL?this._monitoringInterval=setInterval(this._checkForIntersections,this.POLL_INTERVAL):(a(window,"resize",this._checkForIntersections,!0),a(t,"scroll",this._checkForIntersections,!0),this.USE_MUTATION_OBSERVER&&"MutationObserver"in window&&(this._domObserver=new MutationObserver(this._checkForIntersections),this._domObserver.observe(t,{attributes:!0,childList:!0,characterData:!0,subtree:!0}))))},i.prototype._unmonitorIntersections=function(){this._monitoringIntersections&&(this._monitoringIntersections=!1,clearInterval(this._monitoringInterval),this._monitoringInterval=null,s(window,"resize",this._checkForIntersections,!0),s(t,"scroll",this._checkForIntersections,!0),this._domObserver&&(this._domObserver.disconnect(),this._domObserver=null))},i.prototype._checkForIntersections=function(){var t=this._rootIsInDom(),e=t?this._getRootRect():l();this._observationTargets.forEach((function(r){var i=r.element,a=u(i),s=this._rootContainsTarget(i),c=r.entry,l=t&&s&&this._computeTargetAndRootIntersection(i,e),f=r.entry=new n({time:o(),target:i,boundingClientRect:a,rootBounds:e,intersectionRect:l});c?t&&s?this._hasCrossedThreshold(c,f)&&this._queuedEntries.push(f):c&&c.isIntersecting&&this._queuedEntries.push(f):this._queuedEntries.push(f)}),this),this._queuedEntries.length&&this._callback(this.takeRecords(),this)},i.prototype._computeTargetAndRootIntersection=function(e,n){if("none"!=window.getComputedStyle(e).display){var r=u(e),i=r,o=d(e),a=!1;while(!a){var s=null,l=1==o.nodeType?window.getComputedStyle(o):{};if("none"==l.display)return;if(o==this.root||o==t?(a=!0,s=n):o!=t.body&&o!=t.documentElement&&"visible"!=l.overflow&&(s=u(o)),s&&(i=c(s,i),!i))break;o=d(o)}return i}},i.prototype._getRootRect=function(){var e;if(this.root)e=u(this.root);else{var n=t.documentElement,r=t.body;e={top:0,left:0,right:n.clientWidth||r.clientWidth,width:n.clientWidth||r.clientWidth,bottom:n.clientHeight||r.clientHeight,height:n.clientHeight||r.clientHeight}}return this._expandRectByRootMargin(e)},i.prototype._expandRectByRootMargin=function(t){var e=this._rootMarginValues.map((function(e,n){return"px"==e.unit?e.value:e.value*(n%2?t.width:t.height)/100})),n={top:t.top-e[0],right:t.right+e[1],bottom:t.bottom+e[2],left:t.left-e[3]};return n.width=n.right-n.left,n.height=n.bottom-n.top,n},i.prototype._hasCrossedThreshold=function(t,e){var n=t&&t.isIntersecting?t.intersectionRatio||0:-1,r=e.isIntersecting?e.intersectionRatio||0:-1;if(n!==r)for(var i=0;i=0&&s>=0&&{top:n,bottom:r,left:i,right:o,width:a,height:s}}function u(t){var e;try{e=t.getBoundingClientRect()}catch(n){}return e?(e.width&&e.height||(e={top:e.top,right:e.right,bottom:e.bottom,left:e.left,width:e.right-e.left,height:e.bottom-e.top}),e):l()}function l(){return{top:0,bottom:0,left:0,right:0,width:0,height:0}}function f(t,e){var n=e;while(n){if(n==t)return!0;n=d(n)}return!1}function d(t){var e=t.parentNode;return e&&11==e.nodeType&&e.host?e.host:e&&e.assignedSlot?e.assignedSlot.parentNode:e}})()},a7fb:function(t,e,n){"use strict";var r=n("84ed"),i=n("4e46"),o={name:"PageBody",mounted:function(){var t=i["a"].height||"50px",e=".uni-app--showtabbar uni-page-wrapper {\n display: block;\n height: calc(100% - ".concat(t,");\n height: calc(100% - ").concat(t," - constant(safe-area-inset-bottom));\n height: calc(100% - ").concat(t," - env(safe-area-inset-bottom));\n }");e+="\n",e+='.uni-app--showtabbar uni-page-wrapper::after {\n content: "";\n display: block;\n width: 100%;\n height: '.concat(t,";\n height: calc(").concat(t," + constant(safe-area-inset-bottom));\n height: calc(").concat(t," + env(safe-area-inset-bottom));\n }"),e+="\n",e+='.uni-app--showtabbar uni-page-head[uni-page-head-type="default"] ~ uni-page-wrapper {\n height: calc(100% - 44px - '.concat(t,");\n height: calc(100% - 44px - constant(safe-area-inset-top) - ").concat(t," - constant(safe-area-inset-bottom));\n height: calc(100% - 44px - env(safe-area-inset-top) - ").concat(t," - env(safe-area-inset-bottom));\n }"),Object(r["a"])(e)}},a=o,s=(n("8cbb"),n("8844")),c=Object(s["a"])(a,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("uni-page-wrapper",[n("uni-page-body",[t._t("default")],2)],1)}),[],!1,null,null,null);e["a"]=c.exports},a805:function(t,e,n){"use strict";(function(t){function r(e,n,r){t.UniServiceJSBridge.subscribeHandler(e,n,r)}n.d(e,"a",(function(){return r}))}).call(this,n("0ee4"))},a874:function(t,e,n){"use strict";n.r(e),function(t){n.d(e,"createMediaQueryObserver",(function(){return u}));var r=n("7553"),i=n("745a"),o=n("0795");function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{},n=getApp();if(n){var c=!1,u=getCurrentPages();if(u.length?u[u.length-1].$page.meta.isTabBar&&(c=!0):n.$children[0].hasTabBar&&(c=!0),!c)return{errMsg:"".concat(t,":fail not TabBar page")};var l=e.index,f=__uniConfig.tabBar;if(l>=__uniConfig.tabBar.list.length)return{errMsg:"".concat(t,":fail tabbar item not found")};switch(t){case"showTabBar":n.$children[0].hideTabBar=!1;break;case"hideTabBar":n.$children[0].hideTabBar=!0;break;case"setTabBarItem":e.iconfont&&(Object(r["r"])(f.list[l].iconfont,s,e.iconfont),e.iconfont=f.list[l].iconfont),Object(r["r"])(f.list[l],i,e);var d=e.pagePath,h=d&&__uniRoutes.find((function(t){var e=t.path;return e===d}));if(h){var p=h.meta;p.isTabBar=!0,p.tabBarIndex=l,p.isQuit=!0,p.isSet=!0,p.id=l+1;var v=__uniConfig.tabBar;v&&v.list&&v.list[l]&&(v.list[l].pagePath=d.startsWith("/")?d.substring(1):d)}break;case"setTabBarStyle":Object(r["r"])(f,o,e);break;case"showTabBarRedDot":Object(r["r"])(f.list[l],a,{badge:"",redDot:!0});break;case"setTabBarBadge":Object(r["r"])(f.list[l],a,{badge:e.text,redDot:!0});break;case"hideTabBarRedDot":case"removeTabBarBadge":Object(r["r"])(f.list[l],a,{badge:"",redDot:!1});break}}return{}}function u(t){return c("setTabBarItem",t)}function l(t){return c("setTabBarStyle",t)}function f(t){return c("hideTabBar",t)}function d(t){return c("showTabBar",t)}function h(t){return c("hideTabBarRedDot",t)}function p(t){return c("showTabBarRedDot",t)}function v(t){return c("removeTabBarBadge",t)}function g(t){return c("setTabBarBadge",t)}},a944:function(t,e,n){var r,i,o;(function(n,a){i=[],r=function(){return function(){if(document.currentScript)return document.currentScript;try{throw new Error}catch(u){var t,e,n,r=/.*at [^(]*\((.*):(.+):(.+)\)$/gi.exec(u.stack)||/@([^@]*):(\d+):(\d+)\s*$/gi.exec(u.stack),i=r&&r[1]||!1,o=r&&r[2]||!1,a=document.location.href.replace(document.location.hash,""),s=document.getElementsByTagName("script");i===a&&(t=document.documentElement.outerHTML,e=new RegExp("(?:[^\\n]+?\\n){0,"+(o-2)+"}[^<]*
+
+
+
+
+
+