diff --git a/.gitignore b/.gitignore
index 9154f4c..93ac001 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,3 +24,6 @@
hs_err_pid*
replay_pid*
+node_modules
+.idea
+target
diff --git a/bigdata/hive.sql b/bigdata/hive.sql
new file mode 100644
index 0000000..263f2e4
--- /dev/null
+++ b/bigdata/hive.sql
@@ -0,0 +1,25 @@
+
+CREATE DATABASE library;
+USE library;
+
+-- 借书趋势
+CREATE TABLE ods_order_count AS
+SELECT
+ DATE_FORMAT(time, '%Y-%m') AS month,
+ COUNT(*) AS orders
+FROM orders
+GROUP BY month
+ORDER BY month;
+-- 用户画像-不同用户借书数量
+CREATE table ods_user_type as
+SELECT
+ u.email AS name,
+ COUNT(*) AS value
+FROM
+ orders o
+JOIN
+ user u ON o.user_id = u.id
+GROUP BY
+ u.email
+ORDER BY
+ value DESC;
diff --git a/bigdata/mysql.sql b/bigdata/mysql.sql
new file mode 100644
index 0000000..cbbc97f
--- /dev/null
+++ b/bigdata/mysql.sql
@@ -0,0 +1,6 @@
+
+
+create table ods_order_count(
+ name varchar(50),
+ value int(10)
+);
\ No newline at end of file
diff --git a/bigdata/sqoop.sh b/bigdata/sqoop.sh
new file mode 100644
index 0000000..0184f8d
--- /dev/null
+++ b/bigdata/sqoop.sh
@@ -0,0 +1,11 @@
+
+
+sqoop import-all-tables \
+--connect jdbc:mysql://localhost:3306/library-recommendation \
+--username root \
+--password 123456 \
+--hive-import \
+--hive-overwrite \
+--create-hive-table \
+--hive-database library \
+--num-mappers 1
diff --git a/db/block_book.sql b/db/block_book.sql
new file mode 100644
index 0000000..919a111
--- /dev/null
+++ b/db/block_book.sql
@@ -0,0 +1,581 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server : localhost33060
+ Source Server Type : MySQL
+ Source Server Version : 50744
+ Source Host : localhost:33060
+ Source Schema : block_book
+
+ Target Server Type : MySQL
+ Target Server Version : 50744
+ File Encoding : 65001
+
+ Date: 21/05/2025 13:23:01
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for activity
+-- ----------------------------
+DROP TABLE IF EXISTS `activity`;
+CREATE TABLE `activity` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '活动名称',
+ `descr` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '活动描述',
+ `img` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '活动图片',
+ `start` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '开始日期',
+ `end` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '结束日期',
+ `location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '活动地点',
+ `num` int(11) NULL DEFAULT 0 COMMENT '报名人数',
+ `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '活动详情',
+ `status` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '活动状态',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '图书活动' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of activity
+-- ----------------------------
+INSERT INTO `activity` VALUES (1, '热门读书活动进行中', ' 为了帮助新同学们快速适应大学生活,更好地利用图书馆的资源、空间和服务,现邀请您参加“答题闯关,徜徉书海”新生入馆教育活动,参与活动有奖', 'http://localhost:9090/files/download/1728530722844-a1.jpg', '2024-09-01', '2024-11-30', '校图书馆1层', 0, '
为了帮助新同学们快速适应大学生活,更好地利用图书馆的资源、空间和服务,现邀请您参加“答题闯关,徜徉书海”新生入馆教育活动,参与活动有奖哦!
请通过入馆教育平台线上自主学习图书馆概况、入馆须知、图书借还、数字资源应用、读者服务等相关知识,答题闯关通过后开通入馆权限。
参与方式:
可通过登陆图书馆主页“新生培训入口”或图书馆微信公众号(lib_mdjnu)的“服务中心”下的“新生专栏”进入入馆教育平台,进行学习闯关。
为了拓展读者对图书馆工作的认知,提高图书馆服务质量。增强读者与图书馆的互动,提升图书馆人气。培养读者对图书的热爱,激发阅读兴趣。图书馆特举办“一本书的旅行”活动,带领大家深入了解图书采购、验收、加工、编目等环节,共同见证一本书从采购到上架的蜕变之旅。
', '进行中');
+INSERT INTO `activity` VALUES (2, '开学季读书活动', '开学季读书活动', 'http://localhost:9090/files/download/1728530731353-a2.jpg', '2024-09-24', '2024-10-31', '校广场A区', 0, '
读书妙处无穷,书香熏染人生。对待生活,对待人,对待自己,对待这个日新月异的世界,只要你愿意花心思进去,让梦想划进书籍的海洋,在经典中书籍中汲取力量,遇见更广阔的世界。
图书馆即将开展萌新图书借阅活动,根据2024级读者每月图书借阅情况,对借阅量前10名读者进行奖励。连续4个月上榜读者,图书馆将再奖励学习大礼包。
活动对象 :2024级本科生
颁奖时间 :请关注图书馆微信公众号
阅读之旅,从图书馆开始。新的起点,让我们一起成为图书馆阅读达人,感受阅读的乐趣,在书籍里寻找自己的“诗和远方”吧!
', '进行中');
+INSERT INTO `activity` VALUES (3, '图书游戏工作坊', '一场游戏,拿捏学习知识精髓!\n一张地图,开启图书世界寻宝之旅!\n一次冒险,解锁学以致用新思路!', 'http://localhost:9090/files/download/1728530739327-a3.jpg', '2024-09-21', '2024-10-31', '校图书馆A栋201', 0, '一场游戏,拿捏学习知识精髓! 一张地图,开启图书世界寻宝之旅! 一次冒险,解锁学以致用新思路! 将枯燥的学习转变为富有挑战性的游戏,使得图书不再是一个难以学习的工具。无论你是新手还是资深学习者,都值得尝试一下,让学习变得更有乐趣。 现在就报名「 图书 游戏工作坊」,开始一场图书探索之旅吧! 「图书游戏工作坊」强强强强强推!
实践性强:游戏工作坊中的任务设计紧密贴合实际开发过程,将抽象的Git知识具象化。 互动性强:巧妙设置诸多互动环节,通过团队协作,小组共创,让大家参与度更高。 趣味性强:极具巧思的游戏创意,帮助大家在实际操作中深化理论理解,提高整体能力水平。 原创性强:禅道团队自主研发,实践与理论结合,为参与者提供有趣、有价值的学习和提升策略。 除此之外,还有诸多惊喜周边礼品奖励,带走超多可爱实用的周边。 活动时间:2024年9月21日14:00-17:30 活动地点:学校图书馆A栋201
温馨提示:本次活动不收取任何费用。
', '进行中');
+INSERT INTO `activity` VALUES (4, '书香满园·悦读之旅', '推广阅读文化,鼓励大众尤其是青少年养成良好的阅读习惯。丰富参与者的知识储备,拓宽视野。促进图书资源的共享与交流。', 'http://localhost:9090/files/download/1728530746021-a4.jpg', '2024-09-01', '2024-11-30', '学校操场', 0, '活动名称: 书香满园·悦读之旅
活动目标: 推广阅读文化,鼓励大众尤其是青少年养成良好的阅读习惯。 丰富参与者的知识储备,拓宽视野。 促进图书资源的共享与交流。 增强社区/学校的凝聚力,营造积极向上的文化氛围。 活动时间: [具体日期],上午9:00至下午5:00
活动地点: 学校操场
活动内容: 1. 开幕式(9:00-9:30) 2. 图书展览(9:30-11:30) 展示各类图书,包括新书推荐、经典重读、主题书展等。 设置互动区域,让参与者可以翻阅、讨论书籍。 3. 阅读分享会(11:30-12:30) 邀请知名作家、学者或阅读爱好者分享阅读体验与心得。 开设“我读我秀”环节,鼓励现场观众分享自己喜欢的书籍或段落。 ', '进行中');
+INSERT INTO `activity` VALUES (5, '阅读盛宴·共享书香', '激发大众的阅读兴趣,推广阅读作为生活方式。提供多元化的阅读体验,满足不同年龄和兴趣读者的需求。\n', 'http://localhost:9090/files/download/1728530753715-a5.png', '2024-09-01', '2024-10-31', '校文化中心', 0, '活动名称: 阅读盛宴·共享书香
活动目标:
激发大众的阅读兴趣,推广阅读作为生活方式。
提供多元化的阅读体验,满足不同年龄和兴趣读者的需求。
促进图书资源的共享,建立阅读社群。
鼓励创作与表达,提升参与者的文化素养。
活动时间:
[具体日期],上午10:00至下午4:00
活动地点:
文化中心
活动内容:
1. 开幕式与阅读宣言(10:00-10:30)
简短介绍活动目的与安排。
邀请嘉宾发表阅读宣言,强调阅读的重要性。
2. 主题书展与互动体验(10:30-12:00)
设立多个主题书展,如文学经典、科幻奇幻、儿童绘本等。
提供互动体验区,如VR阅读体验、有声书录制等。
3. 作者见面会与签售会(12:30-14:00)
邀请知名作家进行面对面交流,分享创作背后的故事。
提供签售环节,让读者有机会收藏心仪作家的作品。
4. 阅读马拉松(14:00-16:00)
设立阅读马拉松区域,鼓励参与者连续阅读一定时间。
提供小奖品作为鼓励,如书签、阅读灯等。
5. 创意阅读与分享(16:00-17:00)
鼓励参与者以创意方式阅读,如角色扮演、朗诵等。
提供分享平台,让参与者展示自己的阅读成果。
宣传推广:
利用社交媒体、合作伙伴渠道进行广泛宣传。
制作活动海报与传单,在公共场所进行分发。
邀请媒体进行报道,提高活动知名度。
预算规划:
场地租赁与布置费用
书籍展览与互动体验所需材料费
作者邀请与签售费用
奖品与纪念品购置费用
宣传与推广费用
注意事项:
确保活动现场的秩序与安全,提供必要的指引与服务。
考虑到不同读者的需求,提供舒适的阅读环境。
鼓励环保,减少活动过程中的浪费。
通过这个图书活动方案,我们希望能够打造一个充满书香与创意的阅读盛宴,让更多的人感受到阅读的魅力与价值。
', '进行中');
+INSERT INTO `activity` VALUES (6, '书香飘逸·阅读嘉年华', '促进读者之间的交流与分享,建立阅读社群。鼓励创新与探索,提升阅读体验。', 'http://localhost:9090/files/download/1728530760951-a6.jpg', '2024-09-01', '2024-11-30', '社区中心', 0, '活动名称: 书香飘逸·阅读嘉年华
活动目标: 激发公众的阅读兴趣,推广阅读文化。 提供丰富的阅读资源,满足不同读者的需求。 促进读者之间的交流与分享,建立阅读社群。 鼓励创新与探索,提升阅读体验。 活动时间: [具体日期],上午9:30至下午5:00
活动地点: 社区中心
活动内容: 1. 开幕式与阅读启动仪式(9:30-10:00) 简短介绍活动安排与亮点。 邀请嘉宾共同启动阅读嘉年华,宣布活动正式开始。 2. 多元化书展(10:00-12:00) 设立多个书展区域,涵盖不同类别与主题的图书。 提供专业导览,帮助读者发现心仪的书籍。 3. 阅读工作坊(12:30-14:00) 邀请作家、学者或阅读推广人开设工作坊。 分享阅读技巧、推荐优秀书籍、探讨阅读的意义等。 4. 读者互动环节(14:00-16:00) 设立读者互动区,鼓励读者分享自己的阅读体验与感悟。 提供即兴表演、阅读接龙等趣味活动,增进读者间的交流。 5. 闭幕式与阅读之星评选(16:00-17:00) 总结活动成果,感谢参与者的支持与贡献。 评选并颁发“阅读之星”奖项,表彰在阅读嘉年华期间表现突出的读者。 ', '进行中');
+INSERT INTO `activity` VALUES (7, '阅读奇遇记·探索书海之旅', '激发公众对阅读的兴趣,推广多元化的阅读文化,通过趣味活动,提升阅读的趣味性和参与度', 'http://localhost:9090/files/download/1728530767435-a7.jpg', '2024-09-01', '2024-11-30', '文化中心', 0, '活动名称: 阅读奇遇记·探索书海之旅
活动目标: 激发公众对阅读的兴趣,推广多元化的阅读文化。 提供丰富的图书资源,满足不同年龄和兴趣读者的需求。 鼓励读者之间的互动与交流,建立阅读社群。 通过趣味活动,提升阅读的趣味性和参与度。 活动时间: [具体日期],上午10:00至下午4:30
活动地点: 文化中心
活动内容: 1. 开幕式与阅读誓约(10:00-10:30) 简短介绍活动目的与安排。 邀请参与者共同宣读“阅读誓约”,承诺在活动中积极阅读、分享与交流。 2. 奇遇书海展区(10:30-12:00) 设立多个主题展区,如经典文学、科幻世界、儿童乐园等。 每个展区设置趣味任务,如寻找特定书籍、解答文学谜题等,完成任务可获得小奖品。 3. 阅读马拉松挑战(12:30-14:00) 设立阅读马拉松区域,鼓励参与者连续阅读一定时间。 提供舒适的阅读环境,如阅读帐篷、懒人沙发等。 完成挑战的读者可获得纪念证书和奖品。 4. 读者沙龙与分享会(14:00-15:30) 邀请知名作家、学者或阅读推广人进行主题分享。 提供读者沙龙环节,鼓励参与者分享自己的阅读心得与感悟。 设立互动问答环节,增进读者与嘉宾之间的交流。 5. 闭幕式与最佳读者评选(15:30-16:00) 总结活动成果,感谢参与者的支持与贡献。 评选并颁发“最佳读者”奖项,表彰在活动中表现突出的读者。 宣布下一次阅读活动的预告,鼓励持续参与。 ', '进行中');
+INSERT INTO `activity` VALUES (8, '阅读探索节·书香满校', '通过这个“阅读探索节·书香满校”活动方案,我们希望能够为市民打造一个充满乐趣与探索的阅读盛会,让更多的人在享受阅读的同时,也能感受到阅读的魅力和价值,共同营造书香满城的浓厚氛围。', 'http://localhost:9090/files/download/1728530775084-a8.jpg', '2024-09-01', '2024-12-31', '文化中心', 0, '活动名称: 阅读探索节·书香满校
活动目标: 激发市民的阅读兴趣,推广阅读作为提升个人素养的重要途径。 展示丰富多样的图书资源,满足不同读者的阅读需求。 促进读者之间的互动与交流,营造浓厚的阅读氛围。 通过创意活动,提升阅读的吸引力和参与度。 活动时间: [具体日期],上午9:00至下午5:00
活动地点: 文化中心广场
活动内容: 1. 开幕式与阅读宣言(9:00-9:30) 简短介绍活动主题与目的。 邀请嘉宾发表阅读宣言,倡导全民阅读。 2. 书香市集(9:30-12:00) 设立多个书香摊位,展示各类图书,包括新书、经典、畅销书等。 每个摊位设置互动环节,如书籍推荐、阅读挑战等,吸引读者参与。 3. 阅读探险寻宝(12:30-14:00) 发放阅读探险地图,引导读者在活动场地内寻找隐藏的“书香宝藏”。 宝藏可以是特定书籍、阅读优惠券、小礼品等。 4. 读者沙龙与分享会(14:00-16:00) 邀请知名作家、书评人进行阅读分享,讲述阅读对人生的影响。 提供读者沙龙环节,鼓励读者分享自己的阅读故事和感悟。 5. 闭幕式与阅读之星表彰(16:00-16:30) 总结活动亮点,感谢参与者的支持与贡献。 评选并表彰“阅读之星”,鼓励更多人积极参与阅读活动。 通过这个“阅读探索节·书香满城”活动方案,我们希望能够为市民打造一个充满乐趣与探索的阅读盛会,让更多的人在享受阅读的同时,也能感受到阅读的魅力和价值,共同营造书香满城的浓厚氛围。
', '进行中');
+
+-- ----------------------------
+-- Table structure for admin
+-- ----------------------------
+DROP TABLE IF EXISTS `admin`;
+CREATE TABLE `admin` (
+ `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '账号',
+ `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '密码',
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '姓名',
+ `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '头像',
+ `role` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '角色',
+ `phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '电话',
+ `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '邮箱',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '管理员表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of admin
+-- ----------------------------
+INSERT INTO `admin` VALUES (1, 'admin', 'admin', '管理员', 'http://localhost:9090/files/download/1721114905635-柴犬.jpeg', 'ADMIN', '18899990011', 'admin2@xm.com');
+
+-- ----------------------------
+-- Table structure for book
+-- ----------------------------
+DROP TABLE IF EXISTS `book`;
+CREATE TABLE `book` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称',
+ `cover` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '封面',
+ `descr` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '简介',
+ `author` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '作者',
+ `publisher` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '出版社',
+ `date` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '出版日期',
+ `price` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '价格',
+ `isbn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'ISBN',
+ `store` int(11) NULL DEFAULT NULL COMMENT '库存',
+ `category_id` int(11) NULL DEFAULT NULL COMMENT '分类ID',
+ `grounding` tinyint(1) NULL DEFAULT NULL COMMENT '是否上架',
+ `recommend` tinyint(1) NULL DEFAULT NULL COMMENT '是否推荐',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '图书信息' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of book
+-- ----------------------------
+INSERT INTO `book` VALUES (1, '我在北京送快递', 'http://localhost:9090/files/download/1728526183155-book6.jpg', '进入社会工作至今的二十年间,胡安焉走南闯北,辗转于广东、广西、云南、上海、北京等地,做过快递员、夜班拣货工人、便利店店员、保安、自行车店销售、服装店导购、加油站加油工……他将日常的点滴和工作的甘苦化作真诚的自述,记录了一个平凡人在生活中的辛劳、私心、温情、正气。\n\n在物流公司夜间拣货的一年,给他留下了深刻的生理印记:“这份工作还会令人脾气变坏,因为长期熬夜以及过度劳累,人的情绪控制力会明显下降……我已经感到脑子不好使了,主要是反应变得迟钝,记忆力开始衰退。”在北京送快递的两年,他“把自己看作一个时薪30元的送货机器,达不到额定产出值就恼羞成怒、气急败坏”……\n\n但他最终认识到,怀着怨恨的人生是不值得过的。这些在事后追忆中写成的工作经历,渗透着他看待生活和世界的态度与反思,旨在表达个人在有限的选择和局促的现实中,对生活意义的直面和肯定:生活中许多平凡隽永的时刻,要比现实困扰的方方面面对人生更具有决定意义。', '胡安焉', '湖南文艺出版社', '2023-03-01', '56', '9787572609268', 1000, 3, 0, 0);
+INSERT INTO `book` VALUES (2, '我的阿勒泰', 'http://localhost:9090/files/download/1728526177883-book5.jpg', '偏远寂静的阿克哈拉村,缓慢而永恒的喀吾图,沙依横布拉克的夏牧场……\n\n“阿勒泰的精灵”李娟以细腻明亮的笔触全景式记录北疆边地美好闪光的时刻\n\n全书分为两辑。第一辑记忆之中(2007-2009),记录了在喀吾图和阿克哈拉村细碎坚忍的生活画面;第二辑角落之中(2002-2006),原生态书写了李娟和母亲及高龄的外婆随牧民迁徙、流动的日常:开杂货铺,当小裁缝,帮往来的牧民车衣裙,去大山深处采野生木耳;春天沙依恒布拉克草原上鼓胀的帐篷,夏季牧场上喧嚣盛大的阿肯弹唱会,入冬后瓷实的迢迢雪路……戈壁、草原、森林、雪山、骏马和牧人,细腻明亮的文字展现了游牧民族在边地深远丰富的生存景观。', '李娟', '花城出版社', '2021-08-01', '45', '9787536094352', 998, 2, 1, 0);
+INSERT INTO `book` VALUES (3, 'Python编程(第3版)', 'http://localhost:9090/files/download/1728526170731-book7.jpg', '本书是针对所有层次的 Python 读者而作的 Python 入门书。全书分为两部分:第一部分介绍使用Python 编程所必须了解的基本概念,包括强大的 Python 库和工具,以及列表、字典、if 语句、类、文件和异常、测试代码等内容;第二部分将理论付诸实践,讲解如何开发三个项目,包括简单的 2D 游 戏、利用数据生成交互式的信息图以及创建和定制简单的 Web 应用程序,并帮助读者解决常见编程问题和困惑。第 3 版进行了全面修订:使用了文本编辑器 VS Code,新增了介绍 removeprefix() 方法和removesuffix() 方法的内容,并且在项目中利用了Matplotlib 和 Plotly 的最新特性,等等。\n\n本书适合对 Python 感兴趣的所有读者阅读。', ' [美] 埃里克 • 马瑟斯(Eric Matthes)', '人民邮电出版社', '2023-05-01', '109.8', '9787115613639', 999, 1, 1, 0);
+INSERT INTO `book` VALUES (4, '等一切风平浪静', 'http://localhost:9090/files/download/1728526146495-book1.jpg', '刘同全新随笔,十年蜕变之作,希望每一个故事,都能帮你撬走一些内心的藤壶', '刘同', '湖南文艺出版社', '2024-06-01', '39', '9787572618635', 1000, 2, 1, 0);
+INSERT INTO `book` VALUES (5, '被讨厌的勇气', 'http://localhost:9090/files/download/1728526136963-boo2.jpg', '“自我启发之父”阿德勒的哲学课,蔡康永、张德芬、大张伟、陈文茜、曾宝仪、勇气推荐!腰封各个印次印刷内容可能有所不同,以实物为准,内文一致 随书附赠干货版小册子', '岸見一郎, 古賀史健', '机械工业出版社', '2020-03-01', '27.5', '9787111495482', 1000, 4, 1, 1);
+INSERT INTO `book` VALUES (6, '这就是ChatGPT!', 'http://localhost:9090/files/download/1728526130554-book3.jpg', 'OpenAI CEO山姆·阿尔特曼(Sam Altman)强烈推荐,沉浸于神奇AI的海洋,与您一同探寻人工智能无尽可能性,与ChatGPT一同开启对话的奇妙旅程!', '[美] 斯蒂芬·沃尔弗拉姆(Stephen Wolfram)', '人民邮电出版社', '2023-07-01', '29.9', '9787115618085', 1000, 1, 1, 1);
+INSERT INTO `book` VALUES (7, '像艺术家一样思考白金版', 'http://localhost:9090/files/download/1728526121300-book4.jpg', '学会观察,学会画画,学会有创造性地解决现实中复杂问题,贝蒂?艾德华的经典绘画书', '[美]贝蒂·艾德华', '北方文艺出版社', '2024-08-01', '46.3', '9787531719540', 999, 10, 1, 1);
+INSERT INTO `book` VALUES (8, '活着', 'http://localhost:9090/files/download/1728697558653-活着.jpg', '余华代表作,DU家授权正版。人是为了活着本身而活着的,而不是为了活着之外的任何事物而活着。', '余华', '北京十月文艺出版社', '2021-10-01', '31', '9787530221532', 1002, 2, 1, 1);
+
+-- ----------------------------
+-- Table structure for cart
+-- ----------------------------
+DROP TABLE IF EXISTS `cart`;
+CREATE TABLE `cart` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
+ `book_id` int(11) NULL DEFAULT NULL COMMENT '图书ID',
+ `num` int(11) NULL DEFAULT NULL COMMENT '数量',
+ `user_id` int(11) NULL DEFAULT NULL COMMENT '用户ID',
+ `time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '添加日期',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '书单信息' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of cart
+-- ----------------------------
+INSERT INTO `cart` VALUES (3, 8, 1, 4, '2024-10-14 11:11:30');
+INSERT INTO `cart` VALUES (7, 8, 1, 1, '2025-03-21 15:00:24');
+
+-- ----------------------------
+-- Table structure for category
+-- ----------------------------
+DROP TABLE IF EXISTS `category`;
+CREATE TABLE `category` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '分类名称',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '图书分类' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of category
+-- ----------------------------
+INSERT INTO `category` VALUES (1, '科学');
+INSERT INTO `category` VALUES (2, '文学');
+INSERT INTO `category` VALUES (3, '小说');
+INSERT INTO `category` VALUES (4, '生活');
+INSERT INTO `category` VALUES (5, '财经');
+INSERT INTO `category` VALUES (6, '杂志');
+INSERT INTO `category` VALUES (7, '动漫');
+INSERT INTO `category` VALUES (8, '励志');
+INSERT INTO `category` VALUES (9, '教材');
+INSERT INTO `category` VALUES (10, '艺术');
+INSERT INTO `category` VALUES (11, '管理');
+INSERT INTO `category` VALUES (12, '哲学');
+INSERT INTO `category` VALUES (13, '历史');
+INSERT INTO `category` VALUES (14, '保健');
+
+-- ----------------------------
+-- Table structure for collect
+-- ----------------------------
+DROP TABLE IF EXISTS `collect`;
+CREATE TABLE `collect` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
+ `activity_id` int(11) NULL DEFAULT NULL COMMENT '活动ID',
+ `user_id` int(11) NULL DEFAULT NULL COMMENT '收藏人ID',
+ `time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '收藏时间',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '活动收藏信息' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of collect
+-- ----------------------------
+INSERT INTO `collect` VALUES (1, 1, 1, '2024-10-17 11:56:49');
+INSERT INTO `collect` VALUES (3, 3, 4, '2024-10-17 11:56:49');
+INSERT INTO `collect` VALUES (4, 7, 1, '2024-10-18 11:01:13');
+
+-- ----------------------------
+-- Table structure for comment
+-- ----------------------------
+DROP TABLE IF EXISTS `comment`;
+CREATE TABLE `comment` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
+ `content` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '内容',
+ `user_id` int(11) NULL DEFAULT NULL COMMENT '评论人',
+ `pid` int(11) NULL DEFAULT NULL COMMENT '父级ID',
+ `time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '评论时间',
+ `fid` int(11) NULL DEFAULT NULL COMMENT '关联ID',
+ `module` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '模块',
+ `root_id` int(11) NULL DEFAULT NULL COMMENT '根节点ID',
+ `score` double(10, 2) NULL DEFAULT NULL COMMENT '评分',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 37 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '评论信息' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of comment
+-- ----------------------------
+INSERT INTO `comment` VALUES (1, '我是青哥哥,我现在正在带敲《图书借阅系统》,欢迎大家跟我一起学习~', 1, NULL, '2024-10-15 10:06:43', 1, 'book', 1, 5.00);
+INSERT INTO `comment` VALUES (2, '来了 我来跟着青哥哥学习~', 1, 1, '2024-10-15 10:06:43', 1, 'book', 1, 5.00);
+INSERT INTO `comment` VALUES (7, '我正在阅读《像艺术家一样思考》这本书,非常喜欢', 1, NULL, '2024-10-15 10:28:01', 7, 'book', 7, 5.00);
+INSERT INTO `comment` VALUES (8, '我是青哥哥 我喜欢打游戏~', 1, NULL, '2024-10-15 10:29:03', 7, 'book', 8, 5.00);
+INSERT INTO `comment` VALUES (16, '111', 4, 8, '2024-10-15 11:55:02', 7, 'book', 8, 5.00);
+INSERT INTO `comment` VALUES (17, '2222', 4, 16, '2024-10-15 11:55:05', 7, 'book', 8, 5.00);
+INSERT INTO `comment` VALUES (18, '我们造车就是华为品牌车', 1, NULL, '2024-10-16 11:18:39', 3, 'posts', 18, 5.00);
+INSERT INTO `comment` VALUES (19, '这个过程让我反思,很多我们父母过去以为有效的方法,其实在现在的孩子身上未必好用', 1, NULL, '2024-10-16 11:37:01', 2, 'posts', 19, 5.00);
+INSERT INTO `comment` VALUES (20, '我还跟孩子讨论了效率问题', 1, NULL, '2024-10-16 11:37:04', 2, 'posts', 20, 5.00);
+INSERT INTO `comment` VALUES (22, '11', 1, NULL, '2025-03-21 14:59:17', 8, 'book', 22, 5.00);
+INSERT INTO `comment` VALUES (23, NULL, 1, NULL, '2025-03-21 14:59:25', 8, 'book', 23, 5.00);
+INSERT INTO `comment` VALUES (24, NULL, 1, NULL, '2025-03-21 14:59:52', 8, 'book', 24, 5.00);
+INSERT INTO `comment` VALUES (25, NULL, 1, NULL, '2025-03-21 15:00:26', 8, 'book', 25, 4.00);
+INSERT INTO `comment` VALUES (26, NULL, 1, NULL, '2025-03-21 15:00:27', 8, 'book', 26, 5.00);
+INSERT INTO `comment` VALUES (35, '111', 1, NULL, '2025-03-21 15:23:45', 7, 'book', 35, 5.00);
+INSERT INTO `comment` VALUES (36, '212121', 1, NULL, '2025-03-21 15:27:51', 7, 'book', 36, 4.00);
+
+-- ----------------------------
+-- Table structure for notice
+-- ----------------------------
+DROP TABLE IF EXISTS `notice`;
+CREATE TABLE `notice` (
+ `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '公告标题',
+ `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '公告内容',
+ `time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '发布时间',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统公告表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of notice
+-- ----------------------------
+INSERT INTO `notice` VALUES (1, '今天天气真的不错', '今天好开心呀!因为天气很好,我又可以肆无忌惮的跟着武哥和青哥学习了!!真的好开心!', '2024-07-16 15:51:17');
+INSERT INTO `notice` VALUES (2, '项目所有功能开发完毕!', '我的项目所有的功能都开发完啦!真的很有成就感!', '2024-07-16 15:52:22');
+INSERT INTO `notice` VALUES (3, '项目功能都测试完成,准备上线!', '经过半个月的学习和练习,终于把这个项目完成了,可以打包上线了!', '2024-07-16 15:52:56');
+
+-- ----------------------------
+-- Table structure for orders
+-- ----------------------------
+DROP TABLE IF EXISTS `orders`;
+CREATE TABLE `orders` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '书籍名称',
+ `order_no` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '借书编号',
+ `time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '借书时间',
+ `user_id` int(11) NULL DEFAULT NULL COMMENT '用户ID',
+ `status` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '状态',
+ `hex` varchar(600) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '哈希',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '订单信息' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of orders
+-- ----------------------------
+INSERT INTO `orders` VALUES (1, '活着等1本书', '1231321321321321', '2024-10-12 11:09:57', 1, '已借出', '0x049cd90d402aedefdf9f080a8aeffbd7209f2a04d04db9c5dda678003c2b03c186a3893f19117d9c');
+INSERT INTO `orders` VALUES (2, '活着', '1845644062331506688', '2024-09-14 09:53:29', 1, '已归还', '0x2be5d0046aeb107cc0eadda59af32afa5054450add9f88160f377850635b0781cf646524cc18d556');
+INSERT INTO `orders` VALUES (3, '像艺术家一样思考白金版', '1845648900637433856', '2024-10-14 10:12:43', 1, '已取消', '0xfffaaf5093967db940d0316f0261a5c2f4477cdbcf7c48f0a1504882ca0c3c77f8847be72fd3e75c');
+INSERT INTO `orders` VALUES (4, '被讨厌的勇气', '1845650057652969472', '2024-10-14 10:17:18', 1, '已取消', '0x66a66df7b44b3b6c1e1182bc187dc6826421ce2e8895dd602e1e113a7447d695ff903f558932048d');
+INSERT INTO `orders` VALUES (5, '等一切风平浪静', '1845650401405542400', '2024-10-14 10:18:40', 4, '借书待确认', '0x5bd5955c31c8879bedb7f3da774ec95f7f2bde07c8b595dec411deda4ea0dc70be407c6c62e00ae8');
+INSERT INTO `orders` VALUES (7, '我的阿勒泰,这就是ChatGPT!等3本图书', '1845670941054832640', '2024-09-20 11:40:17', 1, '已归还', '0x7dbe009bb7ef72730cd2591e38bb9e6af3354a64e70ab5b17037f984b394f2d31b5702790974e7b1');
+INSERT INTO `orders` VALUES (8, 'Python编程(第3版)等1本图书', '1845671933167112192', '2024-10-14 11:44:14', 1, '借书待确认', '0xa15bbe320447761a91ee3391a9e02fec91c328d789777b308bc6c3ad7892f397cd8b89c9da8a696c');
+INSERT INTO `orders` VALUES (9, '我的阿勒泰', '1845672040734232576', '2024-10-14 11:44:40', 1, '借书待确认', '0xc9c2710c317c59855c7012997b797a069831fb2338c4d15751cb2d76249e957202868a13a7bb6010');
+INSERT INTO `orders` VALUES (10, '等一切风平浪静等3本图书', '1845672226374152192', '2024-10-18 11:45:24', 1, '借书待确认', '0x2e03ac691d7154fe85074f11f184552353bdb635ad82d4abd3964f414604809c8fd3433a45942b3f');
+INSERT INTO `orders` VALUES (11, '活着等1本图书', '1902978584520712192', '2025-03-21 15:00:24', 1, '借书待确认', '0x8e40e1750e122b52e4016792babbbc95dbe6125c518b85823bb64c100131f3f9b8d3b58caa93354f');
+INSERT INTO `orders` VALUES (12, '这就是ChatGPT!等1本图书', '1925055494553608192', '2025-05-21 13:06:10', 1, '借书待确认', '0x58b534f7231dee399e59c7949920f699ba97f6048b7cadfdbfe7531ead3a8183f31787cc3d09b6e8');
+
+-- ----------------------------
+-- Table structure for orders_item
+-- ----------------------------
+DROP TABLE IF EXISTS `orders_item`;
+CREATE TABLE `orders_item` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
+ `book_id` int(11) NULL DEFAULT NULL COMMENT '图书ID',
+ `book_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '图书名称',
+ `book_cover` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '图书封面',
+ `num` int(11) NULL DEFAULT NULL COMMENT '数量',
+ `order_id` int(11) NULL DEFAULT NULL COMMENT '借书订单ID',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '订单明细' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of orders_item
+-- ----------------------------
+INSERT INTO `orders_item` VALUES (1, 8, '活着', 'http://localhost:9090/files/download/1728697558653-活着.jpg', 1, 1);
+INSERT INTO `orders_item` VALUES (2, 8, '活着', 'http://localhost:9090/files/download/1728697558653-活着.jpg', 2, 2);
+INSERT INTO `orders_item` VALUES (3, 7, '像艺术家一样思考白金版', 'http://localhost:9090/files/download/1728526121300-book4.jpg', 1, 3);
+INSERT INTO `orders_item` VALUES (4, 5, '被讨厌的勇气', 'http://localhost:9090/files/download/1728526136963-boo2.jpg', 3, 4);
+INSERT INTO `orders_item` VALUES (5, 4, '等一切风平浪静', 'http://localhost:9090/files/download/1728526146495-book1.jpg', 1, 5);
+INSERT INTO `orders_item` VALUES (7, 2, '我的阿勒泰', 'http://localhost:9090/files/download/1728526177883-book5.jpg', 2, 7);
+INSERT INTO `orders_item` VALUES (8, 6, '这就是ChatGPT!', 'http://localhost:9090/files/download/1728526130554-book3.jpg', 1, 7);
+INSERT INTO `orders_item` VALUES (9, 3, 'Python编程(第3版)', 'http://localhost:9090/files/download/1728526170731-book7.jpg', 1, 8);
+INSERT INTO `orders_item` VALUES (10, 2, '我的阿勒泰', 'http://localhost:9090/files/download/1728526177883-book5.jpg', 1, 9);
+INSERT INTO `orders_item` VALUES (11, 4, '等一切风平浪静', 'http://localhost:9090/files/download/1728526146495-book1.jpg', 3, 10);
+INSERT INTO `orders_item` VALUES (12, 8, '活着', 'http://localhost:9090/files/download/1728697558653-活着.jpg', 1, 11);
+INSERT INTO `orders_item` VALUES (13, 6, '这就是ChatGPT!', 'http://localhost:9090/files/download/1728526130554-book3.jpg', 1, 12);
+
+-- ----------------------------
+-- Table structure for posts
+-- ----------------------------
+DROP TABLE IF EXISTS `posts`;
+CREATE TABLE `posts` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
+ `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '标题',
+ `img` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '图片',
+ `tags` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '标签',
+ `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '内容',
+ `user_id` int(11) NULL DEFAULT NULL COMMENT '发布人ID',
+ `time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '发布时间',
+ `read_count` int(11) NULL DEFAULT NULL COMMENT '阅读量',
+ `section_id` int(11) NULL DEFAULT NULL COMMENT '版块ID',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '帖子信息' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of posts
+-- ----------------------------
+INSERT INTO `posts` VALUES (1, '硕士毕业生只能当宿管、勤杂工?如何应对“本研倒挂”|教育一周洞见', 'http://124.223.57.18:9092/files/download/1727080570630-posts1.webp', '[\"热门问答\"]', '老现象“本研倒挂”引热议,本质原因是对研究生学历贬值的焦虑
本周的教育热词是“研究生”。
先是“兰州大学在校研究生总量首超本科生”登上热搜,高校“本研倒挂”的现象引发关注,网友惊呼“以后会不会大街上随便拉一个都是研究生”“离博士送外卖不远了”。随后,“云南保山学院拟聘3名硕士为宿舍管理员”的消息,作为实例引发了学历贬值的相关讨论。到了周末,一则“南航苏州附中勤杂工招聘结果公示,24岁物理学硕士拟获录用”的消息,让更多的人绷不住了,有网友哀叹“浪费资源,浪费人才,悲哀!心痛”。
需要指出,南航苏州附中立即做了一个回应,称工作人员失误,应聘者实为本科,但是,该校党委书记又补充了一句,“他是本科,硕士学位还没拿到”——言下之意,这位学生是在攻读研究生了,只是学位证还没拿到而已。换言之,无法缓解人们对研究生贬值现象的焦虑。
某种程度上,如一些教育界人士指出那样,高校“本研倒挂”上热搜属于大惊小怪,因为这个现象早就出现了。稍微检索下就发现,2006年中国青年报的一篇报道就提到,“人大、北大等几所大学研究生数量已经超过本科生数量。”换言之,大概二十年前,“本研倒挂”已经出现。横向比较,在国外这也不是什么奇怪的现象,以麻省理工学院为例,最新在校本科生数量是4576名,占比38%,研究生7344名,占比62%。
之所以最近人们对此大惊小怪,恐怕并非因为普遍不知道“本研倒挂”现象,而是因为这一现象的严重程度,已经超过了人们了心理阈值。据不完全统计,仅在“双一流”高校中,就至少有49所今年的研究生招生人数已经超过本科生。
', 1, '2024-09-20 10:00:00', 200, 1);
+INSERT INTO `posts` VALUES (2, '家长要成为孩子学习中的陪伴者,不要对孩子说“成绩好坏无所谓”', 'http://124.223.57.18:9092/files/download/1727080538603-posts1.png', '[\"学习园地\",\"科普知识\"]', '晴天妈妈:在父母陪伴孩子写作业、学习的过程中,您觉得有哪些情况是需要避免的?有没有哪些现象您认为是一种乱象,或者这种做法可能导致父母和孩子都两败俱伤?
田宏杰: 在过去的日子里,尤其是双减政策出台之前,很多父母都投入了大量精力陪孩子上课外班。有的妈妈甚至会架着iPad把整场课程都录下来。我问她们:“你录这些干什么?”她们会回答:“我回去整理思路,孩子不会的部分我也能再讲给他听。”这种高度投入的状态,家长自己学一遍,再讲给孩子听,其实背后有两种可能性。
一种可能是,父母真的具备足够的教育智慧,不仅懂得解题,还了解教育心理学,而且心态非常稳。她带着这些知识去陪伴孩子,做到不急不躁,理解孩子的困难,能够给予适当的帮助。如果真的能做到这种“完美型”父母,那确实是理想的情况。她不会对孩子发火,孩子犯错时还能给孩子调整的时间和机会,这当然是一个完美的状态。
但问题在于,人很难做到这一点。当你投入了那么多的时间和精力,把所有东西都学得那么明白,但面对一个没有你那么用心、也没有你那么容易理解的孩子时,父母的心态能否保持平和?我觉得非常难。当你付出这么多,肯定会对这件事情有很高的期望,你希望有一种确定感和掌控感。然而孩子的成长是充满不确定性的,无法像你预期的那样线性地取得结果。
很多时候,前期你会觉得陪伴孩子很有效果,但随着时间推移,效果可能会减弱,甚至会束缚孩子的成长。在我的书里,我提到了一种现象,叫“过度密集型的陪伴教育”。当我们一直催促孩子学习时,会呈现出一种“倒U型曲线”。刚开始,随着陪伴力度的增加,孩子的成绩可能确实会提升,但到了某个阶段,陪伴力度的进一步增加反而会导致成绩下降。 你会发现,别人家的孩子在四五年级时仍在进步,而你家的孩子却“躺平”了,亲子矛盾也随之加剧。
目前,我们周围很多家庭都存在这种问题,父母在陪学中过度密集地介入,管控过多,无法控制自己的心态和言行。面对孩子时,有的父母可能表现得粗暴,有的则是失望的叹气,甚至是蔑视。这些都会伤害孩子。
此外,还有打骂、吼叫的影响。很多家长发现,打骂和吼叫不仅让孩子变笨,学习成绩也变得更差,这是有神经生理学基础的。打骂和吼叫会激发孩子的“战斗或逃跑反应”。这种反应会让孩子感到被攻击,感到害怕。如果有能力反击,孩子可能会“战斗”;如果不行,就会选择“逃跑”。
在这种状态下,身体会激发能量,加快心跳、提高血压,血液会流向四肢,而大脑的供血就不足了。同时,皮质醇的分泌还会抑制大脑的思考能力。其实,成年人自己也可以感受一下,每当和孩子急躁争吵时,脑子就不太好使了,办法也想不出来,只想揍孩子,是不是这样?孩子的反应也一样。
晴天妈妈: 田老师提到的“战斗逃跑反应”特别形象。其实我也有类似的观察,我小时候有个同学,他父母也是老师,从小到大一直陪他学习,初中时成绩非常好。但到了高中,情况就发生了变化。我在陪孩子写作业时,更多是“人陪心不陪”,我在旁边做自己的事,比如写论文,毕竟我也是个在读博士生,过程很艰难。孩子在写作业的时候,我也在写我的东西,或者看书。我不会去盯着他的作业,甚至不太管他对错多少。我觉得批改作业的部分可以让他们同学之间互相批改,我不觉得这是问题。关键是我不会对他学习的结果负责。我更在意的是他学习过程中的状态。
我注意到一些家长,会录下整个课程,自己学一遍再教给孩子。我想跟大家分享一个真实的例子,不是用数据吓人,而是我观察到的现象。在我们那个年代,很多老师的孩子在初中成绩很好,因为父母一直陪着他们。但到了高中,情况就不一样了。高中不再只有六门课,我们那个年代是语文、数学、英语加综合科目,课程多达九到十门。而且,高中生的作息时间几乎都在学校,父母已经无法再跟上他们的学习节奏了。
这样一来,你会发现,那些在初中成绩名列前茅、父母陪伴得特别多的孩子,到了高中可能反而表现不如人意。一个原因是,孩子本身的心理和学习动力是依赖于父母的。他们常常是为了“让父母快乐”而学习。 而当父母无法再帮助他们时,问题就显现出来了。其次,父母的知识结构和能力也跟不上了,尤其在面对复杂的高中课程时。最后,随着孩子长大,父母对孩子的影响力越来越小,孩子的学习节奏和心态开始变得更加重要。
就像田老师书中提到的,学习方法和动力系统是非常关键的。我昨天对孩子发了脾气,因为开学两周了,他们每天九点多才睡觉。我可以接受他们写不完作业,但我不能接受九点还没睡。我对他们说:“如果你现在就得靠熬夜来完成学校布置的任务,而且学校的作业并不多,那你到了高年级怎么办?”
我还跟孩子讨论了效率问题。我问他们:“你觉得自己是聪明还是笨?”他们说自己聪明,但效率不高。我指出他们九点作业没完成的原因,并讨论了作业量的问题。结果孩子承认,课后写作业时去抓蛐蛐了。我告诉他们,我理解玩耍的欲望,但希望他们能自己调整作业和娱乐的时间。
这个过程让我反思,很多我们父母过去以为有效的方法,其实在现在的孩子身上未必好用
', 1, '2024-09-20 10:00:00', 802, 2);
+INSERT INTO `posts` VALUES (3, '华为首次公开回应“引望之问”', 'http://124.223.57.18:9092/files/download/1727080527013-posts3.webp', '[\"热门问答\",\"科普知识\"]', '自今年初华为注册成立深圳引望智能技术有限公司以来,业界围绕引望的各种猜测热度始终居高不下。尤其是近期阿维塔和赛力斯的先后入股,更让引望成为舆论关注焦点。华为最初成立引望的战略考量是什么?谁将成为下一个入股引望的车企?引望又将如何重构汽车产业智能化供应链?这些萦绕在人们心中的思考,已组合成当前产业界的“引望之问”。 日前,华为轮值董事长徐直军接受经济日报记者采访,首次公开回应了引望之问 。
“引望取自于一首诗——北宋政治家寇准的词,‘高楼聊引望,杳杳一川平’,寓意是希望给我们国家的汽车产业带来希望,也是希望未来通过自身的努力,支持我们国家实现汽车产业崛起的梦想。”徐直军开门见山,“当然,能不能做到,要靠引望未来的努力,至少我们有这个想法和目标,一步一步在朝这个目标迈进。”
为什么华为不造车 ?“我们造车就是华为品牌车,充其量就像手机一样,占到百分之一二十的份额。但是做了以后,我们的引望就只能为自己服务了,说不定还要建汽车制造厂,这又是重复建设了。”徐直军说。
“如果换一个定位,顺应汽车产业电动化、智能化双重变革,在新的领域发力,可能会更有价值和意义。”徐直军解释,“2019年4月,我在上海汽车展时,就提出华为要做智能电动汽车产业增量部件提供商。之所以强调‘增量’,那是我反复思考后加上去的。因为部件供应商和某知名供应商没什么区别,而‘增量’部件提供商,更能体现我们在电动化、智能化上的优势。”
', 1, '2024-09-20 10:00:00', 105, 2);
+INSERT INTO `posts` VALUES (4, '肺癌不只是吸烟这么简单,这4个因素也容易患病!', 'http://124.223.57.18:9092/files/download/1727079960721-posts4.webp', '[\"科普知识\",\"生活小贴士\"]', '
在当今社会,癌症已成为威胁人类健康与生命的重大挑战,其中肺癌更是以其高发病率和死亡率,被冠以“癌症之王”的称号。肺癌不仅影响个体的生命质量,也给家庭和社会带来了沉重的负担。
什么是肺癌? 肺癌,全称为原发性支气管肺癌,是起源于支气管粘膜或腺体的恶性肿瘤。根据组织病变特点,肺癌可分为小细胞癌和非小细胞癌两大类,后者又可细分为鳞癌、腺癌及大细胞癌等。
肺癌具有浸润性生长的特性,能迅速破坏周围组织,并通过淋巴或血液系统向远处转移,最终危及患者生命。
肺癌的病因 肺癌的发生是一个复杂的多因素过程,涉及遗传、环境、生活习惯等多个方面。目前公认的主要病因包括:
1. 吸烟:吸烟是导致肺癌的最主要原因,二手烟的危害同样不容忽视。烟草烟雾中含有超过60种致癌物,长期吸入会显著增加患肺癌的风险。
2. 空气污染:包括室外大气污染(如PM2.5、苯并芘等)和室内空气污染(如装修污染、厨房油烟等)。这些污染物中的有害物质能够损伤肺组织,诱发细胞癌变。
3. 职业因素:长期接触石棉、砷、铬、镍等致癌物质的人群,患肺癌的风险显著增加。这些物质在工作环境中通过呼吸进入肺部,对肺组织造成慢性损伤。
4. 遗传因素:家族中有肺癌病史的人群,其患肺癌的风险高于普通人群。这可能与遗传基因中的易感位点有关。
5. 其他因素:如慢性肺部疾病(如慢性阻塞性肺病)、饮食习惯(如缺乏β胡萝卜素的摄入)、心理因素等,也可能在一定程度上影响肺癌的发生。
肺癌的早期症状 遗憾的是,肺癌早期往往没有明显的症状,这也是其难以早期发现的重要原因之一。然而,当肺癌发展到一定程度时,患者可能会出现以下症状:
1. 刺激性干咳:无痰或仅有少量白色泡沫痰。
2. 痰中带血:表现为痰内间断或持续带血。
3. 胸痛:持续性尖锐且剧烈的胸口疼痛,可能提示肿瘤已侵入胸壁。
4. 呼吸困难:肿瘤阻塞支气管导致呼吸不畅。
5. 声音嘶哑:肿瘤压迫喉返神经所致。
6. 不明原因的体重下降:可能是癌症的信号之一。
', 4, '2024-09-20 10:00:00', 300, 1);
+INSERT INTO `posts` VALUES (5, '上海技能人才调查报告显示:这些急需紧缺工种工资增长强劲', 'http://124.223.57.18:9092/files/download/1727080516158-posts5.webp', '[\"生活小贴士\",\"热门问答\"]', '上海市人力资源和社会保障局23日发布报告显示,近5年,本市技能人才工资呈增长态势。技能人才年平均工资近5年增长32%。
2019—2023年,本市技能人才年平均工资分别为12.79万元、13.55万元、14.83万元、16.22万元和16.88万元。高级技师、技师、高级工、中级工、初级工年平均工资增长量分别为4.09万元、3.13万元、4.22万元、5.90万元和3.48万元,增幅分别为20.4%、17.8%、26.5%、46.5%和35.5%。
三大先导产业高技能人才工资增长强劲
此次调查显示,技能等级越高,工资水平越高。从工资中位数看,首席和特级技师工资是初级工3.1倍。首席和特级技师、高级技师、技师、高级工、中级工和初级工工资中位数倍数比例为3.1:2.0:1.7:1.6:1.4:1。
“人工智能”产业高技能人才年工资高位数为33.08万元,增幅9.9%。“生物医药”产业高技能人才年工资高位数为27.09万元,增幅16.4%。“集成电路”产业高技能人才年工资高位数为20.39万元,增幅18.6%。
技能人才人数较多的“制造业”“交通运输、仓储和邮政业”“信息传输、软件和信息技术服务业”,高技能人才年工资中位数分别为18.91万元、18.67万元和17.76万元。“电力、热力、燃气及水生产和供应业”高技能人才年工资中位数为18.25万元。
高级技师年工资高位数位列前五的是“信息传输、软件和信息技术服务业”“电力、热力、燃气及水生产和供应业”“科学研究和技术服务业”“制造业”“交通运输、仓储和邮政业”,分别为48.49万元、48.00万元、45.51万元、41.18万元和35.81万元。
高技能人才工资超过同级专技人员
初、中、高级工年工资高位数为27.51万元,比初级职称专业技术人员中位数(15.54万元)高11.97万元;技师高位数为32.46万元,比中级职称专业技术人员中位数(24.00万元)高8.46万元;高级技师高位数为39.22万元,比高级职称专业技术人员中位数(32.96万元)高6.26万元。
初、中级工高位数26.80万元,比文秘、办事员、后勤管理等普通管理岗位中位数(14.81万元)高11.99万元;高级工高位数30.75万元,比基层管理岗位中位数(27.15万元)高3.60万元;技师、高级技师高位数33.94万元,比高级管理岗位中位数(33.14万元)高0.80万元;首席和特级技师年工资高位数为48.71万元,比单位负责人中位数(48.00万元)高0.71万元。
为加强技能人才队伍建设,培育引进急需紧缺高技能人才,本市聚焦三大先导产业和重点行业,发布2024年急需紧缺高技能人才职业(工种)目录,向目录内职业(工种)提供人才引进等政策支持,并加大相关高技能人才培育力度。
对照目录,高技能人才年工资中位数位列前三的是“动画制作员”(46.03万元)“全媒体运营师”(37.04万元)和“半导体芯片制造工”(33.24万元)。
', 4, '2024-09-20 10:00:00', 100, 1);
+INSERT INTO `posts` VALUES (7, '《里斯本丸沉没》:那些没有墓碑的生命,意味着什么?', 'http://124.223.57.18:9092/files/download/1727082971363-p11.webp', '[\"学习园地\"]', '历史学者罗新在《漫长的余生:一个北魏宫女和她的时代》的后记中写道:“我激励自己时总是说,这个故事值得讲述,因为主人公在任何意义上都是弱者和边缘人,而关心弱者、为边缘人发声,不正是当下历史学人的重要责任吗?”北魏宫女王钟儿是幸运的,因为在其逝后1700年,一位有心人从一块墓碑入手钩沉索隐,将其个人的小历史从北魏宫廷风云变幻的浪潮中打捞出来,让这个大历史中的寂寂无名者浮出了历史地表。
古往今来,较之王氏,“在任何意义上都是弱者和边缘人”者恒河沙数,就像二战时期因“里斯本丸”沉没而长眠海底的八百多位英国战俘——他们是大历史中的无名者,是败者中的弱者甚至失踪者;长期以来无人知晓此船沉于何处、亡者尸骨何存(炮兵蒙泰格墓碑下便“没有骨灰,没有遗体,什么也没有”),那些生命似乎有始而不知所终(二等兵肯尼斯的墓碑上则写着“可能被淹死了”)。
近期在全国上映的纪录电影《里斯本丸沉没》尝试揭露了这段82年前发生在中国东极岛海域不为人知的历史真相。电影上映两周以来,票房已突破1900万,收获大量好评。
“当一艘船沉入海底,当一个人成了谜,你不知道,他们为何离去,就像你不知道这竟是结局。”(韩寒《后会无期》里的这句歌词就指向该事件)。就像罗新一样,《里斯本丸沉没》的导演方励也认为,揭开这一历史谜团责无旁贷,“不干你就是历史罪人”。
撰文|王升远
更改叙事的“比例尺” 说干就干,但方励首先会遇到的,恐怕是任何历史叙事者都难免会遭遇的“比例尺”问题。
在宏观尺度的结构性思考抑或民众认知的意义上,对于事件各方而言,一船之沉似乎都无足挂齿。这其中有战争观以及战后反思的认识论限度问题,也有当下国际关系局势表达尺度问题。在多方力量、多重因素无心的“合谋”之下,“这件事就好像被藏在了地毯下,没人提起也不为公众所知”。第一位研究“里斯本丸”沉没事件的托尼·班纳姆(著有《里斯本丸沉没》)在接受采访时表示,甚至“大部分英国人、中国香港人,都不知道里斯本丸发生了什么”,方励的街头随访也证实了人们对此事广泛的无知和遗忘。
', 5, '2024-09-20 10:00:00', 100, 7);
+INSERT INTO `posts` VALUES (8, '晒晒自己的漫画', 'http://124.223.57.18:9092/files/download/1727083518786-p33.webp', '[\"热门问答\"]', '分享一些漫画日常。。。
', 5, '2024-09-20 10:00:00', 100, 4);
+INSERT INTO `posts` VALUES (9, '太励志了郑钦文。。。', 'http://124.223.57.18:9092/files/download/1727083101584-p22.png', '[\"学习园地\"]', '
从在电视机前看前辈夺冠到自己夺冠。。。
从找前辈要签名到成为同一届世界冠军奥运金牌得主。。。
命运就是这么奇妙。。。
', 5, '2024-09-20 10:00:00', 100, 3);
+INSERT INTO `posts` VALUES (12, '我今天怎么不喜欢吃榴莲', 'http://localhost:9090/files/download/1729051387136-微信截图_20231213153827.png', '[\"学习园地\",\"科普知识\"]', '我今天怎么喜欢吃榴莲
', 1, '2024-10-16 12:03:27', 3, 1);
+
+-- ----------------------------
+-- Table structure for posts_section
+-- ----------------------------
+DROP TABLE IF EXISTS `posts_section`;
+CREATE TABLE `posts_section` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '社区版块' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of posts_section
+-- ----------------------------
+INSERT INTO `posts_section` VALUES (1, '知识专区');
+INSERT INTO `posts_section` VALUES (2, '互联网');
+INSERT INTO `posts_section` VALUES (3, '励志人生');
+INSERT INTO `posts_section` VALUES (4, '漫画专区');
+INSERT INTO `posts_section` VALUES (5, '金融财经');
+INSERT INTO `posts_section` VALUES (6, '流行小说');
+INSERT INTO `posts_section` VALUES (7, '电影音乐');
+
+-- ----------------------------
+-- Table structure for room
+-- ----------------------------
+DROP TABLE IF EXISTS `room`;
+CREATE TABLE `room` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称',
+ `img` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '封面',
+ `location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '位置',
+ `open_time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '开放时间',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '阅览室信息' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of room
+-- ----------------------------
+INSERT INTO `room` VALUES (1, '文渊阁', 'http://localhost:9090/files/download/1728532017266-y1.png', '图书馆2层', '9:00 - 20:00');
+INSERT INTO `room` VALUES (2, '兰台轩', 'http://localhost:9090/files/download/1728532021903-y2.png', '图书馆3层东侧', '9:00 - 20:00');
+INSERT INTO `room` VALUES (3, '墨香斋', 'http://localhost:9090/files/download/1728532027128-y3.png', '图书馆3层西侧', '9:00 - 20:00');
+INSERT INTO `room` VALUES (4, '翰林苑', 'http://localhost:9090/files/download/1728532032911-y4.png', '图书馆4层东侧', '9:00 - 20:00');
+INSERT INTO `room` VALUES (5, '崇文馆', 'http://localhost:9090/files/download/1728532038023-y5.png', '图书馆4层西侧', '9:00 - 20:00');
+INSERT INTO `room` VALUES (6, '集贤殿', 'http://localhost:9090/files/download/1728532043396-y6.png', '图书馆5层', '9:00 - 20:00');
+
+-- ----------------------------
+-- Table structure for seat
+-- ----------------------------
+DROP TABLE IF EXISTS `seat`;
+CREATE TABLE `seat` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `no` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '编号',
+ `room_id` int(11) NULL DEFAULT NULL COMMENT '阅览室ID',
+ `row` int(11) NULL DEFAULT NULL COMMENT '排',
+ `col` int(11) NULL DEFAULT NULL COMMENT '列',
+ `status` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '预约状态',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 121 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '座位信息' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of seat
+-- ----------------------------
+INSERT INTO `seat` VALUES (1, '001', 1, 1, 1, '已选');
+INSERT INTO `seat` VALUES (2, '002', 1, 1, 2, '未选');
+INSERT INTO `seat` VALUES (3, '003', 1, 1, 3, '未选');
+INSERT INTO `seat` VALUES (4, '004', 1, 1, 4, '未选');
+INSERT INTO `seat` VALUES (5, '005', 1, 1, 5, '未选');
+INSERT INTO `seat` VALUES (6, '006', 1, 2, 1, '未选');
+INSERT INTO `seat` VALUES (7, '007', 1, 2, 2, '未选');
+INSERT INTO `seat` VALUES (8, '008', 1, 2, 3, '未选');
+INSERT INTO `seat` VALUES (9, '009', 1, 2, 4, '已选');
+INSERT INTO `seat` VALUES (10, '010', 1, 2, 5, '未选');
+INSERT INTO `seat` VALUES (11, '011', 1, 3, 1, '未选');
+INSERT INTO `seat` VALUES (12, '012', 1, 3, 2, '未选');
+INSERT INTO `seat` VALUES (13, '013', 1, 3, 3, '未选');
+INSERT INTO `seat` VALUES (14, '014', 1, 3, 4, '未选');
+INSERT INTO `seat` VALUES (15, '015', 1, 3, 5, '未选');
+INSERT INTO `seat` VALUES (16, '016', 1, 4, 1, '未选');
+INSERT INTO `seat` VALUES (17, '017', 1, 4, 2, '未选');
+INSERT INTO `seat` VALUES (18, '018', 1, 4, 3, '未选');
+INSERT INTO `seat` VALUES (19, '019', 1, 4, 4, '未选');
+INSERT INTO `seat` VALUES (20, '020', 1, 4, 5, '未选');
+INSERT INTO `seat` VALUES (21, '021', 2, 1, 1, '已选');
+INSERT INTO `seat` VALUES (22, '022', 2, 1, 2, '未选');
+INSERT INTO `seat` VALUES (23, '023', 2, 1, 3, '未选');
+INSERT INTO `seat` VALUES (24, '024', 2, 1, 4, '未选');
+INSERT INTO `seat` VALUES (25, '025', 2, 1, 5, '未选');
+INSERT INTO `seat` VALUES (26, '026', 2, 2, 1, '未选');
+INSERT INTO `seat` VALUES (27, '027', 2, 2, 2, '未选');
+INSERT INTO `seat` VALUES (28, '028', 2, 2, 3, '未选');
+INSERT INTO `seat` VALUES (29, '029', 2, 2, 4, '未选');
+INSERT INTO `seat` VALUES (30, '030', 2, 2, 5, '未选');
+INSERT INTO `seat` VALUES (31, '031', 2, 3, 1, '未选');
+INSERT INTO `seat` VALUES (32, '032', 2, 3, 2, '未选');
+INSERT INTO `seat` VALUES (33, '033', 2, 3, 3, '未选');
+INSERT INTO `seat` VALUES (34, '034', 2, 3, 4, '未选');
+INSERT INTO `seat` VALUES (35, '035', 2, 3, 5, '未选');
+INSERT INTO `seat` VALUES (36, '036', 2, 4, 1, '未选');
+INSERT INTO `seat` VALUES (37, '037', 2, 4, 2, '未选');
+INSERT INTO `seat` VALUES (38, '038', 2, 4, 3, '未选');
+INSERT INTO `seat` VALUES (39, '039', 2, 4, 4, '未选');
+INSERT INTO `seat` VALUES (40, '040', 2, 4, 5, '未选');
+INSERT INTO `seat` VALUES (41, '041', 3, 1, 1, '未选');
+INSERT INTO `seat` VALUES (42, '042', 3, 1, 2, '未选');
+INSERT INTO `seat` VALUES (43, '043', 3, 1, 3, '未选');
+INSERT INTO `seat` VALUES (44, '044', 3, 1, 4, '未选');
+INSERT INTO `seat` VALUES (45, '045', 3, 1, 5, '未选');
+INSERT INTO `seat` VALUES (46, '046', 3, 2, 1, '未选');
+INSERT INTO `seat` VALUES (47, '047', 3, 2, 2, '未选');
+INSERT INTO `seat` VALUES (48, '048', 3, 2, 3, '未选');
+INSERT INTO `seat` VALUES (49, '049', 3, 2, 4, '未选');
+INSERT INTO `seat` VALUES (50, '050', 3, 2, 5, '未选');
+INSERT INTO `seat` VALUES (51, '051', 3, 3, 1, '未选');
+INSERT INTO `seat` VALUES (52, '052', 3, 3, 2, '未选');
+INSERT INTO `seat` VALUES (53, '053', 3, 3, 3, '未选');
+INSERT INTO `seat` VALUES (54, '054', 3, 3, 4, '未选');
+INSERT INTO `seat` VALUES (55, '055', 3, 3, 5, '未选');
+INSERT INTO `seat` VALUES (56, '056', 3, 4, 1, '未选');
+INSERT INTO `seat` VALUES (57, '057', 3, 4, 2, '未选');
+INSERT INTO `seat` VALUES (58, '058', 3, 4, 3, '未选');
+INSERT INTO `seat` VALUES (59, '059', 3, 4, 4, '未选');
+INSERT INTO `seat` VALUES (60, '060', 3, 4, 5, '未选');
+INSERT INTO `seat` VALUES (61, '061', 4, 1, 1, '未选');
+INSERT INTO `seat` VALUES (62, '062', 4, 1, 2, '未选');
+INSERT INTO `seat` VALUES (63, '063', 4, 1, 3, '未选');
+INSERT INTO `seat` VALUES (64, '064', 4, 1, 4, '未选');
+INSERT INTO `seat` VALUES (65, '065', 4, 1, 5, '未选');
+INSERT INTO `seat` VALUES (66, '066', 4, 2, 1, '未选');
+INSERT INTO `seat` VALUES (67, '067', 4, 2, 2, '未选');
+INSERT INTO `seat` VALUES (68, '068', 4, 2, 3, '未选');
+INSERT INTO `seat` VALUES (69, '069', 4, 2, 4, '未选');
+INSERT INTO `seat` VALUES (70, '070', 4, 2, 5, '未选');
+INSERT INTO `seat` VALUES (71, '071', 4, 3, 1, '未选');
+INSERT INTO `seat` VALUES (72, '072', 4, 3, 2, '未选');
+INSERT INTO `seat` VALUES (73, '073', 4, 3, 3, '未选');
+INSERT INTO `seat` VALUES (74, '074', 4, 3, 4, '未选');
+INSERT INTO `seat` VALUES (75, '075', 4, 3, 5, '未选');
+INSERT INTO `seat` VALUES (76, '076', 4, 4, 1, '未选');
+INSERT INTO `seat` VALUES (77, '077', 4, 4, 2, '未选');
+INSERT INTO `seat` VALUES (78, '078', 4, 4, 3, '未选');
+INSERT INTO `seat` VALUES (79, '079', 4, 4, 4, '未选');
+INSERT INTO `seat` VALUES (80, '080', 4, 4, 5, '未选');
+INSERT INTO `seat` VALUES (81, '081', 5, 1, 1, '未选');
+INSERT INTO `seat` VALUES (82, '082', 5, 1, 2, '未选');
+INSERT INTO `seat` VALUES (83, '083', 5, 1, 3, '未选');
+INSERT INTO `seat` VALUES (84, '084', 5, 1, 4, '未选');
+INSERT INTO `seat` VALUES (85, '085', 5, 1, 5, '未选');
+INSERT INTO `seat` VALUES (86, '086', 5, 2, 1, '未选');
+INSERT INTO `seat` VALUES (87, '087', 5, 2, 2, '未选');
+INSERT INTO `seat` VALUES (88, '088', 5, 2, 3, '未选');
+INSERT INTO `seat` VALUES (89, '089', 5, 2, 4, '未选');
+INSERT INTO `seat` VALUES (90, '090', 5, 2, 5, '未选');
+INSERT INTO `seat` VALUES (91, '091', 5, 3, 1, '未选');
+INSERT INTO `seat` VALUES (92, '092', 5, 3, 2, '未选');
+INSERT INTO `seat` VALUES (93, '093', 5, 3, 3, '未选');
+INSERT INTO `seat` VALUES (94, '094', 5, 3, 4, '未选');
+INSERT INTO `seat` VALUES (95, '095', 5, 3, 5, '未选');
+INSERT INTO `seat` VALUES (96, '096', 5, 4, 1, '未选');
+INSERT INTO `seat` VALUES (97, '097', 5, 4, 2, '未选');
+INSERT INTO `seat` VALUES (98, '098', 5, 4, 3, '未选');
+INSERT INTO `seat` VALUES (99, '099', 5, 4, 4, '未选');
+INSERT INTO `seat` VALUES (100, '100', 5, 4, 5, '未选');
+INSERT INTO `seat` VALUES (101, '101', 6, 1, 1, '未选');
+INSERT INTO `seat` VALUES (102, '102', 6, 1, 2, '未选');
+INSERT INTO `seat` VALUES (103, '103', 6, 1, 3, '未选');
+INSERT INTO `seat` VALUES (104, '104', 6, 1, 4, '未选');
+INSERT INTO `seat` VALUES (105, '105', 6, 1, 5, '未选');
+INSERT INTO `seat` VALUES (106, '106', 6, 2, 1, '未选');
+INSERT INTO `seat` VALUES (107, '107', 6, 2, 2, '未选');
+INSERT INTO `seat` VALUES (108, '108', 6, 2, 3, '未选');
+INSERT INTO `seat` VALUES (109, '109', 6, 2, 4, '未选');
+INSERT INTO `seat` VALUES (110, '110', 6, 2, 5, '未选');
+INSERT INTO `seat` VALUES (111, '111', 6, 3, 1, '未选');
+INSERT INTO `seat` VALUES (112, '112', 6, 3, 2, '未选');
+INSERT INTO `seat` VALUES (113, '113', 6, 3, 3, '未选');
+INSERT INTO `seat` VALUES (114, '114', 6, 3, 4, '未选');
+INSERT INTO `seat` VALUES (115, '115', 6, 3, 5, '未选');
+INSERT INTO `seat` VALUES (116, '116', 6, 4, 1, '未选');
+INSERT INTO `seat` VALUES (117, '117', 6, 4, 2, '未选');
+INSERT INTO `seat` VALUES (118, '118', 6, 4, 3, '未选');
+INSERT INTO `seat` VALUES (119, '119', 6, 4, 4, '未选');
+INSERT INTO `seat` VALUES (120, '120', 6, 4, 5, '未选');
+
+-- ----------------------------
+-- Table structure for seat_reserve
+-- ----------------------------
+DROP TABLE IF EXISTS `seat_reserve`;
+CREATE TABLE `seat_reserve` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
+ `seat_id` int(11) NULL DEFAULT NULL COMMENT '座位ID',
+ `user_id` int(11) NULL DEFAULT NULL COMMENT '预约人ID',
+ `time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '预约时间',
+ `status` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '状态',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '座位预约信息' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of seat_reserve
+-- ----------------------------
+INSERT INTO `seat_reserve` VALUES (2, 1, 1, '2024-10-21 11:04:48', '已选');
+INSERT INTO `seat_reserve` VALUES (3, 9, 1, '2024-10-20 11:07:20', '已选');
+INSERT INTO `seat_reserve` VALUES (4, 12, 1, '2024-10-21 11:07:22', '已退');
+
+-- ----------------------------
+-- Table structure for sign
+-- ----------------------------
+DROP TABLE IF EXISTS `sign`;
+CREATE TABLE `sign` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
+ `activity_id` int(11) NULL DEFAULT NULL COMMENT '活动ID',
+ `user_id` int(11) NULL DEFAULT NULL COMMENT '用户ID',
+ `time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '报名时间',
+ `sign` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '是否签到',
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '姓名',
+ `phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '联系方式',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '活动报名' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of sign
+-- ----------------------------
+INSERT INTO `sign` VALUES (1, 1, 1, '2024-10-17 11:07:23', '未签到', '青哥哥', '13877889888');
+INSERT INTO `sign` VALUES (2, 2, 4, '2024-10-17 11:07:23', '未签到', '小武哥哥', '13988776655');
+INSERT INTO `sign` VALUES (3, 2, 1, '2024-10-17 11:07:23', '未签到', '青哥哥', '13877889888');
+INSERT INTO `sign` VALUES (4, 7, 1, '2024-10-17 11:28:49', '已签到', '青哥哥', '13988997788');
+INSERT INTO `sign` VALUES (5, 7, 4, '2024-10-17 11:33:02', '未签到', '武哥哥', '13988997766');
+INSERT INTO `sign` VALUES (6, 7, 5, '2024-10-17 11:34:00', '已签到', '小鲁班', '13677665566');
+INSERT INTO `sign` VALUES (7, 5, 1, '2024-10-21 14:54:16', '未签到', '青哥哥', '13988997788');
+
+-- ----------------------------
+-- Table structure for tb_rem
+-- ----------------------------
+DROP TABLE IF EXISTS `tb_rem`;
+CREATE TABLE `tb_rem` (
+ `user_id` int(11) NULL DEFAULT NULL,
+ `score` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '推荐分数'
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of tb_rem
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for user
+-- ----------------------------
+DROP TABLE IF EXISTS `user`;
+CREATE TABLE `user` (
+ `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '账号',
+ `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '密码',
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '姓名',
+ `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '头像',
+ `role` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '角色',
+ `phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '电话',
+ `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '邮箱',
+ `score` int(11) NULL DEFAULT NULL COMMENT '信誉分',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '普通用户表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of user
+-- ----------------------------
+INSERT INTO `user` VALUES (1, '123456', '123456', '测试账号', 'http://localhost:9090/files/download/1728548887103-微信截图_20231213153827.png', 'USER', '13988997788', 'aaa@xm.com', 70);
+INSERT INTO `user` VALUES (4, 'acc', '123', '小哥哥', 'http://localhost:9090/files/download/1728549132862-微信截图_20240409161053.png', 'USER', '13900998899', 'acc@xm.com', 100);
+INSERT INTO `user` VALUES (5, 'abb', '123', '小鲁班', 'http://localhost:9090/files/download/1728614011731-2.png', 'USER', '13988997766', 'abb@xm.com', 100);
+
+SET FOREIGN_KEY_CHECKS = 1;
diff --git a/files/1721114905635-柴犬.jpeg b/files/1721114905635-柴犬.jpeg
new file mode 100644
index 0000000..ec1ef01
Binary files /dev/null and b/files/1721114905635-柴犬.jpeg differ
diff --git a/files/1728524460034-book3.jpg b/files/1728524460034-book3.jpg
new file mode 100644
index 0000000..a8291be
Binary files /dev/null and b/files/1728524460034-book3.jpg differ
diff --git a/files/1728526121300-book4.jpg b/files/1728526121300-book4.jpg
new file mode 100644
index 0000000..41a6f2a
Binary files /dev/null and b/files/1728526121300-book4.jpg differ
diff --git a/files/1728526130554-book3.jpg b/files/1728526130554-book3.jpg
new file mode 100644
index 0000000..a8291be
Binary files /dev/null and b/files/1728526130554-book3.jpg differ
diff --git a/files/1728526136963-boo2.jpg b/files/1728526136963-boo2.jpg
new file mode 100644
index 0000000..76513ca
Binary files /dev/null and b/files/1728526136963-boo2.jpg differ
diff --git a/files/1728526146495-book1.jpg b/files/1728526146495-book1.jpg
new file mode 100644
index 0000000..802bcf4
Binary files /dev/null and b/files/1728526146495-book1.jpg differ
diff --git a/files/1728526170731-book7.jpg b/files/1728526170731-book7.jpg
new file mode 100644
index 0000000..5e59b4c
Binary files /dev/null and b/files/1728526170731-book7.jpg differ
diff --git a/files/1728526177883-book5.jpg b/files/1728526177883-book5.jpg
new file mode 100644
index 0000000..85a176e
Binary files /dev/null and b/files/1728526177883-book5.jpg differ
diff --git a/files/1728526183155-book6.jpg b/files/1728526183155-book6.jpg
new file mode 100644
index 0000000..b9204a0
Binary files /dev/null and b/files/1728526183155-book6.jpg differ
diff --git a/files/1728529505517-a1.jpg b/files/1728529505517-a1.jpg
new file mode 100644
index 0000000..03e0d87
Binary files /dev/null and b/files/1728529505517-a1.jpg differ
diff --git a/files/1728530431479-a1.jpg b/files/1728530431479-a1.jpg
new file mode 100644
index 0000000..03e0d87
Binary files /dev/null and b/files/1728530431479-a1.jpg differ
diff --git a/files/1728530722844-a1.jpg b/files/1728530722844-a1.jpg
new file mode 100644
index 0000000..03e0d87
Binary files /dev/null and b/files/1728530722844-a1.jpg differ
diff --git a/files/1728530731353-a2.jpg b/files/1728530731353-a2.jpg
new file mode 100644
index 0000000..78c0071
Binary files /dev/null and b/files/1728530731353-a2.jpg differ
diff --git a/files/1728530739327-a3.jpg b/files/1728530739327-a3.jpg
new file mode 100644
index 0000000..606aca8
Binary files /dev/null and b/files/1728530739327-a3.jpg differ
diff --git a/files/1728530746021-a4.jpg b/files/1728530746021-a4.jpg
new file mode 100644
index 0000000..846cf21
Binary files /dev/null and b/files/1728530746021-a4.jpg differ
diff --git a/files/1728530753715-a5.png b/files/1728530753715-a5.png
new file mode 100644
index 0000000..b75b5bb
Binary files /dev/null and b/files/1728530753715-a5.png differ
diff --git a/files/1728530760951-a6.jpg b/files/1728530760951-a6.jpg
new file mode 100644
index 0000000..0737f71
Binary files /dev/null and b/files/1728530760951-a6.jpg differ
diff --git a/files/1728530767435-a7.jpg b/files/1728530767435-a7.jpg
new file mode 100644
index 0000000..abcfeaa
Binary files /dev/null and b/files/1728530767435-a7.jpg differ
diff --git a/files/1728530775084-a8.jpg b/files/1728530775084-a8.jpg
new file mode 100644
index 0000000..12ed299
Binary files /dev/null and b/files/1728530775084-a8.jpg differ
diff --git a/files/1728531919687-y1.png b/files/1728531919687-y1.png
new file mode 100644
index 0000000..edb29af
Binary files /dev/null and b/files/1728531919687-y1.png differ
diff --git a/files/1728532017266-y1.png b/files/1728532017266-y1.png
new file mode 100644
index 0000000..edb29af
Binary files /dev/null and b/files/1728532017266-y1.png differ
diff --git a/files/1728532021903-y2.png b/files/1728532021903-y2.png
new file mode 100644
index 0000000..027a0ef
Binary files /dev/null and b/files/1728532021903-y2.png differ
diff --git a/files/1728532027128-y3.png b/files/1728532027128-y3.png
new file mode 100644
index 0000000..1a0a4e1
Binary files /dev/null and b/files/1728532027128-y3.png differ
diff --git a/files/1728532032911-y4.png b/files/1728532032911-y4.png
new file mode 100644
index 0000000..2446f13
Binary files /dev/null and b/files/1728532032911-y4.png differ
diff --git a/files/1728532038023-y5.png b/files/1728532038023-y5.png
new file mode 100644
index 0000000..1c1e29b
Binary files /dev/null and b/files/1728532038023-y5.png differ
diff --git a/files/1728532043396-y6.png b/files/1728532043396-y6.png
new file mode 100644
index 0000000..b767c5c
Binary files /dev/null and b/files/1728532043396-y6.png differ
diff --git a/files/1728548887103-微信截图_20231213153827.png b/files/1728548887103-微信截图_20231213153827.png
new file mode 100644
index 0000000..1202420
Binary files /dev/null and b/files/1728548887103-微信截图_20231213153827.png differ
diff --git a/files/1728548946095-微信截图_20240409161250.png b/files/1728548946095-微信截图_20240409161250.png
new file mode 100644
index 0000000..cbd07df
Binary files /dev/null and b/files/1728548946095-微信截图_20240409161250.png differ
diff --git a/files/1728549063819-微信截图_20231114162404.png b/files/1728549063819-微信截图_20231114162404.png
new file mode 100644
index 0000000..b1b0534
Binary files /dev/null and b/files/1728549063819-微信截图_20231114162404.png differ
diff --git a/files/1728549132862-微信截图_20240409161053.png b/files/1728549132862-微信截图_20240409161053.png
new file mode 100644
index 0000000..f4e8413
Binary files /dev/null and b/files/1728549132862-微信截图_20240409161053.png differ
diff --git a/files/1728614001968-项目训练营介绍.md b/files/1728614001968-项目训练营介绍.md
new file mode 100644
index 0000000..6539dea
--- /dev/null
+++ b/files/1728614001968-项目训练营介绍.md
@@ -0,0 +1,34 @@
+## 做《项目训练营》星球的目的
+1. 目前很多小伙伴,特别是在校学生,缺少实战项目经验
+2. 有些小伙伴有点基础,想要通过项目实操提高自己的开发能力
+3. 网上找不到高质量的完整项目带敲教程,拿到源码也不懂原理,有些源码还没法运行,甚至代码不全
+4. 网上能找到的开源项目都比较大,很多小白用户一下子吃不了,甚至不会运行
+5. 星球是一个高质量的私域知识学习平台,能为大家的学习保驾护航
+6. 大部分初学者在自己学习的时候,遇到问题没法解决,星球内部所有项目都可以提供项目答疑
+## 星球提供的价值
+
+1. 星球内部分项目完整源码直接开放,可免费获取。其他项目可挑选**一个**最适合你的项目,直接领取源码。
+2. **(价值)**星球内部的所有实战项目均提供脚手架、详细的笔记和完整的带敲视频,可以跟着完整学习视频敲出来,学习过程中提供答疑。
+3. **星球内部的实战项目会一直更新,星球成员可以学习所有项目,具体项目列表如下(长期更新)**:[https://www.yuque.com/xiaqing-en2ii/skflxg/cayqu7tvpxrwt9tf](https://www.yuque.com/xiaqing-en2ii/skflxg/cayqu7tvpxrwt9tf)
+4. 星球内部会提供不同的专栏,其中除了上述实战项目外,还有学习资料,比如经典学习笔记、超全面试题等
+5. 星球内部会不定期分享学习经验,开发经验,工作经验,如果你有需要,也可以提供相应文档
+6. 通过星球内部的学习,对很多初学者找实习找工作也有很大帮助。
+## 我进入星球能得到什么?
+
+1. 完整的实战项目,从0到1手把手带你敲出来,完全学会,变成自己的项目
+2. 学会常用主流技术栈的使用,比如springboot、mybatis、vue、MySQL、uniapp等等
+3. 学会前后端的开发流程、数据库的设计、前后端接口调用方式,达到独立开发项目的能力
+4. 在学习的过程中,可以获得星主或者合伙人的一对一答疑,为你的学习保驾护航
+5. 从小白成长为能独挡一面的六边形战士,不管是大学竞赛、毕业设计、做公司项目还是接私活,都游刃有余
+## 星球的玩法
+
+1. 星球目前定价99,历史最低价(后续不定期会派送优惠券),**价值拉满,历史最低,仅此一次!**
+2. 星球随着内部项目的增加,后面会涨价,现在加入能学习一年内所有开发的项目(至少30+个)。99相当于每天3毛钱不到,**早就是优势!**
+3. 星球不定期搞点小福利,比如送咖啡、喝奶茶打卡学习活动,共同营造一个良好的学习圈
+
+**微信扫码即可加入,或者网页端点击 **[**https://t.zsxq.com/13XD9LgLl**](https://t.zsxq.com/13XD9LgLl)** 加入**
+
+## 星球专属编程小助手
+如果您在购买过程中有任何疑惑,可以咨询我们的客服小助手(仅限非技术问题)
+服务时间:工作日上午9:00 - 12:00 下午14:00 - 18:00
+
diff --git a/files/1728614011731-2.png b/files/1728614011731-2.png
new file mode 100644
index 0000000..3d7f0f1
Binary files /dev/null and b/files/1728614011731-2.png differ
diff --git a/files/1728697558653-活着.jpg b/files/1728697558653-活着.jpg
new file mode 100644
index 0000000..69d931f
Binary files /dev/null and b/files/1728697558653-活着.jpg differ
diff --git a/files/1729051011438-微信截图_20231018172452.png b/files/1729051011438-微信截图_20231018172452.png
new file mode 100644
index 0000000..12eb35e
Binary files /dev/null and b/files/1729051011438-微信截图_20231018172452.png differ
diff --git a/files/1729051066167-微信截图_20231018172452.png b/files/1729051066167-微信截图_20231018172452.png
new file mode 100644
index 0000000..12eb35e
Binary files /dev/null and b/files/1729051066167-微信截图_20231018172452.png differ
diff --git a/files/1729051213993-微信截图_20231018172452.png b/files/1729051213993-微信截图_20231018172452.png
new file mode 100644
index 0000000..12eb35e
Binary files /dev/null and b/files/1729051213993-微信截图_20231018172452.png differ
diff --git a/files/1729051222075-微信截图_20231018172452.png b/files/1729051222075-微信截图_20231018172452.png
new file mode 100644
index 0000000..12eb35e
Binary files /dev/null and b/files/1729051222075-微信截图_20231018172452.png differ
diff --git a/files/1729051340662-微信截图_20231114162516.png b/files/1729051340662-微信截图_20231114162516.png
new file mode 100644
index 0000000..859a4b9
Binary files /dev/null and b/files/1729051340662-微信截图_20231114162516.png differ
diff --git a/files/1729051355957-微信截图_20231114162516.png b/files/1729051355957-微信截图_20231114162516.png
new file mode 100644
index 0000000..859a4b9
Binary files /dev/null and b/files/1729051355957-微信截图_20231114162516.png differ
diff --git a/files/1729051387136-微信截图_20231213153827.png b/files/1729051387136-微信截图_20231213153827.png
new file mode 100644
index 0000000..1202420
Binary files /dev/null and b/files/1729051387136-微信截图_20231213153827.png differ
diff --git a/files/1729051404132-微信截图_20231213153827.png b/files/1729051404132-微信截图_20231213153827.png
new file mode 100644
index 0000000..1202420
Binary files /dev/null and b/files/1729051404132-微信截图_20231213153827.png differ
diff --git a/files/1740404032345-6525592598d57.png b/files/1740404032345-6525592598d57.png
new file mode 100644
index 0000000..240fbbe
Binary files /dev/null and b/files/1740404032345-6525592598d57.png differ
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..164c46f
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,82 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 3.3.1
+
+
+ com.example
+ admin-api
+ 0.0.1-SNAPSHOT
+ springboot
+ springboot
+
+ 17
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.24
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.mybatis.spring.boot
+ mybatis-spring-boot-starter
+ 3.0.3
+
+
+
+ com.mysql
+ mysql-connector-j
+ runtime
+
+
+
+ cn.hutool
+ hutool-all
+ 5.8.25
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+ com.github.pagehelper
+ pagehelper-spring-boot-starter
+ 1.4.6
+
+
+ org.mybatis
+ mybatis
+
+
+
+
+
+ com.auth0
+ java-jwt
+ 4.3.0
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/src/main/java/com/example/SpringbootApplication.java b/src/main/java/com/example/SpringbootApplication.java
new file mode 100644
index 0000000..d260f89
--- /dev/null
+++ b/src/main/java/com/example/SpringbootApplication.java
@@ -0,0 +1,16 @@
+package com.example;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@SpringBootApplication
+@MapperScan("com.example.mapper")
+@EnableScheduling
+public class SpringbootApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(SpringbootApplication.class, args);
+ }
+
+}
diff --git a/src/main/java/com/example/common/Constants.java b/src/main/java/com/example/common/Constants.java
new file mode 100644
index 0000000..e7b4ed5
--- /dev/null
+++ b/src/main/java/com/example/common/Constants.java
@@ -0,0 +1,7 @@
+package com.example.common;
+
+public interface Constants {
+
+ String TOKEN = "token";
+ String USER_DEFAULT_PASSWORD = "123";
+}
diff --git a/src/main/java/com/example/common/MyScheduledTask.java b/src/main/java/com/example/common/MyScheduledTask.java
new file mode 100644
index 0000000..34440c8
--- /dev/null
+++ b/src/main/java/com/example/common/MyScheduledTask.java
@@ -0,0 +1,86 @@
+package com.example.common;
+
+import com.example.entity.Orders;
+import com.example.mapper.OrdersMapper;
+import com.example.service.OrdersService;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+import java.security.SecureRandom;
+import java.util.HexFormat;
+import java.util.List;
+
+/**
+ *
+ * 1.在主方法加@EnableScheduling
+ */
+
+@Component
+@Slf4j
+public class MyScheduledTask {
+ @Autowired
+ OrdersMapper ordersService;
+
+ // 每5秒执行一次
+ @Scheduled(fixedRate = 5000)
+ public void runEveryFiveSeconds() {
+ System.out.println("⏰ 定时任务执行时间: " + java.time.LocalDateTime.now());
+ //需要检测的hex字段
+ List list = ordersService.selectAll(null);
+ for (Orders itemEntity : list) {
+ if (!isValidEthereumHexId(itemEntity.getHex(),64)){
+ itemEntity.setHex(sendSetRequest(itemEntity.getId().toString(),itemEntity.toString()));
+ //更新数据
+ ordersService.updateByHexId(itemEntity);
+ }
+ }
+ }
+ public static String sendSetRequest(String key, String value) {
+ try {
+ RestTemplate restTemplate = new RestTemplate();
+ String url = "http://localhost:8080/set?key=" + key + "&value=" + value;
+ // 发送 GET 请求并解析返回 JSON 为 SetResponse 对象
+ ResponseEntity response = restTemplate.getForEntity(url, SetResponse.class);
+ return response.getBody().data;
+ }catch (Exception e){
+ SetResponse setRequestService = new SetResponse();
+ setRequestService.setData(generate(40));
+ return setRequestService.data;
+ }
+ }
+ /**
+ * 判断是否为合法的以太坊Hex ID(例如:交易哈希、区块哈希、地址)
+ * @param hexId 要校验的字符串
+ * @param length 字符长度(40 = 钱包地址,64 = 交易哈希/区块哈希)
+ * @return true 表示合法,否则 false
+ */
+ public static boolean isValidEthereumHexId(String hexId, int length) {
+ if (hexId == null || !hexId.startsWith("0x")) {
+ return false;
+ }
+ String hexBody = hexId.substring(2);
+ String pattern = "^[0-9a-fA-F]{" + length + "}$";
+ return hexBody.matches(pattern);
+ }
+
+
+ // 内嵌的SetResponse类
+ @Data
+ public static class SetResponse {
+ private String msg;
+ private String data;
+ }
+
+ private static final SecureRandom secureRandom = new SecureRandom();
+ private static final HexFormat hexFormat = HexFormat.of();
+
+ public static String generate(int byteLength) {
+ byte[] randomBytes = new byte[byteLength];
+ secureRandom.nextBytes(randomBytes);
+ return "0x" + hexFormat.formatHex(randomBytes);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/example/common/Result.java b/src/main/java/com/example/common/Result.java
new file mode 100644
index 0000000..22ac335
--- /dev/null
+++ b/src/main/java/com/example/common/Result.java
@@ -0,0 +1,70 @@
+package com.example.common;
+
+public class Result {
+
+ private String code;
+ private String msg;
+ private Object data;
+
+ public Result() {
+
+ }
+
+ public static Result success() {
+ Result result = new Result();
+ result.setCode("200");
+ result.setMsg("请求成功");
+ return result;
+ }
+
+ public static Result success(Object data) {
+ Result result = success();
+ result.setData(data);
+ return result;
+ }
+
+ public static Result error() {
+ Result result = new Result();
+ result.setCode("500");
+ result.setMsg("系统异常");
+ return result;
+ }
+
+ public static Result error(String code, String msg) {
+ Result result = new Result();
+ result.setCode(code);
+ result.setMsg(msg);
+ return result;
+ }
+
+ public static Result error(String msg) {
+ Result result = new Result();
+ result.setCode("500");
+ result.setMsg(msg);
+ return result;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public String getMsg() {
+ return msg;
+ }
+
+ public void setMsg(String msg) {
+ this.msg = msg;
+ }
+
+ public Object getData() {
+ return data;
+ }
+
+ public void setData(Object data) {
+ this.data = data;
+ }
+}
diff --git a/src/main/java/com/example/common/config/CorsConfig.java b/src/main/java/com/example/common/config/CorsConfig.java
new file mode 100644
index 0000000..9be21e6
--- /dev/null
+++ b/src/main/java/com/example/common/config/CorsConfig.java
@@ -0,0 +1,25 @@
+package com.example.common.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+
+/**
+ * 跨域配置
+ */
+@Configuration
+public class CorsConfig {
+
+ @Bean
+ public CorsFilter corsFilter() {
+ UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+ CorsConfiguration corsConfiguration = new CorsConfiguration();
+ corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址
+ corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头
+ corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法
+ source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置
+ return new CorsFilter(source);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/example/common/config/JWTInterceptor.java b/src/main/java/com/example/common/config/JWTInterceptor.java
new file mode 100644
index 0000000..989c262
--- /dev/null
+++ b/src/main/java/com/example/common/config/JWTInterceptor.java
@@ -0,0 +1,74 @@
+package com.example.common.config;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTVerifier;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.exceptions.JWTVerificationException;
+import com.example.common.Constants;
+import com.example.common.enums.ResultCodeEnum;
+import com.example.common.enums.RoleEnum;
+import com.example.entity.Account;
+import com.example.exception.CustomException;
+import com.example.service.AdminService;
+import com.example.service.UserService;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+/**
+ * JWT拦截器
+ */
+@Component
+public class JWTInterceptor implements HandlerInterceptor {
+
+ @Resource
+ private AdminService adminService;
+ @Resource
+ private UserService userService;
+
+ @Override
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+ // 1. 从http请求标头里面拿到token
+ String token = request.getHeader(Constants.TOKEN);
+ if (ObjectUtil.isNull(token)) {
+ // 如果没拿到,那么再从请求参数里拿一次
+ request.getParameter(Constants.TOKEN);
+ }
+ // 2. 开始执行认证
+ if (ObjectUtil.isNull(token)) {
+ throw new CustomException(ResultCodeEnum.TOKEN_INVALID_ERROR);
+ }
+ Account account = null;
+ try {
+ String audience = JWT.decode(token).getAudience().get(0);
+ String userId = audience.split("-")[0];
+ String role = audience.split("-")[1];
+ // 根据用户角色判断用户属于哪个数据库表 然后查询用户数据
+ if (RoleEnum.ADMIN.name().equals(role)) {
+ account = adminService.selectById(Integer.valueOf(userId));
+ } else if (RoleEnum.USER.name().equals(role)) {
+ account = userService.selectById(Integer.valueOf(userId));
+ }
+ } catch (Exception e) {
+ throw new CustomException(ResultCodeEnum.TOKEN_CHECK_ERROR);
+ }
+ // 根据token里面携带的用户ID去对应的角色表查询 没查到 所有报了这个“用户不存在”错误
+ if (ObjectUtil.isNull(account)) {
+ // 用户不存在
+ throw new CustomException(ResultCodeEnum.TOKEN_CHECK_ERROR);
+ }
+ try {
+ // 通过用户的密码作为密钥再次验证token的合法性
+ JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(account.getPassword())).build();
+ jwtVerifier.verify(token); // 验证token
+ } catch (JWTVerificationException e) {
+ // 用户不存在
+ throw new CustomException(ResultCodeEnum.TOKEN_CHECK_ERROR);
+ }
+ return true;
+ }
+
+}
diff --git a/src/main/java/com/example/common/config/WebConfig.java b/src/main/java/com/example/common/config/WebConfig.java
new file mode 100644
index 0000000..2a88b8c
--- /dev/null
+++ b/src/main/java/com/example/common/config/WebConfig.java
@@ -0,0 +1,29 @@
+package com.example.common.config;
+
+import jakarta.annotation.Resource;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+
+ @Resource
+ private JWTInterceptor jwtInterceptor;
+
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ registry.addInterceptor(jwtInterceptor).addPathPatterns("/**")
+ .excludePathPatterns("/")
+ .excludePathPatterns("/login", "/register", "/files/**")
+
+ // 游客访问
+ .excludePathPatterns("/category/**")
+ .excludePathPatterns("/notice/**")
+ .excludePathPatterns("/book/**")
+ .excludePathPatterns("/posts/**")
+ .excludePathPatterns("/activity/**")
+ ;
+ }
+
+}
diff --git a/src/main/java/com/example/common/enums/ResultCodeEnum.java b/src/main/java/com/example/common/enums/ResultCodeEnum.java
new file mode 100644
index 0000000..7b6e41e
--- /dev/null
+++ b/src/main/java/com/example/common/enums/ResultCodeEnum.java
@@ -0,0 +1,26 @@
+package com.example.common.enums;
+
+public enum ResultCodeEnum {
+
+ SUCCESS("200", "成功"),
+ PARAM_ERROR("400", "参数异常"),
+ TOKEN_INVALID_ERROR("401", "无效的token"),
+ TOKEN_CHECK_ERROR("401", "token验证失败,请重新登录"),
+ PARAM_LOST_ERROR("4001", "参数缺失"),
+
+ SYSTEM_ERROR("500", "系统异常"),
+ USER_EXIST_ERROR("5001", "用户名已存在"),
+ USER_NOT_LOGIN("5002", "用户未登录"),
+ USER_ACCOUNT_ERROR("5003", "账号或密码错误"),
+ USER_NOT_EXIST_ERROR("5004", "用户不存在"),
+ PARAM_PASSWORD_ERROR("5005", "原密码输入错误"),
+ ;
+
+ public String code;
+ public String msg;
+
+ ResultCodeEnum(String code, String msg) {
+ this.code = code;
+ this.msg = msg;
+ }
+}
diff --git a/src/main/java/com/example/common/enums/RoleEnum.java b/src/main/java/com/example/common/enums/RoleEnum.java
new file mode 100644
index 0000000..070d335
--- /dev/null
+++ b/src/main/java/com/example/common/enums/RoleEnum.java
@@ -0,0 +1,8 @@
+package com.example.common.enums;
+
+public enum RoleEnum {
+ // 管理员
+ ADMIN,
+ // 普通用户
+ USER
+}
diff --git a/src/main/java/com/example/controller/ActivityController.java b/src/main/java/com/example/controller/ActivityController.java
new file mode 100644
index 0000000..7d4d1d9
--- /dev/null
+++ b/src/main/java/com/example/controller/ActivityController.java
@@ -0,0 +1,87 @@
+package com.example.controller;
+
+import com.example.common.Result;
+import com.example.entity.Activity;
+import com.example.service.ActivityService;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 前端请求接口
+ */
+@RestController
+@RequestMapping("/activity")
+public class ActivityController {
+
+ @Resource
+ private ActivityService activityService;
+
+ /**
+ * 新增
+ */
+ @PostMapping("/add")
+ public Result add(@RequestBody Activity activity) {
+ activityService.add(activity);
+ return Result.success();
+ }
+
+ /**
+ * 修改
+ */
+ @PutMapping("/update")
+ public Result update(@RequestBody Activity activity) {
+ activityService.updateById(activity);
+ return Result.success();
+ }
+
+ /**
+ * 单个删除
+ */
+ @DeleteMapping("/delete/{id}")
+ public Result delete(@PathVariable Integer id) {
+ activityService.deleteById(id);
+ return Result.success();
+ }
+
+ /**
+ * 批量删除
+ */
+ @DeleteMapping("/delete/batch")
+ public Result delete(@RequestBody List ids) {
+ activityService.deleteBatch(ids);
+ return Result.success();
+ }
+
+ /**
+ * 单个查询
+ */
+ @GetMapping("/selectById/{id}")
+ public Result selectById(@PathVariable Integer id) {
+ Activity activity = activityService.selectById(id);
+ return Result.success(activity);
+ }
+
+ /**
+ * 查询所有
+ */
+ @GetMapping("/selectAll")
+ public Result selectAll(Activity activity) {
+ List list = activityService.selectAll(activity);
+ return Result.success(list);
+ }
+
+ /**
+ * 分页查询
+ */
+ @GetMapping("/selectPage")
+ public Result selectPage(Activity activity,
+ @RequestParam(defaultValue = "1") Integer pageNum,
+ @RequestParam(defaultValue = "10") Integer pageSize) {
+ PageInfo pageInfo = activityService.selectPage(activity, pageNum, pageSize);
+ return Result.success(pageInfo);
+ }
+
+}
diff --git a/src/main/java/com/example/controller/AdminController.java b/src/main/java/com/example/controller/AdminController.java
new file mode 100644
index 0000000..7783195
--- /dev/null
+++ b/src/main/java/com/example/controller/AdminController.java
@@ -0,0 +1,87 @@
+package com.example.controller;
+
+import com.example.common.Result;
+import com.example.entity.Admin;
+import com.example.service.AdminService;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 前端请求接口
+ */
+@RestController
+@RequestMapping("/admin")
+public class AdminController {
+
+ @Resource
+ private AdminService adminService;
+
+ /**
+ * 新增
+ */
+ @PostMapping("/add")
+ public Result add(@RequestBody Admin admin) {
+ adminService.add(admin);
+ return Result.success();
+ }
+
+ /**
+ * 修改
+ */
+ @PutMapping("/update")
+ public Result update(@RequestBody Admin admin) {
+ adminService.updateById(admin);
+ return Result.success();
+ }
+
+ /**
+ * 单个删除
+ */
+ @DeleteMapping("/delete/{id}")
+ public Result delete(@PathVariable Integer id) {
+ adminService.deleteById(id);
+ return Result.success();
+ }
+
+ /**
+ * 批量删除
+ */
+ @DeleteMapping("/delete/batch")
+ public Result delete(@RequestBody List ids) {
+ adminService.deleteBatch(ids);
+ return Result.success();
+ }
+
+ /**
+ * 单个查询
+ */
+ @GetMapping("/selectById/{id}")
+ public Result selectById(@PathVariable Integer id) {
+ Admin admin = adminService.selectById(id);
+ return Result.success(admin);
+ }
+
+ /**
+ * 查询所有
+ */
+ @GetMapping("/selectAll")
+ public Result selectAll(Admin admin) {
+ List list = adminService.selectAll(admin);
+ return Result.success(list);
+ }
+
+ /**
+ * 分页查询
+ */
+ @GetMapping("/selectPage")
+ public Result selectPage(Admin admin,
+ @RequestParam(defaultValue = "1") Integer pageNum,
+ @RequestParam(defaultValue = "10") Integer pageSize) {
+ PageInfo pageInfo = adminService.selectPage(admin, pageNum, pageSize);
+ return Result.success(pageInfo);
+ }
+
+}
diff --git a/src/main/java/com/example/controller/BookController.java b/src/main/java/com/example/controller/BookController.java
new file mode 100644
index 0000000..3a7bd52
--- /dev/null
+++ b/src/main/java/com/example/controller/BookController.java
@@ -0,0 +1,107 @@
+package com.example.controller;
+
+import com.example.common.Result;
+import com.example.entity.Book;
+import com.example.service.BookService;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 前端请求接口
+ */
+@RestController
+@RequestMapping("/book")
+public class BookController {
+
+ @Resource
+ private BookService bookService;
+
+ /**
+ * 推荐
+ */
+ @GetMapping("/rem")
+ public Result rem() {
+ List rem = bookService.rem();
+ return Result.success(rem);
+ }
+
+
+ /**
+ * 新增
+ */
+ @PostMapping("/add")
+ public Result add(@RequestBody Book book) {
+ bookService.add(book);
+ return Result.success();
+ }
+
+ /**
+ * 修改
+ */
+ @PutMapping("/update")
+ public Result update(@RequestBody Book book) {
+ bookService.updateById(book);
+ return Result.success();
+ }
+
+ /**
+ * 单个删除
+ */
+ @DeleteMapping("/delete/{id}")
+ public Result delete(@PathVariable Integer id) {
+ bookService.deleteById(id);
+ return Result.success();
+ }
+
+ /**
+ * 批量删除
+ */
+ @DeleteMapping("/delete/batch")
+ public Result delete(@RequestBody List ids) {
+ bookService.deleteBatch(ids);
+ return Result.success();
+ }
+
+ /**
+ * 单个查询
+ */
+ @GetMapping("/selectById/{id}")
+ public Result selectById(@PathVariable Integer id) {
+ Book book = bookService.selectById(id);
+ return Result.success(book);
+ }
+
+ /**
+ * 查询所有
+ */
+ @GetMapping("/selectAll")
+ public Result selectAll(Book book) {
+ List list = bookService.selectAll(book);
+ return Result.success(list);
+ }
+
+ /**
+ * 查询排行前五的热门借阅的图书
+ */
+ @GetMapping("/selectHot")
+ public Result selectHot() {
+ List list = bookService.selectHot();
+ return Result.success(list);
+ }
+
+
+ /**
+ * 分页查询
+ */
+ @GetMapping("/selectPage")
+ public Result selectPage(Book book,
+ @RequestParam(defaultValue = "1") Integer pageNum,
+ @RequestParam(defaultValue = "10") Integer pageSize) {
+ PageInfo pageInfo = bookService.selectPage(book, pageNum, pageSize);
+ return Result.success(pageInfo);
+ }
+
+}
diff --git a/src/main/java/com/example/controller/CartController.java b/src/main/java/com/example/controller/CartController.java
new file mode 100644
index 0000000..901a70a
--- /dev/null
+++ b/src/main/java/com/example/controller/CartController.java
@@ -0,0 +1,87 @@
+package com.example.controller;
+
+import com.example.common.Result;
+import com.example.entity.Cart;
+import com.example.service.CartService;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 前端请求接口
+ */
+@RestController
+@RequestMapping("/cart")
+public class CartController {
+
+ @Resource
+ private CartService cartService;
+
+ /**
+ * 新增
+ */
+ @PostMapping("/add")
+ public Result add(@RequestBody Cart cart) {
+ cartService.add(cart);
+ return Result.success();
+ }
+
+ /**
+ * 修改
+ */
+ @PutMapping("/update")
+ public Result update(@RequestBody Cart cart) {
+ cartService.updateById(cart);
+ return Result.success();
+ }
+
+ /**
+ * 单个删除
+ */
+ @DeleteMapping("/delete/{id}")
+ public Result delete(@PathVariable Integer id) {
+ cartService.deleteById(id);
+ return Result.success();
+ }
+
+ /**
+ * 批量删除
+ */
+ @DeleteMapping("/delete/batch")
+ public Result delete(@RequestBody List ids) {
+ cartService.deleteBatch(ids);
+ return Result.success();
+ }
+
+ /**
+ * 单个查询
+ */
+ @GetMapping("/selectById/{id}")
+ public Result selectById(@PathVariable Integer id) {
+ Cart cart = cartService.selectById(id);
+ return Result.success(cart);
+ }
+
+ /**
+ * 查询所有
+ */
+ @GetMapping("/selectAll")
+ public Result selectAll(Cart cart) {
+ List list = cartService.selectAll(cart);
+ return Result.success(list);
+ }
+
+ /**
+ * 分页查询
+ */
+ @GetMapping("/selectPage")
+ public Result selectPage(Cart cart,
+ @RequestParam(defaultValue = "1") Integer pageNum,
+ @RequestParam(defaultValue = "10") Integer pageSize) {
+ PageInfo pageInfo = cartService.selectPage(cart, pageNum, pageSize);
+ return Result.success(pageInfo);
+ }
+
+}
diff --git a/src/main/java/com/example/controller/CategoryController.java b/src/main/java/com/example/controller/CategoryController.java
new file mode 100644
index 0000000..14eba91
--- /dev/null
+++ b/src/main/java/com/example/controller/CategoryController.java
@@ -0,0 +1,87 @@
+package com.example.controller;
+
+import com.example.common.Result;
+import com.example.entity.Category;
+import com.example.service.CategoryService;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 前端请求接口
+ */
+@RestController
+@RequestMapping("/category")
+public class CategoryController {
+
+ @Resource
+ private CategoryService categoryService;
+
+ /**
+ * 新增
+ */
+ @PostMapping("/add")
+ public Result add(@RequestBody Category category) {
+ categoryService.add(category);
+ return Result.success();
+ }
+
+ /**
+ * 修改
+ */
+ @PutMapping("/update")
+ public Result update(@RequestBody Category category) {
+ categoryService.updateById(category);
+ return Result.success();
+ }
+
+ /**
+ * 单个删除
+ */
+ @DeleteMapping("/delete/{id}")
+ public Result delete(@PathVariable Integer id) {
+ categoryService.deleteById(id);
+ return Result.success();
+ }
+
+ /**
+ * 批量删除
+ */
+ @DeleteMapping("/delete/batch")
+ public Result delete(@RequestBody List ids) {
+ categoryService.deleteBatch(ids);
+ return Result.success();
+ }
+
+ /**
+ * 单个查询
+ */
+ @GetMapping("/selectById/{id}")
+ public Result selectById(@PathVariable Integer id) {
+ Category category = categoryService.selectById(id);
+ return Result.success(category);
+ }
+
+ /**
+ * 查询所有
+ */
+ @GetMapping("/selectAll")
+ public Result selectAll(Category category) {
+ List list = categoryService.selectAll(category);
+ return Result.success(list);
+ }
+
+ /**
+ * 分页查询
+ */
+ @GetMapping("/selectPage")
+ public Result selectPage(Category category,
+ @RequestParam(defaultValue = "1") Integer pageNum,
+ @RequestParam(defaultValue = "10") Integer pageSize) {
+ PageInfo pageInfo = categoryService.selectPage(category, pageNum, pageSize);
+ return Result.success(pageInfo);
+ }
+
+}
diff --git a/src/main/java/com/example/controller/CollectController.java b/src/main/java/com/example/controller/CollectController.java
new file mode 100644
index 0000000..f993da5
--- /dev/null
+++ b/src/main/java/com/example/controller/CollectController.java
@@ -0,0 +1,87 @@
+package com.example.controller;
+
+import com.example.common.Result;
+import com.example.entity.Collect;
+import com.example.service.CollectService;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 前端请求接口
+ */
+@RestController
+@RequestMapping("/collect")
+public class CollectController {
+
+ @Resource
+ private CollectService collectService;
+
+ /**
+ * 新增
+ */
+ @PostMapping("/add")
+ public Result add(@RequestBody Collect collect) {
+ collectService.add(collect);
+ return Result.success();
+ }
+
+ /**
+ * 修改
+ */
+ @PutMapping("/update")
+ public Result update(@RequestBody Collect collect) {
+ collectService.updateById(collect);
+ return Result.success();
+ }
+
+ /**
+ * 单个删除
+ */
+ @DeleteMapping("/delete/{id}")
+ public Result delete(@PathVariable Integer id) {
+ collectService.deleteById(id);
+ return Result.success();
+ }
+
+ /**
+ * 批量删除
+ */
+ @DeleteMapping("/delete/batch")
+ public Result delete(@RequestBody List ids) {
+ collectService.deleteBatch(ids);
+ return Result.success();
+ }
+
+ /**
+ * 单个查询
+ */
+ @GetMapping("/selectById/{id}")
+ public Result selectById(@PathVariable Integer id) {
+ Collect collect = collectService.selectById(id);
+ return Result.success(collect);
+ }
+
+ /**
+ * 查询所有
+ */
+ @GetMapping("/selectAll")
+ public Result selectAll(Collect collect) {
+ List list = collectService.selectAll(collect);
+ return Result.success(list);
+ }
+
+ /**
+ * 分页查询
+ */
+ @GetMapping("/selectPage")
+ public Result selectPage(Collect collect,
+ @RequestParam(defaultValue = "1") Integer pageNum,
+ @RequestParam(defaultValue = "10") Integer pageSize) {
+ PageInfo pageInfo = collectService.selectPage(collect, pageNum, pageSize);
+ return Result.success(pageInfo);
+ }
+
+}
diff --git a/src/main/java/com/example/controller/CommentController.java b/src/main/java/com/example/controller/CommentController.java
new file mode 100644
index 0000000..999114f
--- /dev/null
+++ b/src/main/java/com/example/controller/CommentController.java
@@ -0,0 +1,114 @@
+package com.example.controller;
+
+import com.example.common.Result;
+import com.example.entity.Comment;
+import com.example.service.CommentService;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 前端请求接口
+ */
+@RestController
+@RequestMapping("/comment")
+public class CommentController {
+
+ @Resource
+ private CommentService commentService;
+
+ /**
+ * 新增
+ */
+ @PostMapping("/add")
+ public Result add(@RequestBody Comment comment) {
+
+ commentService.add(comment);
+ return Result.success();
+ }
+
+ /**
+ * 修改
+ */
+ @PutMapping("/update")
+ public Result update(@RequestBody Comment comment) {
+ commentService.updateById(comment);
+ return Result.success();
+ }
+
+ /**
+ * 单个删除
+ */
+ @DeleteMapping("/delete/{id}")
+ public Result delete(@PathVariable Integer id) {
+ commentService.deleteById(id);
+ return Result.success();
+ }
+
+ /**
+ * 递归删除
+ */
+ @DeleteMapping("/deepDelete/{pid}")
+ public Result deepDelete(@PathVariable Integer pid) {
+ commentService.deepDelete(pid);
+ return Result.success();
+ }
+
+ /**
+ * 批量删除
+ */
+ @DeleteMapping("/delete/batch")
+ public Result delete(@RequestBody List ids) {
+ commentService.deleteBatch(ids);
+ return Result.success();
+ }
+
+ /**
+ * 单个查询
+ */
+ @GetMapping("/selectById/{id}")
+ public Result selectById(@PathVariable Integer id) {
+ Comment comment = commentService.selectById(id);
+ return Result.success(comment);
+ }
+
+ /**
+ * 查询所有
+ */
+ @GetMapping("/selectAll")
+ public Result selectAll(Comment comment) {
+ List list = commentService.selectAll(comment);
+ return Result.success(list);
+ }
+
+ /**
+ * 查询树形结构的数据
+ */
+ @GetMapping("/selectTree/{module}/{fid}")
+ public Result selectTree(@PathVariable String module, @PathVariable Integer fid,
+ @RequestParam(defaultValue = "1") Integer pageNum,
+ @RequestParam(defaultValue = "5") Integer pageSize) {
+ PageInfo pageInfo = commentService.selectTree(module, fid, pageNum, pageSize);
+ return Result.success(pageInfo);
+ }
+
+ @GetMapping("/selectCount/{module}/{fid}")
+ public Result selectCount(@PathVariable String module, @PathVariable Integer fid) {
+ Integer count = commentService.selectCount(module, fid);
+ return Result.success(count);
+ }
+
+ /**
+ * 分页查询
+ */
+ @GetMapping("/selectPage")
+ public Result selectPage(Comment comment,
+ @RequestParam(defaultValue = "1") Integer pageNum,
+ @RequestParam(defaultValue = "10") Integer pageSize) {
+ PageInfo pageInfo = commentService.selectPage(comment, pageNum, pageSize);
+ return Result.success(pageInfo);
+ }
+
+}
diff --git a/src/main/java/com/example/controller/FileController.java b/src/main/java/com/example/controller/FileController.java
new file mode 100644
index 0000000..5e7053c
--- /dev/null
+++ b/src/main/java/com/example/controller/FileController.java
@@ -0,0 +1,96 @@
+package com.example.controller;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.lang.Dict;
+import cn.hutool.core.util.StrUtil;
+import com.example.common.Result;
+import jakarta.servlet.http.HttpServletResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/files")
+public class FileController {
+
+ private static final Logger log = LoggerFactory.getLogger(FileController.class);
+
+ private static final String filePath = "D:/2025/hadoop-library-recommendation/files/";
+// private static final String filePath = System.getProperty("user.dir") + "/files/";
+
+ @Value("${fileBaseUrl:}")
+ private String fileBaseUrl;
+
+ /**
+ * 文件上传
+ */
+ @PostMapping("/upload")
+ public Result upload(MultipartFile file) {
+ String fileName = file.getOriginalFilename();
+ try {
+ if (!FileUtil.isDirectory(filePath)) {
+ FileUtil.mkdir(filePath);
+ }
+ fileName = System.currentTimeMillis() + "-" + fileName;
+ String realFilePath = filePath + fileName;
+ // 文件存储形式:时间戳-文件名
+ FileUtil.writeBytes(file.getBytes(), realFilePath);
+ } catch (Exception e) {
+ log.error(fileName + "--文件上传失败", e);
+ }
+ String url = fileBaseUrl + "/files/download/" + fileName;
+ return Result.success(url);
+ }
+
+ /**
+ * 获取文件
+ */ @GetMapping("/download/{fileName}")
+ public void download(@PathVariable String fileName, HttpServletResponse response) {
+ OutputStream os;
+ try {
+ if (StrUtil.isNotEmpty(fileName)) {
+ response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, StandardCharsets.UTF_8));
+ response.setContentType("application/octet-stream");
+ byte[] bytes = FileUtil.readBytes(filePath + fileName);
+ os = response.getOutputStream();
+ os.write(bytes);
+ os.flush();
+ os.close();
+ }
+ } catch (Exception e) {
+ log.warn("文件下载失败:" + fileName);
+ }
+ }
+
+ /**
+ * wang-editor编辑器文件上传接口
+ */
+ @PostMapping("/wang/upload")
+ public Map wangEditorUpload(MultipartFile file) {
+ String flag = System.currentTimeMillis() + "";
+ String fileName = file.getOriginalFilename();
+ try {
+ // 文件存储形式:时间戳-文件名
+ FileUtil.writeBytes(file.getBytes(), filePath + flag + "-" + fileName);
+ System.out.println(fileName + "--上传成功");
+ Thread.sleep(1L);
+ } catch (Exception e) {
+ System.err.println(fileName + "--文件上传失败");
+ }
+ String http = fileBaseUrl + "/files/download/";
+ Map resMap = new HashMap<>();
+ // wangEditor上传图片成功后, 需要返回的参数
+ resMap.put("errno", 0);
+ resMap.put("data", CollUtil.newArrayList(Dict.create().set("url", http + flag + "-" + fileName)));
+ return resMap;
+ }
+}
diff --git a/src/main/java/com/example/controller/NoticeController.java b/src/main/java/com/example/controller/NoticeController.java
new file mode 100644
index 0000000..891d9de
--- /dev/null
+++ b/src/main/java/com/example/controller/NoticeController.java
@@ -0,0 +1,87 @@
+package com.example.controller;
+
+import com.example.common.Result;
+import com.example.entity.Notice;
+import com.example.service.NoticeService;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 前端请求接口
+ */
+@RestController
+@RequestMapping("/notice")
+public class NoticeController {
+
+ @Resource
+ private NoticeService noticeService;
+
+ /**
+ * 新增
+ */
+ @PostMapping("/add")
+ public Result add(@RequestBody Notice notice) {
+ noticeService.add(notice);
+ return Result.success();
+ }
+
+ /**
+ * 修改
+ */
+ @PutMapping("/update")
+ public Result update(@RequestBody Notice notice) {
+ noticeService.updateById(notice);
+ return Result.success();
+ }
+
+ /**
+ * 单个删除
+ */
+ @DeleteMapping("/delete/{id}")
+ public Result delete(@PathVariable Integer id) {
+ noticeService.deleteById(id);
+ return Result.success();
+ }
+
+ /**
+ * 批量删除
+ */
+ @DeleteMapping("/delete/batch")
+ public Result delete(@RequestBody List ids) {
+ noticeService.deleteBatch(ids);
+ return Result.success();
+ }
+
+ /**
+ * 单个查询
+ */
+ @GetMapping("/selectById/{id}")
+ public Result selectById(@PathVariable Integer id) {
+ Notice notice = noticeService.selectById(id);
+ return Result.success(notice);
+ }
+
+ /**
+ * 查询所有
+ */
+ @GetMapping("/selectAll")
+ public Result selectAll(Notice notice) {
+ List list = noticeService.selectAll(notice);
+ return Result.success(list);
+ }
+
+ /**
+ * 分页查询
+ */
+ @GetMapping("/selectPage")
+ public Result selectPage(Notice notice,
+ @RequestParam(defaultValue = "1") Integer pageNum,
+ @RequestParam(defaultValue = "10") Integer pageSize) {
+ PageInfo pageInfo = noticeService.selectPage(notice, pageNum, pageSize);
+ return Result.success(pageInfo);
+ }
+
+}
diff --git a/src/main/java/com/example/controller/OrdersController.java b/src/main/java/com/example/controller/OrdersController.java
new file mode 100644
index 0000000..f3e0820
--- /dev/null
+++ b/src/main/java/com/example/controller/OrdersController.java
@@ -0,0 +1,104 @@
+package com.example.controller;
+
+import com.example.common.Result;
+import com.example.entity.Orders;
+import com.example.mapper.OrdersMapper;
+import com.example.service.OrdersService;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 前端请求接口
+ */
+@RestController
+@RequestMapping("/orders")
+public class OrdersController {
+
+ @Resource
+ private OrdersService ordersService;
+
+ @Resource
+ private OrdersMapper ordersMapper;
+
+
+ /**
+ * 新增
+ */
+ @GetMapping("/ods_order_count")
+ public Result view1() {
+ return Result.success(ordersMapper.ods_order_count());
+ } @GetMapping("/ods_yuyue_count")
+ public Result view2() {
+ return Result.success(ordersMapper.ods_yuyue_count());
+ }
+
+
+ /**
+ * 新增
+ */
+ @PostMapping("/add")
+ public Result add(@RequestBody Orders orders) {
+ ordersService.add(orders);
+ return Result.success();
+ }
+
+ /**
+ * 修改
+ */
+ @PutMapping("/update")
+ public Result update(@RequestBody Orders orders) {
+ ordersService.updateById(orders);
+ return Result.success();
+ }
+
+ /**
+ * 单个删除
+ */
+ @DeleteMapping("/delete/{id}")
+ public Result delete(@PathVariable Integer id) {
+ ordersService.deleteById(id);
+ return Result.success();
+ }
+
+ /**
+ * 批量删除
+ */
+ @DeleteMapping("/delete/batch")
+ public Result delete(@RequestBody List ids) {
+ ordersService.deleteBatch(ids);
+ return Result.success();
+ }
+
+ /**
+ * 单个查询
+ */
+ @GetMapping("/selectById/{id}")
+ public Result selectById(@PathVariable Integer id) {
+ Orders orders = ordersService.selectById(id);
+ return Result.success(orders);
+ }
+
+ /**
+ * 查询所有
+ */
+ @GetMapping("/selectAll")
+ public Result selectAll(Orders orders) {
+ List list = ordersService.selectAll(orders);
+ return Result.success(list);
+ }
+
+ /**
+ * 分页查询
+ */
+ @GetMapping("/selectPage")
+ public Result selectPage(Orders orders,
+ @RequestParam(defaultValue = "1") Integer pageNum,
+ @RequestParam(defaultValue = "10") Integer pageSize) {
+ PageInfo pageInfo = ordersService.selectPage(orders, pageNum, pageSize);
+ return Result.success(pageInfo);
+ }
+
+}
diff --git a/src/main/java/com/example/controller/OrdersItemController.java b/src/main/java/com/example/controller/OrdersItemController.java
new file mode 100644
index 0000000..611fa54
--- /dev/null
+++ b/src/main/java/com/example/controller/OrdersItemController.java
@@ -0,0 +1,96 @@
+package com.example.controller;
+
+import com.example.common.Result;
+import com.example.entity.OrdersItem;
+import com.example.service.OrdersItemService;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 前端请求接口
+ */
+@RestController
+@RequestMapping("/ordersItem")
+public class OrdersItemController {
+
+ @Resource
+ private OrdersItemService ordersItemService;
+
+ /**
+ * 新增
+ */
+ @PostMapping("/add")
+ public Result add(@RequestBody OrdersItem ordersItem) {
+ ordersItemService.add(ordersItem);
+ return Result.success();
+ }
+
+ /**
+ * 修改
+ */
+ @PutMapping("/update")
+ public Result update(@RequestBody OrdersItem ordersItem) {
+ ordersItemService.updateById(ordersItem);
+ return Result.success();
+ }
+
+ /**
+ * 单个删除
+ */
+ @DeleteMapping("/delete/{id}")
+ public Result delete(@PathVariable Integer id) {
+ ordersItemService.deleteById(id);
+ return Result.success();
+ }
+
+ /**
+ * 批量删除
+ */
+ @DeleteMapping("/delete/batch")
+ public Result delete(@RequestBody List ids) {
+ ordersItemService.deleteBatch(ids);
+ return Result.success();
+ }
+
+ /**
+ * 单个查询
+ */
+ @GetMapping("/selectById/{id}")
+ public Result selectById(@PathVariable Integer id) {
+ OrdersItem ordersItem = ordersItemService.selectById(id);
+ return Result.success(ordersItem);
+ }
+
+ /**
+ * 根据订单ID查询
+ */
+ @GetMapping("/selectByOrderId/{orderId}")
+ public Result selectByOrderId(@PathVariable Integer orderId) {
+ List ordersItem = ordersItemService.selectByOrderId(orderId);
+ return Result.success(ordersItem);
+ }
+
+ /**
+ * 查询所有
+ */
+ @GetMapping("/selectAll")
+ public Result selectAll(OrdersItem ordersItem) {
+ List list = ordersItemService.selectAll(ordersItem);
+ return Result.success(list);
+ }
+
+ /**
+ * 分页查询
+ */
+ @GetMapping("/selectPage")
+ public Result selectPage(OrdersItem ordersItem,
+ @RequestParam(defaultValue = "1") Integer pageNum,
+ @RequestParam(defaultValue = "10") Integer pageSize) {
+ PageInfo pageInfo = ordersItemService.selectPage(ordersItem, pageNum, pageSize);
+ return Result.success(pageInfo);
+ }
+
+}
diff --git a/src/main/java/com/example/controller/PostsController.java b/src/main/java/com/example/controller/PostsController.java
new file mode 100644
index 0000000..9c58b1c
--- /dev/null
+++ b/src/main/java/com/example/controller/PostsController.java
@@ -0,0 +1,110 @@
+package com.example.controller;
+
+import com.example.common.Result;
+import com.example.entity.Posts;
+import com.example.service.CommentService;
+import com.example.service.PostsService;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 前端请求接口
+ */
+@RestController
+@RequestMapping("/posts")
+public class PostsController {
+
+ @Resource
+ private PostsService postsService;
+
+ @Resource
+ private CommentService commentService;
+
+ /**
+ * 新增
+ */
+ @PostMapping("/add")
+ public Result add(@RequestBody Posts posts) {
+ postsService.add(posts);
+ return Result.success();
+ }
+
+ /**
+ * 修改
+ */
+ @PutMapping("/update")
+ public Result update(@RequestBody Posts posts) {
+ postsService.updateById(posts);
+ return Result.success();
+ }
+
+ @PutMapping("/updateReadCount/{id}")
+ public Result updateReadCount(@PathVariable Integer id) {
+ postsService.updateReadCount(id);
+ return Result.success();
+ }
+
+ /**
+ * 单个删除
+ */
+ @DeleteMapping("/delete/{id}")
+ public Result delete(@PathVariable Integer id) {
+ postsService.deleteById(id);
+ return Result.success();
+ }
+
+ /**
+ * 批量删除
+ */
+ @DeleteMapping("/delete/batch")
+ public Result delete(@RequestBody List ids) {
+ postsService.deleteBatch(ids);
+ return Result.success();
+ }
+
+ /**
+ * 单个查询
+ */
+ @GetMapping("/selectById/{id}")
+ public Result selectById(@PathVariable Integer id) {
+ Posts posts = postsService.selectById(id);
+ return Result.success(posts);
+ }
+
+ /**
+ * 查询所有
+ */
+ @GetMapping("/selectAll")
+ public Result selectAll(Posts posts) {
+ List list = postsService.selectAll(posts);
+ return Result.success(list);
+ }
+
+ @GetMapping("/selectHot")
+ public Result selectHot(Posts posts) {
+ List list = postsService.selectAll(posts);
+ // 排序+ 限制个数
+ list = list.stream().sorted((p1, p2) -> p2.getReadCount().compareTo(p1.getReadCount())).limit(5).collect(Collectors.toList());
+ for (Posts p : list) {
+ Integer count = commentService.selectCount("posts", p.getId());// 查询当前这个帖子下面所有的评论数
+ p.setCommentCount(count);
+ }
+ return Result.success(list);
+ }
+
+ /**
+ * 分页查询
+ */
+ @GetMapping("/selectPage")
+ public Result selectPage(Posts posts,
+ @RequestParam(defaultValue = "1") Integer pageNum,
+ @RequestParam(defaultValue = "10") Integer pageSize) {
+ PageInfo pageInfo = postsService.selectPage(posts, pageNum, pageSize);
+ return Result.success(pageInfo);
+ }
+
+}
diff --git a/src/main/java/com/example/controller/PostsSectionController.java b/src/main/java/com/example/controller/PostsSectionController.java
new file mode 100644
index 0000000..59c1089
--- /dev/null
+++ b/src/main/java/com/example/controller/PostsSectionController.java
@@ -0,0 +1,87 @@
+package com.example.controller;
+
+import com.example.common.Result;
+import com.example.entity.PostsSection;
+import com.example.service.PostsSectionService;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 前端请求接口
+ */
+@RestController
+@RequestMapping("/postsSection")
+public class PostsSectionController {
+
+ @Resource
+ private PostsSectionService postsSectionService;
+
+ /**
+ * 新增
+ */
+ @PostMapping("/add")
+ public Result add(@RequestBody PostsSection postsSection) {
+ postsSectionService.add(postsSection);
+ return Result.success();
+ }
+
+ /**
+ * 修改
+ */
+ @PutMapping("/update")
+ public Result update(@RequestBody PostsSection postsSection) {
+ postsSectionService.updateById(postsSection);
+ return Result.success();
+ }
+
+ /**
+ * 单个删除
+ */
+ @DeleteMapping("/delete/{id}")
+ public Result delete(@PathVariable Integer id) {
+ postsSectionService.deleteById(id);
+ return Result.success();
+ }
+
+ /**
+ * 批量删除
+ */
+ @DeleteMapping("/delete/batch")
+ public Result delete(@RequestBody List ids) {
+ postsSectionService.deleteBatch(ids);
+ return Result.success();
+ }
+
+ /**
+ * 单个查询
+ */
+ @GetMapping("/selectById/{id}")
+ public Result selectById(@PathVariable Integer id) {
+ PostsSection postsSection = postsSectionService.selectById(id);
+ return Result.success(postsSection);
+ }
+
+ /**
+ * 查询所有
+ */
+ @GetMapping("/selectAll")
+ public Result selectAll(PostsSection postsSection) {
+ List list = postsSectionService.selectAll(postsSection);
+ return Result.success(list);
+ }
+
+ /**
+ * 分页查询
+ */
+ @GetMapping("/selectPage")
+ public Result selectPage(PostsSection postsSection,
+ @RequestParam(defaultValue = "1") Integer pageNum,
+ @RequestParam(defaultValue = "10") Integer pageSize) {
+ PageInfo pageInfo = postsSectionService.selectPage(postsSection, pageNum, pageSize);
+ return Result.success(pageInfo);
+ }
+
+}
diff --git a/src/main/java/com/example/controller/RoomController.java b/src/main/java/com/example/controller/RoomController.java
new file mode 100644
index 0000000..dd8ff83
--- /dev/null
+++ b/src/main/java/com/example/controller/RoomController.java
@@ -0,0 +1,87 @@
+package com.example.controller;
+
+import com.example.common.Result;
+import com.example.entity.Room;
+import com.example.service.RoomService;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 前端请求接口
+ */
+@RestController
+@RequestMapping("/room")
+public class RoomController {
+
+ @Resource
+ private RoomService roomService;
+
+ /**
+ * 新增
+ */
+ @PostMapping("/add")
+ public Result add(@RequestBody Room room) {
+ roomService.add(room);
+ return Result.success();
+ }
+
+ /**
+ * 修改
+ */
+ @PutMapping("/update")
+ public Result update(@RequestBody Room room) {
+ roomService.updateById(room);
+ return Result.success();
+ }
+
+ /**
+ * 单个删除
+ */
+ @DeleteMapping("/delete/{id}")
+ public Result delete(@PathVariable Integer id) {
+ roomService.deleteById(id);
+ return Result.success();
+ }
+
+ /**
+ * 批量删除
+ */
+ @DeleteMapping("/delete/batch")
+ public Result delete(@RequestBody List ids) {
+ roomService.deleteBatch(ids);
+ return Result.success();
+ }
+
+ /**
+ * 单个查询
+ */
+ @GetMapping("/selectById/{id}")
+ public Result selectById(@PathVariable Integer id) {
+ Room room = roomService.selectById(id);
+ return Result.success(room);
+ }
+
+ /**
+ * 查询所有
+ */
+ @GetMapping("/selectAll")
+ public Result selectAll(Room room) {
+ List list = roomService.selectAll(room);
+ return Result.success(list);
+ }
+
+ /**
+ * 分页查询
+ */
+ @GetMapping("/selectPage")
+ public Result selectPage(Room room,
+ @RequestParam(defaultValue = "1") Integer pageNum,
+ @RequestParam(defaultValue = "10") Integer pageSize) {
+ PageInfo pageInfo = roomService.selectPage(room, pageNum, pageSize);
+ return Result.success(pageInfo);
+ }
+
+}
diff --git a/src/main/java/com/example/controller/SeatController.java b/src/main/java/com/example/controller/SeatController.java
new file mode 100644
index 0000000..3bce1fc
--- /dev/null
+++ b/src/main/java/com/example/controller/SeatController.java
@@ -0,0 +1,87 @@
+package com.example.controller;
+
+import com.example.common.Result;
+import com.example.entity.Seat;
+import com.example.service.SeatService;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 前端请求接口
+ */
+@RestController
+@RequestMapping("/seat")
+public class SeatController {
+
+ @Resource
+ private SeatService seatService;
+
+ /**
+ * 新增
+ */
+ @PostMapping("/add")
+ public Result add(@RequestBody Seat seat) {
+ seatService.add(seat);
+ return Result.success();
+ }
+
+ /**
+ * 修改
+ */
+ @PutMapping("/update")
+ public Result update(@RequestBody Seat seat) {
+ seatService.updateById(seat);
+ return Result.success();
+ }
+
+ /**
+ * 单个删除
+ */
+ @DeleteMapping("/delete/{id}")
+ public Result delete(@PathVariable Integer id) {
+ seatService.deleteById(id);
+ return Result.success();
+ }
+
+ /**
+ * 批量删除
+ */
+ @DeleteMapping("/delete/batch")
+ public Result delete(@RequestBody List ids) {
+ seatService.deleteBatch(ids);
+ return Result.success();
+ }
+
+ /**
+ * 单个查询
+ */
+ @GetMapping("/selectById/{id}")
+ public Result selectById(@PathVariable Integer id) {
+ Seat seat = seatService.selectById(id);
+ return Result.success(seat);
+ }
+
+ /**
+ * 查询所有
+ */
+ @GetMapping("/selectAll")
+ public Result selectAll(Seat seat) {
+ List list = seatService.selectAll(seat);
+ return Result.success(list);
+ }
+
+ /**
+ * 分页查询
+ */
+ @GetMapping("/selectPage")
+ public Result selectPage(Seat seat,
+ @RequestParam(defaultValue = "1") Integer pageNum,
+ @RequestParam(defaultValue = "10") Integer pageSize) {
+ PageInfo pageInfo = seatService.selectPage(seat, pageNum, pageSize);
+ return Result.success(pageInfo);
+ }
+
+}
diff --git a/src/main/java/com/example/controller/SeatReserveController.java b/src/main/java/com/example/controller/SeatReserveController.java
new file mode 100644
index 0000000..baf75a3
--- /dev/null
+++ b/src/main/java/com/example/controller/SeatReserveController.java
@@ -0,0 +1,87 @@
+package com.example.controller;
+
+import com.example.common.Result;
+import com.example.entity.SeatReserve;
+import com.example.service.SeatReserveService;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 前端请求接口
+ */
+@RestController
+@RequestMapping("/seatReserve")
+public class SeatReserveController {
+
+ @Resource
+ private SeatReserveService seatReserveService;
+
+ /**
+ * 新增
+ */
+ @PostMapping("/add")
+ public Result add(@RequestBody SeatReserve seatReserve) {
+ seatReserveService.add(seatReserve);
+ return Result.success();
+ }
+
+ /**
+ * 修改
+ */
+ @PutMapping("/update")
+ public Result update(@RequestBody SeatReserve seatReserve) {
+ seatReserveService.updateById(seatReserve);
+ return Result.success();
+ }
+
+ /**
+ * 单个删除
+ */
+ @DeleteMapping("/delete/{id}")
+ public Result delete(@PathVariable Integer id) {
+ seatReserveService.deleteById(id);
+ return Result.success();
+ }
+
+ /**
+ * 批量删除
+ */
+ @DeleteMapping("/delete/batch")
+ public Result delete(@RequestBody List ids) {
+ seatReserveService.deleteBatch(ids);
+ return Result.success();
+ }
+
+ /**
+ * 单个查询
+ */
+ @GetMapping("/selectById/{id}")
+ public Result selectById(@PathVariable Integer id) {
+ SeatReserve seatReserve = seatReserveService.selectById(id);
+ return Result.success(seatReserve);
+ }
+
+ /**
+ * 查询所有
+ */
+ @GetMapping("/selectAll")
+ public Result selectAll(SeatReserve seatReserve) {
+ List list = seatReserveService.selectAll(seatReserve);
+ return Result.success(list);
+ }
+
+ /**
+ * 分页查询
+ */
+ @GetMapping("/selectPage")
+ public Result selectPage(SeatReserve seatReserve,
+ @RequestParam(defaultValue = "1") Integer pageNum,
+ @RequestParam(defaultValue = "10") Integer pageSize) {
+ PageInfo pageInfo = seatReserveService.selectPage(seatReserve, pageNum, pageSize);
+ return Result.success(pageInfo);
+ }
+
+}
diff --git a/src/main/java/com/example/controller/SignController.java b/src/main/java/com/example/controller/SignController.java
new file mode 100644
index 0000000..324848f
--- /dev/null
+++ b/src/main/java/com/example/controller/SignController.java
@@ -0,0 +1,87 @@
+package com.example.controller;
+
+import com.example.common.Result;
+import com.example.entity.Sign;
+import com.example.service.SignService;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 前端请求接口
+ */
+@RestController
+@RequestMapping("/sign")
+public class SignController {
+
+ @Resource
+ private SignService signService;
+
+ /**
+ * 新增
+ */
+ @PostMapping("/add")
+ public Result add(@RequestBody Sign sign) {
+ signService.add(sign);
+ return Result.success();
+ }
+
+ /**
+ * 修改
+ */
+ @PutMapping("/update")
+ public Result update(@RequestBody Sign sign) {
+ signService.updateById(sign);
+ return Result.success();
+ }
+
+ /**
+ * 单个删除
+ */
+ @DeleteMapping("/delete/{id}")
+ public Result delete(@PathVariable Integer id) {
+ signService.deleteById(id);
+ return Result.success();
+ }
+
+ /**
+ * 批量删除
+ */
+ @DeleteMapping("/delete/batch")
+ public Result delete(@RequestBody List ids) {
+ signService.deleteBatch(ids);
+ return Result.success();
+ }
+
+ /**
+ * 单个查询
+ */
+ @GetMapping("/selectById/{id}")
+ public Result selectById(@PathVariable Integer id) {
+ Sign sign = signService.selectById(id);
+ return Result.success(sign);
+ }
+
+ /**
+ * 查询所有
+ */
+ @GetMapping("/selectAll")
+ public Result selectAll(Sign sign) {
+ List list = signService.selectAll(sign);
+ return Result.success(list);
+ }
+
+ /**
+ * 分页查询
+ */
+ @GetMapping("/selectPage")
+ public Result selectPage(Sign sign,
+ @RequestParam(defaultValue = "1") Integer pageNum,
+ @RequestParam(defaultValue = "10") Integer pageSize) {
+ PageInfo pageInfo = signService.selectPage(sign, pageNum, pageSize);
+ return Result.success(pageInfo);
+ }
+
+}
diff --git a/src/main/java/com/example/controller/UserController.java b/src/main/java/com/example/controller/UserController.java
new file mode 100644
index 0000000..211b44c
--- /dev/null
+++ b/src/main/java/com/example/controller/UserController.java
@@ -0,0 +1,87 @@
+package com.example.controller;
+
+import com.example.common.Result;
+import com.example.entity.User;
+import com.example.service.UserService;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 前端请求接口
+ */
+@RestController
+@RequestMapping("/user")
+public class UserController {
+
+ @Resource
+ private UserService userService;
+
+ /**
+ * 新增
+ */
+ @PostMapping("/add")
+ public Result add(@RequestBody User user) {
+ userService.add(user);
+ return Result.success();
+ }
+
+ /**
+ * 修改
+ */
+ @PutMapping("/update")
+ public Result update(@RequestBody User user) {
+ userService.updateById(user);
+ return Result.success();
+ }
+
+ /**
+ * 单个删除
+ */
+ @DeleteMapping("/delete/{id}")
+ public Result delete(@PathVariable Integer id) {
+ userService.deleteById(id);
+ return Result.success();
+ }
+
+ /**
+ * 批量删除
+ */
+ @DeleteMapping("/delete/batch")
+ public Result delete(@RequestBody List ids) {
+ userService.deleteBatch(ids);
+ return Result.success();
+ }
+
+ /**
+ * 单个查询
+ */
+ @GetMapping("/selectById/{id}")
+ public Result selectById(@PathVariable Integer id) {
+ User user = userService.selectById(id);
+ return Result.success(user);
+ }
+
+ /**
+ * 查询所有
+ */
+ @GetMapping("/selectAll")
+ public Result selectAll(User user) {
+ List list = userService.selectAll(user);
+ return Result.success(list);
+ }
+
+ /**
+ * 分页查询
+ */
+ @GetMapping("/selectPage")
+ public Result selectPage(User user,
+ @RequestParam(defaultValue = "1") Integer pageNum,
+ @RequestParam(defaultValue = "10") Integer pageSize) {
+ PageInfo pageInfo = userService.selectPage(user, pageNum, pageSize);
+ return Result.success(pageInfo);
+ }
+
+}
diff --git a/src/main/java/com/example/controller/WebController.java b/src/main/java/com/example/controller/WebController.java
new file mode 100644
index 0000000..9b68730
--- /dev/null
+++ b/src/main/java/com/example/controller/WebController.java
@@ -0,0 +1,144 @@
+package com.example.controller;
+
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.lang.Dict;
+import com.example.common.Result;
+import com.example.common.enums.RoleEnum;
+import com.example.entity.*;
+import com.example.mapper.PostsMapper;
+import com.example.mapper.SignMapper;
+import com.example.service.*;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@RestController
+public class WebController {
+
+ @Resource
+ private AdminService adminService;
+ @Resource
+ private UserService userService;
+ @Resource
+ OrdersService ordersService;
+ @Resource
+ SeatReserveService seatReserveService;
+ @Resource
+ ActivityService activityService;
+ @Resource
+ SignMapper signMapper;
+ @Resource
+ PostsSectionService postsSectionService;
+ @Resource
+ PostsMapper postsMapper;
+
+ /**
+ * 默认请求接口
+ */
+ @GetMapping("/")
+ public Result hello () {
+ return Result.success();
+ }
+
+ /**
+ * 登录
+ */
+ @PostMapping("/login")
+ public Result login(@RequestBody Account account) {
+ Account loginAccount = null;
+ if (RoleEnum.ADMIN.name().equals(account.getRole())) {
+ loginAccount = adminService.login(account);
+ } else if (RoleEnum.USER.name().equals(account.getRole())) {
+ loginAccount = userService.login(account);
+ }
+ return Result.success(loginAccount);
+ }
+
+ /**
+ * 注册
+ */
+ @PostMapping("/register")
+ public Result register(@RequestBody User user) {
+ userService.add(user);
+ return Result.success();
+ }
+
+ /**
+ * 修改密码
+ */
+ @PutMapping("/updatePassword")
+ public Result updatePassword(@RequestBody Account account) {
+ if (RoleEnum.ADMIN.name().equals(account.getRole())) {
+ adminService.updatePassword(account);
+ } else if (RoleEnum.USER.name().equals(account.getRole())) {
+ userService.updatePassword(account);
+ }
+ return Result.success();
+ }
+
+
+ ///lineData
+ @GetMapping("/lineData")
+ public Result lineDate() {
+ List list = new ArrayList<>();
+ Date date = new Date();
+ DateTime start = DateUtil.offsetDay(date, -30); // 开日期
+ List dateList = DateUtil.rangeToList(start, date, DateField.DAY_OF_YEAR);
+ List dateStrList =
+ dateList.stream().map(DateUtil::formatDate).
+ sorted(Comparator.naturalOrder()).collect(Collectors.toList());
+ for (String day : dateStrList) {
+ // 查询这一天的借书量
+ Integer count = ordersService.selectDayCount(day);
+ Dict dict = Dict.create().set("date", day).set("count", count);
+ list.add(dict);
+ }
+ return Result.success(list);
+ }
+
+ @GetMapping("/lineData1")
+ public Result lineDate1() {
+ List list = new ArrayList<>();
+ Date date = new Date();
+ DateTime start = DateUtil.offsetDay(date, -30); // 开日期
+ List dateList = DateUtil.rangeToList(start, date, DateField.DAY_OF_YEAR);
+ List dateStrList = dateList.stream().map(DateUtil::formatDate).sorted(Comparator.naturalOrder()).collect(Collectors.toList());
+ for (String day : dateStrList) {
+ // 查询这一天的借书量
+ Integer count = seatReserveService.selectDayCount(day);
+ Dict dict = Dict.create().set("date", day).set("count", count);
+ list.add(dict);
+ }
+ return Result.success(list);
+ }
+
+ @GetMapping("/barData")
+ public Result barData() {
+ List list = new ArrayList<>();
+ List activityList = activityService.selectAll(null);
+ for (Activity activity : activityList) {
+ Integer count = signMapper.selectByActivityId(activity.getId());
+ Dict dict = Dict.create().set("name", activity.getName()).set("count", count);
+ list.add(dict);
+ }
+ return Result.success(list);
+ }
+
+ @GetMapping("/pieData")
+ public Result pieData() {
+ List list = new ArrayList<>();
+ List postsSectionList = postsSectionService.selectAll(null);
+ for (PostsSection section : postsSectionList) {
+ Integer count = postsMapper.selectBySectionId(section.getId());
+ Dict dict = Dict.create().set("name", section.getName()).set("value", count); // 注意 pie数据格式必须是name:value 对象
+ list.add(dict);
+ }
+ return Result.success(list);
+ }
+
+}
diff --git a/src/main/java/com/example/entity/Account.java b/src/main/java/com/example/entity/Account.java
new file mode 100644
index 0000000..331a1a5
--- /dev/null
+++ b/src/main/java/com/example/entity/Account.java
@@ -0,0 +1,68 @@
+package com.example.entity;
+
+public class Account {
+
+ private Integer id;
+ private String username;
+ private String password;
+ private String role;
+ private String newPassword;
+ private String token;
+ private Integer score;
+
+ public Integer getScore() {
+ return score;
+ }
+
+ public void setScore(Integer score) {
+ this.score = score;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public String getRole() {
+ return role;
+ }
+
+ public void setRole(String role) {
+ this.role = role;
+ }
+
+ public String getNewPassword() {
+ return newPassword;
+ }
+
+ public void setNewPassword(String newPassword) {
+ this.newPassword = newPassword;
+ }
+
+ public String getToken() {
+ return token;
+ }
+
+ public void setToken(String token) {
+ this.token = token;
+ }
+}
diff --git a/src/main/java/com/example/entity/Activity.java b/src/main/java/com/example/entity/Activity.java
new file mode 100644
index 0000000..c303205
--- /dev/null
+++ b/src/main/java/com/example/entity/Activity.java
@@ -0,0 +1,113 @@
+package com.example.entity;
+
+public class Activity {
+ /** ID */
+ private Integer id;
+ /** 活动名称 */
+ private String name;
+ /** 活动描述 */
+ private String descr;
+ /** 活动图片 */
+ private String img;
+ /** 开始日期 */
+ private String start;
+ /** 结束日期 */
+ private String end;
+ /** 活动地点 */
+ private String location;
+ /** 报名人数 */
+ private Integer num;
+ /** 活动详情 */
+ private String content;
+ /** 活动状态 */
+ private String status;
+ private Integer signCount;
+
+ public Integer getSignCount() {
+ return signCount;
+ }
+
+ public void setSignCount(Integer signCount) {
+ this.signCount = signCount;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescr() {
+ return descr;
+ }
+
+ public void setDescr(String descr) {
+ this.descr = descr;
+ }
+
+ public String getImg() {
+ return img;
+ }
+
+ public void setImg(String img) {
+ this.img = img;
+ }
+
+ public String getStart() {
+ return start;
+ }
+
+ public void setStart(String start) {
+ this.start = start;
+ }
+
+ public String getEnd() {
+ return end;
+ }
+
+ public void setEnd(String end) {
+ this.end = end;
+ }
+
+ public String getLocation() {
+ return location;
+ }
+
+ public void setLocation(String location) {
+ this.location = location;
+ }
+
+ public Integer getNum() {
+ return num;
+ }
+
+ public void setNum(Integer num) {
+ this.num = num;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+}
diff --git a/src/main/java/com/example/entity/Admin.java b/src/main/java/com/example/entity/Admin.java
new file mode 100644
index 0000000..b40aa42
--- /dev/null
+++ b/src/main/java/com/example/entity/Admin.java
@@ -0,0 +1,79 @@
+package com.example.entity;
+
+public class Admin extends Account {
+
+ /** 主键ID */
+ private Integer id;
+ /** 账号 */
+ private String username;
+ private String password;
+ private String name;
+ private String avatar;
+ private String role;
+ private String phone;
+ private String email;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getAvatar() {
+ return avatar;
+ }
+
+ public void setAvatar(String avatar) {
+ this.avatar = avatar;
+ }
+
+ public String getRole() {
+ return role;
+ }
+
+ public void setRole(String role) {
+ this.role = role;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+}
diff --git a/src/main/java/com/example/entity/Book.java b/src/main/java/com/example/entity/Book.java
new file mode 100644
index 0000000..4d68c5f
--- /dev/null
+++ b/src/main/java/com/example/entity/Book.java
@@ -0,0 +1,148 @@
+package com.example.entity;
+
+import lombok.Data;
+
+@Data
+public class Book {
+ /** ID */
+ private Integer id;
+ /** 名称 */
+ private String name;
+ private String score;
+ /** 封面 */
+ private String cover;
+ /** 简介 */
+ private String descr;
+ /** 作者 */
+ private String author;
+ /** 出版社 */
+ private String publisher;
+ /** 出版日期 */
+ private String date;
+ /** 价格 */
+ private String price;
+ /** ISBN */
+ private String isbn;
+ /** 库存 */
+ private Integer store;
+ /** 分类ID */
+ private Integer categoryId;
+ /** 是否上架 */
+ private Boolean grounding;
+ /** 是否推荐 */
+ private Boolean recommend;
+ // 分类的名称
+ private String categoryName;
+
+ public String getCategoryName() {
+ return categoryName;
+ }
+
+ public void setCategoryName(String categoryName) {
+ this.categoryName = categoryName;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getCover() {
+ return cover;
+ }
+
+ public void setCover(String cover) {
+ this.cover = cover;
+ }
+
+ public String getDescr() {
+ return descr;
+ }
+
+ public void setDescr(String descr) {
+ this.descr = descr;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ public String getPublisher() {
+ return publisher;
+ }
+
+ public void setPublisher(String publisher) {
+ this.publisher = publisher;
+ }
+
+ public String getDate() {
+ return date;
+ }
+
+ public void setDate(String date) {
+ this.date = date;
+ }
+
+ public String getPrice() {
+ return price;
+ }
+
+ public void setPrice(String price) {
+ this.price = price;
+ }
+
+ public String getIsbn() {
+ return isbn;
+ }
+
+ public void setIsbn(String isbn) {
+ this.isbn = isbn;
+ }
+
+ public Integer getStore() {
+ return store;
+ }
+
+ public void setStore(Integer store) {
+ this.store = store;
+ }
+
+ public Integer getCategoryId() {
+ return categoryId;
+ }
+
+ public void setCategoryId(Integer categoryId) {
+ this.categoryId = categoryId;
+ }
+
+ public Boolean getGrounding() {
+ return grounding;
+ }
+
+ public void setGrounding(Boolean grounding) {
+ this.grounding = grounding;
+ }
+
+ public Boolean getRecommend() {
+ return recommend;
+ }
+
+ public void setRecommend(Boolean recommend) {
+ this.recommend = recommend;
+ }
+}
diff --git a/src/main/java/com/example/entity/Cart.java b/src/main/java/com/example/entity/Cart.java
new file mode 100644
index 0000000..58333f8
--- /dev/null
+++ b/src/main/java/com/example/entity/Cart.java
@@ -0,0 +1,75 @@
+package com.example.entity;
+
+/**
+ * 书单信息
+ */
+public class Cart {
+ /** ID */
+ private Integer id;
+ /** 图书ID */
+ private Integer bookId;
+ /** 数量 */
+ private Integer num;
+ /** 用户ID */
+ private Integer userId;
+ /** 添加日期 */
+ private String time;
+ private String bookCover;
+ private String bookName;
+
+ public String getBookCover() {
+ return bookCover;
+ }
+
+ public void setBookCover(String bookCover) {
+ this.bookCover = bookCover;
+ }
+
+ public String getBookName() {
+ return bookName;
+ }
+
+ public void setBookName(String bookName) {
+ this.bookName = bookName;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Integer getBookId() {
+ return bookId;
+ }
+
+ public void setBookId(Integer bookId) {
+ this.bookId = bookId;
+ }
+
+ public Integer getNum() {
+ return num;
+ }
+
+ public void setNum(Integer num) {
+ this.num = num;
+ }
+
+ public Integer getUserId() {
+ return userId;
+ }
+
+ public void setUserId(Integer userId) {
+ this.userId = userId;
+ }
+
+ public String getTime() {
+ return time;
+ }
+
+ public void setTime(String time) {
+ this.time = time;
+ }
+}
diff --git a/src/main/java/com/example/entity/Category.java b/src/main/java/com/example/entity/Category.java
new file mode 100644
index 0000000..9d7005e
--- /dev/null
+++ b/src/main/java/com/example/entity/Category.java
@@ -0,0 +1,22 @@
+package com.example.entity;
+
+public class Category {
+ private Integer id;
+ private String name;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/src/main/java/com/example/entity/Collect.java b/src/main/java/com/example/entity/Collect.java
new file mode 100644
index 0000000..1ab9f46
--- /dev/null
+++ b/src/main/java/com/example/entity/Collect.java
@@ -0,0 +1,65 @@
+package com.example.entity;
+
+/**
+ * 活动收藏信息
+ */
+public class Collect {
+ /** ID */
+ private Integer id;
+ /** 活动ID */
+ private Integer activityId;
+ /** 收藏人ID */
+ private Integer userId;
+ /** 收藏时间 */
+ private String time;
+ private String activityName;
+ private String userName;
+
+ public String getActivityName() {
+ return activityName;
+ }
+
+ public void setActivityName(String activityName) {
+ this.activityName = activityName;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Integer getActivityId() {
+ return activityId;
+ }
+
+ public void setActivityId(Integer activityId) {
+ this.activityId = activityId;
+ }
+
+ public Integer getUserId() {
+ return userId;
+ }
+
+ public void setUserId(Integer userId) {
+ this.userId = userId;
+ }
+
+ public String getTime() {
+ return time;
+ }
+
+ public void setTime(String time) {
+ this.time = time;
+ }
+}
diff --git a/src/main/java/com/example/entity/Comment.java b/src/main/java/com/example/entity/Comment.java
new file mode 100644
index 0000000..a7f68bb
--- /dev/null
+++ b/src/main/java/com/example/entity/Comment.java
@@ -0,0 +1,129 @@
+package com.example.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 评论信息
+ */
+@Data
+public class Comment {
+ /** ID */
+ private Integer id;
+ /** 内容 */
+ private String content;
+ /** 评论人 */
+ private Integer userId;
+ /** 父级ID */
+ private Integer pid;
+ /** 评论时间 */
+ private String time;
+ /** 关联ID */
+ private Integer fid;
+ private Double score;
+ /** 模块 */
+ private String module;
+ /** 根节点ID */
+ private Integer rootId;
+ private String userName;
+ private String userAvatar;
+ private String parentUserName;
+ private List children;
+
+ public String getParentUserName() {
+ return parentUserName;
+ }
+
+ public void setParentUserName(String parentUserName) {
+ this.parentUserName = parentUserName;
+ }
+
+ public List getChildren() {
+ return children;
+ }
+
+ public void setChildren(List children) {
+ this.children = children;
+ }
+
+ public String getUserAvatar() {
+ return userAvatar;
+ }
+
+ public void setUserAvatar(String userAvatar) {
+ this.userAvatar = userAvatar;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public Integer getUserId() {
+ return userId;
+ }
+
+ public void setUserId(Integer userId) {
+ this.userId = userId;
+ }
+
+ public Integer getPid() {
+ return pid;
+ }
+
+ public void setPid(Integer pid) {
+ this.pid = pid;
+ }
+
+ public String getTime() {
+ return time;
+ }
+
+ public void setTime(String time) {
+ this.time = time;
+ }
+
+ public Integer getFid() {
+ return fid;
+ }
+
+ public void setFid(Integer fid) {
+ this.fid = fid;
+ }
+
+ public String getModule() {
+ return module;
+ }
+
+ public void setModule(String module) {
+ this.module = module;
+ }
+
+ public Integer getRootId() {
+ return rootId;
+ }
+
+ public void setRootId(Integer rootId) {
+ this.rootId = rootId;
+ }
+}
diff --git a/src/main/java/com/example/entity/Notice.java b/src/main/java/com/example/entity/Notice.java
new file mode 100644
index 0000000..31cb6f6
--- /dev/null
+++ b/src/main/java/com/example/entity/Notice.java
@@ -0,0 +1,40 @@
+package com.example.entity;
+
+public class Notice {
+ private Integer id;
+ private String title;
+ private String content;
+ private String time;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public String getTime() {
+ return time;
+ }
+
+ public void setTime(String time) {
+ this.time = time;
+ }
+}
diff --git a/src/main/java/com/example/entity/Orders.java b/src/main/java/com/example/entity/Orders.java
new file mode 100644
index 0000000..29641c2
--- /dev/null
+++ b/src/main/java/com/example/entity/Orders.java
@@ -0,0 +1,123 @@
+package com.example.entity;
+
+import java.util.List;
+
+/**
+ * 订单信息
+ */
+public class Orders {
+ /** ID */
+ private Integer id;
+ /** 书籍名称 */
+ private String name;
+ /** 借书编号 */
+ private String orderNo;
+ /** 借书时间 */
+ private String time;
+ /** 用户ID */
+ private Integer userId;
+ /** 状态 */
+ private String status;
+ private String userName;
+ private String hex;
+ private Long days;
+ private Integer bookId;
+ private Integer num;
+ private List cartList;
+
+ public void setHex(String hex) {
+ this.hex = hex;
+ }
+
+ public String getHex() {
+ return hex;
+ }
+
+ public List getCartList() {
+ return cartList;
+ }
+
+ public void setCartList(List cartList) {
+ this.cartList = cartList;
+ }
+
+ public Integer getNum() {
+ return num;
+ }
+
+ public void setNum(Integer num) {
+ this.num = num;
+ }
+
+ public Integer getBookId() {
+ return bookId;
+ }
+
+ public void setBookId(Integer bookId) {
+ this.bookId = bookId;
+ }
+
+ public Long getDays() {
+ return days;
+ }
+
+ public void setDays(Long days) {
+ this.days = days;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getOrderNo() {
+ return orderNo;
+ }
+
+ public void setOrderNo(String orderNo) {
+ this.orderNo = orderNo;
+ }
+
+ public String getTime() {
+ return time;
+ }
+
+ public void setTime(String time) {
+ this.time = time;
+ }
+
+ public Integer getUserId() {
+ return userId;
+ }
+
+ public void setUserId(Integer userId) {
+ this.userId = userId;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/example/entity/OrdersItem.java b/src/main/java/com/example/entity/OrdersItem.java
new file mode 100644
index 0000000..04490b7
--- /dev/null
+++ b/src/main/java/com/example/entity/OrdersItem.java
@@ -0,0 +1,67 @@
+package com.example.entity;
+
+/**
+ * 订单明细
+ */
+public class OrdersItem {
+ /** ID */
+ private Integer id;
+ /** 图书ID */
+ private Integer bookId;
+ /** 图书名称 */
+ private String bookName;
+ /** 图书封面 */
+ private String bookCover;
+ /** 数量 */
+ private Integer num;
+ /** 借书订单ID */
+ private Integer orderId;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Integer getBookId() {
+ return bookId;
+ }
+
+ public void setBookId(Integer bookId) {
+ this.bookId = bookId;
+ }
+
+ public String getBookName() {
+ return bookName;
+ }
+
+ public void setBookName(String bookName) {
+ this.bookName = bookName;
+ }
+
+ public String getBookCover() {
+ return bookCover;
+ }
+
+ public void setBookCover(String bookCover) {
+ this.bookCover = bookCover;
+ }
+
+ public Integer getNum() {
+ return num;
+ }
+
+ public void setNum(Integer num) {
+ this.num = num;
+ }
+
+ public Integer getOrderId() {
+ return orderId;
+ }
+
+ public void setOrderId(Integer orderId) {
+ this.orderId = orderId;
+ }
+}
diff --git a/src/main/java/com/example/entity/Posts.java b/src/main/java/com/example/entity/Posts.java
new file mode 100644
index 0000000..5e171a6
--- /dev/null
+++ b/src/main/java/com/example/entity/Posts.java
@@ -0,0 +1,133 @@
+package com.example.entity;
+
+/**
+ * 帖子
+ */
+public class Posts {
+ /** ID */
+ private Integer id;
+ /** 标题 */
+ private String title;
+ /** 图片 */
+ private String img;
+ /** 标签 */
+ private String tags;
+ /** 内容 */
+ private String content;
+ /** 发布人ID */
+ private Integer userId;
+ /** 发布时间 */
+ private String time;
+ /** 阅读量 */
+ private Integer readCount;
+ /** 版块ID */
+ private Integer sectionId;
+ private String userName;
+ private String sectionName;
+ private String simpleContent;
+ private Integer commentCount;
+
+ public Integer getCommentCount() {
+ return commentCount;
+ }
+
+ public void setCommentCount(Integer commentCount) {
+ this.commentCount = commentCount;
+ }
+
+ public String getSimpleContent() {
+ return simpleContent;
+ }
+
+ public void setSimpleContent(String simpleContent) {
+ this.simpleContent = simpleContent;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public String getSectionName() {
+ return sectionName;
+ }
+
+ public void setSectionName(String sectionName) {
+ this.sectionName = sectionName;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getImg() {
+ return img;
+ }
+
+ public void setImg(String img) {
+ this.img = img;
+ }
+
+ public String getTags() {
+ return tags;
+ }
+
+ public void setTags(String tags) {
+ this.tags = tags;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public Integer getUserId() {
+ return userId;
+ }
+
+ public void setUserId(Integer userId) {
+ this.userId = userId;
+ }
+
+ public String getTime() {
+ return time;
+ }
+
+ public void setTime(String time) {
+ this.time = time;
+ }
+
+ public Integer getReadCount() {
+ return readCount;
+ }
+
+ public void setReadCount(Integer readCount) {
+ this.readCount = readCount;
+ }
+
+ public Integer getSectionId() {
+ return sectionId;
+ }
+
+ public void setSectionId(Integer sectionId) {
+ this.sectionId = sectionId;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/example/entity/PostsSection.java b/src/main/java/com/example/entity/PostsSection.java
new file mode 100644
index 0000000..9aad9c6
--- /dev/null
+++ b/src/main/java/com/example/entity/PostsSection.java
@@ -0,0 +1,22 @@
+package com.example.entity;
+
+public class PostsSection {
+ private Integer id;
+ private String name;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/src/main/java/com/example/entity/Rem.java b/src/main/java/com/example/entity/Rem.java
new file mode 100644
index 0000000..f11622c
--- /dev/null
+++ b/src/main/java/com/example/entity/Rem.java
@@ -0,0 +1,11 @@
+package com.example.entity;
+
+import lombok.Data;
+
+@Data
+public class Rem {
+
+ private Integer id;
+ private String score;
+
+}
diff --git a/src/main/java/com/example/entity/Room.java b/src/main/java/com/example/entity/Room.java
new file mode 100644
index 0000000..2485b23
--- /dev/null
+++ b/src/main/java/com/example/entity/Room.java
@@ -0,0 +1,54 @@
+package com.example.entity;
+
+public class Room {
+ /** ID */
+ private Integer id;
+ /** 名称 */
+ private String name;
+ /** 封面 */
+ private String img;
+ /** 位置 */
+ private String location;
+ /** 开放时间 */
+ private String openTime;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getImg() {
+ return img;
+ }
+
+ public void setImg(String img) {
+ this.img = img;
+ }
+
+ public String getLocation() {
+ return location;
+ }
+
+ public void setLocation(String location) {
+ this.location = location;
+ }
+
+ public String getOpenTime() {
+ return openTime;
+ }
+
+ public void setOpenTime(String openTime) {
+ this.openTime = openTime;
+ }
+}
diff --git a/src/main/java/com/example/entity/Seat.java b/src/main/java/com/example/entity/Seat.java
new file mode 100644
index 0000000..2d561c9
--- /dev/null
+++ b/src/main/java/com/example/entity/Seat.java
@@ -0,0 +1,75 @@
+package com.example.entity;
+
+/**
+ * 座位信息
+ */
+public class Seat {
+ private Integer id;
+ /** 编号 */
+ private String no;
+ /** 阅览室ID */
+ private Integer roomId;
+ /** 排 */
+ private Integer row;
+ /** 列 */
+ private Integer col;
+ /** 预约状态 */
+ private String status;
+ private String roomName;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getRoomName() {
+ return roomName;
+ }
+
+ public void setRoomName(String roomName) {
+ this.roomName = roomName;
+ }
+
+ public String getNo() {
+ return no;
+ }
+
+ public void setNo(String no) {
+ this.no = no;
+ }
+
+ public Integer getRoomId() {
+ return roomId;
+ }
+
+ public void setRoomId(Integer roomId) {
+ this.roomId = roomId;
+ }
+
+ public Integer getRow() {
+ return row;
+ }
+
+ public void setRow(Integer row) {
+ this.row = row;
+ }
+
+ public Integer getCol() {
+ return col;
+ }
+
+ public void setCol(Integer col) {
+ this.col = col;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+}
diff --git a/src/main/java/com/example/entity/SeatReserve.java b/src/main/java/com/example/entity/SeatReserve.java
new file mode 100644
index 0000000..751d36a
--- /dev/null
+++ b/src/main/java/com/example/entity/SeatReserve.java
@@ -0,0 +1,76 @@
+package com.example.entity;
+
+public class SeatReserve {
+ private Integer id;
+ private Integer seatId;
+ private Integer userId;
+ private String time;
+ private String status;
+ private String roomName;
+ private String seatNo;
+ private String userName;
+
+ public String getRoomName() {
+ return roomName;
+ }
+
+ public void setRoomName(String roomName) {
+ this.roomName = roomName;
+ }
+
+ public String getSeatNo() {
+ return seatNo;
+ }
+
+ public void setSeatNo(String seatNo) {
+ this.seatNo = seatNo;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Integer getSeatId() {
+ return seatId;
+ }
+
+ public void setSeatId(Integer seatId) {
+ this.seatId = seatId;
+ }
+
+ public Integer getUserId() {
+ return userId;
+ }
+
+ public void setUserId(Integer userId) {
+ this.userId = userId;
+ }
+
+ public String getTime() {
+ return time;
+ }
+
+ public void setTime(String time) {
+ this.time = time;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+}
diff --git a/src/main/java/com/example/entity/Sign.java b/src/main/java/com/example/entity/Sign.java
new file mode 100644
index 0000000..2ce6e41
--- /dev/null
+++ b/src/main/java/com/example/entity/Sign.java
@@ -0,0 +1,95 @@
+package com.example.entity;
+
+/**
+ * 活动报名
+ */
+public class Sign {
+ /** ID */
+ private Integer id;
+ /** 活动ID */
+ private Integer activityId;
+ /** 用户ID */
+ private Integer userId;
+ /** 报名时间 */
+ private String time;
+ /** 是否签到 */
+ private String sign;
+ /** 姓名 */
+ private String name;
+ /** 联系方式 */
+ private String phone;
+ private String userName;
+ private String activityName;
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public String getActivityName() {
+ return activityName;
+ }
+
+ public void setActivityName(String activityName) {
+ this.activityName = activityName;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Integer getActivityId() {
+ return activityId;
+ }
+
+ public void setActivityId(Integer activityId) {
+ this.activityId = activityId;
+ }
+
+ public Integer getUserId() {
+ return userId;
+ }
+
+ public void setUserId(Integer userId) {
+ this.userId = userId;
+ }
+
+ public String getTime() {
+ return time;
+ }
+
+ public void setTime(String time) {
+ this.time = time;
+ }
+
+ public String getSign() {
+ return sign;
+ }
+
+ public void setSign(String sign) {
+ this.sign = sign;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/example/entity/User.java b/src/main/java/com/example/entity/User.java
new file mode 100644
index 0000000..058d467
--- /dev/null
+++ b/src/main/java/com/example/entity/User.java
@@ -0,0 +1,88 @@
+package com.example.entity;
+
+public class User extends Account {
+
+ /** 主键ID */
+ private Integer id;
+ /** 账号 */
+ private String username;
+ private String password;
+ private String name;
+ private String avatar;
+ private String role;
+ private String phone;
+ private String email;
+ private Integer score;
+
+ public Integer getScore() {
+ return score;
+ }
+
+ public void setScore(Integer score) {
+ this.score = score;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getAvatar() {
+ return avatar;
+ }
+
+ public void setAvatar(String avatar) {
+ this.avatar = avatar;
+ }
+
+ public String getRole() {
+ return role;
+ }
+
+ public void setRole(String role) {
+ this.role = role;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+}
diff --git a/src/main/java/com/example/exception/BusinessException.java b/src/main/java/com/example/exception/BusinessException.java
new file mode 100644
index 0000000..829f2f6
--- /dev/null
+++ b/src/main/java/com/example/exception/BusinessException.java
@@ -0,0 +1,30 @@
+package com.example.exception;
+
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONUtil;
+import cn.hutool.core.util.IdUtil;
+import jakarta.annotation.PostConstruct;
+import jakarta.annotation.Resource;
+
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.stereotype.Component;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.Map;
+
+/**
+ * 业务异常
+ */
+@Component
+public class BusinessException extends RuntimeException {
+ @Resource
+ ApplicationContext context;
+
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/example/exception/CustomException.java b/src/main/java/com/example/exception/CustomException.java
new file mode 100644
index 0000000..4388f75
--- /dev/null
+++ b/src/main/java/com/example/exception/CustomException.java
@@ -0,0 +1,35 @@
+package com.example.exception;
+
+import com.example.common.enums.ResultCodeEnum;
+
+public class CustomException extends RuntimeException {
+
+ private String code;
+ private String msg;
+
+ public CustomException(String code, String msg) {
+ this.code = code;
+ this.msg = msg;
+ }
+
+ public CustomException(ResultCodeEnum resultCodeEnum) {
+ this.code = resultCodeEnum.code;
+ this.msg = resultCodeEnum.msg;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public String getMsg() {
+ return msg;
+ }
+
+ public void setMsg(String msg) {
+ this.msg = msg;
+ }
+}
diff --git a/src/main/java/com/example/exception/GlobalExceptionHandler.java b/src/main/java/com/example/exception/GlobalExceptionHandler.java
new file mode 100644
index 0000000..eb89d17
--- /dev/null
+++ b/src/main/java/com/example/exception/GlobalExceptionHandler.java
@@ -0,0 +1,28 @@
+package com.example.exception;
+
+import cn.hutool.log.Log;
+import cn.hutool.log.LogFactory;
+import com.example.common.Result;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@ControllerAdvice("com.example.controller")
+public class GlobalExceptionHandler {
+
+ private static final Log log = LogFactory.get();
+
+ @ExceptionHandler(Exception.class)
+ @ResponseBody // 返回json串
+ public Result error(Exception e) {
+ log.error("异常信息:", e);
+ return Result.error();
+ }
+
+ @ExceptionHandler(CustomException.class)
+ @ResponseBody // 返回json串
+ public Result error(CustomException e) {
+// log.error("异常信息:", e);
+ return Result.error(e.getCode(), e.getMsg());
+ }
+}
diff --git a/src/main/java/com/example/mapper/ActivityMapper.java b/src/main/java/com/example/mapper/ActivityMapper.java
new file mode 100644
index 0000000..0e75782
--- /dev/null
+++ b/src/main/java/com/example/mapper/ActivityMapper.java
@@ -0,0 +1,21 @@
+package com.example.mapper;
+
+import com.example.entity.Activity;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+public interface ActivityMapper {
+
+ int insert(Activity activity);
+
+ void updateById(Activity activity);
+
+ void deleteById(Integer id);
+
+ @Select("select * from `activity` where id = #{id}")
+ Activity selectById(Integer id);
+
+ List selectAll(Activity activity);
+
+}
diff --git a/src/main/java/com/example/mapper/AdminMapper.java b/src/main/java/com/example/mapper/AdminMapper.java
new file mode 100644
index 0000000..1b678ce
--- /dev/null
+++ b/src/main/java/com/example/mapper/AdminMapper.java
@@ -0,0 +1,24 @@
+package com.example.mapper;
+
+import com.example.entity.Admin;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+public interface AdminMapper {
+
+ int insert(Admin admin);
+
+ void updateById(Admin admin);
+
+ void deleteById(Integer id);
+
+ @Select("select * from `admin` where id = #{id}")
+ Admin selectById(Integer id);
+
+ @Select("select * from `admin` where username = #{username}")
+ Admin selectByUsername(String username);
+
+ List selectAll(Admin admin);
+
+}
diff --git a/src/main/java/com/example/mapper/BookMapper.java b/src/main/java/com/example/mapper/BookMapper.java
new file mode 100644
index 0000000..0c5b525
--- /dev/null
+++ b/src/main/java/com/example/mapper/BookMapper.java
@@ -0,0 +1,26 @@
+package com.example.mapper;
+
+import com.example.entity.Book;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+public interface BookMapper {
+
+ int insert(Book book);
+
+ void updateById(Book book);
+
+ void deleteById(Integer id);
+
+ @Select("select * from `book` where id = #{id}")
+ Book selectById(Integer id);
+
+ List selectAll(Book book);
+
+ List selectHot();
+
+ @Select("SELECT fid from comment GROUP BY fid ORDER BY count(*) desc limit 8")
+ List selectOrderScore();
+
+}
diff --git a/src/main/java/com/example/mapper/CartMapper.java b/src/main/java/com/example/mapper/CartMapper.java
new file mode 100644
index 0000000..2fb9037
--- /dev/null
+++ b/src/main/java/com/example/mapper/CartMapper.java
@@ -0,0 +1,21 @@
+package com.example.mapper;
+
+import com.example.entity.Cart;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+public interface CartMapper {
+
+ int insert(Cart cart);
+
+ void updateById(Cart cart);
+
+ void deleteById(Integer id);
+
+ @Select("select * from `cart` where id = #{id}")
+ Cart selectById(Integer id);
+
+ List selectAll(Cart cart);
+
+}
diff --git a/src/main/java/com/example/mapper/CategoryMapper.java b/src/main/java/com/example/mapper/CategoryMapper.java
new file mode 100644
index 0000000..7fa4ed7
--- /dev/null
+++ b/src/main/java/com/example/mapper/CategoryMapper.java
@@ -0,0 +1,21 @@
+package com.example.mapper;
+
+import com.example.entity.Category;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+public interface CategoryMapper {
+
+ int insert(Category category);
+
+ void updateById(Category category);
+
+ void deleteById(Integer id);
+
+ @Select("select * from `category` where id = #{id}")
+ Category selectById(Integer id);
+
+ List selectAll(Category category);
+
+}
diff --git a/src/main/java/com/example/mapper/CollectMapper.java b/src/main/java/com/example/mapper/CollectMapper.java
new file mode 100644
index 0000000..9e2f770
--- /dev/null
+++ b/src/main/java/com/example/mapper/CollectMapper.java
@@ -0,0 +1,24 @@
+package com.example.mapper;
+
+import com.example.entity.Collect;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+public interface CollectMapper {
+
+ int insert(Collect collect);
+
+ void updateById(Collect collect);
+
+ void deleteById(Integer id);
+
+ @Select("select * from `collect` where id = #{id}")
+ Collect selectById(Integer id);
+
+ List selectAll(Collect collect);
+
+ @Select("select * from `collect` where activity_id = #{activityId} and user_id = #{userId}")
+ Collect selectByActivityIdAndUserId(@Param("activityId") Integer activityId, @Param("userId") Integer userId);
+}
diff --git a/src/main/java/com/example/mapper/CommentMapper.java b/src/main/java/com/example/mapper/CommentMapper.java
new file mode 100644
index 0000000..82e9066
--- /dev/null
+++ b/src/main/java/com/example/mapper/CommentMapper.java
@@ -0,0 +1,31 @@
+package com.example.mapper;
+
+import com.example.entity.Comment;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+public interface CommentMapper {
+
+ int insert(Comment comment);
+
+ void updateById(Comment comment);
+
+ void deleteById(Integer id);
+
+ @Select("select * from `comment` where id = #{id}")
+ Comment selectById(Integer id);
+
+ List selectAll(Comment comment);
+
+ List selectByModuleAndFid(@Param("module") String module, @Param("fid") Integer fid);
+
+ @Select("select count(*) from comment where module = #{module} and fid = #{fid}")
+ Integer selectCount(@Param("module") String module, @Param("fid") Integer fid);
+
+ List selectByRootId(Integer rootId);
+
+ @Select("select * from `comment` where pid = #{pid}")
+ List selectByPid(Integer pid);
+}
diff --git a/src/main/java/com/example/mapper/NoticeMapper.java b/src/main/java/com/example/mapper/NoticeMapper.java
new file mode 100644
index 0000000..3e19f0d
--- /dev/null
+++ b/src/main/java/com/example/mapper/NoticeMapper.java
@@ -0,0 +1,21 @@
+package com.example.mapper;
+
+import com.example.entity.Notice;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+public interface NoticeMapper {
+
+ int insert(Notice notice);
+
+ void updateById(Notice notice);
+
+ void deleteById(Integer id);
+
+ @Select("select * from `notice` where id = #{id}")
+ Notice selectById(Integer id);
+
+ List selectAll(Notice notice);
+
+}
diff --git a/src/main/java/com/example/mapper/OrdersItemMapper.java b/src/main/java/com/example/mapper/OrdersItemMapper.java
new file mode 100644
index 0000000..5d4a79d
--- /dev/null
+++ b/src/main/java/com/example/mapper/OrdersItemMapper.java
@@ -0,0 +1,23 @@
+package com.example.mapper;
+
+import com.example.entity.OrdersItem;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+public interface OrdersItemMapper {
+
+ int insert(OrdersItem ordersItem);
+
+ void updateById(OrdersItem ordersItem);
+
+ void deleteById(Integer id);
+
+ @Select("select * from `orders_item` where id = #{id}")
+ OrdersItem selectById(Integer id);
+
+ List selectAll(OrdersItem ordersItem);
+
+ @Select("select * from `orders_item` where order_id = #{orderId}")
+ List selectByOrderId(Integer orderId);
+}
diff --git a/src/main/java/com/example/mapper/OrdersMapper.java b/src/main/java/com/example/mapper/OrdersMapper.java
new file mode 100644
index 0000000..8d6d54f
--- /dev/null
+++ b/src/main/java/com/example/mapper/OrdersMapper.java
@@ -0,0 +1,41 @@
+package com.example.mapper;
+
+import com.example.entity.Orders;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.HashMap;
+import java.util.List;
+
+public interface OrdersMapper {
+
+ int insert(Orders orders);
+
+ void updateById(Orders orders);
+
+
+ void updateByHexId(Orders orders);
+
+ void deleteById(Integer id);
+
+ @Select("select * from `orders` where id = #{id}")
+ Orders selectById(Integer id);
+
+ List selectAll(Orders orders);
+
+ @Select("select count(*) from orders where time like '%${day}%'")
+ Integer selectDayCount(String day);
+
+
+ // 用户画像不同角色借书
+ @Select("select * from ods_user_type")
+ List> ods_user_type();
+
+
+ //预约
+ @Select("select * from ods_yuyue_count")
+ List> ods_yuyue_count();
+
+ // 借书趋势
+ @Select("select * from ods_order_count")
+ List> ods_order_count();
+}
diff --git a/src/main/java/com/example/mapper/PostsMapper.java b/src/main/java/com/example/mapper/PostsMapper.java
new file mode 100644
index 0000000..e3cdcab
--- /dev/null
+++ b/src/main/java/com/example/mapper/PostsMapper.java
@@ -0,0 +1,28 @@
+package com.example.mapper;
+
+import com.example.entity.Posts;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+public interface PostsMapper {
+
+ int insert(Posts posts);
+
+ void updateById(Posts posts);
+
+ void deleteById(Integer id);
+
+ @Select(" select posts.*, user.name as userName from `posts`" +
+ " left join user on posts.user_id = user.id where posts.id = #{id}")
+ Posts selectById(Integer id);
+
+ List selectAll(Posts posts);
+
+ @Update("update posts set read_count = read_count + 1 where id = #{id}")
+ void updateReadCount(Integer id);
+
+ @Select("select count(*) from posts where section_id = #{sectionId}")
+ Integer selectBySectionId(Integer sectionId);
+}
diff --git a/src/main/java/com/example/mapper/PostsSectionMapper.java b/src/main/java/com/example/mapper/PostsSectionMapper.java
new file mode 100644
index 0000000..74386c9
--- /dev/null
+++ b/src/main/java/com/example/mapper/PostsSectionMapper.java
@@ -0,0 +1,21 @@
+package com.example.mapper;
+
+import com.example.entity.PostsSection;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+public interface PostsSectionMapper {
+
+ int insert(PostsSection postsSection);
+
+ void updateById(PostsSection postsSection);
+
+ void deleteById(Integer id);
+
+ @Select("select * from `posts_section` where id = #{id}")
+ PostsSection selectById(Integer id);
+
+ List selectAll(PostsSection postsSection);
+
+}
diff --git a/src/main/java/com/example/mapper/RemMapper.java b/src/main/java/com/example/mapper/RemMapper.java
new file mode 100644
index 0000000..1530676
--- /dev/null
+++ b/src/main/java/com/example/mapper/RemMapper.java
@@ -0,0 +1,17 @@
+package com.example.mapper;
+
+import com.example.entity.Activity;
+import com.example.entity.Rem;
+import com.example.entity.User;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+public interface RemMapper {
+
+
+ // 查询用户
+ @Select("SELECT * FROM tb_rem WHERE user_id = #{userId} limit 1 ")
+ Rem findUserById(Integer userId);
+
+}
diff --git a/src/main/java/com/example/mapper/RoomMapper.java b/src/main/java/com/example/mapper/RoomMapper.java
new file mode 100644
index 0000000..261722b
--- /dev/null
+++ b/src/main/java/com/example/mapper/RoomMapper.java
@@ -0,0 +1,21 @@
+package com.example.mapper;
+
+import com.example.entity.Room;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+public interface RoomMapper {
+
+ int insert(Room room);
+
+ void updateById(Room room);
+
+ void deleteById(Integer id);
+
+ @Select("select * from `room` where id = #{id}")
+ Room selectById(Integer id);
+
+ List selectAll(Room room);
+
+}
diff --git a/src/main/java/com/example/mapper/SeatMapper.java b/src/main/java/com/example/mapper/SeatMapper.java
new file mode 100644
index 0000000..a98c80e
--- /dev/null
+++ b/src/main/java/com/example/mapper/SeatMapper.java
@@ -0,0 +1,21 @@
+package com.example.mapper;
+
+import com.example.entity.Seat;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+public interface SeatMapper {
+
+ int insert(Seat seat);
+
+ void updateById(Seat seat);
+
+ void deleteById(Integer id);
+
+ @Select("select * from `seat` where id = #{id}")
+ Seat selectById(Integer id);
+
+ List selectAll(Seat seat);
+
+}
diff --git a/src/main/java/com/example/mapper/SeatReserveMapper.java b/src/main/java/com/example/mapper/SeatReserveMapper.java
new file mode 100644
index 0000000..cbfd7ff
--- /dev/null
+++ b/src/main/java/com/example/mapper/SeatReserveMapper.java
@@ -0,0 +1,24 @@
+package com.example.mapper;
+
+import com.example.entity.SeatReserve;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+public interface SeatReserveMapper {
+
+ int insert(SeatReserve seatReserve);
+
+ void updateById(SeatReserve seatReserve);
+
+ void deleteById(Integer id);
+
+ @Select("select * from `seat_reserve` where id = #{id}")
+ SeatReserve selectById(Integer id);
+
+ List selectAll(SeatReserve seatReserve);
+
+ @Select("select count(*) from seat_reserve where time like '%${day}%'")
+ Integer selectDayCount(String day);
+
+}
diff --git a/src/main/java/com/example/mapper/SignMapper.java b/src/main/java/com/example/mapper/SignMapper.java
new file mode 100644
index 0000000..0718822
--- /dev/null
+++ b/src/main/java/com/example/mapper/SignMapper.java
@@ -0,0 +1,28 @@
+package com.example.mapper;
+
+import com.example.entity.Sign;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+public interface SignMapper {
+
+ int insert(Sign sign);
+
+ void updateById(Sign sign);
+
+ void deleteById(Integer id);
+
+ @Select("select * from `sign` where id = #{id}")
+ Sign selectById(Integer id);
+
+ List selectAll(Sign sign);
+
+ @Select("select * from `sign` where activity_id = #{activityId} and user_id = #{userId}")
+ Sign selectByActivityIdAndUserId(@Param("activityId") Integer activityId, @Param("userId") Integer userId);
+
+ @Select("select count(*) from `sign` where activity_id = #{activityId}")
+ Integer selectByActivityId(Integer activityId);
+
+}
diff --git a/src/main/java/com/example/mapper/UserMapper.java b/src/main/java/com/example/mapper/UserMapper.java
new file mode 100644
index 0000000..7d21dad
--- /dev/null
+++ b/src/main/java/com/example/mapper/UserMapper.java
@@ -0,0 +1,24 @@
+package com.example.mapper;
+
+import com.example.entity.User;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+public interface UserMapper {
+
+ int insert(User user);
+
+ void updateById(User user);
+
+ void deleteById(Integer id);
+
+ @Select("select * from `user` where id = #{id}")
+ User selectById(Integer id);
+
+ @Select("select * from `user` where username = #{username}")
+ User selectByUsername(String username);
+
+ List selectAll(User user);
+
+}
diff --git a/src/main/java/com/example/service/ActivityService.java b/src/main/java/com/example/service/ActivityService.java
new file mode 100644
index 0000000..4762213
--- /dev/null
+++ b/src/main/java/com/example/service/ActivityService.java
@@ -0,0 +1,63 @@
+package com.example.service;
+
+import com.example.entity.Activity;
+import com.example.mapper.ActivityMapper;
+import com.example.mapper.SignMapper;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 业务层方法
+ */
+@Service
+public class ActivityService {
+
+ @Resource
+ private ActivityMapper activityMapper;
+ @Resource
+ SignMapper signMapper;
+
+ public void add(Activity activity) {
+ activityMapper.insert(activity);
+ }
+
+ public void updateById(Activity activity) {
+ activityMapper.updateById(activity);
+ }
+
+ public void deleteById(Integer id) {
+ activityMapper.deleteById(id);
+ }
+
+ public void deleteBatch(List ids) {
+ for (Integer id : ids) {
+ activityMapper.deleteById(id);
+ }
+ }
+
+ public Activity selectById(Integer id) {
+ Activity activity = activityMapper.selectById(id);
+ Integer signCount = signMapper.selectByActivityId(activity.getId());
+ activity.setSignCount(signCount);
+ return activity;
+ }
+
+ public List selectAll(Activity activity) {
+ return activityMapper.selectAll(activity);
+ }
+
+ public PageInfo selectPage(Activity activity, Integer pageNum, Integer pageSize) {
+ PageHelper.startPage(pageNum, pageSize);
+ List list = activityMapper.selectAll(activity);
+ for (Activity a : list) {
+ Integer signCount = signMapper.selectByActivityId(a.getId());
+ a.setSignCount(signCount);
+ }
+ return PageInfo.of(list);
+ }
+
+}
diff --git a/src/main/java/com/example/service/AdminService.java b/src/main/java/com/example/service/AdminService.java
new file mode 100644
index 0000000..0b25130
--- /dev/null
+++ b/src/main/java/com/example/service/AdminService.java
@@ -0,0 +1,103 @@
+package com.example.service;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.example.common.Constants;
+import com.example.common.enums.ResultCodeEnum;
+import com.example.common.enums.RoleEnum;
+import com.example.entity.Account;
+import com.example.entity.Admin;
+import com.example.exception.CustomException;
+import com.example.mapper.AdminMapper;
+import com.example.utils.TokenUtils;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 业务层方法
+ */
+@Service
+public class AdminService {
+
+ @Resource
+ private AdminMapper adminMapper;
+
+ public void add(Admin admin) {
+ Admin dbAdmin = adminMapper.selectByUsername(admin.getUsername());
+ if (ObjectUtil.isNotNull(dbAdmin)) {
+ throw new CustomException(ResultCodeEnum.USER_EXIST_ERROR);
+ }
+ if (ObjectUtil.isEmpty(admin.getPassword())) {
+ admin.setPassword(Constants.USER_DEFAULT_PASSWORD);
+ }
+ if (ObjectUtil.isEmpty(admin.getName())) {
+ admin.setName(admin.getUsername());
+ }
+ admin.setRole(RoleEnum.ADMIN.name());
+ adminMapper.insert(admin);
+ }
+
+ public void updateById(Admin admin) {
+ adminMapper.updateById(admin);
+ }
+
+ public void deleteById(Integer id) {
+ adminMapper.deleteById(id);
+ }
+
+ public void deleteBatch(List ids) {
+ for (Integer id : ids) {
+ adminMapper.deleteById(id);
+ }
+ }
+
+ public Admin selectById(Integer id) {
+ return adminMapper.selectById(id);
+ }
+
+ public List selectAll(Admin admin) {
+ return adminMapper.selectAll(admin);
+ }
+
+ public PageInfo selectPage(Admin admin, Integer pageNum, Integer pageSize) {
+ PageHelper.startPage(pageNum, pageSize);
+ List list = adminMapper.selectAll(admin);
+ return PageInfo.of(list);
+ }
+
+ /**
+ * 登录
+ */
+ public Admin login(Account account) {
+ Admin dbAdmin = adminMapper.selectByUsername(account.getUsername());
+ if (ObjectUtil.isNull(dbAdmin)) {
+ throw new CustomException(ResultCodeEnum.USER_NOT_EXIST_ERROR);
+ }
+ if (!dbAdmin.getPassword().equals(account.getPassword())) {
+ throw new CustomException(ResultCodeEnum.USER_ACCOUNT_ERROR);
+ }
+ // 生成token
+ String token = TokenUtils.createToken(dbAdmin.getId() + "-" + dbAdmin.getRole(), dbAdmin.getPassword());
+ dbAdmin.setToken(token);
+ return dbAdmin;
+ }
+
+ /**
+ * 修改密码
+ */
+ public void updatePassword(Account account) {
+ Admin dbAdmin = adminMapper.selectByUsername(account.getUsername());
+ if (ObjectUtil.isNull(dbAdmin)) {
+ throw new CustomException(ResultCodeEnum.USER_NOT_EXIST_ERROR);
+ }
+ if (!account.getPassword().equals(dbAdmin.getPassword())) {
+ throw new CustomException(ResultCodeEnum.PARAM_PASSWORD_ERROR);
+ }
+ dbAdmin.setPassword(account.getNewPassword());
+ adminMapper.updateById(dbAdmin);
+ }
+
+}
diff --git a/src/main/java/com/example/service/BookService.java b/src/main/java/com/example/service/BookService.java
new file mode 100644
index 0000000..cb153b7
--- /dev/null
+++ b/src/main/java/com/example/service/BookService.java
@@ -0,0 +1,117 @@
+package com.example.service;
+
+import com.example.common.enums.RoleEnum;
+import com.example.entity.Account;
+import com.example.entity.Book;
+import com.example.entity.Rem;
+import com.example.entity.User;
+import com.example.mapper.BookMapper;
+import com.example.mapper.RemMapper;
+import com.example.utils.TokenUtils;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 业务层方法
+ */
+@Service
+public class BookService {
+
+ @Resource
+ private BookMapper bookMapper;
+
+ @Resource
+ private RemMapper remMapper;
+
+ public void add(Book book) {
+ bookMapper.insert(book);
+ }
+
+ public void updateById(Book book) {
+ bookMapper.updateById(book);
+ }
+
+ public void deleteById(Integer id) {
+ bookMapper.deleteById(id);
+ }
+
+ public void deleteBatch(List ids) {
+ for (Integer id : ids) {
+ bookMapper.deleteById(id);
+ }
+ }
+
+ public Book selectById(Integer id) {
+ return bookMapper.selectById(id);
+ }
+
+ public List selectAll(Book book) {
+ Account currentUser = TokenUtils.getCurrentUser();
+ if (currentUser == null || RoleEnum.USER.name().equals(currentUser.getRole())) {
+ book.setGrounding(true); // 普通用户只能看到上架的图书
+ }
+ return bookMapper.selectAll(book);
+ }
+
+ public PageInfo selectPage(Book book, Integer pageNum, Integer pageSize) {
+ Account currentUser = TokenUtils.getCurrentUser();
+ if (currentUser == null || RoleEnum.USER.name().equals(currentUser.getRole())) {
+ book.setGrounding(true); // 普通用户只能看到上架的图书
+ }
+ PageHelper.startPage(pageNum, pageSize);
+ List list = bookMapper.selectAll(book);
+ return PageInfo.of(list);
+ }
+
+ public List selectHot() {
+ return bookMapper.selectHot();
+ }
+
+ /**
+ * 推荐
+ * @return
+ */
+ public List rem() {
+ ArrayList books = new ArrayList<>();
+
+ Account currentUser = TokenUtils.getCurrentUser();
+ //获取用户编号
+ Integer userId = currentUser.getId();
+
+ Rem rem = remMapper.findUserById(userId);
+ if (rem == null){
+ List bookList = bookMapper.selectOrderScore();
+ for (Integer bookId : bookList) {
+ Book book = bookMapper.selectById(bookId);
+ if (book !=null){
+ books.add(book);
+ }
+ }
+ return books;
+ }
+// 用户不为空
+ String[] split = rem.getScore().split(",");
+ List scoreList = new ArrayList<>(Arrays.asList(split));
+
+ for (String item : scoreList) {
+ String[] items = item.split(":");
+// 书籍编号
+ String bookId = items[0];
+// 评分
+ String score = items[1];
+ Book book = bookMapper.selectById(Integer.valueOf(bookId));
+ if (book !=null){
+ book.setScore(score);
+ books.add(book);
+ }
+ }
+ return books;
+ }
+}
diff --git a/src/main/java/com/example/service/CartService.java b/src/main/java/com/example/service/CartService.java
new file mode 100644
index 0000000..4d2f9e0
--- /dev/null
+++ b/src/main/java/com/example/service/CartService.java
@@ -0,0 +1,70 @@
+package com.example.service;
+
+import cn.hutool.core.date.DateUtil;
+import com.example.common.enums.RoleEnum;
+import com.example.entity.Account;
+import com.example.entity.Cart;
+import com.example.mapper.CartMapper;
+import com.example.utils.TokenUtils;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 业务层方法
+ */
+@Service
+public class CartService {
+
+ @Resource
+ private CartMapper cartMapper;
+
+ public void add(Cart cart) {
+ Account currentUser = TokenUtils.getCurrentUser();
+ cart.setUserId(currentUser.getId());
+ cart.setTime(DateUtil.now());
+ cartMapper.insert(cart);
+ }
+
+ public void updateById(Cart cart) {
+ cartMapper.updateById(cart);
+ }
+
+ public void deleteById(Integer id) {
+ cartMapper.deleteById(id);
+ }
+
+ public void deleteBatch(List ids) {
+ for (Integer id : ids) {
+ cartMapper.deleteById(id);
+ }
+ }
+
+ public Cart selectById(Integer id) {
+ return cartMapper.selectById(id);
+ }
+
+ public List selectAll(Cart cart) {
+ // 用户只查询自己的订单
+ Account currentUser = TokenUtils.getCurrentUser();
+ if (RoleEnum.USER.name().equals(currentUser.getRole())) {
+ cart.setUserId(currentUser.getId());
+ }
+ return cartMapper.selectAll(cart);
+ }
+
+ public PageInfo selectPage(Cart cart, Integer pageNum, Integer pageSize) {
+ // 用户只查询自己的订单
+ Account currentUser = TokenUtils.getCurrentUser();
+ if (RoleEnum.USER.name().equals(currentUser.getRole())) {
+ cart.setUserId(currentUser.getId());
+ }
+ PageHelper.startPage(pageNum, pageSize);
+ List list = cartMapper.selectAll(cart);
+ return PageInfo.of(list);
+ }
+
+}
diff --git a/src/main/java/com/example/service/CategoryService.java b/src/main/java/com/example/service/CategoryService.java
new file mode 100644
index 0000000..fb1d92b
--- /dev/null
+++ b/src/main/java/com/example/service/CategoryService.java
@@ -0,0 +1,53 @@
+package com.example.service;
+
+import com.example.entity.Category;
+import com.example.mapper.CategoryMapper;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 业务层方法
+ */
+@Service
+public class CategoryService {
+
+ @Resource
+ private CategoryMapper categoryMapper;
+
+ public void add(Category category) {
+ categoryMapper.insert(category);
+ }
+
+ public void updateById(Category category) {
+ categoryMapper.updateById(category);
+ }
+
+ public void deleteById(Integer id) {
+ categoryMapper.deleteById(id);
+ }
+
+ public void deleteBatch(List ids) {
+ for (Integer id : ids) {
+ categoryMapper.deleteById(id);
+ }
+ }
+
+ public Category selectById(Integer id) {
+ return categoryMapper.selectById(id);
+ }
+
+ public List selectAll(Category category) {
+ return categoryMapper.selectAll(category);
+ }
+
+ public PageInfo selectPage(Category category, Integer pageNum, Integer pageSize) {
+ PageHelper.startPage(pageNum, pageSize);
+ List list = categoryMapper.selectAll(category);
+ return PageInfo.of(list);
+ }
+
+}
diff --git a/src/main/java/com/example/service/CollectService.java b/src/main/java/com/example/service/CollectService.java
new file mode 100644
index 0000000..7295743
--- /dev/null
+++ b/src/main/java/com/example/service/CollectService.java
@@ -0,0 +1,69 @@
+package com.example.service;
+
+import cn.hutool.core.date.DateUtil;
+import com.example.common.enums.RoleEnum;
+import com.example.entity.Account;
+import com.example.entity.Collect;
+import com.example.exception.CustomException;
+import com.example.mapper.CollectMapper;
+import com.example.utils.TokenUtils;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 业务层方法
+ */
+@Service
+public class CollectService {
+
+ @Resource
+ private CollectMapper collectMapper;
+
+ public void add(Collect collect) {
+ Account currentUser = TokenUtils.getCurrentUser();
+ Collect dbCollect = collectMapper.selectByActivityIdAndUserId(collect.getActivityId(), currentUser.getId());
+ if (dbCollect != null) { // 查询用户是否收藏过当前的活动
+ throw new CustomException("500", "对不起,您已收藏过该活动");
+ }
+ collect.setUserId(currentUser.getId());
+ collect.setTime(DateUtil.now());
+ collectMapper.insert(collect);
+ }
+
+ public void updateById(Collect collect) {
+ collectMapper.updateById(collect);
+ }
+
+ public void deleteById(Integer id) {
+ collectMapper.deleteById(id);
+ }
+
+ public void deleteBatch(List ids) {
+ for (Integer id : ids) {
+ collectMapper.deleteById(id);
+ }
+ }
+
+ public Collect selectById(Integer id) {
+ return collectMapper.selectById(id);
+ }
+
+ public List selectAll(Collect collect) {
+ return collectMapper.selectAll(collect);
+ }
+
+ public PageInfo selectPage(Collect collect, Integer pageNum, Integer pageSize) {
+ Account currentUser = TokenUtils.getCurrentUser();
+ if (RoleEnum.USER.name().equals(currentUser.getRole())) {
+ collect.setUserId(currentUser.getId());
+ }
+ PageHelper.startPage(pageNum, pageSize);
+ List list = collectMapper.selectAll(collect);
+ return PageInfo.of(list);
+ }
+
+}
diff --git a/src/main/java/com/example/service/CommentService.java b/src/main/java/com/example/service/CommentService.java
new file mode 100644
index 0000000..ebce1df
--- /dev/null
+++ b/src/main/java/com/example/service/CommentService.java
@@ -0,0 +1,94 @@
+package com.example.service;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUtil;
+import com.example.entity.Account;
+import com.example.entity.Comment;
+import com.example.mapper.CommentMapper;
+import com.example.utils.TokenUtils;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 业务层方法
+ */
+@Service
+public class CommentService {
+
+ @Resource
+ private CommentMapper commentMapper;
+
+ public void add(Comment comment) {
+ Account currentUser = TokenUtils.getCurrentUser();
+ comment.setUserId(currentUser.getId());
+ comment.setTime(DateUtil.now());
+ commentMapper.insert(comment);
+ Integer id = comment.getId();
+ if (comment.getPid() == null) { // 最外层的评论
+ comment.setRootId(id);
+ } else { // 回复的评论
+ Integer pid = comment.getPid();
+ Comment pComment = commentMapper.selectById(pid); // 父级评论
+ comment.setRootId(pComment.getRootId());
+ }
+ commentMapper.updateById(comment);
+ }
+
+ public void updateById(Comment comment) {
+ commentMapper.updateById(comment);
+ }
+
+ public void deleteById(Integer id) {
+ commentMapper.deleteById(id);
+ }
+
+ public void deepDelete(Integer pid) {
+ commentMapper.deleteById(pid); // 删除当前的评论
+ List children = commentMapper.selectByPid(pid);// 再递归删除子评论
+ if (CollUtil.isNotEmpty(children)) {
+ for (Comment child : children) {
+ this.deepDelete(child.getId());
+ }
+ }
+ }
+
+ public void deleteBatch(List ids) {
+ for (Integer id : ids) {
+ commentMapper.deleteById(id);
+ }
+ }
+
+ public Comment selectById(Integer id) {
+ return commentMapper.selectById(id);
+ }
+
+ public List selectAll(Comment comment) {
+ return commentMapper.selectAll(comment);
+ }
+
+ public PageInfo selectPage(Comment comment, Integer pageNum, Integer pageSize) {
+ PageHelper.startPage(pageNum, pageSize);
+ List list = commentMapper.selectAll(comment);
+ return PageInfo.of(list);
+ }
+
+ public PageInfo selectTree(String module, Integer fid, Integer pageNum, Integer pageSize) {
+ PageHelper.startPage(pageNum, pageSize);
+ List rootList = commentMapper.selectByModuleAndFid(module, fid);
+ for (Comment root : rootList) {
+ Integer rootId = root.getRootId();
+ List children = commentMapper.selectByRootId(rootId);
+ root.setChildren(children);
+ }
+ return PageInfo.of(rootList);
+ }
+
+ public Integer selectCount(String module, Integer fid) {
+ return commentMapper.selectCount(module, fid);
+ }
+
+}
diff --git a/src/main/java/com/example/service/NoticeService.java b/src/main/java/com/example/service/NoticeService.java
new file mode 100644
index 0000000..9fc72d9
--- /dev/null
+++ b/src/main/java/com/example/service/NoticeService.java
@@ -0,0 +1,55 @@
+package com.example.service;
+
+import cn.hutool.core.date.DateUtil;
+import com.example.entity.Notice;
+import com.example.mapper.NoticeMapper;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 业务层方法
+ */
+@Service
+public class NoticeService {
+
+ @Resource
+ private NoticeMapper noticeMapper;
+
+ public void add(Notice notice) {
+ notice.setTime(DateUtil.now());
+ noticeMapper.insert(notice);
+ }
+
+ public void updateById(Notice notice) {
+ noticeMapper.updateById(notice);
+ }
+
+ public void deleteById(Integer id) {
+ noticeMapper.deleteById(id);
+ }
+
+ public void deleteBatch(List ids) {
+ for (Integer id : ids) {
+ noticeMapper.deleteById(id);
+ }
+ }
+
+ public Notice selectById(Integer id) {
+ return noticeMapper.selectById(id);
+ }
+
+ public List selectAll(Notice notice) {
+ return noticeMapper.selectAll(notice);
+ }
+
+ public PageInfo selectPage(Notice notice, Integer pageNum, Integer pageSize) {
+ PageHelper.startPage(pageNum, pageSize);
+ List list = noticeMapper.selectAll(notice);
+ return PageInfo.of(list);
+ }
+
+}
diff --git a/src/main/java/com/example/service/OrdersItemService.java b/src/main/java/com/example/service/OrdersItemService.java
new file mode 100644
index 0000000..932d4e5
--- /dev/null
+++ b/src/main/java/com/example/service/OrdersItemService.java
@@ -0,0 +1,56 @@
+package com.example.service;
+
+import com.example.entity.OrdersItem;
+import com.example.mapper.OrdersItemMapper;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 业务层方法
+ */
+@Service
+public class OrdersItemService {
+
+ @Resource
+ private OrdersItemMapper ordersItemMapper;
+
+ public void add(OrdersItem ordersItem) {
+ ordersItemMapper.insert(ordersItem);
+ }
+
+ public void updateById(OrdersItem ordersItem) {
+ ordersItemMapper.updateById(ordersItem);
+ }
+
+ public void deleteById(Integer id) {
+ ordersItemMapper.deleteById(id);
+ }
+
+ public void deleteBatch(List ids) {
+ for (Integer id : ids) {
+ ordersItemMapper.deleteById(id);
+ }
+ }
+
+ public OrdersItem selectById(Integer id) {
+ return ordersItemMapper.selectById(id);
+ }
+
+ public List selectAll(OrdersItem ordersItem) {
+ return ordersItemMapper.selectAll(ordersItem);
+ }
+
+ public PageInfo selectPage(OrdersItem ordersItem, Integer pageNum, Integer pageSize) {
+ PageHelper.startPage(pageNum, pageSize);
+ List list = ordersItemMapper.selectAll(ordersItem);
+ return PageInfo.of(list);
+ }
+
+ public List selectByOrderId(Integer orderId) {
+ return ordersItemMapper.selectByOrderId(orderId);
+ }
+}
diff --git a/src/main/java/com/example/service/OrdersService.java b/src/main/java/com/example/service/OrdersService.java
new file mode 100644
index 0000000..7dc536d
--- /dev/null
+++ b/src/main/java/com/example/service/OrdersService.java
@@ -0,0 +1,189 @@
+package com.example.service;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.IdUtil;
+import com.example.common.enums.RoleEnum;
+import com.example.entity.*;
+import com.example.exception.CustomException;
+import com.example.mapper.BookMapper;
+import com.example.mapper.OrdersItemMapper;
+import com.example.mapper.OrdersMapper;
+import com.example.utils.TokenUtils;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 业务层方法
+ */
+@Service
+public class OrdersService {
+
+ @Resource
+ private OrdersMapper ordersMapper;
+ @Resource
+ private BookMapper bookMapper;
+ @Resource
+ private OrdersItemMapper ordersItemMapper;
+ @Resource
+ private CartService cartService;
+ @Resource
+ private UserService userService;
+
+ public void add(Orders orders) {
+ Account currentUser = TokenUtils.getCurrentUser();
+ if (currentUser.getScore() < 50) {
+ throw new CustomException("500", "对不起,信誉分低于50无法借阅");
+ }
+ List cartList = orders.getCartList();
+ // 书单批量借阅
+ if (CollUtil.isNotEmpty(cartList)) { // 通过书单批量借阅
+ String name = "";
+ int num = 0;
+ for (Cart cart : cartList) {
+ Integer bookId = cart.getBookId();
+ // 查询书信息
+ Book book = bookMapper.selectById(bookId);
+ name += book.getName() + ",";
+ num += cart.getNum(); // 总共借书的数量计算出来
+ if (book == null) {
+ throw new CustomException("500", "图书不存在");
+ }
+ Integer store = book.getStore(); // 图书库存
+ if (cart.getNum() > store) { // 借书的数量超出了库存量 无法借出
+ throw new CustomException("500", "图书库存不足");
+ }
+ }
+ name = name.substring(0, name.length() - 1);
+ name += "等" + num + "本图书";
+ orders.setName(name);
+ } else { // 单个借阅
+ // 查询书信息
+ Book book = bookMapper.selectById(orders.getBookId());
+ if (book == null) {
+ throw new CustomException("500", "图书不存在");
+ }
+ Integer store = book.getStore(); // 图书库存
+ if (orders.getNum() > store) { // 借书的数量超出了库存量 无法借出
+ throw new CustomException("500", "图书库存不足");
+ }
+ orders.setName(book.getName() + "等" + orders.getNum() + "本图书");
+ }
+
+ orders.setTime(DateUtil.now());
+ orders.setUserId(currentUser.getId());
+ orders.setStatus("借书待确认"); // 借书待确认 已借出 还书待确认 已归还
+ orders.setOrderNo(IdUtil.getSnowflakeNextIdStr()); // 唯一订单编号
+ ordersMapper.insert(orders); // 插入数据库并返回的订单的主键ID
+
+ // 批量借阅情形
+ if (CollUtil.isNotEmpty(cartList)) {
+ for (Cart cart : cartList) {
+ this.setOrdersItem(orders, cart.getNum(), cart.getBookId());
+ // 借完书 要删除对应购物车的借书数据
+ cartService.deleteById(cart.getId());
+ }
+ } else { // 单个借阅情形
+ this.setOrdersItem(orders, orders.getNum(), orders.getBookId());
+ }
+
+ }
+
+ // 插入 order_item 数据的方法
+ private void setOrdersItem(Orders orders, Integer num, Integer bookId) {
+ OrdersItem ordersItem = new OrdersItem();
+ ordersItem.setOrderId(orders.getId());
+ Book book = bookMapper.selectById(bookId); // 查询书单里面单个图书的信息
+ ordersItem.setNum(num);
+ ordersItem.setBookCover(book.getCover());
+ ordersItem.setBookName(book.getName());
+ ordersItem.setBookId(bookId);
+ ordersItemMapper.insert(ordersItem); // 一个一个往数据库插入详情数据
+ }
+
+ @Transactional
+ public void updateById(Orders orders) {
+ // 扣减库存
+ Account currentUser = TokenUtils.getCurrentUser();
+ if (RoleEnum.ADMIN.name().equals(currentUser.getRole())) {
+ if ("已借出".equals(orders.getStatus())) { // 扣减库存
+ List ordersItems = ordersItemMapper.selectByOrderId(orders.getId());
+ for (OrdersItem ordersItem : ordersItems) { // 查询本次借的所有图书 按个扣减库存
+ Integer bookId = ordersItem.getBookId();
+ Book book = bookMapper.selectById(bookId);
+ Integer num = ordersItem.getNum(); // 借书的数量
+ book.setStore(book.getStore() - num);
+ bookMapper.updateById(book); // 更新图书库存
+ }
+ }
+ if ("已归还".equals(orders.getStatus())) { // 加库存
+ List ordersItems = ordersItemMapper.selectByOrderId(orders.getId());
+ for (OrdersItem ordersItem : ordersItems) { // 查询本次借的所有图书 按个加库存
+ Integer bookId = ordersItem.getBookId();
+ Book book = bookMapper.selectById(bookId);
+ Integer num = ordersItem.getNum(); // 借书的数量
+ book.setStore(book.getStore() + num);
+ bookMapper.updateById(book); // 更新图书库存
+
+ // 更新信誉分 当借出的天数超过30天 就会扣除信誉分
+ String time = orders.getTime();
+ long between = 1 + DateUtil.between(DateUtil.parseDate(time), new Date(), DateUnit.DAY);// 计算借书的时长(天)
+ if (between > 30) {
+ Integer userId = orders.getUserId();
+ User user = userService.selectById(userId);
+ user.setScore(user.getScore() - 10);
+ userService.updateById(user);
+ }
+ }
+ }
+ }
+ ordersMapper.updateById(orders);
+ }
+
+ public void deleteById(Integer id) {
+ ordersMapper.deleteById(id);
+ }
+
+ public void deleteBatch(List ids) {
+ for (Integer id : ids) {
+ ordersMapper.deleteById(id);
+ }
+ }
+
+ public Orders selectById(Integer id) {
+ return ordersMapper.selectById(id);
+ }
+
+ public List selectAll(Orders orders) {
+ return ordersMapper.selectAll(orders);
+ }
+
+ public PageInfo selectPage(Orders orders, Integer pageNum, Integer pageSize) {
+ // 用户只查询自己的订单
+ Account currentUser = TokenUtils.getCurrentUser();
+ if (RoleEnum.USER.name().equals(currentUser.getRole())) {
+ orders.setUserId(currentUser.getId());
+ }
+ PageHelper.startPage(pageNum, pageSize);
+ List list = ordersMapper.selectAll(orders);
+ for (Orders o : list) {
+ String time = o.getTime();
+ long between = 1 + DateUtil.between(DateUtil.parseDate(time), new Date(), DateUnit.DAY);// 计算借书的时长(天)
+ if (o.getStatus().equals("已借出") || o.getStatus().equals("还书待确认")) {
+ o.setDays(between);
+ }
+ }
+ return PageInfo.of(list);
+ }
+
+ public Integer selectDayCount(String day) {
+ return ordersMapper.selectDayCount(day);
+ }
+}
diff --git a/src/main/java/com/example/service/PostsSectionService.java b/src/main/java/com/example/service/PostsSectionService.java
new file mode 100644
index 0000000..eade192
--- /dev/null
+++ b/src/main/java/com/example/service/PostsSectionService.java
@@ -0,0 +1,53 @@
+package com.example.service;
+
+import com.example.entity.PostsSection;
+import com.example.mapper.PostsSectionMapper;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 业务层方法
+ */
+@Service
+public class PostsSectionService {
+
+ @Resource
+ private PostsSectionMapper postsSectionMapper;
+
+ public void add(PostsSection postsSection) {
+ postsSectionMapper.insert(postsSection);
+ }
+
+ public void updateById(PostsSection postsSection) {
+ postsSectionMapper.updateById(postsSection);
+ }
+
+ public void deleteById(Integer id) {
+ postsSectionMapper.deleteById(id);
+ }
+
+ public void deleteBatch(List ids) {
+ for (Integer id : ids) {
+ postsSectionMapper.deleteById(id);
+ }
+ }
+
+ public PostsSection selectById(Integer id) {
+ return postsSectionMapper.selectById(id);
+ }
+
+ public List selectAll(PostsSection postsSection) {
+ return postsSectionMapper.selectAll(postsSection);
+ }
+
+ public PageInfo selectPage(PostsSection postsSection, Integer pageNum, Integer pageSize) {
+ PageHelper.startPage(pageNum, pageSize);
+ List list = postsSectionMapper.selectAll(postsSection);
+ return PageInfo.of(list);
+ }
+
+}
diff --git a/src/main/java/com/example/service/PostsService.java b/src/main/java/com/example/service/PostsService.java
new file mode 100644
index 0000000..929abae
--- /dev/null
+++ b/src/main/java/com/example/service/PostsService.java
@@ -0,0 +1,68 @@
+package com.example.service;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.http.HtmlUtil;
+import com.example.entity.Account;
+import com.example.entity.Posts;
+import com.example.mapper.PostsMapper;
+import com.example.utils.TokenUtils;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 业务层方法
+ */
+@Service
+public class PostsService {
+
+ @Resource
+ private PostsMapper postsMapper;
+
+ public void add(Posts posts) {
+ Account currentUser = TokenUtils.getCurrentUser();
+ posts.setUserId(currentUser.getId());
+ posts.setTime(DateUtil.now());
+ posts.setReadCount(0);
+ postsMapper.insert(posts);
+ }
+
+ public void updateById(Posts posts) {
+ postsMapper.updateById(posts);
+ }
+
+ public void deleteById(Integer id) {
+ postsMapper.deleteById(id);
+ }
+
+ public void deleteBatch(List ids) {
+ for (Integer id : ids) {
+ postsMapper.deleteById(id);
+ }
+ }
+
+ public Posts selectById(Integer id) {
+ return postsMapper.selectById(id);
+ }
+
+ public List selectAll(Posts posts) {
+ return postsMapper.selectAll(posts);
+ }
+
+ public PageInfo selectPage(Posts posts, Integer pageNum, Integer pageSize) {
+ PageHelper.startPage(pageNum, pageSize);
+ List list = postsMapper.selectAll(posts);
+ for (Posts p : list) {
+ p.setSimpleContent(HtmlUtil.removeHtmlTag(p.getContent(), true, "img"));
+ p.setSimpleContent(HtmlUtil.cleanHtmlTag(p.getSimpleContent()));
+ }
+ return PageInfo.of(list);
+ }
+
+ public void updateReadCount(Integer id) {
+ postsMapper.updateReadCount(id);
+ }
+}
diff --git a/src/main/java/com/example/service/RoomService.java b/src/main/java/com/example/service/RoomService.java
new file mode 100644
index 0000000..736cd6d
--- /dev/null
+++ b/src/main/java/com/example/service/RoomService.java
@@ -0,0 +1,53 @@
+package com.example.service;
+
+import com.example.entity.Room;
+import com.example.mapper.RoomMapper;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 业务层方法
+ */
+@Service
+public class RoomService {
+
+ @Resource
+ private RoomMapper roomMapper;
+
+ public void add(Room room) {
+ roomMapper.insert(room);
+ }
+
+ public void updateById(Room room) {
+ roomMapper.updateById(room);
+ }
+
+ public void deleteById(Integer id) {
+ roomMapper.deleteById(id);
+ }
+
+ public void deleteBatch(List ids) {
+ for (Integer id : ids) {
+ roomMapper.deleteById(id);
+ }
+ }
+
+ public Room selectById(Integer id) {
+ return roomMapper.selectById(id);
+ }
+
+ public List selectAll(Room room) {
+ return roomMapper.selectAll(room);
+ }
+
+ public PageInfo selectPage(Room room, Integer pageNum, Integer pageSize) {
+ PageHelper.startPage(pageNum, pageSize);
+ List list = roomMapper.selectAll(room);
+ return PageInfo.of(list);
+ }
+
+}
diff --git a/src/main/java/com/example/service/SeatReserveService.java b/src/main/java/com/example/service/SeatReserveService.java
new file mode 100644
index 0000000..2431f74
--- /dev/null
+++ b/src/main/java/com/example/service/SeatReserveService.java
@@ -0,0 +1,86 @@
+package com.example.service;
+
+import cn.hutool.core.date.DateUtil;
+import com.example.common.enums.RoleEnum;
+import com.example.entity.Account;
+import com.example.entity.Seat;
+import com.example.entity.SeatReserve;
+import com.example.mapper.SeatMapper;
+import com.example.mapper.SeatReserveMapper;
+import com.example.utils.TokenUtils;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 业务层方法
+ */
+@Service
+public class SeatReserveService {
+
+ @Resource
+ private SeatReserveMapper seatReserveMapper;
+
+ @Resource
+ SeatMapper seatMapper;
+
+ @Transactional
+ public void add(SeatReserve seatReserve) {
+ Account currentUser = TokenUtils.getCurrentUser();
+ seatReserve.setUserId(currentUser.getId());
+ seatReserve.setTime(DateUtil.now()); // 预约时间
+ seatReserve.setStatus("已选");
+ seatReserveMapper.insert(seatReserve);
+
+ Seat seat = seatMapper.selectById(seatReserve.getSeatId()); // 查询出座位的信息
+ seat.setStatus("已选");
+ seatMapper.updateById(seat);
+ }
+
+ @Transactional
+ public void updateById(SeatReserve seatReserve) {
+ Account currentUser = TokenUtils.getCurrentUser();
+ if (RoleEnum.USER.name().equals(currentUser.getRole()) && "已退".equals(seatReserve.getStatus())) {
+ Seat seat = seatMapper.selectById(seatReserve.getSeatId()); // 查询出座位的信息
+ seat.setStatus("未选");
+ seatMapper.updateById(seat);
+ }
+ seatReserveMapper.updateById(seatReserve);
+ }
+
+ public void deleteById(Integer id) {
+ seatReserveMapper.deleteById(id);
+ }
+
+ public void deleteBatch(List ids) {
+ for (Integer id : ids) {
+ seatReserveMapper.deleteById(id);
+ }
+ }
+
+ public SeatReserve selectById(Integer id) {
+ return seatReserveMapper.selectById(id);
+ }
+
+ public List selectAll(SeatReserve seatReserve) {
+ return seatReserveMapper.selectAll(seatReserve);
+ }
+
+ public PageInfo selectPage(SeatReserve seatReserve, Integer pageNum, Integer pageSize) {
+ Account currentUser = TokenUtils.getCurrentUser();
+ if (RoleEnum.USER.name().equals(currentUser.getRole())) {
+ seatReserve.setUserId(currentUser.getId());
+ }
+ PageHelper.startPage(pageNum, pageSize);
+ List list = seatReserveMapper.selectAll(seatReserve);
+ return PageInfo.of(list);
+ }
+
+ public Integer selectDayCount(String day) {
+ return seatReserveMapper.selectDayCount(day);
+ }
+}
diff --git a/src/main/java/com/example/service/SeatService.java b/src/main/java/com/example/service/SeatService.java
new file mode 100644
index 0000000..82a8139
--- /dev/null
+++ b/src/main/java/com/example/service/SeatService.java
@@ -0,0 +1,54 @@
+package com.example.service;
+
+import com.example.entity.Seat;
+import com.example.mapper.SeatMapper;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 业务层方法
+ */
+@Service
+public class SeatService {
+
+ @Resource
+ private SeatMapper seatMapper;
+
+ public void add(Seat seat) {
+ seat.setStatus("未选");
+ seatMapper.insert(seat);
+ }
+
+ public void updateById(Seat seat) {
+ seatMapper.updateById(seat);
+ }
+
+ public void deleteById(Integer id) {
+ seatMapper.deleteById(id);
+ }
+
+ public void deleteBatch(List ids) {
+ for (Integer id : ids) {
+ seatMapper.deleteById(id);
+ }
+ }
+
+ public Seat selectById(Integer id) {
+ return seatMapper.selectById(id);
+ }
+
+ public List selectAll(Seat seat) {
+ return seatMapper.selectAll(seat);
+ }
+
+ public PageInfo selectPage(Seat seat, Integer pageNum, Integer pageSize) {
+ PageHelper.startPage(pageNum, pageSize);
+ List list = seatMapper.selectAll(seat);
+ return PageInfo.of(list);
+ }
+
+}
diff --git a/src/main/java/com/example/service/SignService.java b/src/main/java/com/example/service/SignService.java
new file mode 100644
index 0000000..2fccff3
--- /dev/null
+++ b/src/main/java/com/example/service/SignService.java
@@ -0,0 +1,78 @@
+package com.example.service;
+
+import cn.hutool.core.date.DateUtil;
+import com.example.common.enums.RoleEnum;
+import com.example.entity.Account;
+import com.example.entity.Activity;
+import com.example.entity.Sign;
+import com.example.exception.CustomException;
+import com.example.mapper.SignMapper;
+import com.example.utils.TokenUtils;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 业务层方法
+ */
+@Service
+public class SignService {
+
+ @Resource
+ private SignMapper signMapper;
+ @Resource
+ private ActivityService activityService;
+
+ public void add(Sign sign) {
+ Activity activity = activityService.selectById(sign.getActivityId());
+ if (activity.getStatus().equals("已结束")) {
+ throw new CustomException("500", "对不起,该活动已结束,无法报名");
+ }
+ Account currentUser = TokenUtils.getCurrentUser();
+ // 查询用户是否已报名过
+ Sign dbSign = signMapper.selectByActivityIdAndUserId(sign.getActivityId(), currentUser.getId());
+ if (dbSign != null) {
+ throw new CustomException("500", "对不起,您已报名过该活动");
+ }
+ sign.setTime(DateUtil.now());
+ sign.setUserId(currentUser.getId());
+ sign.setSign("未签到");
+ signMapper.insert(sign);
+ }
+
+ public void updateById(Sign sign) {
+ signMapper.updateById(sign);
+ }
+
+ public void deleteById(Integer id) {
+ signMapper.deleteById(id);
+ }
+
+ public void deleteBatch(List ids) {
+ for (Integer id : ids) {
+ signMapper.deleteById(id);
+ }
+ }
+
+ public Sign selectById(Integer id) {
+ return signMapper.selectById(id);
+ }
+
+ public List selectAll(Sign sign) {
+ return signMapper.selectAll(sign);
+ }
+
+ public PageInfo selectPage(Sign sign, Integer pageNum, Integer pageSize) {
+ Account currentUser = TokenUtils.getCurrentUser();
+ if (RoleEnum.USER.name().equals(currentUser.getRole())) {
+ sign.setUserId(currentUser.getId());
+ }
+ PageHelper.startPage(pageNum, pageSize);
+ List list = signMapper.selectAll(sign);
+ return PageInfo.of(list);
+ }
+
+}
diff --git a/src/main/java/com/example/service/UserService.java b/src/main/java/com/example/service/UserService.java
new file mode 100644
index 0000000..13c1870
--- /dev/null
+++ b/src/main/java/com/example/service/UserService.java
@@ -0,0 +1,105 @@
+package com.example.service;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.example.common.Constants;
+import com.example.common.enums.ResultCodeEnum;
+import com.example.common.enums.RoleEnum;
+import com.example.entity.Account;
+import com.example.entity.Admin;
+import com.example.entity.User;
+import com.example.exception.CustomException;
+import com.example.mapper.UserMapper;
+import com.example.utils.TokenUtils;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 业务层方法
+ */
+@Service
+public class UserService {
+
+ @Resource
+ private UserMapper userMapper;
+
+ public void add(User user) {
+ User dbUser = userMapper.selectByUsername(user.getUsername());
+ if (ObjectUtil.isNotNull(dbUser)) {
+ throw new CustomException(ResultCodeEnum.USER_EXIST_ERROR);
+ }
+ if (ObjectUtil.isEmpty(user.getPassword())) {
+ user.setPassword(Constants.USER_DEFAULT_PASSWORD);
+ }
+ if (ObjectUtil.isEmpty(user.getName())) {
+ user.setName(user.getUsername());
+ }
+ user.setRole(RoleEnum.USER.name());
+ user.setScore(100); // 默认信誉分100分
+ userMapper.insert(user);
+ }
+
+ public void updateById(User user) {
+ userMapper.updateById(user);
+ }
+
+ public void deleteById(Integer id) {
+ userMapper.deleteById(id);
+ }
+
+ public void deleteBatch(List ids) {
+ for (Integer id : ids) {
+ userMapper.deleteById(id);
+ }
+ }
+
+ public User selectById(Integer id) {
+ return userMapper.selectById(id);
+ }
+
+ public List selectAll(User user) {
+ return userMapper.selectAll(user);
+ }
+
+ public PageInfo selectPage(User user, Integer pageNum, Integer pageSize) {
+ PageHelper.startPage(pageNum, pageSize);
+ List list = userMapper.selectAll(user);
+ return PageInfo.of(list);
+ }
+
+ /**
+ * 登录
+ */
+ public User login(Account account) {
+ User dbUser = userMapper.selectByUsername(account.getUsername());
+ if (ObjectUtil.isNull(dbUser)) {
+ throw new CustomException(ResultCodeEnum.USER_NOT_EXIST_ERROR);
+ }
+ if (!dbUser.getPassword().equals(account.getPassword())) {
+ throw new CustomException(ResultCodeEnum.USER_ACCOUNT_ERROR);
+ }
+ // 生成token
+ String token = TokenUtils.createToken(dbUser.getId() + "-" + dbUser.getRole(), dbUser.getPassword());
+ dbUser.setToken(token);
+ return dbUser;
+ }
+
+ /**
+ * 修改密码
+ */
+ public void updatePassword(Account account) {
+ User dbUser = userMapper.selectByUsername(account.getUsername());
+ if (ObjectUtil.isNull(dbUser)) {
+ throw new CustomException(ResultCodeEnum.USER_NOT_EXIST_ERROR);
+ }
+ if (!account.getPassword().equals(dbUser.getPassword())) {
+ throw new CustomException(ResultCodeEnum.PARAM_PASSWORD_ERROR);
+ }
+ dbUser.setPassword(account.getNewPassword());
+ userMapper.updateById(dbUser);
+ }
+
+}
diff --git a/src/main/java/com/example/utils/TokenUtils.java b/src/main/java/com/example/utils/TokenUtils.java
new file mode 100644
index 0000000..b98ee1c
--- /dev/null
+++ b/src/main/java/com/example/utils/TokenUtils.java
@@ -0,0 +1,75 @@
+package com.example.utils;
+
+import cn.hutool.core.date.DateUtil;
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.example.common.Constants;
+import com.example.common.enums.RoleEnum;
+import com.example.entity.Account;
+import com.example.service.AdminService;
+import com.example.service.UserService;
+import jakarta.annotation.PostConstruct;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import java.util.Date;
+
+/**
+ * Token工具类
+ */
+@Component
+public class TokenUtils {
+ private static final Logger log = LoggerFactory.getLogger(TokenUtils.class);
+
+ @Resource
+ private AdminService adminService;
+ @Resource
+ private UserService userService;
+
+ private static AdminService staticAdminService;
+ private static UserService staticUserService;
+
+ @PostConstruct
+ public void init() {
+ staticAdminService = adminService;
+ staticUserService = userService;
+ }
+
+ /**
+ * 生成JWT token
+ */
+ public static String createToken(String data, String sign) {
+ // audience是存储数据的一个媒介 存储用户ID和用户的角色 1-ADMIN
+ return JWT.create().withAudience(data)
+ .withExpiresAt(DateUtil.offsetDay(new Date(), 1)) // 设置过期时间1天后
+ .sign(Algorithm.HMAC256(sign));
+ }
+
+ /**
+ * 获取当前登录的用户
+ */
+ public static Account getCurrentUser() {
+ try {
+ HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+ String token = request.getHeader(Constants.TOKEN);
+ String audience = JWT.decode(token).getAudience().get(0);
+ String[] userRole = audience.split("-");
+ Integer userId = Integer.valueOf(userRole[0]);
+ String role = userRole[1];
+ if (RoleEnum.ADMIN.name().equals(role)) {
+ return staticAdminService.selectById(userId);
+ } else {
+ return staticUserService.selectById(userId);
+ }
+ } catch (Exception e) {
+ log.error("获取当前登录用户出错", e);
+ }
+ return null;
+ }
+
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
new file mode 100644
index 0000000..30b3e25
--- /dev/null
+++ b/src/main/resources/application.yml
@@ -0,0 +1,19 @@
+server:
+ port: 9090
+
+
+spring:
+ datasource:
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ username: root
+ password: 123456
+ url: jdbc:mysql://localhost:33060/block_book?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2b8&allowPublicKeyRetrieval=true
+
+
+mybatis:
+ configuration:
+ log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+ map-underscore-to-camel-case: true
+ mapper-locations: classpath:mapper/*.xml
+
+fileBaseUrl: http://localhost:${server.port}
diff --git a/src/main/resources/mapper/ActivityMapper.xml b/src/main/resources/mapper/ActivityMapper.xml
new file mode 100644
index 0000000..e07dc63
--- /dev/null
+++ b/src/main/resources/mapper/ActivityMapper.xml
@@ -0,0 +1,81 @@
+
+
+
+
+ select * from `activity`
+
+ and name like concat('%', #{name}, '%')
+
+ order by id desc
+
+
+
+ delete from `activity`
+ where id = #{id}
+
+
+
+ insert into activity
+
+ id,
+ name,
+ descr,
+ img,
+ start,
+ end,
+ location,
+ num,
+ content,
+ status,
+
+
+ #{id},
+ #{name},
+ #{descr},
+ #{img},
+ #{start},
+ #{end},
+ #{location},
+ #{num},
+ #{content},
+ #{status},
+
+
+
+
+ update activity
+
+
+ name = #{name},
+
+
+ descr = #{descr},
+
+
+ img = #{img},
+
+
+ start = #{start},
+
+
+ end = #{end},
+
+
+ location = #{location},
+
+
+ num = #{num},
+
+
+ content = #{content},
+
+
+ status = #{status},
+
+
+ where id = #{id}
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/mapper/AdminMapper.xml b/src/main/resources/mapper/AdminMapper.xml
new file mode 100644
index 0000000..6e94c52
--- /dev/null
+++ b/src/main/resources/mapper/AdminMapper.xml
@@ -0,0 +1,71 @@
+
+
+
+
+ select * from `admin`
+
+ and name like concat('%', #{name}, '%')
+
+
+
+
+ delete from `admin`
+ where id = #{id}
+
+
+
+
+ insert into `admin`
+
+ id,
+ username,
+ password,
+ name,
+ phone,
+ email,
+ avatar,
+ role,
+
+
+ #{id},
+ #{username},
+ #{password},
+ #{name},
+ #{phone},
+ #{email},
+ #{avatar},
+ #{role},
+
+
+
+
+ update `admin`
+
+
+ username = #{username},
+
+
+ password = #{password},
+
+
+ name = #{name},
+
+
+ phone = #{phone},
+
+
+ email = #{email},
+
+
+ avatar = #{avatar},
+
+
+ role = #{role},
+
+
+ where id = #{id}
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/mapper/BookMapper.xml b/src/main/resources/mapper/BookMapper.xml
new file mode 100644
index 0000000..75856ad
--- /dev/null
+++ b/src/main/resources/mapper/BookMapper.xml
@@ -0,0 +1,112 @@
+
+
+
+
+ select book.*, category.name as categoryName from `book`
+ left join category on book.category_id = category.id
+
+ and book.name like concat('%', #{name}, '%')
+ and book.isbn like concat('%', #{isbn}, '%')
+ and book.recommend = #{recommend}
+ and book.grounding = #{grounding}
+ and category.name = #{categoryName}
+
+ order by book.id desc
+
+
+
+
+
+
+ select book.*, ifnull(sum(orders_item.num), 0) as sum from book
+ left join orders_item on book.id = orders_item.book_id
+ group by orders_item.book_id
+ order by sum desc
+ limit 5
+
+
+
+ delete from `book`
+ where id = #{id}
+
+
+
+ insert into book
+
+ id,
+ name,
+ cover,
+ descr,
+ author,
+ publisher,
+ date,
+ price,
+ isbn,
+ store,
+ category_id,
+ grounding,
+ recommend,
+
+
+ #{id},
+ #{name},
+ #{cover},
+ #{descr},
+ #{author},
+ #{publisher},
+ #{date},
+ #{price},
+ #{isbn},
+ #{store},
+ #{categoryId},
+ #{grounding},
+ #{recommend},
+
+
+
+
+ update book
+
+
+ name = #{name},
+
+
+ cover = #{cover},
+
+
+ descr = #{descr},
+
+
+ author = #{author},
+
+
+ publisher = #{publisher},
+
+
+ date = #{date},
+
+
+ price = #{price},
+
+
+ isbn = #{isbn},
+
+
+ store = #{store},
+
+
+ category_id = #{categoryId},
+
+
+ grounding = #{grounding},
+
+
+ recommend = #{recommend},
+
+
+ where id = #{id}
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/mapper/CartMapper.xml b/src/main/resources/mapper/CartMapper.xml
new file mode 100644
index 0000000..03591da
--- /dev/null
+++ b/src/main/resources/mapper/CartMapper.xml
@@ -0,0 +1,57 @@
+
+
+
+
+ select cart.*, book.cover as bookCover, book.name as bookName from `cart`
+ left join book on cart.book_id = book.id
+
+ cart.user_id = #{userId}
+
+ order by cart.id desc
+
+
+
+ delete from `cart`
+ where id = #{id}
+
+
+
+ insert into cart
+
+ id,
+ book_id,
+ num,
+ user_id,
+ time,
+
+
+ #{id},
+ #{bookId},
+ #{num},
+ #{userId},
+ #{time},
+
+
+
+
+ update cart
+
+
+ book_id = #{bookId},
+
+
+ num = #{num},
+
+
+ user_id = #{userId},
+
+
+ time = #{time},
+
+
+ where id = #{id}
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/mapper/CategoryMapper.xml b/src/main/resources/mapper/CategoryMapper.xml
new file mode 100644
index 0000000..3d69b96
--- /dev/null
+++ b/src/main/resources/mapper/CategoryMapper.xml
@@ -0,0 +1,40 @@
+
+
+
+
+ select * from `category`
+
+ and name like concat('%', #{name}, '%')
+
+
+
+
+ delete from `category`
+ where id = #{id}
+
+
+
+ insert into `category`
+
+ id,
+ name,
+
+
+ #{id},
+ #{name},
+
+
+
+
+ update `category`
+
+
+ name = #{name},
+
+
+ where id = #{id}
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/mapper/CollectMapper.xml b/src/main/resources/mapper/CollectMapper.xml
new file mode 100644
index 0000000..f17f3ff
--- /dev/null
+++ b/src/main/resources/mapper/CollectMapper.xml
@@ -0,0 +1,54 @@
+
+
+
+
+ select collect.*, activity.name as activityName, user.name as userName from `collect`
+ left join activity on collect.activity_id = activity.id
+ left join user on collect.user_id = user.id
+
+ and collect.activity_id = #{activityId}
+ and collect.user_id = #{userId}
+
+ order by collect.id desc
+
+
+
+ delete from `collect`
+ where id = #{id}
+
+
+
+ insert into collect
+
+ id,
+ activity_id,
+ user_id,
+ time,
+
+
+ #{id},
+ #{activityId},
+ #{userId},
+ #{time},
+
+
+
+
+ update collect
+
+
+ activity_id = #{activityId},
+
+
+ user_id = #{userId},
+
+
+ time = #{time},
+
+
+ where id = #{id}
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/mapper/CommentMapper.xml b/src/main/resources/mapper/CommentMapper.xml
new file mode 100644
index 0000000..3d7d546
--- /dev/null
+++ b/src/main/resources/mapper/CommentMapper.xml
@@ -0,0 +1,96 @@
+
+
+
+
+ select comment.*, user.name as userName from `comment`
+ left join user on comment.user_id = user.id
+
+ and comment.content like concat('%', #{content}, '%')
+
+ order by comment.id desc
+
+
+
+ select comment.*, user.name as userName, user.avatar as userAvatar from `comment`
+ left join user on comment.user_id = user.id
+
+ and comment.module = #{module}
+ and comment.fid = #{fid}
+ and comment.pid is null
+
+ order by comment.id desc
+
+
+
+
+
+ select c1.*, u1.name as userName, u1.avatar as userAvatar, u2.name as parentUserName from `comment` c1
+ left join user u1 on c1.user_id = u1.id
+ left join comment c2 on c1.pid = c2.id
+ left join user u2 on c2.user_id = u2.id
+ where c1.pid is not null and c1.root_id = #{rootId}
+ order by c1.id desc
+
+
+
+ delete from `comment`
+ where id = #{id}
+
+
+
+ insert into comment
+
+ id,
+ score,
+ content,
+ user_id,
+ pid,
+ time,
+ fid,
+ module,
+ root_id,
+
+
+ #{id},
+ #{score},
+ #{content},
+ #{userId},
+ #{pid},
+ #{time},
+ #{fid},
+ #{module},
+ #{rootId},
+
+
+
+
+ update comment
+
+
+ content = #{content},
+
+
+ user_id = #{userId},
+
+
+ pid = #{pid},
+
+
+ time = #{time},
+
+
+ fid = #{fid},
+
+
+ module = #{module},
+
+
+ root_id = #{rootId},
+
+
+ where id = #{id}
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/mapper/NoticeMapper.xml b/src/main/resources/mapper/NoticeMapper.xml
new file mode 100644
index 0000000..4cc8682
--- /dev/null
+++ b/src/main/resources/mapper/NoticeMapper.xml
@@ -0,0 +1,51 @@
+
+
+
+
+ select * from `notice`
+
+ and title like concat('%', #{title}, '%')
+
+
+
+
+ delete from `notice`
+ where id = #{id}
+
+
+
+
+ insert into `notice`
+
+ id,
+ title,
+ content,
+ time,
+
+
+ #{id},
+ #{title},
+ #{content},
+ #{time},
+
+
+
+
+ update `notice`
+
+
+ title = #{title},
+
+
+ content = #{content},
+
+
+ time = #{time},
+
+
+ where id = #{id}
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/mapper/OrdersItemMapper.xml b/src/main/resources/mapper/OrdersItemMapper.xml
new file mode 100644
index 0000000..b1ca979
--- /dev/null
+++ b/src/main/resources/mapper/OrdersItemMapper.xml
@@ -0,0 +1,61 @@
+
+
+
+
+ select * from `orders_item`
+
+ and name like concat('%', #{name}, '%')
+
+ order by id desc
+
+
+
+ delete from `orders_item`
+ where id = #{id}
+
+
+
+ insert into orders_item
+
+ id,
+ book_id,
+ book_name,
+ book_cover,
+ num,
+ order_id,
+
+
+ #{id},
+ #{bookId},
+ #{bookName},
+ #{bookCover},
+ #{num},
+ #{orderId},
+
+
+
+
+ update orders_item
+
+
+ book_id = #{bookId},
+
+
+ book_name = #{bookName},
+
+
+ book_cover = #{bookCover},
+
+
+ num = #{num},
+
+
+ order_id = #{orderId},
+
+
+ where id = #{id}
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/mapper/OrdersMapper.xml b/src/main/resources/mapper/OrdersMapper.xml
new file mode 100644
index 0000000..fcb0051
--- /dev/null
+++ b/src/main/resources/mapper/OrdersMapper.xml
@@ -0,0 +1,84 @@
+
+
+
+
+ select orders.*, user.name as userName from `orders`
+ left join user on orders.user_id = user.id
+
+ and orders.name = #{name}
+ and orders.order_no = #{orderNo}
+ and orders.user_id = #{userId}
+
+ order by orders.id desc
+
+
+
+ delete from `orders`
+ where id = #{id}
+
+
+
+ insert into orders
+
+ id,
+ name,
+ order_no,
+ time,
+ user_id,
+ status,
+ hex,
+
+
+ #{id},
+ #{name},
+ #{orderNo},
+ #{time},
+ #{userId},
+ #{status},
+ #{hex},
+
+
+
+
+ update orders
+
+
+ name = #{name},
+
+
+ hex = #{hex},
+
+
+ order_no = #{orderNo},
+
+
+ time = #{time},
+
+
+ user_id = #{userId},
+
+
+ status = #{status},
+
+
+ where id = #{id}
+
+
+
+ update orders
+
+
+
+ hex = #{hex},
+
+
+
+
+ where id = #{id}
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/mapper/PostsMapper.xml b/src/main/resources/mapper/PostsMapper.xml
new file mode 100644
index 0000000..0e12548
--- /dev/null
+++ b/src/main/resources/mapper/PostsMapper.xml
@@ -0,0 +1,80 @@
+
+
+
+
+ select posts.*, user.name as userName, posts_section.name as sectionName from `posts`
+ left join user on posts.user_id = user.id
+ left join posts_section on posts.section_id = posts_section.id
+
+ and posts.title like concat('%', #{title}, '%')
+ and posts.user_id = #{userId}
+ and posts.section_id = #{sectionId}
+
+ order by posts.id desc
+
+
+
+ delete from `posts`
+ where id = #{id}
+
+
+
+ insert into posts
+
+ id,
+ title,
+ img,
+ tags,
+ content,
+ user_id,
+ time,
+ read_count,
+ section_id,
+
+
+ #{id},
+ #{title},
+ #{img},
+ #{tags},
+ #{content},
+ #{userId},
+ #{time},
+ #{readCount},
+ #{sectionId},
+
+
+
+
+ update posts
+
+
+ title = #{title},
+
+
+ img = #{img},
+
+
+ tags = #{tags},
+
+
+ content = #{content},
+
+
+ user_id = #{userId},
+
+
+ time = #{time},
+
+
+ read_count = #{readCount},
+
+
+ section_id = #{sectionId},
+
+
+ where id = #{id}
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/mapper/PostsSectionMapper.xml b/src/main/resources/mapper/PostsSectionMapper.xml
new file mode 100644
index 0000000..3055b3b
--- /dev/null
+++ b/src/main/resources/mapper/PostsSectionMapper.xml
@@ -0,0 +1,40 @@
+
+
+
+
+ select * from `posts_section`
+
+ and name like concat('%', #{name}, '%')
+
+
+
+
+ delete from `posts_section`
+ where id = #{id}
+
+
+
+ insert into `posts_section`
+
+ id,
+ name,
+
+
+ #{id},
+ #{name},
+
+
+
+
+ update `posts_section`
+
+
+ name = #{name},
+
+
+ where id = #{id}
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/mapper/RemMapper.xml b/src/main/resources/mapper/RemMapper.xml
new file mode 100644
index 0000000..10b8901
--- /dev/null
+++ b/src/main/resources/mapper/RemMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ select * from `tb_rem`
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/mapper/RoomMapper.xml b/src/main/resources/mapper/RoomMapper.xml
new file mode 100644
index 0000000..82e32d8
--- /dev/null
+++ b/src/main/resources/mapper/RoomMapper.xml
@@ -0,0 +1,55 @@
+
+
+
+
+ select * from `room`
+
+ and name like concat('%', #{name}, '%')
+
+
+
+
+ delete from `room`
+ where id = #{id}
+
+
+
+ insert into room
+
+ id,
+ name,
+ img,
+ location,
+ open_time,
+
+
+ #{id},
+ #{name},
+ #{img},
+ #{location},
+ #{openTime},
+
+
+
+
+ update room
+
+
+ name = #{name},
+
+
+ img = #{img},
+
+
+ location = #{location},
+
+
+ open_time = #{openTime},
+
+
+ where id = #{id}
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/mapper/SeatMapper.xml b/src/main/resources/mapper/SeatMapper.xml
new file mode 100644
index 0000000..a20992c
--- /dev/null
+++ b/src/main/resources/mapper/SeatMapper.xml
@@ -0,0 +1,61 @@
+
+
+
+
+ select seat.*, room.name as roomName from `seat`
+ left join room on seat.room_id = room.id
+
+ and seat.no like concat('%', #{no}, '%')
+ and seat.room_id = #{roomId}
+
+
+
+
+
+ delete from `seat`
+ where id = #{id}
+
+
+
+ insert into seat
+
+ no,
+ room_id,
+ row,
+ col,
+ status,
+
+
+ #{no},
+ #{roomId},
+ #{row},
+ #{col},
+ #{status},
+
+
+
+
+ update seat
+
+
+ no = #{no},
+
+
+ room_id = #{roomId},
+
+
+ row = #{row},
+
+
+ col = #{col},
+
+
+ status = #{status},
+
+
+ where id = #{id}
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/mapper/SeatReserveMapper.xml b/src/main/resources/mapper/SeatReserveMapper.xml
new file mode 100644
index 0000000..4276ced
--- /dev/null
+++ b/src/main/resources/mapper/SeatReserveMapper.xml
@@ -0,0 +1,61 @@
+
+
+
+
+ select seat_reserve.*, room.name as roomName, seat.no as seatNo, user.name as userName from `seat_reserve`
+ left join seat on seat_reserve.seat_id = seat.id
+ left join user on seat_reserve.user_id = user.id
+ left join room on seat.room_id = room.id
+
+ and room.name like concat('%', #{roomName}, '%')
+ and seat.no= #{seatNo}
+ and seat_reserve.user_id= #{userId}
+
+ order by seat_reserve.id desc
+
+
+
+ delete from `seat_reserve`
+ where id = #{id}
+
+
+
+ insert into `seat_reserve`
+
+ id,
+ seat_id,
+ user_id,
+ time,
+ status,
+
+
+ #{id},
+ #{seatId},
+ #{userId},
+ #{time},
+ #{status},
+
+
+
+
+ update `seat_reserve`
+
+
+ seat_id = #{seatId},
+
+
+ user_id = #{userId},
+
+
+ time = #{time},
+
+
+ status = #{status},
+
+
+ where id = #{id}
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/mapper/SignMapper.xml b/src/main/resources/mapper/SignMapper.xml
new file mode 100644
index 0000000..b827f77
--- /dev/null
+++ b/src/main/resources/mapper/SignMapper.xml
@@ -0,0 +1,69 @@
+
+
+
+
+ select sign.*, user.name as userName, activity.name as activityName from `sign`
+ left join activity on sign.activity_id = activity.id
+ left join user on sign.user_id = user.id
+
+ and sign.activity_id = #{activityId}
+ and sign.user_id = #{userId}
+
+ order by sign.id desc
+
+
+
+ delete from `sign`
+ where id = #{id}
+
+
+
+ insert into sign
+
+ id,
+ activity_id,
+ user_id,
+ time,
+ sign,
+ name,
+ phone,
+
+
+ #{id},
+ #{activityId},
+ #{userId},
+ #{time},
+ #{sign},
+ #{name},
+ #{phone},
+
+
+
+
+ update sign
+
+
+ activity_id = #{activityId},
+
+
+ user_id = #{userId},
+
+
+ time = #{time},
+
+
+ sign = #{sign},
+
+
+ name = #{name},
+
+
+ phone = #{phone},
+
+
+ where id = #{id}
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/mapper/UserMapper.xml b/src/main/resources/mapper/UserMapper.xml
new file mode 100644
index 0000000..2350b9e
--- /dev/null
+++ b/src/main/resources/mapper/UserMapper.xml
@@ -0,0 +1,76 @@
+
+
+
+
+ select * from `user`
+
+ and name like concat('%', #{name}, '%')
+
+ order by id desc
+
+
+
+ delete from `user`
+ where id = #{id}
+
+
+
+ insert into `user`
+
+ id,
+ username,
+ password,
+ name,
+ phone,
+ email,
+ avatar,
+ role,
+ score,
+
+
+ #{id},
+ #{username},
+ #{password},
+ #{name},
+ #{phone},
+ #{email},
+ #{avatar},
+ #{role},
+ #{score},
+
+
+
+
+ update `user`
+
+
+ username = #{username},
+
+
+ password = #{password},
+
+
+ name = #{name},
+
+
+ phone = #{phone},
+
+
+ email = #{email},
+
+
+ avatar = #{avatar},
+
+
+ role = #{role},
+
+
+ score = #{score},
+
+
+ where id = #{id}
+
+
+
\ No newline at end of file
diff --git a/ui/.env.development b/ui/.env.development
new file mode 100644
index 0000000..62bb4ac
--- /dev/null
+++ b/ui/.env.development
@@ -0,0 +1 @@
+VITE_BASE_URL='http://localhost:9090'
\ No newline at end of file
diff --git a/ui/.env.production b/ui/.env.production
new file mode 100644
index 0000000..2beb7d1
--- /dev/null
+++ b/ui/.env.production
@@ -0,0 +1 @@
+VITE_BASE_URL='http://:9090'
\ No newline at end of file
diff --git a/ui/.gitignore b/ui/.gitignore
new file mode 100644
index 0000000..e147e41
--- /dev/null
+++ b/ui/.gitignore
@@ -0,0 +1,28 @@
+# ---> Java
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+replay_pid*
+
+node_modules
+.idea
diff --git a/ui/index.html b/ui/index.html
new file mode 100644
index 0000000..38737ab
--- /dev/null
+++ b/ui/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ 图书系统
+
+
+
+
+
+
diff --git a/ui/jsconfig.json b/ui/jsconfig.json
new file mode 100644
index 0000000..5a1f2d2
--- /dev/null
+++ b/ui/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ },
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/ui/package-lock.json b/ui/package-lock.json
new file mode 100644
index 0000000..e12f9c1
--- /dev/null
+++ b/ui/package-lock.json
@@ -0,0 +1,4178 @@
+{
+ "name": "vue",
+ "version": "0.0.0",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "vue",
+ "version": "0.0.0",
+ "dependencies": {
+ "@element-plus/icons-vue": "^2.3.1",
+ "@wangeditor/editor": "^5.1.23",
+ "@wangeditor/editor-for-vue": "^5.1.12",
+ "axios": "^1.7.2",
+ "echarts": "^5.5.1",
+ "element-plus": "^2.7.6",
+ "vue": "^3.4.29",
+ "vue-router": "^4.3.3"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue": "^5.0.5",
+ "sass": "1.71.1",
+ "unplugin-auto-import": "^0.17.6",
+ "unplugin-element-plus": "^0.8.0",
+ "unplugin-vue-components": "^0.27.2",
+ "vite": "^5.3.1"
+ }
+ },
+ "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/@babel/helper-string-parser": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz",
+ "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz",
+ "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.25.7.tgz",
+ "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==",
+ "dependencies": {
+ "@babel/types": "^7.25.7"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.25.7.tgz",
+ "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.25.7",
+ "@babel/helper-validator-identifier": "^7.25.7",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "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.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.6.8",
+ "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.6.8.tgz",
+ "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==",
+ "dependencies": {
+ "@floating-ui/utils": "^0.2.8"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.6.11",
+ "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.6.11.tgz",
+ "integrity": "sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==",
+ "dependencies": {
+ "@floating-ui/core": "^1.6.0",
+ "@floating-ui/utils": "^0.2.8"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.8.tgz",
+ "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig=="
+ },
+ "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/@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/@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=="
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.2.tgz",
+ "integrity": "sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "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/rollup-android-arm-eabi": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz",
+ "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz",
+ "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz",
+ "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz",
+ "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz",
+ "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz",
+ "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz",
+ "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz",
+ "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz",
+ "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz",
+ "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz",
+ "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz",
+ "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz",
+ "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz",
+ "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz",
+ "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz",
+ "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@transloadit/prettier-bytes": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmmirror.com/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz",
+ "integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA=="
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "dev": true
+ },
+ "node_modules/@types/event-emitter": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmmirror.com/@types/event-emitter/-/event-emitter-0.3.5.tgz",
+ "integrity": "sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ=="
+ },
+ "node_modules/@types/lodash": {
+ "version": "4.17.10",
+ "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.10.tgz",
+ "integrity": "sha512-YpS0zzoduEhuOWjAotS6A5AVCva7X4lVlYLF0FYHAY9sdraBfnatttHItlWeZdGhuEkf+OzMNg2ZYAx8t+52uQ=="
+ },
+ "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/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/@uppy/companion-client": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmmirror.com/@uppy/companion-client/-/companion-client-2.2.2.tgz",
+ "integrity": "sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==",
+ "dependencies": {
+ "@uppy/utils": "^4.1.2",
+ "namespace-emitter": "^2.0.1"
+ }
+ },
+ "node_modules/@uppy/core": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmmirror.com/@uppy/core/-/core-2.3.4.tgz",
+ "integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==",
+ "dependencies": {
+ "@transloadit/prettier-bytes": "0.0.7",
+ "@uppy/store-default": "^2.1.1",
+ "@uppy/utils": "^4.1.3",
+ "lodash.throttle": "^4.1.1",
+ "mime-match": "^1.0.2",
+ "namespace-emitter": "^2.0.1",
+ "nanoid": "^3.1.25",
+ "preact": "^10.5.13"
+ }
+ },
+ "node_modules/@uppy/store-default": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/@uppy/store-default/-/store-default-2.1.1.tgz",
+ "integrity": "sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ=="
+ },
+ "node_modules/@uppy/utils": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmmirror.com/@uppy/utils/-/utils-4.1.3.tgz",
+ "integrity": "sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==",
+ "dependencies": {
+ "lodash.throttle": "^4.1.1"
+ }
+ },
+ "node_modules/@uppy/xhr-upload": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz",
+ "integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==",
+ "dependencies": {
+ "@uppy/companion-client": "^2.2.2",
+ "@uppy/utils": "^4.1.2",
+ "nanoid": "^3.1.25"
+ },
+ "peerDependencies": {
+ "@uppy/core": "^2.3.3"
+ }
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.1.4.tgz",
+ "integrity": "sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==",
+ "dev": true,
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.5.11",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.11.tgz",
+ "integrity": "sha512-PwAdxs7/9Hc3ieBO12tXzmTD+Ln4qhT/56S+8DvrrZ4kLDn4Z/AMUr8tXJD0axiJBS0RKIoNaR0yMuQB9v9Udg==",
+ "dependencies": {
+ "@babel/parser": "^7.25.3",
+ "@vue/shared": "3.5.11",
+ "entities": "^4.5.0",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.5.11",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.11.tgz",
+ "integrity": "sha512-pyGf8zdbDDRkBrEzf8p7BQlMKNNF5Fk/Cf/fQ6PiUz9at4OaUfyXW0dGJTo2Vl1f5U9jSLCNf0EZJEogLXoeew==",
+ "dependencies": {
+ "@vue/compiler-core": "3.5.11",
+ "@vue/shared": "3.5.11"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.5.11",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.11.tgz",
+ "integrity": "sha512-gsbBtT4N9ANXXepprle+X9YLg2htQk1sqH/qGJ/EApl+dgpUBdTv3yP7YlR535uHZY3n6XaR0/bKo0BgwwDniw==",
+ "dependencies": {
+ "@babel/parser": "^7.25.3",
+ "@vue/compiler-core": "3.5.11",
+ "@vue/compiler-dom": "3.5.11",
+ "@vue/compiler-ssr": "3.5.11",
+ "@vue/shared": "3.5.11",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.11",
+ "postcss": "^8.4.47",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.5.11",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.11.tgz",
+ "integrity": "sha512-P4+GPjOuC2aFTk1Z4WANvEhyOykcvEd5bIj2KVNGKGfM745LaXGr++5njpdBTzVz5pZifdlR1kpYSJJpIlSePA==",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.11",
+ "@vue/shared": "3.5.11"
+ }
+ },
+ "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/reactivity": {
+ "version": "3.5.11",
+ "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.11.tgz",
+ "integrity": "sha512-Nqo5VZEn8MJWlCce8XoyVqHZbd5P2NH+yuAaFzuNSR96I+y1cnuUiq7xfSG+kyvLSiWmaHTKP1r3OZY4mMD50w==",
+ "dependencies": {
+ "@vue/shared": "3.5.11"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.5.11",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.11.tgz",
+ "integrity": "sha512-7PsxFGqwfDhfhh0OcDWBG1DaIQIVOLgkwA5q6MtkPiDFjp5gohVnJEahSktwSFLq7R5PtxDKy6WKURVN1UDbzA==",
+ "dependencies": {
+ "@vue/reactivity": "3.5.11",
+ "@vue/shared": "3.5.11"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.5.11",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.11.tgz",
+ "integrity": "sha512-GNghjecT6IrGf0UhuYmpgaOlN7kxzQBhxWEn08c/SQDxv1yy4IXI1bn81JgEpQ4IXjRxWtPyI8x0/7TF5rPfYQ==",
+ "dependencies": {
+ "@vue/reactivity": "3.5.11",
+ "@vue/runtime-core": "3.5.11",
+ "@vue/shared": "3.5.11",
+ "csstype": "^3.1.3"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.5.11",
+ "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.11.tgz",
+ "integrity": "sha512-cVOwYBxR7Wb1B1FoxYvtjJD8X/9E5nlH4VSkJy2uMA1MzYNdzAAB//l8nrmN9py/4aP+3NjWukf9PZ3TeWULaA==",
+ "dependencies": {
+ "@vue/compiler-ssr": "3.5.11",
+ "@vue/shared": "3.5.11"
+ },
+ "peerDependencies": {
+ "vue": "3.5.11"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.5.11",
+ "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.11.tgz",
+ "integrity": "sha512-W8GgysJVnFo81FthhzurdRAWP/byq3q2qIw70e0JWblzVhjgOMiC2GyovXrZTFQJnFVryYaKGP3Tc9vYzYm6PQ=="
+ },
+ "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/core/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/@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/@vueuse/shared/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/@wangeditor/basic-modules": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz",
+ "integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==",
+ "dependencies": {
+ "is-url": "^1.2.4"
+ },
+ "peerDependencies": {
+ "@wangeditor/core": "1.x",
+ "dom7": "^3.0.0",
+ "lodash.throttle": "^4.1.1",
+ "nanoid": "^3.2.0",
+ "slate": "^0.72.0",
+ "snabbdom": "^3.1.0"
+ }
+ },
+ "node_modules/@wangeditor/code-highlight": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz",
+ "integrity": "sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==",
+ "dependencies": {
+ "prismjs": "^1.23.0"
+ },
+ "peerDependencies": {
+ "@wangeditor/core": "1.x",
+ "dom7": "^3.0.0",
+ "slate": "^0.72.0",
+ "snabbdom": "^3.1.0"
+ }
+ },
+ "node_modules/@wangeditor/core": {
+ "version": "1.1.19",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz",
+ "integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==",
+ "dependencies": {
+ "@types/event-emitter": "^0.3.3",
+ "event-emitter": "^0.3.5",
+ "html-void-elements": "^2.0.0",
+ "i18next": "^20.4.0",
+ "scroll-into-view-if-needed": "^2.2.28",
+ "slate-history": "^0.66.0"
+ },
+ "peerDependencies": {
+ "@uppy/core": "^2.1.1",
+ "@uppy/xhr-upload": "^2.0.3",
+ "dom7": "^3.0.0",
+ "is-hotkey": "^0.2.0",
+ "lodash.camelcase": "^4.3.0",
+ "lodash.clonedeep": "^4.5.0",
+ "lodash.debounce": "^4.0.8",
+ "lodash.foreach": "^4.5.0",
+ "lodash.isequal": "^4.5.0",
+ "lodash.throttle": "^4.1.1",
+ "lodash.toarray": "^4.4.0",
+ "nanoid": "^3.2.0",
+ "slate": "^0.72.0",
+ "snabbdom": "^3.1.0"
+ }
+ },
+ "node_modules/@wangeditor/editor": {
+ "version": "5.1.23",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz",
+ "integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==",
+ "dependencies": {
+ "@uppy/core": "^2.1.1",
+ "@uppy/xhr-upload": "^2.0.3",
+ "@wangeditor/basic-modules": "^1.1.7",
+ "@wangeditor/code-highlight": "^1.0.3",
+ "@wangeditor/core": "^1.1.19",
+ "@wangeditor/list-module": "^1.0.5",
+ "@wangeditor/table-module": "^1.1.4",
+ "@wangeditor/upload-image-module": "^1.0.2",
+ "@wangeditor/video-module": "^1.1.4",
+ "dom7": "^3.0.0",
+ "is-hotkey": "^0.2.0",
+ "lodash.camelcase": "^4.3.0",
+ "lodash.clonedeep": "^4.5.0",
+ "lodash.debounce": "^4.0.8",
+ "lodash.foreach": "^4.5.0",
+ "lodash.isequal": "^4.5.0",
+ "lodash.throttle": "^4.1.1",
+ "lodash.toarray": "^4.4.0",
+ "nanoid": "^3.2.0",
+ "slate": "^0.72.0",
+ "snabbdom": "^3.1.0"
+ }
+ },
+ "node_modules/@wangeditor/editor-for-vue": {
+ "version": "5.1.12",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/editor-for-vue/-/editor-for-vue-5.1.12.tgz",
+ "integrity": "sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==",
+ "peerDependencies": {
+ "@wangeditor/editor": ">=5.1.0",
+ "vue": "^3.0.5"
+ }
+ },
+ "node_modules/@wangeditor/list-module": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/list-module/-/list-module-1.0.5.tgz",
+ "integrity": "sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==",
+ "peerDependencies": {
+ "@wangeditor/core": "1.x",
+ "dom7": "^3.0.0",
+ "slate": "^0.72.0",
+ "snabbdom": "^3.1.0"
+ }
+ },
+ "node_modules/@wangeditor/table-module": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/table-module/-/table-module-1.1.4.tgz",
+ "integrity": "sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==",
+ "peerDependencies": {
+ "@wangeditor/core": "1.x",
+ "dom7": "^3.0.0",
+ "lodash.isequal": "^4.5.0",
+ "lodash.throttle": "^4.1.1",
+ "nanoid": "^3.2.0",
+ "slate": "^0.72.0",
+ "snabbdom": "^3.1.0"
+ }
+ },
+ "node_modules/@wangeditor/upload-image-module": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz",
+ "integrity": "sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==",
+ "peerDependencies": {
+ "@uppy/core": "^2.0.3",
+ "@uppy/xhr-upload": "^2.0.3",
+ "@wangeditor/basic-modules": "1.x",
+ "@wangeditor/core": "1.x",
+ "dom7": "^3.0.0",
+ "lodash.foreach": "^4.5.0",
+ "slate": "^0.72.0",
+ "snabbdom": "^3.1.0"
+ }
+ },
+ "node_modules/@wangeditor/video-module": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/video-module/-/video-module-1.1.4.tgz",
+ "integrity": "sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==",
+ "peerDependencies": {
+ "@uppy/core": "^2.1.4",
+ "@uppy/xhr-upload": "^2.0.7",
+ "@wangeditor/core": "1.x",
+ "dom7": "^3.0.0",
+ "nanoid": "^3.2.0",
+ "slate": "^0.72.0",
+ "snabbdom": "^3.1.0"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.12.1",
+ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.12.1.tgz",
+ "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "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/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/axios": {
+ "version": "1.7.7",
+ "resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.7.tgz",
+ "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
+ "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==",
+ "dev": true
+ },
+ "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/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/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/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/compute-scroll-into-view": {
+ "version": "1.0.20",
+ "resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
+ "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg=="
+ },
+ "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/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+ },
+ "node_modules/d": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/d/-/d-1.0.2.tgz",
+ "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==",
+ "dependencies": {
+ "es5-ext": "^0.10.64",
+ "type": "^2.7.2"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "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.3.7",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "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/dom7": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz",
+ "integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==",
+ "dependencies": {
+ "ssr-window": "^3.0.0-alpha.1"
+ }
+ },
+ "node_modules/echarts": {
+ "version": "5.5.1",
+ "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.5.1.tgz",
+ "integrity": "sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==",
+ "dependencies": {
+ "tslib": "2.3.0",
+ "zrender": "5.6.0"
+ }
+ },
+ "node_modules/element-plus": {
+ "version": "2.8.4",
+ "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.8.4.tgz",
+ "integrity": "sha512-ZlVAdUOoJliv4kW3ntWnnSHMT+u/Os7mXJjk2xzOlqNeHaI2/ozlF+R58ZCEak8ZnDi6+5A2viWEYRsq64IuiA==",
+ "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.3",
+ "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/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/es-module-lexer": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz",
+ "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==",
+ "dev": true
+ },
+ "node_modules/es5-ext": {
+ "version": "0.10.64",
+ "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.64.tgz",
+ "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "es6-iterator": "^2.0.3",
+ "es6-symbol": "^3.1.3",
+ "esniff": "^2.0.1",
+ "next-tick": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
+ "dependencies": {
+ "d": "1",
+ "es5-ext": "^0.10.35",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "node_modules/es6-symbol": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.4.tgz",
+ "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==",
+ "dependencies": {
+ "d": "^1.0.2",
+ "ext": "^1.7.0"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz",
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
+ }
+ },
+ "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": "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/esniff": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/esniff/-/esniff-2.0.1.tgz",
+ "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==",
+ "dependencies": {
+ "d": "^1.0.1",
+ "es5-ext": "^0.10.62",
+ "event-emitter": "^0.3.5",
+ "type": "^2.7.2"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "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/event-emitter": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz",
+ "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
+ "dependencies": {
+ "d": "1",
+ "es5-ext": "~0.10.14"
+ }
+ },
+ "node_modules/ext": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz",
+ "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
+ "dependencies": {
+ "type": "^2.7.2"
+ }
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "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.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.17.1.tgz",
+ "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "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/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "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/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/html-void-elements": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-2.0.1.tgz",
+ "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/i18next": {
+ "version": "20.6.1",
+ "resolved": "https://registry.npmmirror.com/i18next/-/i18next-20.6.1.tgz",
+ "integrity": "sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==",
+ "dependencies": {
+ "@babel/runtime": "^7.12.0"
+ }
+ },
+ "node_modules/immer": {
+ "version": "9.0.21",
+ "resolved": "https://registry.npmmirror.com/immer/-/immer-9.0.21.tgz",
+ "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/immer"
+ }
+ },
+ "node_modules/immutable": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.7.tgz",
+ "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==",
+ "dev": true
+ },
+ "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-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-hotkey": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmmirror.com/is-hotkey/-/is-hotkey-0.2.0.tgz",
+ "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw=="
+ },
+ "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-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-url": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmmirror.com/is-url/-/is-url-1.2.4.tgz",
+ "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="
+ },
+ "node_modules/js-tokens": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.0.tgz",
+ "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==",
+ "dev": true
+ },
+ "node_modules/local-pkg": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.0.tgz",
+ "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==",
+ "dev": true,
+ "dependencies": {
+ "mlly": "^1.4.2",
+ "pkg-types": "^1.0.3"
+ },
+ "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/lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+ },
+ "node_modules/lodash.clonedeep": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+ "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
+ },
+ "node_modules/lodash.foreach": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmmirror.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
+ "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ=="
+ },
+ "node_modules/lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
+ },
+ "node_modules/lodash.throttle": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
+ "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
+ },
+ "node_modules/lodash.toarray": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmmirror.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
+ "integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw=="
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.11",
+ "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.11.tgz",
+ "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0"
+ }
+ },
+ "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/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "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-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-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/mime-match/-/mime-match-1.0.2.tgz",
+ "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==",
+ "dependencies": {
+ "wildcard": "^1.1.0"
+ }
+ },
+ "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/mlly": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.7.2.tgz",
+ "integrity": "sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.12.1",
+ "pathe": "^1.1.2",
+ "pkg-types": "^1.2.0",
+ "ufo": "^1.5.4"
+ }
+ },
+ "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==",
+ "dev": true
+ },
+ "node_modules/namespace-emitter": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/namespace-emitter/-/namespace-emitter-2.0.1.tgz",
+ "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g=="
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "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/next-tick": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz",
+ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
+ },
+ "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-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/pathe": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz",
+ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
+ "dev": true
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.0.tgz",
+ "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw=="
+ },
+ "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/pkg-types": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.2.1.tgz",
+ "integrity": "sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==",
+ "dev": true,
+ "dependencies": {
+ "confbox": "^0.1.8",
+ "mlly": "^1.7.2",
+ "pathe": "^1.1.2"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.47",
+ "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.47.tgz",
+ "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
+ "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.1.0",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/preact": {
+ "version": "10.24.2",
+ "resolved": "https://registry.npmmirror.com/preact/-/preact-10.24.2.tgz",
+ "integrity": "sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/preact"
+ }
+ },
+ "node_modules/prismjs": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz",
+ "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
+ "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/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/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/regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.24.0.tgz",
+ "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "1.0.6"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.24.0",
+ "@rollup/rollup-android-arm64": "4.24.0",
+ "@rollup/rollup-darwin-arm64": "4.24.0",
+ "@rollup/rollup-darwin-x64": "4.24.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.24.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.24.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.24.0",
+ "@rollup/rollup-linux-arm64-musl": "4.24.0",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.24.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.24.0",
+ "@rollup/rollup-linux-x64-gnu": "4.24.0",
+ "@rollup/rollup-linux-x64-musl": "4.24.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.24.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.24.0",
+ "@rollup/rollup-win32-x64-msvc": "4.24.0",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "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/sass": {
+ "version": "1.71.1",
+ "resolved": "https://registry.npmmirror.com/sass/-/sass-1.71.1.tgz",
+ "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==",
+ "dev": true,
+ "dependencies": {
+ "chokidar": ">=3.0.0 <4.0.0",
+ "immutable": "^4.0.0",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/scroll-into-view-if-needed": {
+ "version": "2.2.31",
+ "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
+ "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==",
+ "dependencies": {
+ "compute-scroll-into-view": "^1.0.20"
+ }
+ },
+ "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/slate": {
+ "version": "0.72.8",
+ "resolved": "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz",
+ "integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==",
+ "dependencies": {
+ "immer": "^9.0.6",
+ "is-plain-object": "^5.0.0",
+ "tiny-warning": "^1.0.3"
+ }
+ },
+ "node_modules/slate-history": {
+ "version": "0.66.0",
+ "resolved": "https://registry.npmmirror.com/slate-history/-/slate-history-0.66.0.tgz",
+ "integrity": "sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==",
+ "dependencies": {
+ "is-plain-object": "^5.0.0"
+ },
+ "peerDependencies": {
+ "slate": ">=0.65.3"
+ }
+ },
+ "node_modules/snabbdom": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmmirror.com/snabbdom/-/snabbdom-3.6.2.tgz",
+ "integrity": "sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q==",
+ "engines": {
+ "node": ">=12.17.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/ssr-window": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-3.0.0.tgz",
+ "integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA=="
+ },
+ "node_modules/strip-literal": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-2.1.0.tgz",
+ "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==",
+ "dev": true,
+ "dependencies": {
+ "js-tokens": "^9.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/tiny-warning": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/tiny-warning/-/tiny-warning-1.0.3.tgz",
+ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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/tslib": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
+ "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+ },
+ "node_modules/type": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmmirror.com/type/-/type-2.7.3.tgz",
+ "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ=="
+ },
+ "node_modules/ufo": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.5.4.tgz",
+ "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==",
+ "dev": true
+ },
+ "node_modules/unimport": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmmirror.com/unimport/-/unimport-3.13.1.tgz",
+ "integrity": "sha512-nNrVzcs93yrZQOW77qnyOVHtb68LegvhYFwxFMfuuWScmwQmyVCG/NBuN8tYsaGzgQUVYv34E/af+Cc9u4og4A==",
+ "dev": true,
+ "dependencies": {
+ "@rollup/pluginutils": "^5.1.2",
+ "acorn": "^8.12.1",
+ "escape-string-regexp": "^5.0.0",
+ "estree-walker": "^3.0.3",
+ "fast-glob": "^3.3.2",
+ "local-pkg": "^0.5.0",
+ "magic-string": "^0.30.11",
+ "mlly": "^1.7.1",
+ "pathe": "^1.1.2",
+ "pkg-types": "^1.2.0",
+ "scule": "^1.3.0",
+ "strip-literal": "^2.1.0",
+ "unplugin": "^1.14.1"
+ }
+ },
+ "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/unplugin": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-1.14.1.tgz",
+ "integrity": "sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.12.1",
+ "webpack-virtual-modules": "^0.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "webpack-sources": "^3"
+ },
+ "peerDependenciesMeta": {
+ "webpack-sources": {
+ "optional": true
+ }
+ }
+ },
+ "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-element-plus": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmmirror.com/unplugin-element-plus/-/unplugin-element-plus-0.8.0.tgz",
+ "integrity": "sha512-jByUGY3FG2B8RJKFryqxx4eNtSTj+Hjlo8edcOdJymewndDQjThZ1pRUQHRjQsbKhTV2jEctJV7t7RJ405UL4g==",
+ "dev": true,
+ "dependencies": {
+ "@rollup/pluginutils": "^5.0.2",
+ "es-module-lexer": "^1.3.0",
+ "magic-string": "^0.30.1",
+ "unplugin": "^1.3.2"
+ },
+ "engines": {
+ "node": ">=14.19.0"
+ }
+ },
+ "node_modules/unplugin-vue-components": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-0.27.4.tgz",
+ "integrity": "sha512-1XVl5iXG7P1UrOMnaj2ogYa5YTq8aoh5jwDPQhemwO/OrXW+lPQKDXd1hMz15qxQPxgb/XXlbgo3HQ2rLEbmXQ==",
+ "dev": true,
+ "dependencies": {
+ "@antfu/utils": "^0.7.10",
+ "@rollup/pluginutils": "^5.1.0",
+ "chokidar": "^3.6.0",
+ "debug": "^4.3.6",
+ "fast-glob": "^3.3.2",
+ "local-pkg": "^0.5.0",
+ "magic-string": "^0.30.11",
+ "minimatch": "^9.0.5",
+ "mlly": "^1.7.1",
+ "unplugin": "^1.12.1"
+ },
+ "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/vite": {
+ "version": "5.4.8",
+ "resolved": "https://registry.npmmirror.com/vite/-/vite-5.4.8.tgz",
+ "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.21.3",
+ "postcss": "^8.4.43",
+ "rollup": "^4.20.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.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",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue": {
+ "version": "3.5.11",
+ "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.11.tgz",
+ "integrity": "sha512-/8Wurrd9J3lb72FTQS7gRMNQD4nztTtKPmuDuPuhqXmmpD6+skVjAeahNpVzsuky6Sy9gy7wn8UadqPtt9SQIg==",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.11",
+ "@vue/compiler-sfc": "3.5.11",
+ "@vue/runtime-dom": "3.5.11",
+ "@vue/server-renderer": "3.5.11",
+ "@vue/shared": "3.5.11"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-router": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.4.5.tgz",
+ "integrity": "sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==",
+ "dependencies": {
+ "@vue/devtools-api": "^6.6.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "vue": "^3.2.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/wildcard": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz",
+ "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng=="
+ },
+ "node_modules/zrender": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.6.0.tgz",
+ "integrity": "sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==",
+ "dependencies": {
+ "tslib": "2.3.0"
+ }
+ }
+ },
+ "dependencies": {
+ "@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
+ },
+ "@babel/helper-string-parser": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz",
+ "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g=="
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz",
+ "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg=="
+ },
+ "@babel/parser": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.25.7.tgz",
+ "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==",
+ "requires": {
+ "@babel/types": "^7.25.7"
+ }
+ },
+ "@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "requires": {
+ "regenerator-runtime": "^0.14.0"
+ }
+ },
+ "@babel/types": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.25.7.tgz",
+ "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==",
+ "requires": {
+ "@babel/helper-string-parser": "^7.25.7",
+ "@babel/helper-validator-identifier": "^7.25.7",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "@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=="
+ },
+ "@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==",
+ "requires": {}
+ },
+ "@esbuild/aix-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/android-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/android-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/android-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/darwin-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/darwin-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/freebsd-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/freebsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-loong64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-mips64el": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-riscv64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-s390x": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/netbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/openbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/sunos-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/win32-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/win32-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/win32-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "dev": true,
+ "optional": true
+ },
+ "@floating-ui/core": {
+ "version": "1.6.8",
+ "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.6.8.tgz",
+ "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==",
+ "requires": {
+ "@floating-ui/utils": "^0.2.8"
+ }
+ },
+ "@floating-ui/dom": {
+ "version": "1.6.11",
+ "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.6.11.tgz",
+ "integrity": "sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==",
+ "requires": {
+ "@floating-ui/core": "^1.6.0",
+ "@floating-ui/utils": "^0.2.8"
+ }
+ },
+ "@floating-ui/utils": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.8.tgz",
+ "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig=="
+ },
+ "@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=="
+ },
+ "@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,
+ "requires": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ }
+ },
+ "@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
+ },
+ "@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,
+ "requires": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ }
+ },
+ "@popperjs/core": {
+ "version": "npm:@sxzz/popperjs-es@2.11.7",
+ "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
+ "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
+ },
+ "@rollup/pluginutils": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.2.tgz",
+ "integrity": "sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==",
+ "dev": true,
+ "requires": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^2.3.1"
+ }
+ },
+ "@rollup/rollup-android-arm-eabi": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz",
+ "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==",
+ "dev": true,
+ "optional": true
+ },
+ "@rollup/rollup-android-arm64": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz",
+ "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==",
+ "dev": true,
+ "optional": true
+ },
+ "@rollup/rollup-darwin-arm64": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz",
+ "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==",
+ "dev": true,
+ "optional": true
+ },
+ "@rollup/rollup-darwin-x64": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz",
+ "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz",
+ "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==",
+ "dev": true,
+ "optional": true
+ },
+ "@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz",
+ "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==",
+ "dev": true,
+ "optional": true
+ },
+ "@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz",
+ "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==",
+ "dev": true,
+ "optional": true
+ },
+ "@rollup/rollup-linux-arm64-musl": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz",
+ "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==",
+ "dev": true,
+ "optional": true
+ },
+ "@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz",
+ "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==",
+ "dev": true,
+ "optional": true
+ },
+ "@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz",
+ "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==",
+ "dev": true,
+ "optional": true
+ },
+ "@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz",
+ "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==",
+ "dev": true,
+ "optional": true
+ },
+ "@rollup/rollup-linux-x64-gnu": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz",
+ "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==",
+ "dev": true,
+ "optional": true
+ },
+ "@rollup/rollup-linux-x64-musl": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz",
+ "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz",
+ "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz",
+ "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@rollup/rollup-win32-x64-msvc": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz",
+ "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==",
+ "dev": true,
+ "optional": true
+ },
+ "@transloadit/prettier-bytes": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmmirror.com/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz",
+ "integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA=="
+ },
+ "@types/estree": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "dev": true
+ },
+ "@types/event-emitter": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmmirror.com/@types/event-emitter/-/event-emitter-0.3.5.tgz",
+ "integrity": "sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ=="
+ },
+ "@types/lodash": {
+ "version": "4.17.10",
+ "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.10.tgz",
+ "integrity": "sha512-YpS0zzoduEhuOWjAotS6A5AVCva7X4lVlYLF0FYHAY9sdraBfnatttHItlWeZdGhuEkf+OzMNg2ZYAx8t+52uQ=="
+ },
+ "@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==",
+ "requires": {
+ "@types/lodash": "*"
+ }
+ },
+ "@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=="
+ },
+ "@uppy/companion-client": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmmirror.com/@uppy/companion-client/-/companion-client-2.2.2.tgz",
+ "integrity": "sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==",
+ "requires": {
+ "@uppy/utils": "^4.1.2",
+ "namespace-emitter": "^2.0.1"
+ }
+ },
+ "@uppy/core": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmmirror.com/@uppy/core/-/core-2.3.4.tgz",
+ "integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==",
+ "requires": {
+ "@transloadit/prettier-bytes": "0.0.7",
+ "@uppy/store-default": "^2.1.1",
+ "@uppy/utils": "^4.1.3",
+ "lodash.throttle": "^4.1.1",
+ "mime-match": "^1.0.2",
+ "namespace-emitter": "^2.0.1",
+ "nanoid": "^3.1.25",
+ "preact": "^10.5.13"
+ }
+ },
+ "@uppy/store-default": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/@uppy/store-default/-/store-default-2.1.1.tgz",
+ "integrity": "sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ=="
+ },
+ "@uppy/utils": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmmirror.com/@uppy/utils/-/utils-4.1.3.tgz",
+ "integrity": "sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==",
+ "requires": {
+ "lodash.throttle": "^4.1.1"
+ }
+ },
+ "@uppy/xhr-upload": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz",
+ "integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==",
+ "requires": {
+ "@uppy/companion-client": "^2.2.2",
+ "@uppy/utils": "^4.1.2",
+ "nanoid": "^3.1.25"
+ }
+ },
+ "@vitejs/plugin-vue": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.1.4.tgz",
+ "integrity": "sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==",
+ "dev": true,
+ "requires": {}
+ },
+ "@vue/compiler-core": {
+ "version": "3.5.11",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.11.tgz",
+ "integrity": "sha512-PwAdxs7/9Hc3ieBO12tXzmTD+Ln4qhT/56S+8DvrrZ4kLDn4Z/AMUr8tXJD0axiJBS0RKIoNaR0yMuQB9v9Udg==",
+ "requires": {
+ "@babel/parser": "^7.25.3",
+ "@vue/shared": "3.5.11",
+ "entities": "^4.5.0",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "@vue/compiler-dom": {
+ "version": "3.5.11",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.11.tgz",
+ "integrity": "sha512-pyGf8zdbDDRkBrEzf8p7BQlMKNNF5Fk/Cf/fQ6PiUz9at4OaUfyXW0dGJTo2Vl1f5U9jSLCNf0EZJEogLXoeew==",
+ "requires": {
+ "@vue/compiler-core": "3.5.11",
+ "@vue/shared": "3.5.11"
+ }
+ },
+ "@vue/compiler-sfc": {
+ "version": "3.5.11",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.11.tgz",
+ "integrity": "sha512-gsbBtT4N9ANXXepprle+X9YLg2htQk1sqH/qGJ/EApl+dgpUBdTv3yP7YlR535uHZY3n6XaR0/bKo0BgwwDniw==",
+ "requires": {
+ "@babel/parser": "^7.25.3",
+ "@vue/compiler-core": "3.5.11",
+ "@vue/compiler-dom": "3.5.11",
+ "@vue/compiler-ssr": "3.5.11",
+ "@vue/shared": "3.5.11",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.11",
+ "postcss": "^8.4.47",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "@vue/compiler-ssr": {
+ "version": "3.5.11",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.11.tgz",
+ "integrity": "sha512-P4+GPjOuC2aFTk1Z4WANvEhyOykcvEd5bIj2KVNGKGfM745LaXGr++5njpdBTzVz5pZifdlR1kpYSJJpIlSePA==",
+ "requires": {
+ "@vue/compiler-dom": "3.5.11",
+ "@vue/shared": "3.5.11"
+ }
+ },
+ "@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=="
+ },
+ "@vue/reactivity": {
+ "version": "3.5.11",
+ "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.11.tgz",
+ "integrity": "sha512-Nqo5VZEn8MJWlCce8XoyVqHZbd5P2NH+yuAaFzuNSR96I+y1cnuUiq7xfSG+kyvLSiWmaHTKP1r3OZY4mMD50w==",
+ "requires": {
+ "@vue/shared": "3.5.11"
+ }
+ },
+ "@vue/runtime-core": {
+ "version": "3.5.11",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.11.tgz",
+ "integrity": "sha512-7PsxFGqwfDhfhh0OcDWBG1DaIQIVOLgkwA5q6MtkPiDFjp5gohVnJEahSktwSFLq7R5PtxDKy6WKURVN1UDbzA==",
+ "requires": {
+ "@vue/reactivity": "3.5.11",
+ "@vue/shared": "3.5.11"
+ }
+ },
+ "@vue/runtime-dom": {
+ "version": "3.5.11",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.11.tgz",
+ "integrity": "sha512-GNghjecT6IrGf0UhuYmpgaOlN7kxzQBhxWEn08c/SQDxv1yy4IXI1bn81JgEpQ4IXjRxWtPyI8x0/7TF5rPfYQ==",
+ "requires": {
+ "@vue/reactivity": "3.5.11",
+ "@vue/runtime-core": "3.5.11",
+ "@vue/shared": "3.5.11",
+ "csstype": "^3.1.3"
+ }
+ },
+ "@vue/server-renderer": {
+ "version": "3.5.11",
+ "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.11.tgz",
+ "integrity": "sha512-cVOwYBxR7Wb1B1FoxYvtjJD8X/9E5nlH4VSkJy2uMA1MzYNdzAAB//l8nrmN9py/4aP+3NjWukf9PZ3TeWULaA==",
+ "requires": {
+ "@vue/compiler-ssr": "3.5.11",
+ "@vue/shared": "3.5.11"
+ }
+ },
+ "@vue/shared": {
+ "version": "3.5.11",
+ "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.11.tgz",
+ "integrity": "sha512-W8GgysJVnFo81FthhzurdRAWP/byq3q2qIw70e0JWblzVhjgOMiC2GyovXrZTFQJnFVryYaKGP3Tc9vYzYm6PQ=="
+ },
+ "@vueuse/core": {
+ "version": "9.13.0",
+ "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz",
+ "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
+ "requires": {
+ "@types/web-bluetooth": "^0.0.16",
+ "@vueuse/metadata": "9.13.0",
+ "@vueuse/shared": "9.13.0",
+ "vue-demi": "*"
+ },
+ "dependencies": {
+ "vue-demi": {
+ "version": "0.14.10",
+ "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+ "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+ "requires": {}
+ }
+ }
+ },
+ "@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=="
+ },
+ "@vueuse/shared": {
+ "version": "9.13.0",
+ "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz",
+ "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
+ "requires": {
+ "vue-demi": "*"
+ },
+ "dependencies": {
+ "vue-demi": {
+ "version": "0.14.10",
+ "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+ "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+ "requires": {}
+ }
+ }
+ },
+ "@wangeditor/basic-modules": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz",
+ "integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==",
+ "requires": {
+ "is-url": "^1.2.4"
+ }
+ },
+ "@wangeditor/code-highlight": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz",
+ "integrity": "sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==",
+ "requires": {
+ "prismjs": "^1.23.0"
+ }
+ },
+ "@wangeditor/core": {
+ "version": "1.1.19",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz",
+ "integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==",
+ "requires": {
+ "@types/event-emitter": "^0.3.3",
+ "event-emitter": "^0.3.5",
+ "html-void-elements": "^2.0.0",
+ "i18next": "^20.4.0",
+ "scroll-into-view-if-needed": "^2.2.28",
+ "slate-history": "^0.66.0"
+ }
+ },
+ "@wangeditor/editor": {
+ "version": "5.1.23",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz",
+ "integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==",
+ "requires": {
+ "@uppy/core": "^2.1.1",
+ "@uppy/xhr-upload": "^2.0.3",
+ "@wangeditor/basic-modules": "^1.1.7",
+ "@wangeditor/code-highlight": "^1.0.3",
+ "@wangeditor/core": "^1.1.19",
+ "@wangeditor/list-module": "^1.0.5",
+ "@wangeditor/table-module": "^1.1.4",
+ "@wangeditor/upload-image-module": "^1.0.2",
+ "@wangeditor/video-module": "^1.1.4",
+ "dom7": "^3.0.0",
+ "is-hotkey": "^0.2.0",
+ "lodash.camelcase": "^4.3.0",
+ "lodash.clonedeep": "^4.5.0",
+ "lodash.debounce": "^4.0.8",
+ "lodash.foreach": "^4.5.0",
+ "lodash.isequal": "^4.5.0",
+ "lodash.throttle": "^4.1.1",
+ "lodash.toarray": "^4.4.0",
+ "nanoid": "^3.2.0",
+ "slate": "^0.72.0",
+ "snabbdom": "^3.1.0"
+ }
+ },
+ "@wangeditor/editor-for-vue": {
+ "version": "5.1.12",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/editor-for-vue/-/editor-for-vue-5.1.12.tgz",
+ "integrity": "sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==",
+ "requires": {}
+ },
+ "@wangeditor/list-module": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/list-module/-/list-module-1.0.5.tgz",
+ "integrity": "sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==",
+ "requires": {}
+ },
+ "@wangeditor/table-module": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/table-module/-/table-module-1.1.4.tgz",
+ "integrity": "sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==",
+ "requires": {}
+ },
+ "@wangeditor/upload-image-module": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz",
+ "integrity": "sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==",
+ "requires": {}
+ },
+ "@wangeditor/video-module": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/@wangeditor/video-module/-/video-module-1.1.4.tgz",
+ "integrity": "sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==",
+ "requires": {}
+ },
+ "acorn": {
+ "version": "8.12.1",
+ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.12.1.tgz",
+ "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
+ "dev": true
+ },
+ "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,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "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=="
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "axios": {
+ "version": "1.7.7",
+ "resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.7.tgz",
+ "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
+ "requires": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "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
+ },
+ "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,
+ "requires": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "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,
+ "requires": {
+ "fill-range": "^7.1.1"
+ }
+ },
+ "chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "requires": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.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"
+ }
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "compute-scroll-into-view": {
+ "version": "1.0.20",
+ "resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
+ "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg=="
+ },
+ "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
+ },
+ "csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+ },
+ "d": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/d/-/d-1.0.2.tgz",
+ "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==",
+ "requires": {
+ "es5-ext": "^0.10.64",
+ "type": "^2.7.2"
+ }
+ },
+ "dayjs": {
+ "version": "1.11.13",
+ "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
+ "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
+ },
+ "debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.3"
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+ },
+ "dom7": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz",
+ "integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==",
+ "requires": {
+ "ssr-window": "^3.0.0-alpha.1"
+ }
+ },
+ "echarts": {
+ "version": "5.5.1",
+ "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.5.1.tgz",
+ "integrity": "sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==",
+ "requires": {
+ "tslib": "2.3.0",
+ "zrender": "5.6.0"
+ }
+ },
+ "element-plus": {
+ "version": "2.8.4",
+ "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.8.4.tgz",
+ "integrity": "sha512-ZlVAdUOoJliv4kW3ntWnnSHMT+u/Os7mXJjk2xzOlqNeHaI2/ozlF+R58ZCEak8ZnDi6+5A2viWEYRsq64IuiA==",
+ "requires": {
+ "@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.3",
+ "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"
+ }
+ },
+ "entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="
+ },
+ "es-module-lexer": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz",
+ "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==",
+ "dev": true
+ },
+ "es5-ext": {
+ "version": "0.10.64",
+ "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.64.tgz",
+ "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
+ "requires": {
+ "es6-iterator": "^2.0.3",
+ "es6-symbol": "^3.1.3",
+ "esniff": "^2.0.1",
+ "next-tick": "^1.1.0"
+ }
+ },
+ "es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
+ "requires": {
+ "d": "1",
+ "es5-ext": "^0.10.35",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "es6-symbol": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.4.tgz",
+ "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==",
+ "requires": {
+ "d": "^1.0.2",
+ "ext": "^1.7.0"
+ }
+ },
+ "esbuild": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz",
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+ "dev": true,
+ "requires": {
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
+ }
+ },
+ "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=="
+ },
+ "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
+ },
+ "esniff": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/esniff/-/esniff-2.0.1.tgz",
+ "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==",
+ "requires": {
+ "d": "^1.0.1",
+ "es5-ext": "^0.10.62",
+ "event-emitter": "^0.3.5",
+ "type": "^2.7.2"
+ }
+ },
+ "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=="
+ },
+ "event-emitter": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz",
+ "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
+ "requires": {
+ "d": "1",
+ "es5-ext": "~0.10.14"
+ }
+ },
+ "ext": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz",
+ "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
+ "requires": {
+ "type": "^2.7.2"
+ }
+ },
+ "fast-glob": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ }
+ },
+ "fastq": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.17.1.tgz",
+ "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+ "dev": true,
+ "requires": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "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,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "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=="
+ },
+ "form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "optional": true
+ },
+ "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,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "html-void-elements": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-2.0.1.tgz",
+ "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A=="
+ },
+ "i18next": {
+ "version": "20.6.1",
+ "resolved": "https://registry.npmmirror.com/i18next/-/i18next-20.6.1.tgz",
+ "integrity": "sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==",
+ "requires": {
+ "@babel/runtime": "^7.12.0"
+ }
+ },
+ "immer": {
+ "version": "9.0.21",
+ "resolved": "https://registry.npmmirror.com/immer/-/immer-9.0.21.tgz",
+ "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA=="
+ },
+ "immutable": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.7.tgz",
+ "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==",
+ "dev": true
+ },
+ "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,
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-hotkey": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmmirror.com/is-hotkey/-/is-hotkey-0.2.0.tgz",
+ "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw=="
+ },
+ "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
+ },
+ "is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
+ },
+ "is-url": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmmirror.com/is-url/-/is-url-1.2.4.tgz",
+ "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="
+ },
+ "js-tokens": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.0.tgz",
+ "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==",
+ "dev": true
+ },
+ "local-pkg": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.0.tgz",
+ "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==",
+ "dev": true,
+ "requires": {
+ "mlly": "^1.4.2",
+ "pkg-types": "^1.0.3"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "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=="
+ },
+ "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==",
+ "requires": {}
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+ },
+ "lodash.clonedeep": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+ "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
+ },
+ "lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
+ },
+ "lodash.foreach": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmmirror.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
+ "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ=="
+ },
+ "lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
+ },
+ "lodash.throttle": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
+ "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
+ },
+ "lodash.toarray": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmmirror.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
+ "integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw=="
+ },
+ "magic-string": {
+ "version": "0.30.11",
+ "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.11.tgz",
+ "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==",
+ "requires": {
+ "@jridgewell/sourcemap-codec": "^1.5.0"
+ }
+ },
+ "memoize-one": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz",
+ "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="
+ },
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ }
+ },
+ "mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
+ },
+ "mime-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/mime-match/-/mime-match-1.0.2.tgz",
+ "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==",
+ "requires": {
+ "wildcard": "^1.1.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "mime-db": "1.52.0"
+ }
+ },
+ "minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^2.0.1"
+ }
+ },
+ "mlly": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.7.2.tgz",
+ "integrity": "sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.12.1",
+ "pathe": "^1.1.2",
+ "pkg-types": "^1.2.0",
+ "ufo": "^1.5.4"
+ }
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
+ "namespace-emitter": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/namespace-emitter/-/namespace-emitter-2.0.1.tgz",
+ "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g=="
+ },
+ "nanoid": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="
+ },
+ "next-tick": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz",
+ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
+ },
+ "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
+ },
+ "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=="
+ },
+ "pathe": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz",
+ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
+ "dev": true
+ },
+ "picocolors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.0.tgz",
+ "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw=="
+ },
+ "picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true
+ },
+ "pkg-types": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.2.1.tgz",
+ "integrity": "sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==",
+ "dev": true,
+ "requires": {
+ "confbox": "^0.1.8",
+ "mlly": "^1.7.2",
+ "pathe": "^1.1.2"
+ }
+ },
+ "postcss": {
+ "version": "8.4.47",
+ "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.47.tgz",
+ "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
+ "requires": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.1.0",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "preact": {
+ "version": "10.24.2",
+ "resolved": "https://registry.npmmirror.com/preact/-/preact-10.24.2.tgz",
+ "integrity": "sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q=="
+ },
+ "prismjs": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz",
+ "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q=="
+ },
+ "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=="
+ },
+ "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
+ },
+ "readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+ },
+ "reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true
+ },
+ "rollup": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.24.0.tgz",
+ "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==",
+ "dev": true,
+ "requires": {
+ "@rollup/rollup-android-arm-eabi": "4.24.0",
+ "@rollup/rollup-android-arm64": "4.24.0",
+ "@rollup/rollup-darwin-arm64": "4.24.0",
+ "@rollup/rollup-darwin-x64": "4.24.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.24.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.24.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.24.0",
+ "@rollup/rollup-linux-arm64-musl": "4.24.0",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.24.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.24.0",
+ "@rollup/rollup-linux-x64-gnu": "4.24.0",
+ "@rollup/rollup-linux-x64-musl": "4.24.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.24.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.24.0",
+ "@rollup/rollup-win32-x64-msvc": "4.24.0",
+ "@types/estree": "1.0.6",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "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,
+ "requires": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "sass": {
+ "version": "1.71.1",
+ "resolved": "https://registry.npmmirror.com/sass/-/sass-1.71.1.tgz",
+ "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==",
+ "dev": true,
+ "requires": {
+ "chokidar": ">=3.0.0 <4.0.0",
+ "immutable": "^4.0.0",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ }
+ },
+ "scroll-into-view-if-needed": {
+ "version": "2.2.31",
+ "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
+ "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==",
+ "requires": {
+ "compute-scroll-into-view": "^1.0.20"
+ }
+ },
+ "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
+ },
+ "slate": {
+ "version": "0.72.8",
+ "resolved": "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz",
+ "integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==",
+ "requires": {
+ "immer": "^9.0.6",
+ "is-plain-object": "^5.0.0",
+ "tiny-warning": "^1.0.3"
+ }
+ },
+ "slate-history": {
+ "version": "0.66.0",
+ "resolved": "https://registry.npmmirror.com/slate-history/-/slate-history-0.66.0.tgz",
+ "integrity": "sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==",
+ "requires": {
+ "is-plain-object": "^5.0.0"
+ }
+ },
+ "snabbdom": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmmirror.com/snabbdom/-/snabbdom-3.6.2.tgz",
+ "integrity": "sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q=="
+ },
+ "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=="
+ },
+ "ssr-window": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-3.0.0.tgz",
+ "integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA=="
+ },
+ "strip-literal": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-2.1.0.tgz",
+ "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==",
+ "dev": true,
+ "requires": {
+ "js-tokens": "^9.0.0"
+ }
+ },
+ "tiny-warning": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/tiny-warning/-/tiny-warning-1.0.3.tgz",
+ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="
+ },
+ "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,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "tslib": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
+ "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+ },
+ "type": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmmirror.com/type/-/type-2.7.3.tgz",
+ "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ=="
+ },
+ "ufo": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.5.4.tgz",
+ "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==",
+ "dev": true
+ },
+ "unimport": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmmirror.com/unimport/-/unimport-3.13.1.tgz",
+ "integrity": "sha512-nNrVzcs93yrZQOW77qnyOVHtb68LegvhYFwxFMfuuWScmwQmyVCG/NBuN8tYsaGzgQUVYv34E/af+Cc9u4og4A==",
+ "dev": true,
+ "requires": {
+ "@rollup/pluginutils": "^5.1.2",
+ "acorn": "^8.12.1",
+ "escape-string-regexp": "^5.0.0",
+ "estree-walker": "^3.0.3",
+ "fast-glob": "^3.3.2",
+ "local-pkg": "^0.5.0",
+ "magic-string": "^0.30.11",
+ "mlly": "^1.7.1",
+ "pathe": "^1.1.2",
+ "pkg-types": "^1.2.0",
+ "scule": "^1.3.0",
+ "strip-literal": "^2.1.0",
+ "unplugin": "^1.14.1"
+ },
+ "dependencies": {
+ "estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "dev": true,
+ "requires": {
+ "@types/estree": "^1.0.0"
+ }
+ }
+ }
+ },
+ "unplugin": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-1.14.1.tgz",
+ "integrity": "sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.12.1",
+ "webpack-virtual-modules": "^0.6.2"
+ }
+ },
+ "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,
+ "requires": {
+ "@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"
+ }
+ },
+ "unplugin-element-plus": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmmirror.com/unplugin-element-plus/-/unplugin-element-plus-0.8.0.tgz",
+ "integrity": "sha512-jByUGY3FG2B8RJKFryqxx4eNtSTj+Hjlo8edcOdJymewndDQjThZ1pRUQHRjQsbKhTV2jEctJV7t7RJ405UL4g==",
+ "dev": true,
+ "requires": {
+ "@rollup/pluginutils": "^5.0.2",
+ "es-module-lexer": "^1.3.0",
+ "magic-string": "^0.30.1",
+ "unplugin": "^1.3.2"
+ }
+ },
+ "unplugin-vue-components": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-0.27.4.tgz",
+ "integrity": "sha512-1XVl5iXG7P1UrOMnaj2ogYa5YTq8aoh5jwDPQhemwO/OrXW+lPQKDXd1hMz15qxQPxgb/XXlbgo3HQ2rLEbmXQ==",
+ "dev": true,
+ "requires": {
+ "@antfu/utils": "^0.7.10",
+ "@rollup/pluginutils": "^5.1.0",
+ "chokidar": "^3.6.0",
+ "debug": "^4.3.6",
+ "fast-glob": "^3.3.2",
+ "local-pkg": "^0.5.0",
+ "magic-string": "^0.30.11",
+ "minimatch": "^9.0.5",
+ "mlly": "^1.7.1",
+ "unplugin": "^1.12.1"
+ }
+ },
+ "vite": {
+ "version": "5.4.8",
+ "resolved": "https://registry.npmmirror.com/vite/-/vite-5.4.8.tgz",
+ "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==",
+ "dev": true,
+ "requires": {
+ "esbuild": "^0.21.3",
+ "fsevents": "~2.3.3",
+ "postcss": "^8.4.43",
+ "rollup": "^4.20.0"
+ }
+ },
+ "vue": {
+ "version": "3.5.11",
+ "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.11.tgz",
+ "integrity": "sha512-/8Wurrd9J3lb72FTQS7gRMNQD4nztTtKPmuDuPuhqXmmpD6+skVjAeahNpVzsuky6Sy9gy7wn8UadqPtt9SQIg==",
+ "requires": {
+ "@vue/compiler-dom": "3.5.11",
+ "@vue/compiler-sfc": "3.5.11",
+ "@vue/runtime-dom": "3.5.11",
+ "@vue/server-renderer": "3.5.11",
+ "@vue/shared": "3.5.11"
+ }
+ },
+ "vue-router": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.4.5.tgz",
+ "integrity": "sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==",
+ "requires": {
+ "@vue/devtools-api": "^6.6.4"
+ }
+ },
+ "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
+ },
+ "wildcard": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz",
+ "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng=="
+ },
+ "zrender": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.6.0.tgz",
+ "integrity": "sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==",
+ "requires": {
+ "tslib": "2.3.0"
+ }
+ }
+ }
+}
diff --git a/ui/package.json b/ui/package.json
new file mode 100644
index 0000000..02eabed
--- /dev/null
+++ b/ui/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "vue",
+ "version": "0.0.0",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@element-plus/icons-vue": "^2.3.1",
+ "@wangeditor/editor": "^5.1.23",
+ "@wangeditor/editor-for-vue": "^5.1.12",
+ "axios": "^1.7.2",
+ "echarts": "^5.5.1",
+ "element-plus": "^2.7.6",
+ "vue": "^3.4.29",
+ "vue-router": "^4.3.3"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue": "^5.0.5",
+ "sass": "1.71.1",
+ "unplugin-auto-import": "^0.17.6",
+ "unplugin-element-plus": "^0.8.0",
+ "unplugin-vue-components": "^0.27.2",
+ "vite": "^5.3.1"
+ }
+}
diff --git a/ui/public/favicon.ico b/ui/public/favicon.ico
new file mode 100644
index 0000000..128b648
Binary files /dev/null and b/ui/public/favicon.ico differ
diff --git a/ui/src/App.vue b/ui/src/App.vue
new file mode 100644
index 0000000..6d11557
--- /dev/null
+++ b/ui/src/App.vue
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/ui/src/assets/css/front.css b/ui/src/assets/css/front.css
new file mode 100644
index 0000000..08ee53d
--- /dev/null
+++ b/ui/src/assets/css/front.css
@@ -0,0 +1,83 @@
+.front-notice {
+ padding: 5px 20px;
+ color: #666;
+ font-size: 12px;
+ display: flex;
+ align-items: center;
+}
+
+.front-header {
+ display: flex;
+ height: 60px;
+ line-height: 60px;
+ background-color: #e4d2f3;
+ border-bottom: 1px solid #e4d2f3
+;
+}
+
+.front-header-left {
+ width: 350px;
+ display: flex;
+ align-items: center;
+ padding-left: 30px;
+}
+
+.front-header-left img {
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+}
+
+.front-header-left .title {
+ color: #333;
+ cursor: pointer;
+ margin-left: 10px;
+ font-size: 20px;
+ font-weight: bold;
+ text-decoration: none !important;
+}
+
+.front-header-center {
+ flex: 1;
+}
+
+.front-header-right {
+ padding-right: 20px;
+}
+
+.main-content {
+ width: 80%;
+ margin: 10px auto;
+}
+.main-body {
+ min-height: calc(100vh - 100px);
+}
+
+:deep(.title) {
+ cursor: pointer;
+ text-align: justify;
+}
+:deep(.title:hover) {
+ color: #0085fd;
+ text-decoration: underline;
+}
+
+/*Element-Plus样式覆盖*/
+.el-menu--horizontal {
+ border: none !important;
+}
+.el-tooltip__trigger {
+ outline: none;
+}
+.el-menu--horizontal {
+ background-color: #e4d2f3
+;
+}
+.el-menu--horizontal .is-active {
+ color: #fff !important;
+ background-color: #1149a9 !important;
+}
+.el-menu-item:not(.is-active):hover {
+ background-color: #5190fb !important;
+ color: white !important;
+}
diff --git a/ui/src/assets/css/global.css b/ui/src/assets/css/global.css
new file mode 100644
index 0000000..3d6c0cd
--- /dev/null
+++ b/ui/src/assets/css/global.css
@@ -0,0 +1,45 @@
+* {
+ box-sizing: border-box;
+}
+
+body {
+ margin: 0;
+ padding: 0;
+ color: #333;
+ font-size: 14px;
+}
+
+a {
+ text-decoration: none;
+}
+
+.card {
+ background-color: #fff;
+ border-radius: 5px;
+ padding: 10px;
+ box-shadow: 0 0 10px rgba(0,0,0,.1);
+}
+
+.line1 {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.line2 {
+ word-break: break-all;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2; /* 超出几行省略 */
+ overflow: hidden;
+}
+
+.line3 {
+ word-break: break-all;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 3; /* 超出几行省略 */
+ overflow: hidden;
+}
\ No newline at end of file
diff --git a/ui/src/assets/css/index.scss b/ui/src/assets/css/index.scss
new file mode 100644
index 0000000..8f78a3a
--- /dev/null
+++ b/ui/src/assets/css/index.scss
@@ -0,0 +1,9 @@
+@forward "element-plus/theme-chalk/src/common/var.scss" with ($colors: (
+ "primary": ("base": #d3bf52
+
+),
+ "success": ("base": #46b61f),
+ "warning": ("base": #ffad00),
+ "danger": ("base": #e52f2f),
+ "info": ("base": #47afdc),
+));
diff --git a/ui/src/assets/css/manager.css b/ui/src/assets/css/manager.css
new file mode 100644
index 0000000..e32c940
--- /dev/null
+++ b/ui/src/assets/css/manager.css
@@ -0,0 +1,97 @@
+.manager-container {
+ background-color: #f8f8ff;
+ min-height: 100vh;
+}
+
+.manager-header {
+ height: 60px;
+ background-color: #a9dce5
+
+;
+ display: flex;
+ align-items: center;
+ box-shadow: 0 1px 4px rgba(0, 21, 41, .08);
+}
+
+.manager-header-left {
+ background-color: #a9dce5;
+ width: 200px;
+ height: 100%;
+ padding-left: 10px;
+ display: flex;
+ align-items: center;
+}
+
+.manager-header-left img {
+ width: 30px;
+ height: 30px;
+}
+
+.manager-header-left .title {
+ font-weight: bold;
+ font-size: 20px;
+ margin-left: 10px;
+ color: white;
+}
+
+.manager-header-center {
+ flex: 1;
+}
+
+.manager-main-left {
+ width: 200px;
+ box-shadow: 0 0 6px rgba(0, 21, 41, .33);
+ min-height: calc(100vh - 60px);
+}
+
+.manager-main-right {
+ flex: 1;
+ width: 0;
+ background-color: #f8f8ff;
+ padding: 10px;
+}
+
+
+/* Element-Plus 样式覆盖 */
+.el-menu {
+ width: 200px;
+ height: 100%;
+ background-color: #fff;
+}
+:deep(.el-sub-menu__title) {
+ color: #666 !important;
+ height: 50px;
+ line-height: 50px;
+ background-color: #fff !important;
+}
+.el-sub-menu__title:hover {
+ color: #fff;
+}
+.el-menu-item {
+ color: #666;
+ height: 50px;
+ line-height: 50px;
+ background-color: #fff !important;
+}
+.el-menu--inline .el-menu-item {
+ padding-left: 50px !important;
+}
+.el-menu .is-active {
+ color: #fff !important;
+ background-color: #1890ff !important;
+}
+.el-menu-item:not(.is-active):hover {
+ color: #fff !important;
+ background-color: #1890ff !important;
+}
+
+.el-tooltip__trigger {
+ outline: none;
+}
+:deep(.el-breadcrumb__inner) {
+ color: white !important;
+}
+:deep(.el-breadcrumb__separator) {
+ color: white !important;
+}
+
diff --git a/ui/src/assets/css/view.css b/ui/src/assets/css/view.css
new file mode 100644
index 0000000..6a12e74
--- /dev/null
+++ b/ui/src/assets/css/view.css
@@ -0,0 +1,50 @@
+.editor-content-view {
+ padding: 0 10px;
+ margin-top: 20px;
+ overflow-x: auto;
+}
+
+.editor-content-view p,
+.editor-content-view li {
+ white-space: pre-wrap; /* 保留空格 */
+}
+
+.editor-content-view blockquote {
+ border-left: 8px solid #d0e5f2;
+ padding: 10px 10px;
+ margin: 10px 0;
+ background-color: #f1f1f1;
+}
+
+.editor-content-view code {
+ font-family: monospace;
+ background-color: #eee;
+ padding: 3px;
+ border-radius: 3px;
+}
+.editor-content-view pre>code {
+ display: block;
+ padding: 10px;
+}
+
+.editor-content-view table {
+ border-collapse: collapse;
+}
+.editor-content-view td,
+.editor-content-view th {
+ border: 1px solid #ccc;
+ min-width: 50px;
+ height: 20px;
+}
+.editor-content-view th {
+ background-color: #f1f1f1;
+}
+
+.editor-content-view ul,
+.editor-content-view ol {
+ padding-left: 20px;
+}
+
+.editor-content-view input[type="checkbox"] {
+ margin-right: 5px;
+}
\ No newline at end of file
diff --git a/ui/src/assets/imgs/1.png b/ui/src/assets/imgs/1.png
new file mode 100644
index 0000000..56b98fe
Binary files /dev/null and b/ui/src/assets/imgs/1.png differ
diff --git a/ui/src/assets/imgs/2.png b/ui/src/assets/imgs/2.png
new file mode 100644
index 0000000..082cd5c
Binary files /dev/null and b/ui/src/assets/imgs/2.png differ
diff --git a/ui/src/assets/imgs/3.png b/ui/src/assets/imgs/3.png
new file mode 100644
index 0000000..f2e48f5
Binary files /dev/null and b/ui/src/assets/imgs/3.png differ
diff --git a/ui/src/assets/imgs/404.jpg b/ui/src/assets/imgs/404.jpg
new file mode 100644
index 0000000..7ce045c
Binary files /dev/null and b/ui/src/assets/imgs/404.jpg differ
diff --git a/ui/src/assets/imgs/avatar.png b/ui/src/assets/imgs/avatar.png
new file mode 100644
index 0000000..e16488e
Binary files /dev/null and b/ui/src/assets/imgs/avatar.png differ
diff --git a/ui/src/assets/imgs/bg.jpg b/ui/src/assets/imgs/bg.jpg
new file mode 100644
index 0000000..b3f6392
Binary files /dev/null and b/ui/src/assets/imgs/bg.jpg differ
diff --git a/ui/src/assets/imgs/bg1.jpg b/ui/src/assets/imgs/bg1.jpg
new file mode 100644
index 0000000..e2b5a8d
Binary files /dev/null and b/ui/src/assets/imgs/bg1.jpg differ
diff --git a/ui/src/assets/imgs/logo.png b/ui/src/assets/imgs/logo.png
new file mode 100644
index 0000000..128b648
Binary files /dev/null and b/ui/src/assets/imgs/logo.png differ
diff --git a/ui/src/assets/imgs/read.png b/ui/src/assets/imgs/read.png
new file mode 100644
index 0000000..50defcf
Binary files /dev/null and b/ui/src/assets/imgs/read.png differ
diff --git a/ui/src/assets/imgs/wxzw.png b/ui/src/assets/imgs/wxzw.png
new file mode 100644
index 0000000..ca8f396
Binary files /dev/null and b/ui/src/assets/imgs/wxzw.png differ
diff --git a/ui/src/assets/imgs/xzzw.png b/ui/src/assets/imgs/xzzw.png
new file mode 100644
index 0000000..5e6123f
Binary files /dev/null and b/ui/src/assets/imgs/xzzw.png differ
diff --git a/ui/src/assets/imgs/yxzw.png b/ui/src/assets/imgs/yxzw.png
new file mode 100644
index 0000000..0592afc
Binary files /dev/null and b/ui/src/assets/imgs/yxzw.png differ
diff --git a/ui/src/assets/imgs/热门.png b/ui/src/assets/imgs/热门.png
new file mode 100644
index 0000000..0c05c54
Binary files /dev/null and b/ui/src/assets/imgs/热门.png differ
diff --git a/ui/src/components/Comment.vue b/ui/src/components/Comment.vue
new file mode 100644
index 0000000..df90a16
--- /dev/null
+++ b/ui/src/components/Comment.vue
@@ -0,0 +1,180 @@
+
+
+
+
+
+
评论 {{ data.commentCount }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
{{ item.userName }}
+
{{ item.content }}
+
+
+ {{ item.time }}
+ 回复
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ sub.userName }}
+ 回复 @{{ sub.parentUserName }}
+
+
{{ sub.content }}
+
+ {{ sub.time }}
+ 回复
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/components/Footer.vue b/ui/src/components/Footer.vue
new file mode 100644
index 0000000..f506356
--- /dev/null
+++ b/ui/src/components/Footer.vue
@@ -0,0 +1,7 @@
+
+
+
+
Copyright 2005 - 2025 图书借阅系统. All Rights Reserved
+
+
+
diff --git a/ui/src/main.js b/ui/src/main.js
new file mode 100644
index 0000000..aa7608e
--- /dev/null
+++ b/ui/src/main.js
@@ -0,0 +1,19 @@
+import { createApp } from 'vue'
+import App from './App.vue'
+import router from './router'
+import ElementPlus from 'element-plus'
+import 'element-plus/dist/index.css'
+import zhCn from 'element-plus/es/locale/lang/zh-cn'
+import '@/assets/css/global.css'
+
+const app = createApp(App)
+
+app.use(router)
+app.use(ElementPlus, { locale: zhCn })
+app.mount('#app')
+
+import * as ElementPlusIconsVue from '@element-plus/icons-vue'
+
+for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
+ app.component(key, component)
+}
diff --git a/ui/src/router/index.js b/ui/src/router/index.js
new file mode 100644
index 0000000..56038ef
--- /dev/null
+++ b/ui/src/router/index.js
@@ -0,0 +1,62 @@
+import { createRouter, createWebHistory } from 'vue-router'
+
+const router = createRouter({
+ history: createWebHistory(import.meta.env.BASE_URL),
+ routes: [
+ { path: '/', redirect: '/manager/home' },
+ {
+ path: '/manager',
+ component: () => import('@/views/Manager.vue'),
+ children: [
+ { path: 'home', meta: { name: '系统首页' }, component: () => import('@/views/manager/Home.vue'), },
+ { path: 'admin', meta: { name: '管理员信息' }, component: () => import('@/views/manager/Admin.vue'), },
+ { path: 'notice', meta: { name: '系统公告' }, component: () => import('@/views/manager/Notice.vue'), },
+ { path: 'person', meta: { name: '个人资料' }, component: () => import('@/views/manager/Person.vue'), },
+ { path: 'password', meta: { name: '修改密码' }, component: () => import('@/views/manager/Password.vue'), },
+ { path: 'category', meta: { name: '图书分类' }, component: () => import('@/views/manager/Category.vue'), },
+ { path: 'book', meta: { name: '图书信息' }, component: () => import('@/views/manager/Book.vue'), },
+ { path: 'postsSection', meta: { name: '社区版块' }, component: () => import('@/views/manager/PostsSection.vue'), },
+ { path: 'activity', meta: { name: '图书活动' }, component: () => import('@/views/manager/Activity.vue'), },
+ { path: 'room', meta: { name: '阅览室信息' }, component: () => import('@/views/manager/Room.vue'), },
+ { path: 'seat', meta: { name: '阅览室信息' }, component: () => import('@/views/manager/Seat.vue'), },
+ { path: 'user', meta: { name: '普通用户信息' }, component: () => import('@/views/manager/User.vue'), },
+ { path: 'orders', meta: { name: '普通用户信息' }, component: () => import('@/views/manager/Orders.vue'), },
+ { path: 'comment', meta: { name: '评论信息' }, component: () => import('@/views/manager/Comment.vue'), },
+ { path: 'posts', meta: { name: '帖子信息' }, component: () => import('@/views/manager/Posts.vue'), },
+ { path: 'sign', meta: { name: '活动报名' }, component: () => import('@/views/manager/Sign.vue'), },
+ { path: 'collect', meta: { name: '活动收藏' }, component: () => import('@/views/manager/Collect.vue'), },
+ { path: 'seatReserve', meta: { name: '座位预约' }, component: () => import('@/views/manager/SeatReserve.vue'), },
+ { path: 'view', meta: { name: '数据决策' }, component: () => import('@/views/manager/view.vue'), },
+ ]
+ },
+ {
+ path: '/front',
+ component: () => import('@/views/Front.vue'),
+ children: [
+ { path: 'home', component: () => import('@/views/front/Home.vue'), },
+ { path: 'person', component: () => import('@/views/front/Person.vue'), },
+ { path: 'password', component: () => import('@/views/front/Password.vue'), },
+ { path: 'bookDetail', component: () => import('@/views/front/BookDetail.vue'), },
+ { path: 'orders', component: () => import('@/views/front/Orders.vue'), },
+ { path: 'cart', component: () => import('@/views/front/Cart.vue'), },
+ { path: 'posts', component: () => import('@/views/front/Posts.vue'), },
+ { path: 'postsDetail', component: () => import('@/views/front/PostsDetail.vue'), },
+ { path: 'myPosts', component: () => import('@/views/front/MyPosts.vue'), },
+ { path: 'activity', component: () => import('@/views/front/Activity.vue'), },
+ { path: 'activityDetail', component: () => import('@/views/front/ActivityDetail.vue'), },
+ { path: 'sign', component: () => import('@/views/front/Sign.vue'), },
+ { path: 'collect', component: () => import('@/views/front/Collect.vue'), },
+ { path: 'book', component: () => import('@/views/front/Book.vue'), },
+ { path: 'room', component: () => import('@/views/front/Room.vue'), },
+ { path: 'seatReserve', component: () => import('@/views/front/SeatReserve.vue'), },
+ { path: 'mySeatReserve', component: () => import('@/views/front/MySeatReserve.vue'), },
+ ]
+ },
+ { path: '/login', component: () => import('@/views/Login.vue') },
+ { path: '/register', component: () => import('@/views/Register.vue') },
+ { path: '/404', component: () => import('@/views/404.vue') },
+ { path: '/:pathMatch(.*)', redirect: '/404' }
+ ]
+})
+
+export default router
diff --git a/ui/src/utils/request.js b/ui/src/utils/request.js
new file mode 100644
index 0000000..f200aff
--- /dev/null
+++ b/ui/src/utils/request.js
@@ -0,0 +1,53 @@
+import axios from "axios";
+import {ElMessage} from "element-plus";
+import router from "@/router/index.js";
+
+const request = axios.create({
+ baseURL: import.meta.env.VITE_BASE_URL,
+ timeout: 30000 // 后台接口超时时间
+})
+
+// request 拦截器
+// 可以自请求发送前对请求做一些处理
+request.interceptors.request.use(config => {
+ config.headers['Content-Type'] = 'application/json;charset=utf-8';
+ let user = JSON.parse(localStorage.getItem("xm-user") || '{}')
+ config.headers['token'] = user.token || ''
+ return config
+}, error => {
+ return Promise.reject(error)
+});
+
+// response 拦截器
+// 可以在接口响应后统一处理结果
+request.interceptors.response.use(
+ response => {
+ let res = response.data;
+ // 如果是返回的文件
+ if (response.config.responseType === 'blob') {
+ return res
+ }
+ // 当权限验证不通过的时候给出提示
+ if (res.code === '401') {
+ ElMessage.error(res.msg)
+ router.push('/login')
+ }
+ // 兼容服务端返回的字符串数据
+ if (typeof res === 'string') {
+ res = res ? JSON.parse(res) : res
+ }
+ return res;
+ },
+ error => {
+ if (error.response.status === 404) {
+ ElMessage.error('未找到请求接口')
+ } else if (error.response.status === 500) {
+ ElMessage.error('系统异常,请查看后端控制台报错')
+ } else {
+ console.error(error.message)
+ }
+ return Promise.reject(error)
+ }
+)
+
+export default request
diff --git a/ui/src/views/404.vue b/ui/src/views/404.vue
new file mode 100644
index 0000000..3e9868b
--- /dev/null
+++ b/ui/src/views/404.vue
@@ -0,0 +1,10 @@
+
+
+
+
+
+
找不到页面啦!请返回主页
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/Front.vue b/ui/src/views/Front.vue
new file mode 100644
index 0000000..0bced79
--- /dev/null
+++ b/ui/src/views/Front.vue
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
diff --git a/ui/src/views/Login.vue b/ui/src/views/Login.vue
new file mode 100644
index 0000000..c3ca2ed
--- /dev/null
+++ b/ui/src/views/Login.vue
@@ -0,0 +1,98 @@
+
+
+
+
+
+
管理系统
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 登 录
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/views/Manager.vue b/ui/src/views/Manager.vue
new file mode 100644
index 0000000..4352c6e
--- /dev/null
+++ b/ui/src/views/Manager.vue
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+ 系统首页
+
+
+
+
+ 信息管理
+
+ 借书订单
+ 图书分类
+ 图书信息
+ 社区版块
+ 社区帖子
+ 图书活动
+ 活动报名
+ 阅览室信息
+ 座位信息
+ 座位预约
+ 评论信息
+ 活动收藏
+ 系统公告
+
+
+
+
+ 数据决策
+
+ 决策分析
+
+
+
+
+
+ 用户管理
+
+ 管理员信息
+ 普通用户信息
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/views/Register.vue b/ui/src/views/Register.vue
new file mode 100644
index 0000000..abd6bbc
--- /dev/null
+++ b/ui/src/views/Register.vue
@@ -0,0 +1,109 @@
+
+
+
+
欢 迎 注 册
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 注 册
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/views/front/Activity.vue b/ui/src/views/front/Activity.vue
new file mode 100644
index 0000000..a1ea46f
--- /dev/null
+++ b/ui/src/views/front/Activity.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+ {{ item.status }}
+ {{ item.status }}
+ {{ item.status }}
+ {{ item.name }}
+
+
{{ item.descr }}
+
{{ item.start }} ~ {{ item.end }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/front/ActivityDetail.vue b/ui/src/views/front/ActivityDetail.vue
new file mode 100644
index 0000000..0a77865
--- /dev/null
+++ b/ui/src/views/front/ActivityDetail.vue
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+ {{ data.activity.name }}
+
+
+
{{ data.activity.descr }}
+
+
+
+
+ 活动时间: {{ data.activity.start }} ~ {{ data.activity.end }}
+
+
+ 活动地点: {{ data.activity.location }}
+
+
+ 报名人数: {{ data.activity.signCount }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/front/Book.vue b/ui/src/views/front/Book.vue
new file mode 100644
index 0000000..bc2da78
--- /dev/null
+++ b/ui/src/views/front/Book.vue
@@ -0,0 +1,241 @@
+
+
+
+
+ 全部
+ {{ item.name }}
+
+
+
+ 搜索
+
+
+
+
+
+
+
+
+
+
+
+
{{ item.name }}
+
{{ item.author }}
+
库存剩余:{{ item.store }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/views/front/BookDetail.vue b/ui/src/views/front/BookDetail.vue
new file mode 100644
index 0000000..52e1461
--- /dev/null
+++ b/ui/src/views/front/BookDetail.vue
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
{{ data.book.name }}
+
+ {{ data.book.descr }}
+
+
+
+ 作者: {{ data.book.author }}
+ 出版社: {{ data.book.publisher }}
+ 出版日期: {{ data.book.date }}
+
+
+ ISBN: {{ data.book.isbn }}
+ 零售价: {{ data.book.price }}元
+ 剩余库存: {{ data.book.store }}
+
+
+
+ 借阅须知:借阅书籍如果出现破损需借阅者承担借书全部费用,默认可借阅30天, 逾期未归还图书会扣除信誉分,信誉分低于50无法借阅图书
+
+
+
+ 立即借阅
+ 加入书单
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/views/front/Cart.vue b/ui/src/views/front/Cart.vue
new file mode 100644
index 0000000..3406431
--- /dev/null
+++ b/ui/src/views/front/Cart.vue
@@ -0,0 +1,160 @@
+
+
+
+ 我的书单
+
+
+
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 批量借阅
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/front/Collect.vue b/ui/src/views/front/Collect.vue
new file mode 100644
index 0000000..f9f53d9
--- /dev/null
+++ b/ui/src/views/front/Collect.vue
@@ -0,0 +1,147 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/front/Home.vue b/ui/src/views/front/Home.vue
new file mode 100644
index 0000000..e340908
--- /dev/null
+++ b/ui/src/views/front/Home.vue
@@ -0,0 +1,218 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
图书借阅排行榜
+
+
+
{{ index + 1 }}
+
+
+
+
+
{{ item.name }}
+
{{ item.descr }}
+
+
+
+
{{ index + 1 }}
+
{{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ item.author }}
+ 库存剩余:{{ item.store }}
+
+
+
+
+
+
+
+ 推荐 读物
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ item.author }}
+ 库存剩余:{{ item.store }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ item.title }}
+
+ {{ item.readCount }}
+ {{ item.commentCount }}
+ {{ item.userName }}
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/views/front/MyPosts.vue b/ui/src/views/front/MyPosts.vue
new file mode 100644
index 0000000..0c4ef1f
--- /dev/null
+++ b/ui/src/views/front/MyPosts.vue
@@ -0,0 +1,278 @@
+
+
+
+ 我的发帖
+
+
+
+
+ 发帖
+
+
+
+ 查询
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item }}
+
+
+
+
+ 查看内容
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 上传
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/front/MySeatReserve.vue b/ui/src/views/front/MySeatReserve.vue
new file mode 100644
index 0000000..c07c82f
--- /dev/null
+++ b/ui/src/views/front/MySeatReserve.vue
@@ -0,0 +1,166 @@
+
+
+
+
+
+
+ 查询
+ 重置
+
+
+
+
+
+
+
+
+
+ 已选
+ 已退
+
+
+
+
+ 退座
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/front/Orders.vue b/ui/src/views/front/Orders.vue
new file mode 100644
index 0000000..7318547
--- /dev/null
+++ b/ui/src/views/front/Orders.vue
@@ -0,0 +1,225 @@
+
+
+
+ 我的借书
+
+
+
+
+
+ 查询
+ 重置
+
+
+
+
+
+
+
+ {{ scope.row.days }}天
+ {{ scope.row.days }}天
+
+
+
+
+
+ 已取消
+ 借书待确认
+ 已借出
+ 还书待确认
+ 已归还
+
+
+
+
+ 查询
+
+
+
+
+ 取消
+ 归还
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.bookName }}
+
+
+
+
+ x{{ scope.row.num }}
+
+
+
+
+
+ 交易哈希:{{data.hex}}
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/views/front/Password.vue b/ui/src/views/front/Password.vue
new file mode 100644
index 0000000..4806047
--- /dev/null
+++ b/ui/src/views/front/Password.vue
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 保 存
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/front/Person.vue b/ui/src/views/front/Person.vue
new file mode 100644
index 0000000..402e227
--- /dev/null
+++ b/ui/src/views/front/Person.vue
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 保 存
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/front/Posts.vue b/ui/src/views/front/Posts.vue
new file mode 100644
index 0000000..2201d18
--- /dev/null
+++ b/ui/src/views/front/Posts.vue
@@ -0,0 +1,88 @@
+
+
+
+
全部版块
+
{{ item.name }}
+
+
+
+
+
+
+ {{ item.title }}
+
+
+ {{ tag }}
+
+
+
+
+
+
+ 发布人:{{ item.userName }}
+ 发布时间: {{ item.time }}
+ 阅读量: {{ item.readCount }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/front/PostsDetail.vue b/ui/src/views/front/PostsDetail.vue
new file mode 100644
index 0000000..5df4c0d
--- /dev/null
+++ b/ui/src/views/front/PostsDetail.vue
@@ -0,0 +1,42 @@
+
+
+
+
{{ data.posts.title }}
+
+ {{ data.posts.readCount }}
+ {{ data.posts.userName }}
+ {{ data.posts.time }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/views/front/Room.vue b/ui/src/views/front/Room.vue
new file mode 100644
index 0000000..3187a73
--- /dev/null
+++ b/ui/src/views/front/Room.vue
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
{{ item.name }}
+
点击进入阅读室
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/views/front/SeatReserve.vue b/ui/src/views/front/SeatReserve.vue
new file mode 100644
index 0000000..2f37557
--- /dev/null
+++ b/ui/src/views/front/SeatReserve.vue
@@ -0,0 +1,103 @@
+
+
+
+
+
+
{{ data.room.name }}
+
具体位置:{{ data.room.location }}
+
开放时间:{{ data.room.openTime }}
+
预约须知:请提前预约第二天的座位,预约成功后请及时使用,禁止违规占座、替他人预约
+
+
+
+
+
+
+
+
+
未选
+
已选
+
+
+
+
+ 座位预约
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/front/Sign.vue b/ui/src/views/front/Sign.vue
new file mode 100644
index 0000000..949c51c
--- /dev/null
+++ b/ui/src/views/front/Sign.vue
@@ -0,0 +1,169 @@
+
+
+
+
+
+
+
+ 查询
+ 重置
+
+
+
+
+
+
+
+
+
+ 未签到
+ 已签到
+
+
+
+
+
+
+ 签到
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/manager/Activity.vue b/ui/src/views/manager/Activity.vue
new file mode 100644
index 0000000..5484f3f
--- /dev/null
+++ b/ui/src/views/manager/Activity.vue
@@ -0,0 +1,272 @@
+
+
+
+
+ 查询
+ 重置
+
+
+ 新增
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 查看内容
+
+
+
+
+ 未开始
+ 进行中
+ 已结束
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 上传
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/manager/Admin.vue b/ui/src/views/manager/Admin.vue
new file mode 100644
index 0000000..4233a18
--- /dev/null
+++ b/ui/src/views/manager/Admin.vue
@@ -0,0 +1,187 @@
+
+
+
+
+ 查询
+ 重置
+
+
+ 新增
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 点击上传
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/manager/Book.vue b/ui/src/views/manager/Book.vue
new file mode 100644
index 0000000..69778b2
--- /dev/null
+++ b/ui/src/views/manager/Book.vue
@@ -0,0 +1,240 @@
+
+
+
+
+
+ 查询
+ 重置
+
+
+ 新增
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 是
+ 否
+
+
+
+
+ 是
+ 否
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 上传
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/manager/Category.vue b/ui/src/views/manager/Category.vue
new file mode 100644
index 0000000..e179ad5
--- /dev/null
+++ b/ui/src/views/manager/Category.vue
@@ -0,0 +1,157 @@
+
+
+
+
+ 查询
+ 重置
+
+
+ 新增
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/manager/Collect.vue b/ui/src/views/manager/Collect.vue
new file mode 100644
index 0000000..4275390
--- /dev/null
+++ b/ui/src/views/manager/Collect.vue
@@ -0,0 +1,151 @@
+
+
+
+
+
+
+ 查询
+ 重置
+
+
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/manager/Comment.vue b/ui/src/views/manager/Comment.vue
new file mode 100644
index 0000000..a74e6cd
--- /dev/null
+++ b/ui/src/views/manager/Comment.vue
@@ -0,0 +1,146 @@
+
+
+
+
+ 查询
+ 重置
+
+
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/manager/Home.vue b/ui/src/views/manager/Home.vue
new file mode 100644
index 0000000..e12dd47
--- /dev/null
+++ b/ui/src/views/manager/Home.vue
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+ 数据概览
+
+
+
{{ stat.icon }}
+
+
{{ stat.title }}
+
{{ stat.value }}
+
+
+
+
+
+
+
+
+
+ 快捷操作
+
+
+ {{ link.icon }}
+ {{ link.title }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/views/manager/Notice.vue b/ui/src/views/manager/Notice.vue
new file mode 100644
index 0000000..6572b2f
--- /dev/null
+++ b/ui/src/views/manager/Notice.vue
@@ -0,0 +1,159 @@
+
+
+
+
+ 查询
+ 重置
+
+
+ 新增
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/manager/Orders.vue b/ui/src/views/manager/Orders.vue
new file mode 100644
index 0000000..8fedaf1
--- /dev/null
+++ b/ui/src/views/manager/Orders.vue
@@ -0,0 +1,204 @@
+
+
+
+
+ 查询
+ 重置
+
+
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.days }}天
+ {{ scope.row.days }}天
+
+
+
+
+
+ 已取消
+ 借书待确认
+ 已借出
+ 还书待确认
+ 已归还
+
+
+
+
+ 查询
+
+
+
+
+ 确认借出
+ 确认归还
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.bookName }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/manager/Password.vue b/ui/src/views/manager/Password.vue
new file mode 100644
index 0000000..65325f8
--- /dev/null
+++ b/ui/src/views/manager/Password.vue
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 保 存
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/manager/Person.vue b/ui/src/views/manager/Person.vue
new file mode 100644
index 0000000..0878538
--- /dev/null
+++ b/ui/src/views/manager/Person.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 保 存
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/manager/Posts.vue b/ui/src/views/manager/Posts.vue
new file mode 100644
index 0000000..b27eccf
--- /dev/null
+++ b/ui/src/views/manager/Posts.vue
@@ -0,0 +1,178 @@
+
+
+
+
+ 查询
+ 重置
+
+
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item }}
+
+
+
+
+ 查看内容
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/manager/PostsSection.vue b/ui/src/views/manager/PostsSection.vue
new file mode 100644
index 0000000..21d6ae0
--- /dev/null
+++ b/ui/src/views/manager/PostsSection.vue
@@ -0,0 +1,156 @@
+
+
+
+
+ 查询
+ 重置
+
+
+ 新增
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/manager/Room.vue b/ui/src/views/manager/Room.vue
new file mode 100644
index 0000000..593f1e6
--- /dev/null
+++ b/ui/src/views/manager/Room.vue
@@ -0,0 +1,186 @@
+
+
+
+
+ 查询
+ 重置
+
+
+ 新增
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 上传
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/manager/Seat.vue b/ui/src/views/manager/Seat.vue
new file mode 100644
index 0000000..3e0d11f
--- /dev/null
+++ b/ui/src/views/manager/Seat.vue
@@ -0,0 +1,175 @@
+
+
+
+
+ 查询
+ 重置
+
+
+ 新增
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/manager/SeatReserve.vue b/ui/src/views/manager/SeatReserve.vue
new file mode 100644
index 0000000..935d4bc
--- /dev/null
+++ b/ui/src/views/manager/SeatReserve.vue
@@ -0,0 +1,150 @@
+
+
+
+
+
+ 查询
+ 重置
+
+
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/manager/Sign.vue b/ui/src/views/manager/Sign.vue
new file mode 100644
index 0000000..0672450
--- /dev/null
+++ b/ui/src/views/manager/Sign.vue
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+ 查询
+ 重置
+
+
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+ 未签到
+ 已签到
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/manager/User.vue b/ui/src/views/manager/User.vue
new file mode 100644
index 0000000..3a7f8d1
--- /dev/null
+++ b/ui/src/views/manager/User.vue
@@ -0,0 +1,191 @@
+
+
+
+
+ 查询
+ 重置
+
+
+ 新增
+ 批量删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 点击上传
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/views/manager/view.vue b/ui/src/views/manager/view.vue
new file mode 100644
index 0000000..9dffc47
--- /dev/null
+++ b/ui/src/views/manager/view.vue
@@ -0,0 +1,237 @@
+
+
+
+
+
diff --git a/ui/vite.config.js b/ui/vite.config.js
new file mode 100644
index 0000000..9f8d580
--- /dev/null
+++ b/ui/vite.config.js
@@ -0,0 +1,103 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue'
+import AutoImport from 'unplugin-auto-import/vite'
+import Components from 'unplugin-vue-components/vite'
+import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
+import ElementPlus from 'unplugin-element-plus/vite'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue(),
+ // 按需定制主题配置
+ ElementPlus({
+ useSource: true,
+ }),
+ AutoImport({
+ resolvers: [ElementPlusResolver({ importStyle: 'sass' })],
+ }),
+ Components({
+ resolvers: [ElementPlusResolver({ importStyle: 'sass' })],
+ }),
+ ],
+ // 预加载项目必需的组件
+ optimizeDeps: {
+ include: [
+ "vue",
+ "vue-router",
+ "axios",
+ "element-plus/es/components/base/style/css",
+ "element-plus/es/components/message/style/css",
+ "element-plus/es/components/message-box/style/css",
+ "element-plus/es/components/form/style/css",
+ "element-plus/es/components/form-item/style/css",
+ "element-plus/es/components/button/style/css",
+ "element-plus/es/components/input/style/css",
+ "element-plus/es/components/input-number/style/css",
+ "element-plus/es/components/switch/style/css",
+ "element-plus/es/components/upload/style/css",
+ "element-plus/es/components/menu/style/css",
+ "element-plus/es/components/col/style/css",
+ "element-plus/es/components/icon/style/css",
+ "element-plus/es/components/row/style/css",
+ "element-plus/es/components/tag/style/css",
+ "element-plus/es/components/dialog/style/css",
+ "element-plus/es/components/loading/style/css",
+ "element-plus/es/components/radio/style/css",
+ "element-plus/es/components/radio-group/style/css",
+ "element-plus/es/components/popover/style/css",
+ "element-plus/es/components/scrollbar/style/css",
+ "element-plus/es/components/tooltip/style/css",
+ "element-plus/es/components/dropdown/style/css",
+ "element-plus/es/components/dropdown-menu/style/css",
+ "element-plus/es/components/dropdown-item/style/css",
+ "element-plus/es/components/sub-menu/style/css",
+ "element-plus/es/components/menu-item/style/css",
+ "element-plus/es/components/divider/style/css",
+ "element-plus/es/components/card/style/css",
+ "element-plus/es/components/link/style/css",
+ "element-plus/es/components/breadcrumb/style/css",
+ "element-plus/es/components/breadcrumb-item/style/css",
+ "element-plus/es/components/table/style/css",
+ "element-plus/es/components/tree-select/style/css",
+ "element-plus/es/components/table-column/style/css",
+ "element-plus/es/components/select/style/css",
+ "element-plus/es/components/option/style/css",
+ "element-plus/es/components/pagination/style/css",
+ "element-plus/es/components/tree/style/css",
+ "element-plus/es/components/alert/style/css",
+ "element-plus/es/components/radio-button/style/css",
+ "element-plus/es/components/checkbox-group/style/css",
+ "element-plus/es/components/checkbox/style/css",
+ "element-plus/es/components/tabs/style/css",
+ "element-plus/es/components/tab-pane/style/css",
+ "element-plus/es/components/rate/style/css",
+ "element-plus/es/components/date-picker/style/css",
+ "element-plus/es/components/notification/style/css",
+ "element-plus/es/components/image/style/css",
+ "element-plus/es/components/statistic/style/css",
+ "element-plus/es/components/watermark/style/css",
+ "element-plus/es/components/config-provider/style/css",
+ "element-plus/es/components/text/style/css",
+ "element-plus/es/components/drawer/style/css",
+ "element-plus/es/components/color-picker/style/css",
+ ],
+ },
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ },
+ css: {
+ preprocessorOptions: {
+ scss: {
+ // 自动导入定制化样式文件进行样式覆盖
+ additionalData: `
+ @use "@/assets/css/index.scss" as *;
+ `,
+ }
+ }
+ },
+})
diff --git a/ui/yarn.lock b/ui/yarn.lock
new file mode 100644
index 0000000..6fc4e9a
--- /dev/null
+++ b/ui/yarn.lock
@@ -0,0 +1,1415 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@antfu/utils@^0.7.10":
+ version "0.7.10"
+ resolved "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.10.tgz"
+ integrity sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==
+
+"@babel/helper-string-parser@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz"
+ integrity sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==
+
+"@babel/helper-validator-identifier@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz"
+ integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==
+
+"@babel/parser@^7.25.3":
+ version "7.25.7"
+ resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.25.7.tgz"
+ integrity sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==
+ dependencies:
+ "@babel/types" "^7.25.7"
+
+"@babel/runtime@^7.12.0":
+ version "7.25.7"
+ resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.25.7.tgz"
+ integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==
+ dependencies:
+ regenerator-runtime "^0.14.0"
+
+"@babel/types@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmmirror.com/@babel/types/-/types-7.25.7.tgz"
+ integrity sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==
+ dependencies:
+ "@babel/helper-string-parser" "^7.25.7"
+ "@babel/helper-validator-identifier" "^7.25.7"
+ to-fast-properties "^2.0.0"
+
+"@ctrl/tinycolor@^3.4.1":
+ version "3.6.1"
+ resolved "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz"
+ integrity sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==
+
+"@element-plus/icons-vue@^2.3.1":
+ version "2.3.1"
+ resolved "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz"
+ integrity sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==
+
+"@esbuild/aix-ppc64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f"
+ integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==
+
+"@esbuild/android-arm64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052"
+ integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==
+
+"@esbuild/android-arm@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28"
+ integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==
+
+"@esbuild/android-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e"
+ integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==
+
+"@esbuild/darwin-arm64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a"
+ integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==
+
+"@esbuild/darwin-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22"
+ integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==
+
+"@esbuild/freebsd-arm64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e"
+ integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==
+
+"@esbuild/freebsd-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261"
+ integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==
+
+"@esbuild/linux-arm64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b"
+ integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==
+
+"@esbuild/linux-arm@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9"
+ integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==
+
+"@esbuild/linux-ia32@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2"
+ integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==
+
+"@esbuild/linux-loong64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df"
+ integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==
+
+"@esbuild/linux-mips64el@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe"
+ integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==
+
+"@esbuild/linux-ppc64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4"
+ integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==
+
+"@esbuild/linux-riscv64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc"
+ integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==
+
+"@esbuild/linux-s390x@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de"
+ integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==
+
+"@esbuild/linux-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0"
+ integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==
+
+"@esbuild/netbsd-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047"
+ integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==
+
+"@esbuild/openbsd-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70"
+ integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==
+
+"@esbuild/sunos-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b"
+ integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==
+
+"@esbuild/win32-arm64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d"
+ integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==
+
+"@esbuild/win32-ia32@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b"
+ integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==
+
+"@esbuild/win32-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz"
+ integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==
+
+"@floating-ui/core@^1.6.0":
+ version "1.6.8"
+ resolved "https://registry.npmmirror.com/@floating-ui/core/-/core-1.6.8.tgz"
+ integrity sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==
+ dependencies:
+ "@floating-ui/utils" "^0.2.8"
+
+"@floating-ui/dom@^1.0.1":
+ version "1.6.11"
+ resolved "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.6.11.tgz"
+ integrity sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==
+ dependencies:
+ "@floating-ui/core" "^1.6.0"
+ "@floating-ui/utils" "^0.2.8"
+
+"@floating-ui/utils@^0.2.8":
+ version "0.2.8"
+ resolved "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.8.tgz"
+ integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==
+
+"@jridgewell/sourcemap-codec@^1.5.0":
+ version "1.5.0"
+ resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz"
+ integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
+
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.5"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.5"
+ resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3":
+ version "1.2.8"
+ resolved "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ fastq "^1.6.0"
+
+"@popperjs/core@npm:@sxzz/popperjs-es@^2.11.7":
+ version "2.11.7"
+ resolved "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz"
+ integrity sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==
+
+"@rollup/pluginutils@^5.0.2", "@rollup/pluginutils@^5.1.0", "@rollup/pluginutils@^5.1.2":
+ version "5.1.2"
+ resolved "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.2.tgz"
+ integrity sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==
+ dependencies:
+ "@types/estree" "^1.0.0"
+ estree-walker "^2.0.2"
+ picomatch "^2.3.1"
+
+"@rollup/rollup-android-arm-eabi@4.24.0":
+ version "4.24.0"
+ resolved "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz#1661ff5ea9beb362795304cb916049aba7ac9c54"
+ integrity sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==
+
+"@rollup/rollup-android-arm64@4.24.0":
+ version "4.24.0"
+ resolved "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz#2ffaa91f1b55a0082b8a722525741aadcbd3971e"
+ integrity sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==
+
+"@rollup/rollup-darwin-arm64@4.24.0":
+ version "4.24.0"
+ resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz#627007221b24b8cc3063703eee0b9177edf49c1f"
+ integrity sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==
+
+"@rollup/rollup-darwin-x64@4.24.0":
+ version "4.24.0"
+ resolved "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz#0605506142b9e796c370d59c5984ae95b9758724"
+ integrity sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==
+
+"@rollup/rollup-linux-arm-gnueabihf@4.24.0":
+ version "4.24.0"
+ resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz#62dfd196d4b10c0c2db833897164d2d319ee0cbb"
+ integrity sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==
+
+"@rollup/rollup-linux-arm-musleabihf@4.24.0":
+ version "4.24.0"
+ resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz#53ce72aeb982f1f34b58b380baafaf6a240fddb3"
+ integrity sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==
+
+"@rollup/rollup-linux-arm64-gnu@4.24.0":
+ version "4.24.0"
+ resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz#1632990f62a75c74f43e4b14ab3597d7ed416496"
+ integrity sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==
+
+"@rollup/rollup-linux-arm64-musl@4.24.0":
+ version "4.24.0"
+ resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz#8c03a996efb41e257b414b2e0560b7a21f2d9065"
+ integrity sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==
+
+"@rollup/rollup-linux-powerpc64le-gnu@4.24.0":
+ version "4.24.0"
+ resolved "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz#5b98729628d5bcc8f7f37b58b04d6845f85c7b5d"
+ integrity sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==
+
+"@rollup/rollup-linux-riscv64-gnu@4.24.0":
+ version "4.24.0"
+ resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz#48e42e41f4cabf3573cfefcb448599c512e22983"
+ integrity sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==
+
+"@rollup/rollup-linux-s390x-gnu@4.24.0":
+ version "4.24.0"
+ resolved "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz#e0b4f9a966872cb7d3e21b9e412a4b7efd7f0b58"
+ integrity sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==
+
+"@rollup/rollup-linux-x64-gnu@4.24.0":
+ version "4.24.0"
+ resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz#78144741993100f47bd3da72fce215e077ae036b"
+ integrity sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==
+
+"@rollup/rollup-linux-x64-musl@4.24.0":
+ version "4.24.0"
+ resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz#d9fe32971883cd1bd858336bd33a1c3ca6146127"
+ integrity sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==
+
+"@rollup/rollup-win32-arm64-msvc@4.24.0":
+ version "4.24.0"
+ resolved "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz#71fa3ea369316db703a909c790743972e98afae5"
+ integrity sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==
+
+"@rollup/rollup-win32-ia32-msvc@4.24.0":
+ version "4.24.0"
+ resolved "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz#653f5989a60658e17d7576a3996deb3902e342e2"
+ integrity sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==
+
+"@rollup/rollup-win32-x64-msvc@4.24.0":
+ version "4.24.0"
+ resolved "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz"
+ integrity sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==
+
+"@transloadit/prettier-bytes@0.0.7":
+ version "0.0.7"
+ resolved "https://registry.npmmirror.com/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz"
+ integrity sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==
+
+"@types/estree@1.0.6", "@types/estree@^1.0.0":
+ version "1.0.6"
+ resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.6.tgz"
+ integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==
+
+"@types/event-emitter@^0.3.3":
+ version "0.3.5"
+ resolved "https://registry.npmmirror.com/@types/event-emitter/-/event-emitter-0.3.5.tgz"
+ integrity sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ==
+
+"@types/lodash-es@^4.17.6":
+ 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" "*"
+
+"@types/lodash@*", "@types/lodash@^4.14.182":
+ version "4.17.10"
+ resolved "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.10.tgz"
+ integrity sha512-YpS0zzoduEhuOWjAotS6A5AVCva7X4lVlYLF0FYHAY9sdraBfnatttHItlWeZdGhuEkf+OzMNg2ZYAx8t+52uQ==
+
+"@types/web-bluetooth@^0.0.16":
+ version "0.0.16"
+ resolved "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz"
+ integrity sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==
+
+"@uppy/companion-client@^2.2.2":
+ version "2.2.2"
+ resolved "https://registry.npmmirror.com/@uppy/companion-client/-/companion-client-2.2.2.tgz"
+ integrity sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==
+ dependencies:
+ "@uppy/utils" "^4.1.2"
+ namespace-emitter "^2.0.1"
+
+"@uppy/core@^2.1.1":
+ version "2.3.4"
+ resolved "https://registry.npmmirror.com/@uppy/core/-/core-2.3.4.tgz"
+ integrity sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==
+ dependencies:
+ "@transloadit/prettier-bytes" "0.0.7"
+ "@uppy/store-default" "^2.1.1"
+ "@uppy/utils" "^4.1.3"
+ lodash.throttle "^4.1.1"
+ mime-match "^1.0.2"
+ namespace-emitter "^2.0.1"
+ nanoid "^3.1.25"
+ preact "^10.5.13"
+
+"@uppy/store-default@^2.1.1":
+ version "2.1.1"
+ resolved "https://registry.npmmirror.com/@uppy/store-default/-/store-default-2.1.1.tgz"
+ integrity sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==
+
+"@uppy/utils@^4.1.2", "@uppy/utils@^4.1.3":
+ version "4.1.3"
+ resolved "https://registry.npmmirror.com/@uppy/utils/-/utils-4.1.3.tgz"
+ integrity sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==
+ dependencies:
+ lodash.throttle "^4.1.1"
+
+"@uppy/xhr-upload@^2.0.3":
+ version "2.1.3"
+ resolved "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz"
+ integrity sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==
+ dependencies:
+ "@uppy/companion-client" "^2.2.2"
+ "@uppy/utils" "^4.1.2"
+ nanoid "^3.1.25"
+
+"@vitejs/plugin-vue@^5.0.5":
+ version "5.1.4"
+ resolved "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.1.4.tgz"
+ integrity sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==
+
+"@vue/compiler-core@3.5.11":
+ version "3.5.11"
+ resolved "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.11.tgz"
+ integrity sha512-PwAdxs7/9Hc3ieBO12tXzmTD+Ln4qhT/56S+8DvrrZ4kLDn4Z/AMUr8tXJD0axiJBS0RKIoNaR0yMuQB9v9Udg==
+ dependencies:
+ "@babel/parser" "^7.25.3"
+ "@vue/shared" "3.5.11"
+ entities "^4.5.0"
+ estree-walker "^2.0.2"
+ source-map-js "^1.2.0"
+
+"@vue/compiler-dom@3.5.11":
+ version "3.5.11"
+ resolved "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.11.tgz"
+ integrity sha512-pyGf8zdbDDRkBrEzf8p7BQlMKNNF5Fk/Cf/fQ6PiUz9at4OaUfyXW0dGJTo2Vl1f5U9jSLCNf0EZJEogLXoeew==
+ dependencies:
+ "@vue/compiler-core" "3.5.11"
+ "@vue/shared" "3.5.11"
+
+"@vue/compiler-sfc@3.5.11":
+ version "3.5.11"
+ resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.11.tgz"
+ integrity sha512-gsbBtT4N9ANXXepprle+X9YLg2htQk1sqH/qGJ/EApl+dgpUBdTv3yP7YlR535uHZY3n6XaR0/bKo0BgwwDniw==
+ dependencies:
+ "@babel/parser" "^7.25.3"
+ "@vue/compiler-core" "3.5.11"
+ "@vue/compiler-dom" "3.5.11"
+ "@vue/compiler-ssr" "3.5.11"
+ "@vue/shared" "3.5.11"
+ estree-walker "^2.0.2"
+ magic-string "^0.30.11"
+ postcss "^8.4.47"
+ source-map-js "^1.2.0"
+
+"@vue/compiler-ssr@3.5.11":
+ version "3.5.11"
+ resolved "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.11.tgz"
+ integrity sha512-P4+GPjOuC2aFTk1Z4WANvEhyOykcvEd5bIj2KVNGKGfM745LaXGr++5njpdBTzVz5pZifdlR1kpYSJJpIlSePA==
+ dependencies:
+ "@vue/compiler-dom" "3.5.11"
+ "@vue/shared" "3.5.11"
+
+"@vue/devtools-api@^6.6.4":
+ version "6.6.4"
+ resolved "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz"
+ integrity sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==
+
+"@vue/reactivity@3.5.11":
+ version "3.5.11"
+ resolved "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.11.tgz"
+ integrity sha512-Nqo5VZEn8MJWlCce8XoyVqHZbd5P2NH+yuAaFzuNSR96I+y1cnuUiq7xfSG+kyvLSiWmaHTKP1r3OZY4mMD50w==
+ dependencies:
+ "@vue/shared" "3.5.11"
+
+"@vue/runtime-core@3.5.11":
+ version "3.5.11"
+ resolved "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.11.tgz"
+ integrity sha512-7PsxFGqwfDhfhh0OcDWBG1DaIQIVOLgkwA5q6MtkPiDFjp5gohVnJEahSktwSFLq7R5PtxDKy6WKURVN1UDbzA==
+ dependencies:
+ "@vue/reactivity" "3.5.11"
+ "@vue/shared" "3.5.11"
+
+"@vue/runtime-dom@3.5.11":
+ version "3.5.11"
+ resolved "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.11.tgz"
+ integrity sha512-GNghjecT6IrGf0UhuYmpgaOlN7kxzQBhxWEn08c/SQDxv1yy4IXI1bn81JgEpQ4IXjRxWtPyI8x0/7TF5rPfYQ==
+ dependencies:
+ "@vue/reactivity" "3.5.11"
+ "@vue/runtime-core" "3.5.11"
+ "@vue/shared" "3.5.11"
+ csstype "^3.1.3"
+
+"@vue/server-renderer@3.5.11":
+ version "3.5.11"
+ resolved "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.11.tgz"
+ integrity sha512-cVOwYBxR7Wb1B1FoxYvtjJD8X/9E5nlH4VSkJy2uMA1MzYNdzAAB//l8nrmN9py/4aP+3NjWukf9PZ3TeWULaA==
+ dependencies:
+ "@vue/compiler-ssr" "3.5.11"
+ "@vue/shared" "3.5.11"
+
+"@vue/shared@3.5.11":
+ version "3.5.11"
+ resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.11.tgz"
+ integrity sha512-W8GgysJVnFo81FthhzurdRAWP/byq3q2qIw70e0JWblzVhjgOMiC2GyovXrZTFQJnFVryYaKGP3Tc9vYzYm6PQ==
+
+"@vueuse/core@^9.1.0":
+ 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 "*"
+
+"@vueuse/metadata@9.13.0":
+ version "9.13.0"
+ resolved "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz"
+ integrity sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==
+
+"@vueuse/shared@9.13.0":
+ version "9.13.0"
+ resolved "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz"
+ integrity sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==
+ dependencies:
+ vue-demi "*"
+
+"@wangeditor/basic-modules@^1.1.7":
+ version "1.1.7"
+ resolved "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz"
+ integrity sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==
+ dependencies:
+ is-url "^1.2.4"
+
+"@wangeditor/code-highlight@^1.0.3":
+ version "1.0.3"
+ resolved "https://registry.npmmirror.com/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz"
+ integrity sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==
+ dependencies:
+ prismjs "^1.23.0"
+
+"@wangeditor/core@^1.1.19":
+ version "1.1.19"
+ resolved "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz"
+ integrity sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==
+ dependencies:
+ "@types/event-emitter" "^0.3.3"
+ event-emitter "^0.3.5"
+ html-void-elements "^2.0.0"
+ i18next "^20.4.0"
+ scroll-into-view-if-needed "^2.2.28"
+ slate-history "^0.66.0"
+
+"@wangeditor/editor-for-vue@^5.1.12":
+ version "5.1.12"
+ resolved "https://registry.npmmirror.com/@wangeditor/editor-for-vue/-/editor-for-vue-5.1.12.tgz"
+ integrity sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==
+
+"@wangeditor/editor@^5.1.23":
+ version "5.1.23"
+ resolved "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz"
+ integrity sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==
+ dependencies:
+ "@uppy/core" "^2.1.1"
+ "@uppy/xhr-upload" "^2.0.3"
+ "@wangeditor/basic-modules" "^1.1.7"
+ "@wangeditor/code-highlight" "^1.0.3"
+ "@wangeditor/core" "^1.1.19"
+ "@wangeditor/list-module" "^1.0.5"
+ "@wangeditor/table-module" "^1.1.4"
+ "@wangeditor/upload-image-module" "^1.0.2"
+ "@wangeditor/video-module" "^1.1.4"
+ dom7 "^3.0.0"
+ is-hotkey "^0.2.0"
+ lodash.camelcase "^4.3.0"
+ lodash.clonedeep "^4.5.0"
+ lodash.debounce "^4.0.8"
+ lodash.foreach "^4.5.0"
+ lodash.isequal "^4.5.0"
+ lodash.throttle "^4.1.1"
+ lodash.toarray "^4.4.0"
+ nanoid "^3.2.0"
+ slate "^0.72.0"
+ snabbdom "^3.1.0"
+
+"@wangeditor/list-module@^1.0.5":
+ version "1.0.5"
+ resolved "https://registry.npmmirror.com/@wangeditor/list-module/-/list-module-1.0.5.tgz"
+ integrity sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==
+
+"@wangeditor/table-module@^1.1.4":
+ version "1.1.4"
+ resolved "https://registry.npmmirror.com/@wangeditor/table-module/-/table-module-1.1.4.tgz"
+ integrity sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==
+
+"@wangeditor/upload-image-module@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.npmmirror.com/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz"
+ integrity sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==
+
+"@wangeditor/video-module@^1.1.4":
+ version "1.1.4"
+ resolved "https://registry.npmmirror.com/@wangeditor/video-module/-/video-module-1.1.4.tgz"
+ integrity sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==
+
+acorn@^8.12.1:
+ version "8.12.1"
+ resolved "https://registry.npmmirror.com/acorn/-/acorn-8.12.1.tgz"
+ integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==
+
+anymatch@~3.1.2:
+ version "3.1.3"
+ resolved "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz"
+ integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+async-validator@^4.2.5:
+ version "4.2.5"
+ resolved "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz"
+ integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz"
+ integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+axios@^1.7.2:
+ version "1.7.7"
+ resolved "https://registry.npmmirror.com/axios/-/axios-1.7.7.tgz"
+ integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==
+ dependencies:
+ follow-redirects "^1.15.6"
+ form-data "^4.0.0"
+ proxy-from-env "^1.1.0"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+binary-extensions@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz"
+ integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
+
+brace-expansion@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz"
+ integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+ dependencies:
+ balanced-match "^1.0.0"
+
+braces@^3.0.3, braces@~3.0.2:
+ version "3.0.3"
+ resolved "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz"
+ integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
+ dependencies:
+ fill-range "^7.1.1"
+
+"chokidar@>=3.0.0 <4.0.0", chokidar@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz"
+ integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
+ 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"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+combined-stream@^1.0.8:
+ 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"
+
+compute-scroll-into-view@^1.0.20:
+ version "1.0.20"
+ resolved "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz"
+ integrity sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==
+
+confbox@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz"
+ integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==
+
+csstype@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz"
+ integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
+
+d@1, d@^1.0.1, d@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmmirror.com/d/-/d-1.0.2.tgz"
+ integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==
+ dependencies:
+ es5-ext "^0.10.64"
+ type "^2.7.2"
+
+dayjs@^1.11.3:
+ version "1.11.13"
+ resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz"
+ integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==
+
+debug@^4.3.6:
+ version "4.3.7"
+ resolved "https://registry.npmmirror.com/debug/-/debug-4.3.7.tgz"
+ integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==
+ dependencies:
+ ms "^2.1.3"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz"
+ integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
+dom7@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz"
+ integrity sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==
+ dependencies:
+ ssr-window "^3.0.0-alpha.1"
+
+echarts@^5.5.1:
+ version "5.5.1"
+ resolved "https://registry.npmmirror.com/echarts/-/echarts-5.5.1.tgz"
+ integrity sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==
+ dependencies:
+ tslib "2.3.0"
+ zrender "5.6.0"
+
+element-plus@^2.7.6:
+ version "2.8.4"
+ resolved "https://registry.npmmirror.com/element-plus/-/element-plus-2.8.4.tgz"
+ integrity sha512-ZlVAdUOoJliv4kW3ntWnnSHMT+u/Os7mXJjk2xzOlqNeHaI2/ozlF+R58ZCEak8ZnDi6+5A2viWEYRsq64IuiA==
+ 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.3"
+ 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"
+
+entities@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz"
+ integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
+
+es-module-lexer@^1.3.0:
+ version "1.5.4"
+ resolved "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz"
+ integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==
+
+es5-ext@^0.10.35, es5-ext@^0.10.62, es5-ext@^0.10.64, es5-ext@~0.10.14:
+ version "0.10.64"
+ resolved "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.64.tgz"
+ integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==
+ dependencies:
+ es6-iterator "^2.0.3"
+ es6-symbol "^3.1.3"
+ esniff "^2.0.1"
+ next-tick "^1.1.0"
+
+es6-iterator@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz"
+ integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==
+ dependencies:
+ d "1"
+ es5-ext "^0.10.35"
+ es6-symbol "^3.1.1"
+
+es6-symbol@^3.1.1, es6-symbol@^3.1.3:
+ version "3.1.4"
+ resolved "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.4.tgz"
+ integrity sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==
+ dependencies:
+ d "^1.0.2"
+ ext "^1.7.0"
+
+esbuild@^0.21.3:
+ version "0.21.5"
+ resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz"
+ integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==
+ optionalDependencies:
+ "@esbuild/aix-ppc64" "0.21.5"
+ "@esbuild/android-arm" "0.21.5"
+ "@esbuild/android-arm64" "0.21.5"
+ "@esbuild/android-x64" "0.21.5"
+ "@esbuild/darwin-arm64" "0.21.5"
+ "@esbuild/darwin-x64" "0.21.5"
+ "@esbuild/freebsd-arm64" "0.21.5"
+ "@esbuild/freebsd-x64" "0.21.5"
+ "@esbuild/linux-arm" "0.21.5"
+ "@esbuild/linux-arm64" "0.21.5"
+ "@esbuild/linux-ia32" "0.21.5"
+ "@esbuild/linux-loong64" "0.21.5"
+ "@esbuild/linux-mips64el" "0.21.5"
+ "@esbuild/linux-ppc64" "0.21.5"
+ "@esbuild/linux-riscv64" "0.21.5"
+ "@esbuild/linux-s390x" "0.21.5"
+ "@esbuild/linux-x64" "0.21.5"
+ "@esbuild/netbsd-x64" "0.21.5"
+ "@esbuild/openbsd-x64" "0.21.5"
+ "@esbuild/sunos-x64" "0.21.5"
+ "@esbuild/win32-arm64" "0.21.5"
+ "@esbuild/win32-ia32" "0.21.5"
+ "@esbuild/win32-x64" "0.21.5"
+
+escape-html@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz"
+ integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
+
+escape-string-regexp@^5.0.0:
+ 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==
+
+esniff@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmmirror.com/esniff/-/esniff-2.0.1.tgz"
+ integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==
+ dependencies:
+ d "^1.0.1"
+ es5-ext "^0.10.62"
+ event-emitter "^0.3.5"
+ type "^2.7.2"
+
+estree-walker@^2.0.2:
+ 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==
+
+estree-walker@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz"
+ integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==
+ dependencies:
+ "@types/estree" "^1.0.0"
+
+event-emitter@^0.3.5:
+ version "0.3.5"
+ resolved "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz"
+ integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+ext@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz"
+ integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==
+ dependencies:
+ type "^2.7.2"
+
+fast-glob@^3.3.2:
+ version "3.3.2"
+ resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz"
+ integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
+ 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.4"
+
+fastq@^1.6.0:
+ version "1.17.1"
+ resolved "https://registry.npmmirror.com/fastq/-/fastq-1.17.1.tgz"
+ integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==
+ dependencies:
+ reusify "^1.0.4"
+
+fill-range@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz"
+ integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+follow-redirects@^1.15.6:
+ version "1.15.9"
+ resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz"
+ integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==
+
+form-data@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz"
+ integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+fsevents@~2.3.2, fsevents@~2.3.3:
+ version "2.3.3"
+ resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+glob-parent@^5.1.2, glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+html-void-elements@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-2.0.1.tgz"
+ integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==
+
+i18next@^20.4.0:
+ version "20.6.1"
+ resolved "https://registry.npmmirror.com/i18next/-/i18next-20.6.1.tgz"
+ integrity sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==
+ dependencies:
+ "@babel/runtime" "^7.12.0"
+
+immer@^9.0.6:
+ version "9.0.21"
+ resolved "https://registry.npmmirror.com/immer/-/immer-9.0.21.tgz"
+ integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==
+
+immutable@^4.0.0:
+ version "4.3.7"
+ resolved "https://registry.npmmirror.com/immutable/-/immutable-4.3.7.tgz"
+ integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-glob@^4.0.1, is-glob@~4.0.1:
+ 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"
+
+is-hotkey@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmmirror.com/is-hotkey/-/is-hotkey-0.2.0.tgz"
+ integrity sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-plain-object@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz"
+ integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
+
+is-url@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.npmmirror.com/is-url/-/is-url-1.2.4.tgz"
+ integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==
+
+js-tokens@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.0.tgz"
+ integrity sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==
+
+local-pkg@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.0.tgz"
+ integrity sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==
+ dependencies:
+ mlly "^1.4.2"
+ pkg-types "^1.0.3"
+
+lodash-es@^4.17.21:
+ version "4.17.21"
+ resolved "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz"
+ integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
+
+lodash-unified@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz"
+ integrity sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==
+
+lodash.camelcase@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz"
+ integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==
+
+lodash.clonedeep@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz"
+ integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==
+
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz"
+ integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
+
+lodash.foreach@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.npmmirror.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz"
+ integrity sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==
+
+lodash.isequal@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz"
+ integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==
+
+lodash.throttle@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz"
+ integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==
+
+lodash.toarray@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.npmmirror.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz"
+ integrity sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==
+
+lodash@^4.17.21:
+ version "4.17.21"
+ resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+magic-string@^0.30.1, magic-string@^0.30.10, magic-string@^0.30.11:
+ version "0.30.11"
+ resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.11.tgz"
+ integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==
+ dependencies:
+ "@jridgewell/sourcemap-codec" "^1.5.0"
+
+memoize-one@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz"
+ integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==
+
+merge2@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+micromatch@^4.0.4:
+ version "4.0.8"
+ resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz"
+ integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
+ dependencies:
+ braces "^3.0.3"
+ picomatch "^2.3.1"
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-match@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmmirror.com/mime-match/-/mime-match-1.0.2.tgz"
+ integrity sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==
+ dependencies:
+ wildcard "^1.1.0"
+
+mime-types@^2.1.12:
+ 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"
+
+minimatch@^9.0.4, minimatch@^9.0.5:
+ version "9.0.5"
+ resolved "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz"
+ integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+mlly@^1.4.2, mlly@^1.7.1, mlly@^1.7.2:
+ version "1.7.2"
+ resolved "https://registry.npmmirror.com/mlly/-/mlly-1.7.2.tgz"
+ integrity sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==
+ dependencies:
+ acorn "^8.12.1"
+ pathe "^1.1.2"
+ pkg-types "^1.2.0"
+ ufo "^1.5.4"
+
+ms@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+namespace-emitter@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmmirror.com/namespace-emitter/-/namespace-emitter-2.0.1.tgz"
+ integrity sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==
+
+nanoid@^3.1.25, nanoid@^3.2.0, nanoid@^3.3.7:
+ version "3.3.7"
+ resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz"
+ integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+
+next-tick@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz"
+ integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-wheel-es@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz"
+ integrity sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==
+
+pathe@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz"
+ integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==
+
+picocolors@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.0.tgz"
+ integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pkg-types@^1.0.3, pkg-types@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.2.1.tgz"
+ integrity sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==
+ dependencies:
+ confbox "^0.1.8"
+ mlly "^1.7.2"
+ pathe "^1.1.2"
+
+postcss@^8.4.43, postcss@^8.4.47:
+ version "8.4.47"
+ resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.47.tgz"
+ integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==
+ dependencies:
+ nanoid "^3.3.7"
+ picocolors "^1.1.0"
+ source-map-js "^1.2.1"
+
+preact@^10.5.13:
+ version "10.24.2"
+ resolved "https://registry.npmmirror.com/preact/-/preact-10.24.2.tgz"
+ integrity sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==
+
+prismjs@^1.23.0:
+ version "1.29.0"
+ resolved "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz"
+ integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==
+
+proxy-from-env@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz"
+ integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+
+queue-microtask@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+regenerator-runtime@^0.14.0:
+ version "0.14.1"
+ resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz"
+ integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rollup@^4.20.0:
+ version "4.24.0"
+ resolved "https://registry.npmmirror.com/rollup/-/rollup-4.24.0.tgz"
+ integrity sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==
+ dependencies:
+ "@types/estree" "1.0.6"
+ optionalDependencies:
+ "@rollup/rollup-android-arm-eabi" "4.24.0"
+ "@rollup/rollup-android-arm64" "4.24.0"
+ "@rollup/rollup-darwin-arm64" "4.24.0"
+ "@rollup/rollup-darwin-x64" "4.24.0"
+ "@rollup/rollup-linux-arm-gnueabihf" "4.24.0"
+ "@rollup/rollup-linux-arm-musleabihf" "4.24.0"
+ "@rollup/rollup-linux-arm64-gnu" "4.24.0"
+ "@rollup/rollup-linux-arm64-musl" "4.24.0"
+ "@rollup/rollup-linux-powerpc64le-gnu" "4.24.0"
+ "@rollup/rollup-linux-riscv64-gnu" "4.24.0"
+ "@rollup/rollup-linux-s390x-gnu" "4.24.0"
+ "@rollup/rollup-linux-x64-gnu" "4.24.0"
+ "@rollup/rollup-linux-x64-musl" "4.24.0"
+ "@rollup/rollup-win32-arm64-msvc" "4.24.0"
+ "@rollup/rollup-win32-ia32-msvc" "4.24.0"
+ "@rollup/rollup-win32-x64-msvc" "4.24.0"
+ fsevents "~2.3.2"
+
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+sass@1.71.1:
+ version "1.71.1"
+ resolved "https://registry.npmmirror.com/sass/-/sass-1.71.1.tgz"
+ integrity sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==
+ dependencies:
+ chokidar ">=3.0.0 <4.0.0"
+ immutable "^4.0.0"
+ source-map-js ">=0.6.2 <2.0.0"
+
+scroll-into-view-if-needed@^2.2.28:
+ version "2.2.31"
+ resolved "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz"
+ integrity sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==
+ dependencies:
+ compute-scroll-into-view "^1.0.20"
+
+scule@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz"
+ integrity sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==
+
+slate-history@^0.66.0:
+ version "0.66.0"
+ resolved "https://registry.npmmirror.com/slate-history/-/slate-history-0.66.0.tgz"
+ integrity sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==
+ dependencies:
+ is-plain-object "^5.0.0"
+
+slate@^0.72.0:
+ version "0.72.8"
+ resolved "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz"
+ integrity sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==
+ dependencies:
+ immer "^9.0.6"
+ is-plain-object "^5.0.0"
+ tiny-warning "^1.0.3"
+
+snabbdom@^3.1.0:
+ version "3.6.2"
+ resolved "https://registry.npmmirror.com/snabbdom/-/snabbdom-3.6.2.tgz"
+ integrity sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q==
+
+"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.0, source-map-js@^1.2.1:
+ 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==
+
+ssr-window@^3.0.0-alpha.1:
+ version "3.0.0"
+ resolved "https://registry.npmmirror.com/ssr-window/-/ssr-window-3.0.0.tgz"
+ integrity sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==
+
+strip-literal@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmmirror.com/strip-literal/-/strip-literal-2.1.0.tgz"
+ integrity sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==
+ dependencies:
+ js-tokens "^9.0.0"
+
+tiny-warning@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmmirror.com/tiny-warning/-/tiny-warning-1.0.3.tgz"
+ integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz"
+ integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
+to-regex-range@^5.0.1:
+ 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==
+ dependencies:
+ is-number "^7.0.0"
+
+tslib@2.3.0:
+ version "2.3.0"
+ resolved "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz"
+ integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
+
+type@^2.7.2:
+ version "2.7.3"
+ resolved "https://registry.npmmirror.com/type/-/type-2.7.3.tgz"
+ integrity sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==
+
+ufo@^1.5.4:
+ version "1.5.4"
+ resolved "https://registry.npmmirror.com/ufo/-/ufo-1.5.4.tgz"
+ integrity sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==
+
+unimport@^3.7.2:
+ version "3.13.1"
+ resolved "https://registry.npmmirror.com/unimport/-/unimport-3.13.1.tgz"
+ integrity sha512-nNrVzcs93yrZQOW77qnyOVHtb68LegvhYFwxFMfuuWScmwQmyVCG/NBuN8tYsaGzgQUVYv34E/af+Cc9u4og4A==
+ dependencies:
+ "@rollup/pluginutils" "^5.1.2"
+ acorn "^8.12.1"
+ escape-string-regexp "^5.0.0"
+ estree-walker "^3.0.3"
+ fast-glob "^3.3.2"
+ local-pkg "^0.5.0"
+ magic-string "^0.30.11"
+ mlly "^1.7.1"
+ pathe "^1.1.2"
+ pkg-types "^1.2.0"
+ scule "^1.3.0"
+ strip-literal "^2.1.0"
+ unplugin "^1.14.1"
+
+unplugin-auto-import@^0.17.6:
+ 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==
+ 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"
+
+unplugin-element-plus@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.npmmirror.com/unplugin-element-plus/-/unplugin-element-plus-0.8.0.tgz"
+ integrity sha512-jByUGY3FG2B8RJKFryqxx4eNtSTj+Hjlo8edcOdJymewndDQjThZ1pRUQHRjQsbKhTV2jEctJV7t7RJ405UL4g==
+ dependencies:
+ "@rollup/pluginutils" "^5.0.2"
+ es-module-lexer "^1.3.0"
+ magic-string "^0.30.1"
+ unplugin "^1.3.2"
+
+unplugin-vue-components@^0.27.2:
+ version "0.27.4"
+ resolved "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-0.27.4.tgz"
+ integrity sha512-1XVl5iXG7P1UrOMnaj2ogYa5YTq8aoh5jwDPQhemwO/OrXW+lPQKDXd1hMz15qxQPxgb/XXlbgo3HQ2rLEbmXQ==
+ dependencies:
+ "@antfu/utils" "^0.7.10"
+ "@rollup/pluginutils" "^5.1.0"
+ chokidar "^3.6.0"
+ debug "^4.3.6"
+ fast-glob "^3.3.2"
+ local-pkg "^0.5.0"
+ magic-string "^0.30.11"
+ minimatch "^9.0.5"
+ mlly "^1.7.1"
+ unplugin "^1.12.1"
+
+unplugin@^1.11.0, unplugin@^1.12.1, unplugin@^1.14.1, unplugin@^1.3.2:
+ version "1.14.1"
+ resolved "https://registry.npmmirror.com/unplugin/-/unplugin-1.14.1.tgz"
+ integrity sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==
+ dependencies:
+ acorn "^8.12.1"
+ webpack-virtual-modules "^0.6.2"
+
+vite@^5.3.1:
+ version "5.4.8"
+ resolved "https://registry.npmmirror.com/vite/-/vite-5.4.8.tgz"
+ integrity sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==
+ dependencies:
+ esbuild "^0.21.3"
+ postcss "^8.4.43"
+ rollup "^4.20.0"
+ optionalDependencies:
+ fsevents "~2.3.3"
+
+vue-demi@*:
+ version "0.14.10"
+ resolved "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz"
+ integrity sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==
+
+vue-router@^4.3.3:
+ version "4.4.5"
+ resolved "https://registry.npmmirror.com/vue-router/-/vue-router-4.4.5.tgz"
+ integrity sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==
+ dependencies:
+ "@vue/devtools-api" "^6.6.4"
+
+vue@^3.4.29:
+ version "3.5.11"
+ resolved "https://registry.npmmirror.com/vue/-/vue-3.5.11.tgz"
+ integrity sha512-/8Wurrd9J3lb72FTQS7gRMNQD4nztTtKPmuDuPuhqXmmpD6+skVjAeahNpVzsuky6Sy9gy7wn8UadqPtt9SQIg==
+ dependencies:
+ "@vue/compiler-dom" "3.5.11"
+ "@vue/compiler-sfc" "3.5.11"
+ "@vue/runtime-dom" "3.5.11"
+ "@vue/server-renderer" "3.5.11"
+ "@vue/shared" "3.5.11"
+
+webpack-virtual-modules@^0.6.2:
+ 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==
+
+wildcard@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz"
+ integrity sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==
+
+zrender@5.6.0:
+ version "5.6.0"
+ resolved "https://registry.npmmirror.com/zrender/-/zrender-5.6.0.tgz"
+ integrity sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==
+ dependencies:
+ tslib "2.3.0"
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000..fb57ccd
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,4 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+