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, '

活动名称:

书香满园·悦读之旅

活动目标:

  1. 推广阅读文化,鼓励大众尤其是青少年养成良好的阅读习惯。
  2. 丰富参与者的知识储备,拓宽视野。
  3. 促进图书资源的共享与交流。
  4. 增强社区/学校的凝聚力,营造积极向上的文化氛围。

活动时间:

[具体日期],上午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, '

活动名称:

书香飘逸·阅读嘉年华

活动目标:

  1. 激发公众的阅读兴趣,推广阅读文化。
  2. 提供丰富的阅读资源,满足不同读者的需求。
  3. 促进读者之间的交流与分享,建立阅读社群。
  4. 鼓励创新与探索,提升阅读体验。

活动时间:

[具体日期],上午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, '

活动名称:

阅读奇遇记·探索书海之旅

活动目标:

  1. 激发公众对阅读的兴趣,推广多元化的阅读文化。
  2. 提供丰富的图书资源,满足不同年龄和兴趣读者的需求。
  3. 鼓励读者之间的互动与交流,建立阅读社群。
  4. 通过趣味活动,提升阅读的趣味性和参与度。

活动时间:

[具体日期],上午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, '

活动名称:

阅读探索节·书香满校

活动目标:

  1. 激发市民的阅读兴趣,推广阅读作为提升个人素养的重要途径。
  2. 展示丰富多样的图书资源,满足不同读者的阅读需求。
  3. 促进读者之间的互动与交流,营造浓厚的阅读氛围。
  4. 通过创意活动,提升阅读的吸引力和参与度。

活动时间:

[具体日期],上午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)** 加入** +![项目训练营.jpg](https://cdn.nlark.com/yuque/0/2023/jpeg/751015/1697190549852-d549b9bb-41b6-4895-b84b-cb0eed6b8f26.jpeg#averageHue=%23bec3c0&clientId=uf493bfb5-158c-4&from=paste&height=314&id=HZ0TO&originHeight=1320&originWidth=1060&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=78728&status=done&style=none&taskId=u0fee2c6c-1814-4b30-8ad7-713e6bd1dc6&title=&width=252) +## 星球专属编程小助手 +如果您在购买过程中有任何疑惑,可以咨询我们的客服小助手(仅限非技术问题) +服务时间:工作日上午9:00 - 12:00 下午14:00 - 18:00 +![](https://cdn.nlark.com/yuque/0/2024/png/751015/1713232611921-bd89c17f-415c-477a-ba4b-d772378e6d68.png#averageHue=%23cdcdcd&clientId=u299b98da-3480-4&from=paste&height=199&id=Fp8aI&originHeight=391&originWidth=392&originalType=url&ratio=1.25&rotation=0&showTitle=false&status=done&style=none&taskId=ub21d4ab0-f522-44a0-affe-3a4325c218a&title=&width=200) 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + + \ 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + + + + + + 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 @@ + + 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 @@ + 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 @@ + + + \ 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 @@ + + + \ 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 @@ + + + + + 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 @@ + + + + + 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 @@ + + + + + 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 @@ + + + \ 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 @@ + + + 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 @@ + + + + + \ 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 @@ + + + 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 @@ + + + + + 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 @@ + + + + + \ 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 @@ + + + + + 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 @@ + + + \ 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 @@ + + + \ 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 + +