data-collector fixed
This commit is contained in:
1 parent
2e6603e29a
commit
b52a9befee
28 files changed
+4084
-44
No files matched your search
@@ -1,17 +1,357 @@
|
|||||||
2025-06-04 18:03:49,612 - INFO - 数据库连接成功
|
2025-06-18 08:46:19,433 - INFO - 数据库连接成功
|
||||||
2025-06-04 18:03:49,613 - INFO - 股票数据采集器启动
|
2025-06-18 08:46:19,433 - INFO - 股票数据采集器启动
|
||||||
2025-06-04 18:03:49,613 - INFO - 定时任务已启动,每 5 分钟采集一次
|
2025-06-18 08:46:19,434 - INFO - 定时任务已启动,每 5 分钟采集一次
|
||||||
2025-06-04 18:03:49,613 - INFO - 开始执行股票数据采集...image.png
|
2025-06-18 08:46:19,434 - INFO - 开始执行股票数据采集...
|
||||||
2025-06-04 18:03:49,706 - INFO - 成功获取股票 sz300630 数据: 普利退
|
2025-06-18 08:46:19,537 - INFO - 成功获取股票 sz300189 数据: 神农种业
|
||||||
2025-06-04 18:03:50,248 - INFO - 成功获取股票 sh600998 数据: 九州通
|
2025-06-18 08:46:20,127 - INFO - 成功获取股票 sz000713 数据: 丰乐种业
|
||||||
2025-06-04 18:03:50,791 - INFO - 成功获取股票 sh600371 数据: 万向德农
|
2025-06-18 08:46:20,719 - INFO - 成功获取股票 sh600313 数据: 农发种业
|
||||||
2025-06-04 18:03:51,331 - INFO - 成功获取股票 sz000876 数据: 新 希 望
|
2025-06-18 08:46:21,393 - INFO - 成功获取股票 bj837403 数据: 康农种业
|
||||||
2025-06-04 18:03:51,873 - INFO - 成功获取股票 sz002714 数据: 牧原股份
|
2025-06-18 08:46:22,105 - INFO - 成功获取股票 sz200505 数据: 京粮B
|
||||||
2025-06-04 18:03:52,414 - INFO - 成功获取股票 sh600519 数据: 贵州茅台
|
2025-06-18 08:46:22,754 - INFO - 成功获取股票 sz300268 数据: *ST佳沃
|
||||||
2025-06-04 18:03:52,956 - INFO - 成功获取股票 sz000858 数据: 五 粮 液
|
2025-06-18 08:46:23,483 - INFO - 成功获取股票 sz000930 数据: 中粮科技
|
||||||
2025-06-04 18:03:53,498 - INFO - 成功获取股票 sh600887 数据: 伊利股份
|
2025-06-18 08:46:24,082 - INFO - 成功获取股票 sz002299 数据: 圣农发展
|
||||||
2025-06-04 18:03:54,038 - INFO - 成功获取股票 sz002304 数据: 洋河股份
|
2025-06-18 08:46:24,703 - INFO - 成功获取股票 sh600371 数据: 万向德农
|
||||||
2025-06-04 18:03:54,580 - INFO - 成功获取股票 sh600036 数据: 招商银行
|
2025-06-18 08:46:25,297 - INFO - 成功获取股票 sh600598 数据: 北大荒
|
||||||
2025-06-04 18:03:55,081 - INFO - 本次采集完成,共获取 10 只股票数据
|
2025-06-18 08:46:25,902 - INFO - 成功获取股票 sh603609 数据: 禾丰股份
|
||||||
2025-06-04 18:03:55,106 - INFO - 成功保存 10 条股票数据到数据库
|
2025-06-18 08:46:26,508 - INFO - 成功获取股票 bj831087 数据: 秋乐种业
|
||||||
2025-06-04 18:03:55,106 - INFO - 数据采集完成,共处理 10 只股票
|
2025-06-18 08:46:27,113 - INFO - 成功获取股票 sh603363 数据: 傲农生物
|
||||||
|
2025-06-18 08:46:27,721 - INFO - 成功获取股票 sh603336 数据: 宏辉果蔬
|
||||||
|
2025-06-18 08:46:28,304 - INFO - 成功获取股票 sh600354 数据: 敦煌种业
|
||||||
|
2025-06-18 08:46:28,890 - INFO - 成功获取股票 sz002385 数据: 大北农
|
||||||
|
2025-06-18 08:46:29,466 - INFO - 成功获取股票 sz000048 数据: 京基智农
|
||||||
|
2025-06-18 08:46:30,061 - INFO - 成功获取股票 sh600251 数据: 冠农股份
|
||||||
|
2025-06-18 08:46:30,673 - INFO - 成功获取股票 sz002321 数据: 华英农业
|
||||||
|
2025-06-18 08:46:31,278 - INFO - 成功获取股票 sz000505 数据: 京粮控股
|
||||||
|
2025-06-18 08:46:31,875 - INFO - 成功获取股票 sz001366 数据: 播恩集团
|
||||||
|
2025-06-18 08:46:32,492 - INFO - 成功获取股票 sz002772 数据: 众兴菌业
|
||||||
|
2025-06-18 08:46:33,083 - INFO - 成功获取股票 sz002041 数据: 登海种业
|
||||||
|
2025-06-18 08:46:33,672 - INFO - 成功获取股票 sh600127 数据: 金健米业
|
||||||
|
2025-06-18 08:46:34,277 - INFO - 成功获取股票 sz002548 数据: 金新农
|
||||||
|
2025-06-18 08:46:34,865 - INFO - 成功获取股票 sh605296 数据: 神农集团
|
||||||
|
2025-06-18 08:46:35,464 - INFO - 成功获取股票 sh600359 数据: 新农开发
|
||||||
|
2025-06-18 08:46:36,062 - INFO - 成功获取股票 sh601952 数据: 苏垦农发
|
||||||
|
2025-06-18 08:46:36,661 - INFO - 成功获取股票 sh600975 数据: 新五丰
|
||||||
|
2025-06-18 08:46:37,270 - INFO - 成功获取股票 sz300505 数据: 川金诺
|
||||||
|
2025-06-18 08:46:37,859 - INFO - 成功获取股票 sh600141 数据: 兴发集团
|
||||||
|
2025-06-18 08:46:38,459 - INFO - 成功获取股票 sz000893 数据: 亚钾国际
|
||||||
|
2025-06-18 08:46:39,058 - INFO - 成功获取股票 sh600691 数据: 阳煤化工
|
||||||
|
2025-06-18 08:46:39,645 - INFO - 成功获取股票 sh600470 数据: 六国化工
|
||||||
|
2025-06-18 08:46:40,233 - INFO - 成功获取股票 sh000912 数据: 300消费
|
||||||
|
2025-06-18 08:46:40,839 - INFO - 成功获取股票 sz000408 数据: 藏格矿业
|
||||||
|
2025-06-18 08:46:41,437 - INFO - 成功获取股票 sz000902 数据: 新洋丰
|
||||||
|
2025-06-18 08:46:42,043 - INFO - 成功获取股票 sz002539 数据: 云图控股
|
||||||
|
2025-06-18 08:46:42,655 - INFO - 成功获取股票 sz002599 数据: 盛通股份
|
||||||
|
2025-06-18 08:46:43,236 - INFO - 成功获取股票 sz002545 数据: 东方铁塔
|
||||||
|
2025-06-18 08:46:43,847 - INFO - 成功获取股票 sz300387 数据: 富邦科技
|
||||||
|
2025-06-18 08:46:44,446 - INFO - 成功获取股票 sz002274 数据: 华昌化工
|
||||||
|
2025-06-18 08:46:45,050 - INFO - 成功获取股票 sz002470 数据: 金正大
|
||||||
|
2025-06-18 08:46:45,655 - INFO - 成功获取股票 sz002538 数据: 司尔特
|
||||||
|
2025-06-18 08:46:46,247 - INFO - 成功获取股票 sz000731 数据: 四川美丰
|
||||||
|
2025-06-18 08:46:46,834 - INFO - 成功获取股票 sh600078 数据: 澄星股份
|
||||||
|
2025-06-18 08:46:47,422 - INFO - 成功获取股票 sh600227 数据: 赤天化
|
||||||
|
2025-06-18 08:46:48,026 - INFO - 成功获取股票 sh603395 数据: 红四方
|
||||||
|
2025-06-18 08:46:48,628 - INFO - 成功获取股票 sz002588 数据: 史丹利
|
||||||
|
2025-06-18 08:46:49,206 - INFO - 成功获取股票 sz000422 数据: 湖北宜化
|
||||||
|
2025-06-18 08:46:49,787 - INFO - 成功获取股票 sz002556 数据: 辉隆股份
|
||||||
|
2025-06-18 08:46:50,401 - INFO - 成功获取股票 sz002312 数据: 川发龙蟒
|
||||||
|
2025-06-18 08:46:50,982 - INFO - 成功获取股票 sz002170 数据: 芭田股份
|
||||||
|
2025-06-18 08:46:51,597 - INFO - 成功获取股票 sz000792 数据: 盐湖股份
|
||||||
|
2025-06-18 08:46:52,201 - INFO - 成功获取股票 sh600096 数据: 云天化
|
||||||
|
2025-06-18 08:46:52,782 - INFO - 成功获取股票 sz001231 数据: 农心科技
|
||||||
|
2025-06-18 08:46:53,372 - INFO - 成功获取股票 sz002731 数据: 萃华珠宝
|
||||||
|
2025-06-18 08:46:53,979 - INFO - 成功获取股票 sz200553 数据: 安道麦B
|
||||||
|
2025-06-18 08:46:54,584 - INFO - 成功获取股票 sh603810 数据: 丰山集团
|
||||||
|
2025-06-18 08:46:55,183 - INFO - 成功获取股票 sh603970 数据: 中农立华
|
||||||
|
2025-06-18 08:46:55,800 - INFO - 成功获取股票 sz301035 数据: 润丰股份
|
||||||
|
2025-06-18 08:46:56,414 - INFO - 成功获取股票 sz002868 数据: *ST绿康
|
||||||
|
2025-06-18 08:46:57,026 - INFO - 成功获取股票 sz003042 数据: 中农联合
|
||||||
|
2025-06-18 08:46:57,619 - INFO - 成功获取股票 sz002391 数据: 长青股份
|
||||||
|
2025-06-18 08:46:58,222 - INFO - 成功获取股票 bj870866 数据: 绿亨科技
|
||||||
|
2025-06-18 08:46:58,805 - INFO - 成功获取股票 sz301665 数据: 泰禾股份
|
||||||
|
2025-06-18 08:46:59,412 - INFO - 成功获取股票 sh600486 数据: 扬农化工
|
||||||
|
2025-06-18 08:46:59,913 - INFO - 本次采集完成,共获取 67 只股票数据
|
||||||
|
2025-06-18 08:46:59,925 - INFO - 插入股票 sz300189 数据
|
||||||
|
2025-06-18 08:46:59,928 - INFO - 插入股票 sz000713 数据
|
||||||
|
2025-06-18 08:46:59,930 - INFO - 插入股票 sh600313 数据
|
||||||
|
2025-06-18 08:46:59,932 - INFO - 插入股票 bj837403 数据
|
||||||
|
2025-06-18 08:46:59,934 - INFO - 插入股票 sz200505 数据
|
||||||
|
2025-06-18 08:46:59,936 - INFO - 插入股票 sz300268 数据
|
||||||
|
2025-06-18 08:46:59,939 - INFO - 插入股票 sz000930 数据
|
||||||
|
2025-06-18 08:46:59,941 - INFO - 插入股票 sz002299 数据
|
||||||
|
2025-06-18 08:46:59,943 - INFO - 插入股票 sh600371 数据
|
||||||
|
2025-06-18 08:46:59,946 - INFO - 插入股票 sh600598 数据
|
||||||
|
2025-06-18 08:46:59,947 - INFO - 插入股票 sh603609 数据
|
||||||
|
2025-06-18 08:46:59,949 - INFO - 插入股票 bj831087 数据
|
||||||
|
2025-06-18 08:46:59,951 - INFO - 插入股票 sh603363 数据
|
||||||
|
2025-06-18 08:46:59,953 - INFO - 插入股票 sh603336 数据
|
||||||
|
2025-06-18 08:46:59,955 - INFO - 插入股票 sh600354 数据
|
||||||
|
2025-06-18 08:46:59,956 - INFO - 插入股票 sz002385 数据
|
||||||
|
2025-06-18 08:46:59,959 - INFO - 插入股票 sz000048 数据
|
||||||
|
2025-06-18 08:46:59,961 - INFO - 插入股票 sh600251 数据
|
||||||
|
2025-06-18 08:46:59,963 - INFO - 插入股票 sz002321 数据
|
||||||
|
2025-06-18 08:46:59,964 - INFO - 插入股票 sz000505 数据
|
||||||
|
2025-06-18 08:46:59,966 - INFO - 插入股票 sz001366 数据
|
||||||
|
2025-06-18 08:46:59,968 - INFO - 插入股票 sz002772 数据
|
||||||
|
2025-06-18 08:46:59,969 - INFO - 插入股票 sz002041 数据
|
||||||
|
2025-06-18 08:46:59,970 - INFO - 插入股票 sh600127 数据
|
||||||
|
2025-06-18 08:46:59,972 - INFO - 插入股票 sz002548 数据
|
||||||
|
2025-06-18 08:46:59,974 - INFO - 插入股票 sh605296 数据
|
||||||
|
2025-06-18 08:46:59,976 - INFO - 插入股票 sh600359 数据
|
||||||
|
2025-06-18 08:46:59,977 - INFO - 插入股票 sh601952 数据
|
||||||
|
2025-06-18 08:46:59,978 - INFO - 插入股票 sh600975 数据
|
||||||
|
2025-06-18 08:46:59,980 - INFO - 插入股票 sz300505 数据
|
||||||
|
2025-06-18 08:46:59,982 - INFO - 插入股票 sh600141 数据
|
||||||
|
2025-06-18 08:46:59,984 - INFO - 插入股票 sz000893 数据
|
||||||
|
2025-06-18 08:46:59,985 - INFO - 插入股票 sh600691 数据
|
||||||
|
2025-06-18 08:46:59,987 - INFO - 插入股票 sh600470 数据
|
||||||
|
2025-06-18 08:46:59,988 - INFO - 插入股票 sh000912 数据
|
||||||
|
2025-06-18 08:46:59,990 - INFO - 插入股票 sz000408 数据
|
||||||
|
2025-06-18 08:46:59,992 - INFO - 插入股票 sz000902 数据
|
||||||
|
2025-06-18 08:46:59,993 - INFO - 插入股票 sz002539 数据
|
||||||
|
2025-06-18 08:46:59,995 - INFO - 插入股票 sz002599 数据
|
||||||
|
2025-06-18 08:46:59,997 - INFO - 插入股票 sz002545 数据
|
||||||
|
2025-06-18 08:46:59,998 - INFO - 插入股票 sz300387 数据
|
||||||
|
2025-06-18 08:47:00,000 - INFO - 插入股票 sz002274 数据
|
||||||
|
2025-06-18 08:47:00,002 - INFO - 插入股票 sz002470 数据
|
||||||
|
2025-06-18 08:47:00,003 - INFO - 插入股票 sz002538 数据
|
||||||
|
2025-06-18 08:47:00,004 - INFO - 插入股票 sz000731 数据
|
||||||
|
2025-06-18 08:47:00,005 - INFO - 插入股票 sh600078 数据
|
||||||
|
2025-06-18 08:47:00,007 - INFO - 插入股票 sh600227 数据
|
||||||
|
2025-06-18 08:47:00,009 - INFO - 插入股票 sh603395 数据
|
||||||
|
2025-06-18 08:47:00,010 - INFO - 插入股票 sz002588 数据
|
||||||
|
2025-06-18 08:47:00,012 - INFO - 插入股票 sz000422 数据
|
||||||
|
2025-06-18 08:47:00,014 - INFO - 插入股票 sz002556 数据
|
||||||
|
2025-06-18 08:47:00,015 - INFO - 插入股票 sz002312 数据
|
||||||
|
2025-06-18 08:47:00,017 - INFO - 插入股票 sz002170 数据
|
||||||
|
2025-06-18 08:47:00,019 - INFO - 插入股票 sz000792 数据
|
||||||
|
2025-06-18 08:47:00,021 - INFO - 插入股票 sh600096 数据
|
||||||
|
2025-06-18 08:47:00,022 - INFO - 插入股票 sz001231 数据
|
||||||
|
2025-06-18 08:47:00,024 - INFO - 插入股票 sz002731 数据
|
||||||
|
2025-06-18 08:47:00,026 - INFO - 插入股票 sz200553 数据
|
||||||
|
2025-06-18 08:47:00,028 - INFO - 插入股票 sh603810 数据
|
||||||
|
2025-06-18 08:47:00,031 - INFO - 插入股票 sh603970 数据
|
||||||
|
2025-06-18 08:47:00,032 - INFO - 插入股票 sz301035 数据
|
||||||
|
2025-06-18 08:47:00,034 - INFO - 插入股票 sz002868 数据
|
||||||
|
2025-06-18 08:47:00,035 - INFO - 插入股票 sz003042 数据
|
||||||
|
2025-06-18 08:47:00,037 - INFO - 插入股票 sz002391 数据
|
||||||
|
2025-06-18 08:47:00,038 - INFO - 插入股票 bj870866 数据
|
||||||
|
2025-06-18 08:47:00,040 - INFO - 插入股票 sz301665 数据
|
||||||
|
2025-06-18 08:47:00,042 - INFO - 插入股票 sh600486 数据
|
||||||
|
2025-06-18 08:47:00,048 - INFO - 成功处理 67 条股票数据到数据库
|
||||||
|
2025-06-18 08:47:00,049 - INFO - 数据采集完成,共处理 67 只股票
|
||||||
|
2025-06-18 08:51:20,157 - INFO - 开始执行股票数据采集...
|
||||||
|
2025-06-18 08:51:20,278 - INFO - 成功获取股票 sz300189 数据: 神农种业
|
||||||
|
2025-06-18 08:51:20,886 - INFO - 成功获取股票 sz000713 数据: 丰乐种业
|
||||||
|
2025-06-18 08:51:21,481 - INFO - 成功获取股票 sh600313 数据: 农发种业
|
||||||
|
2025-06-18 08:51:22,094 - INFO - 成功获取股票 bj837403 数据: 康农种业
|
||||||
|
2025-06-18 08:51:22,722 - INFO - 成功获取股票 sz200505 数据: 京粮B
|
||||||
|
2025-06-18 08:51:23,375 - INFO - 成功获取股票 sz300268 数据: *ST佳沃
|
||||||
|
2025-06-18 08:51:23,978 - INFO - 成功获取股票 sz000930 数据: 中粮科技
|
||||||
|
2025-06-18 08:51:24,672 - INFO - 成功获取股票 sz002299 数据: 圣农发展
|
||||||
|
2025-06-18 08:51:25,277 - INFO - 成功获取股票 sh600371 数据: 万向德农
|
||||||
|
2025-06-18 08:51:25,906 - INFO - 成功获取股票 sh600598 数据: 北大荒
|
||||||
|
2025-06-18 08:51:26,508 - INFO - 成功获取股票 sh603609 数据: 禾丰股份
|
||||||
|
2025-06-18 08:51:27,112 - INFO - 成功获取股票 bj831087 数据: 秋乐种业
|
||||||
|
2025-06-18 08:51:27,692 - INFO - 成功获取股票 sh603363 数据: 傲农生物
|
||||||
|
2025-06-18 08:51:28,282 - INFO - 成功获取股票 sh603336 数据: 宏辉果蔬
|
||||||
|
2025-06-18 08:51:28,897 - INFO - 成功获取股票 sh600354 数据: 敦煌种业
|
||||||
|
2025-06-18 08:51:29,502 - INFO - 成功获取股票 sz002385 数据: 大北农
|
||||||
|
2025-06-18 08:51:30,081 - INFO - 成功获取股票 sz000048 数据: 京基智农
|
||||||
|
2025-06-18 08:51:30,671 - INFO - 成功获取股票 sh600251 数据: 冠农股份
|
||||||
|
2025-06-18 08:51:31,266 - INFO - 成功获取股票 sz002321 数据: 华英农业
|
||||||
|
2025-06-18 08:51:31,860 - INFO - 成功获取股票 sz000505 数据: 京粮控股
|
||||||
|
2025-06-18 08:51:32,465 - INFO - 成功获取股票 sz001366 数据: 播恩集团
|
||||||
|
2025-06-18 08:51:33,063 - INFO - 成功获取股票 sz002772 数据: 众兴菌业
|
||||||
|
2025-06-18 08:51:33,669 - INFO - 成功获取股票 sz002041 数据: 登海种业
|
||||||
|
2025-06-18 08:51:34,269 - INFO - 成功获取股票 sh600127 数据: 金健米业
|
||||||
|
2025-06-18 08:51:34,875 - INFO - 成功获取股票 sz002548 数据: 金新农
|
||||||
|
2025-06-18 08:51:35,457 - INFO - 成功获取股票 sh605296 数据: 神农集团
|
||||||
|
2025-06-18 08:51:36,061 - INFO - 成功获取股票 sh600359 数据: 新农开发
|
||||||
|
2025-06-18 08:51:36,660 - INFO - 成功获取股票 sh601952 数据: 苏垦农发
|
||||||
|
2025-06-18 08:51:37,246 - INFO - 成功获取股票 sh600975 数据: 新五丰
|
||||||
|
2025-06-18 08:51:37,832 - INFO - 成功获取股票 sz300505 数据: 川金诺
|
||||||
|
2025-06-18 08:51:38,432 - INFO - 成功获取股票 sh600141 数据: 兴发集团
|
||||||
|
2025-06-18 08:51:39,032 - INFO - 成功获取股票 sz000893 数据: 亚钾国际
|
||||||
|
2025-06-18 08:51:39,630 - INFO - 成功获取股票 sh600691 数据: 阳煤化工
|
||||||
|
2025-06-18 08:51:40,229 - INFO - 成功获取股票 sh600470 数据: 六国化工
|
||||||
|
2025-06-18 08:51:40,814 - INFO - 成功获取股票 sh000912 数据: 300消费
|
||||||
|
2025-06-18 08:51:41,407 - INFO - 成功获取股票 sz000408 数据: 藏格矿业
|
||||||
|
2025-06-18 08:51:41,988 - INFO - 成功获取股票 sz000902 数据: 新洋丰
|
||||||
|
2025-06-18 08:51:42,574 - INFO - 成功获取股票 sz002539 数据: 云图控股
|
||||||
|
2025-06-18 08:51:43,175 - INFO - 成功获取股票 sz002599 数据: 盛通股份
|
||||||
|
2025-06-18 08:51:43,752 - INFO - 成功获取股票 sz002545 数据: 东方铁塔
|
||||||
|
2025-06-18 08:51:44,359 - INFO - 成功获取股票 sz300387 数据: 富邦科技
|
||||||
|
2025-06-18 08:51:44,952 - INFO - 成功获取股票 sz002274 数据: 华昌化工
|
||||||
|
2025-06-18 08:51:45,558 - INFO - 成功获取股票 sz002470 数据: 金正大
|
||||||
|
2025-06-18 08:51:46,159 - INFO - 成功获取股票 sz002538 数据: 司尔特
|
||||||
|
2025-06-18 08:51:46,749 - INFO - 成功获取股票 sz000731 数据: 四川美丰
|
||||||
|
2025-06-18 08:51:47,345 - INFO - 成功获取股票 sh600078 数据: 澄星股份
|
||||||
|
2025-06-18 08:51:47,924 - INFO - 成功获取股票 sh600227 数据: 赤天化
|
||||||
|
2025-06-18 08:51:48,524 - INFO - 成功获取股票 sh603395 数据: 红四方
|
||||||
|
2025-06-18 08:51:49,116 - INFO - 成功获取股票 sz002588 数据: 史丹利
|
||||||
|
2025-06-18 08:51:49,718 - INFO - 成功获取股票 sz000422 数据: 湖北宜化
|
||||||
|
2025-06-18 08:51:50,306 - INFO - 成功获取股票 sz002556 数据: 辉隆股份
|
||||||
|
2025-06-18 08:51:50,888 - INFO - 成功获取股票 sz002312 数据: 川发龙蟒
|
||||||
|
2025-06-18 08:51:51,496 - INFO - 成功获取股票 sz002170 数据: 芭田股份
|
||||||
|
2025-06-18 08:51:52,089 - INFO - 成功获取股票 sz000792 数据: 盐湖股份
|
||||||
|
2025-06-18 08:51:52,674 - INFO - 成功获取股票 sh600096 数据: 云天化
|
||||||
|
2025-06-18 08:51:53,275 - INFO - 成功获取股票 sz001231 数据: 农心科技
|
||||||
|
2025-06-18 08:51:53,875 - INFO - 成功获取股票 sz002731 数据: 萃华珠宝
|
||||||
|
2025-06-18 08:51:54,481 - INFO - 成功获取股票 sz200553 数据: 安道麦B
|
||||||
|
2025-06-18 08:51:55,089 - INFO - 成功获取股票 sh603810 数据: 丰山集团
|
||||||
|
2025-06-18 08:51:55,690 - INFO - 成功获取股票 sh603970 数据: 中农立华
|
||||||
|
2025-06-18 08:51:56,283 - INFO - 成功获取股票 sz301035 数据: 润丰股份
|
||||||
|
2025-06-18 08:51:56,889 - INFO - 成功获取股票 sz002868 数据: *ST绿康
|
||||||
|
2025-06-18 08:51:57,486 - INFO - 成功获取股票 sz003042 数据: 中农联合
|
||||||
|
2025-06-18 08:51:58,097 - INFO - 成功获取股票 sz002391 数据: 长青股份
|
||||||
|
2025-06-18 08:51:58,694 - INFO - 成功获取股票 bj870866 数据: 绿亨科技
|
||||||
|
2025-06-18 08:51:59,298 - INFO - 成功获取股票 sz301665 数据: 泰禾股份
|
||||||
|
2025-06-18 08:51:59,895 - INFO - 成功获取股票 sh600486 数据: 扬农化工
|
||||||
|
2025-06-18 08:52:00,396 - INFO - 本次采集完成,共获取 67 只股票数据
|
||||||
|
2025-06-18 08:52:00,399 - ERROR - 保存数据到数据库失败: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%s' at line 16
|
||||||
|
2025-06-18 08:52:00,401 - INFO - 数据采集完成,共处理 67 只股票
|
||||||
|
2025-06-18 08:53:22,391 - INFO - 收到停止信号,正在关闭...
|
||||||
|
2025-06-18 08:53:22,391 - INFO - 股票数据采集器已停止
|
||||||
|
2025-06-18 08:53:24,484 - INFO - 数据库连接成功
|
||||||
|
2025-06-18 08:53:24,484 - INFO - 股票数据采集器启动
|
||||||
|
2025-06-18 08:53:24,485 - INFO - 定时任务已启动,每 5 分钟采集一次
|
||||||
|
2025-06-18 08:53:24,486 - INFO - 开始执行股票数据采集...
|
||||||
|
2025-06-18 08:53:24,579 - INFO - 成功获取股票 sz300189 数据: 神农种业
|
||||||
|
2025-06-18 08:53:25,181 - INFO - 成功获取股票 sz000713 数据: 丰乐种业
|
||||||
|
2025-06-18 08:53:25,792 - INFO - 成功获取股票 sh600313 数据: 农发种业
|
||||||
|
2025-06-18 08:53:26,396 - INFO - 成功获取股票 bj837403 数据: 康农种业
|
||||||
|
2025-06-18 08:53:27,000 - INFO - 成功获取股票 sz200505 数据: 京粮B
|
||||||
|
2025-06-18 08:53:27,606 - INFO - 成功获取股票 sz300268 数据: *ST佳沃
|
||||||
|
2025-06-18 08:53:28,218 - INFO - 成功获取股票 sz000930 数据: 中粮科技
|
||||||
|
2025-06-18 08:53:28,819 - INFO - 成功获取股票 sz002299 数据: 圣农发展
|
||||||
|
2025-06-18 08:53:29,422 - INFO - 成功获取股票 sh600371 数据: 万向德农
|
||||||
|
2025-06-18 08:53:30,013 - INFO - 成功获取股票 sh600598 数据: 北大荒
|
||||||
|
2025-06-18 08:53:30,597 - INFO - 成功获取股票 sh603609 数据: 禾丰股份
|
||||||
|
2025-06-18 08:53:31,176 - INFO - 成功获取股票 bj831087 数据: 秋乐种业
|
||||||
|
2025-06-18 08:53:31,771 - INFO - 成功获取股票 sh603363 数据: 傲农生物
|
||||||
|
2025-06-18 08:53:32,366 - INFO - 成功获取股票 sh603336 数据: 宏辉果蔬
|
||||||
|
2025-06-18 08:53:32,958 - INFO - 成功获取股票 sh600354 数据: 敦煌种业
|
||||||
|
2025-06-18 08:53:33,568 - INFO - 成功获取股票 sz002385 数据: 大北农
|
||||||
|
2025-06-18 08:53:34,176 - INFO - 成功获取股票 sz000048 数据: 京基智农
|
||||||
|
2025-06-18 08:53:34,785 - INFO - 成功获取股票 sh600251 数据: 冠农股份
|
||||||
|
2025-06-18 08:53:35,430 - INFO - 成功获取股票 sz002321 数据: 华英农业
|
||||||
|
2025-06-18 08:53:36,098 - INFO - 成功获取股票 sz000505 数据: 京粮控股
|
||||||
|
2025-06-18 08:53:36,715 - INFO - 成功获取股票 sz001366 数据: 播恩集团
|
||||||
|
2025-06-18 08:53:37,300 - INFO - 成功获取股票 sz002772 数据: 众兴菌业
|
||||||
|
2025-06-18 08:53:37,894 - INFO - 成功获取股票 sz002041 数据: 登海种业
|
||||||
|
2025-06-18 08:53:38,524 - INFO - 成功获取股票 sh600127 数据: 金健米业
|
||||||
|
2025-06-18 08:53:39,134 - INFO - 成功获取股票 sz002548 数据: 金新农
|
||||||
|
2025-06-18 08:53:39,715 - INFO - 成功获取股票 sh605296 数据: 神农集团
|
||||||
|
2025-06-18 08:53:40,328 - INFO - 成功获取股票 sh600359 数据: 新农开发
|
||||||
|
2025-06-18 08:53:40,929 - INFO - 成功获取股票 sh601952 数据: 苏垦农发
|
||||||
|
2025-06-18 08:53:41,542 - INFO - 成功获取股票 sh600975 数据: 新五丰
|
||||||
|
2025-06-18 08:53:42,141 - INFO - 成功获取股票 sz300505 数据: 川金诺
|
||||||
|
2025-06-18 08:53:42,736 - INFO - 成功获取股票 sh600141 数据: 兴发集团
|
||||||
|
2025-06-18 08:53:43,341 - INFO - 成功获取股票 sz000893 数据: 亚钾国际
|
||||||
|
2025-06-18 08:53:43,931 - INFO - 成功获取股票 sh600691 数据: 阳煤化工
|
||||||
|
2025-06-18 08:53:44,532 - INFO - 成功获取股票 sh600470 数据: 六国化工
|
||||||
|
2025-06-18 08:53:45,129 - INFO - 成功获取股票 sh000912 数据: 300消费
|
||||||
|
2025-06-18 08:53:45,734 - INFO - 成功获取股票 sz000408 数据: 藏格矿业
|
||||||
|
2025-06-18 08:53:46,337 - INFO - 成功获取股票 sz000902 数据: 新洋丰
|
||||||
|
2025-06-18 08:53:46,928 - INFO - 成功获取股票 sz002539 数据: 云图控股
|
||||||
|
2025-06-18 08:53:47,530 - INFO - 成功获取股票 sz002599 数据: 盛通股份
|
||||||
|
2025-06-18 08:53:48,133 - INFO - 成功获取股票 sz002545 数据: 东方铁塔
|
||||||
|
2025-06-18 08:53:48,727 - INFO - 成功获取股票 sz300387 数据: 富邦科技
|
||||||
|
2025-06-18 08:53:49,329 - INFO - 成功获取股票 sz002274 数据: 华昌化工
|
||||||
|
2025-06-18 08:53:49,935 - INFO - 成功获取股票 sz002470 数据: 金正大
|
||||||
|
2025-06-18 08:53:50,535 - INFO - 成功获取股票 sz002538 数据: 司尔特
|
||||||
|
2025-06-18 08:53:51,118 - INFO - 成功获取股票 sz000731 数据: 四川美丰
|
||||||
|
2025-06-18 08:53:51,711 - INFO - 成功获取股票 sh600078 数据: 澄星股份
|
||||||
|
2025-06-18 08:53:52,317 - INFO - 成功获取股票 sh600227 数据: 赤天化
|
||||||
|
2025-06-18 08:53:52,907 - INFO - 成功获取股票 sh603395 数据: 红四方
|
||||||
|
2025-06-18 08:53:53,495 - INFO - 成功获取股票 sz002588 数据: 史丹利
|
||||||
|
2025-06-18 08:53:54,099 - INFO - 成功获取股票 sz000422 数据: 湖北宜化
|
||||||
|
2025-06-18 08:53:54,679 - INFO - 成功获取股票 sz002556 数据: 辉隆股份
|
||||||
|
2025-06-18 08:53:55,282 - INFO - 成功获取股票 sz002312 数据: 川发龙蟒
|
||||||
|
2025-06-18 08:53:55,888 - INFO - 成功获取股票 sz002170 数据: 芭田股份
|
||||||
|
2025-06-18 08:53:56,505 - INFO - 成功获取股票 sz000792 数据: 盐湖股份
|
||||||
|
2025-06-18 08:53:57,112 - INFO - 成功获取股票 sh600096 数据: 云天化
|
||||||
|
2025-06-18 08:53:57,699 - INFO - 成功获取股票 sz001231 数据: 农心科技
|
||||||
|
2025-06-18 08:53:58,300 - INFO - 成功获取股票 sz002731 数据: 萃华珠宝
|
||||||
|
2025-06-18 08:53:58,884 - INFO - 成功获取股票 sz200553 数据: 安道麦B
|
||||||
|
2025-06-18 08:53:59,488 - INFO - 成功获取股票 sh603810 数据: 丰山集团
|
||||||
|
2025-06-18 08:54:00,099 - INFO - 成功获取股票 sh603970 数据: 中农立华
|
||||||
|
2025-06-18 08:54:00,690 - INFO - 成功获取股票 sz301035 数据: 润丰股份
|
||||||
|
2025-06-18 08:54:01,284 - INFO - 成功获取股票 sz002868 数据: *ST绿康
|
||||||
|
2025-06-18 08:54:01,889 - INFO - 成功获取股票 sz003042 数据: 中农联合
|
||||||
|
2025-06-18 08:54:02,476 - INFO - 成功获取股票 sz002391 数据: 长青股份
|
||||||
|
2025-06-18 08:54:03,079 - INFO - 成功获取股票 bj870866 数据: 绿亨科技
|
||||||
|
2025-06-18 08:54:03,683 - INFO - 成功获取股票 sz301665 数据: 泰禾股份
|
||||||
|
2025-06-18 08:54:04,295 - INFO - 成功获取股票 sh600486 数据: 扬农化工
|
||||||
|
2025-06-18 08:54:04,796 - INFO - 本次采集完成,共获取 67 只股票数据
|
||||||
|
2025-06-18 08:54:04,803 - INFO - 更新股票 sz300189 数据
|
||||||
|
2025-06-18 08:54:04,806 - INFO - 更新股票 sz000713 数据
|
||||||
|
2025-06-18 08:54:04,807 - INFO - 更新股票 sh600313 数据
|
||||||
|
2025-06-18 08:54:04,809 - INFO - 更新股票 bj837403 数据
|
||||||
|
2025-06-18 08:54:04,812 - INFO - 更新股票 sz200505 数据
|
||||||
|
2025-06-18 08:54:04,813 - INFO - 更新股票 sz300268 数据
|
||||||
|
2025-06-18 08:54:04,815 - INFO - 更新股票 sz000930 数据
|
||||||
|
2025-06-18 08:54:04,817 - INFO - 更新股票 sz002299 数据
|
||||||
|
2025-06-18 08:54:04,819 - INFO - 更新股票 sh600371 数据
|
||||||
|
2025-06-18 08:54:04,820 - INFO - 更新股票 sh600598 数据
|
||||||
|
2025-06-18 08:54:04,821 - INFO - 更新股票 sh603609 数据
|
||||||
|
2025-06-18 08:54:04,822 - INFO - 更新股票 bj831087 数据
|
||||||
|
2025-06-18 08:54:04,824 - INFO - 更新股票 sh603363 数据
|
||||||
|
2025-06-18 08:54:04,826 - INFO - 更新股票 sh603336 数据
|
||||||
|
2025-06-18 08:54:04,829 - INFO - 更新股票 sh600354 数据
|
||||||
|
2025-06-18 08:54:04,831 - INFO - 更新股票 sz002385 数据
|
||||||
|
2025-06-18 08:54:04,832 - INFO - 更新股票 sz000048 数据
|
||||||
|
2025-06-18 08:54:04,833 - INFO - 更新股票 sh600251 数据
|
||||||
|
2025-06-18 08:54:04,835 - INFO - 更新股票 sz002321 数据
|
||||||
|
2025-06-18 08:54:04,836 - INFO - 更新股票 sz000505 数据
|
||||||
|
2025-06-18 08:54:04,837 - INFO - 更新股票 sz001366 数据
|
||||||
|
2025-06-18 08:54:04,839 - INFO - 更新股票 sz002772 数据
|
||||||
|
2025-06-18 08:54:04,840 - INFO - 更新股票 sz002041 数据
|
||||||
|
2025-06-18 08:54:04,841 - INFO - 更新股票 sh600127 数据
|
||||||
|
2025-06-18 08:54:04,842 - INFO - 更新股票 sz002548 数据
|
||||||
|
2025-06-18 08:54:04,845 - INFO - 更新股票 sh605296 数据
|
||||||
|
2025-06-18 08:54:04,847 - INFO - 更新股票 sh600359 数据
|
||||||
|
2025-06-18 08:54:04,848 - INFO - 更新股票 sh601952 数据
|
||||||
|
2025-06-18 08:54:04,849 - INFO - 更新股票 sh600975 数据
|
||||||
|
2025-06-18 08:54:04,851 - INFO - 更新股票 sz300505 数据
|
||||||
|
2025-06-18 08:54:04,852 - INFO - 更新股票 sh600141 数据
|
||||||
|
2025-06-18 08:54:04,853 - INFO - 更新股票 sz000893 数据
|
||||||
|
2025-06-18 08:54:04,855 - INFO - 更新股票 sh600691 数据
|
||||||
|
2025-06-18 08:54:04,856 - INFO - 更新股票 sh600470 数据
|
||||||
|
2025-06-18 08:54:04,857 - INFO - 更新股票 sh000912 数据
|
||||||
|
2025-06-18 08:54:04,859 - INFO - 更新股票 sz000408 数据
|
||||||
|
2025-06-18 08:54:04,862 - INFO - 更新股票 sz000902 数据
|
||||||
|
2025-06-18 08:54:04,864 - INFO - 更新股票 sz002539 数据
|
||||||
|
2025-06-18 08:54:04,866 - INFO - 更新股票 sz002599 数据
|
||||||
|
2025-06-18 08:54:04,867 - INFO - 更新股票 sz002545 数据
|
||||||
|
2025-06-18 08:54:04,868 - INFO - 更新股票 sz300387 数据
|
||||||
|
2025-06-18 08:54:04,869 - INFO - 更新股票 sz002274 数据
|
||||||
|
2025-06-18 08:54:04,872 - INFO - 更新股票 sz002470 数据
|
||||||
|
2025-06-18 08:54:04,873 - INFO - 更新股票 sz002538 数据
|
||||||
|
2025-06-18 08:54:04,874 - INFO - 更新股票 sz000731 数据
|
||||||
|
2025-06-18 08:54:04,876 - INFO - 更新股票 sh600078 数据
|
||||||
|
2025-06-18 08:54:04,878 - INFO - 更新股票 sh600227 数据
|
||||||
|
2025-06-18 08:54:04,879 - INFO - 更新股票 sh603395 数据
|
||||||
|
2025-06-18 08:54:04,881 - INFO - 更新股票 sz002588 数据
|
||||||
|
2025-06-18 08:54:04,882 - INFO - 更新股票 sz000422 数据
|
||||||
|
2025-06-18 08:54:04,883 - INFO - 更新股票 sz002556 数据
|
||||||
|
2025-06-18 08:54:04,884 - INFO - 更新股票 sz002312 数据
|
||||||
|
2025-06-18 08:54:04,885 - INFO - 更新股票 sz002170 数据
|
||||||
|
2025-06-18 08:54:04,887 - INFO - 更新股票 sz000792 数据
|
||||||
|
2025-06-18 08:54:04,888 - INFO - 更新股票 sh600096 数据
|
||||||
|
2025-06-18 08:54:04,889 - INFO - 更新股票 sz001231 数据
|
||||||
|
2025-06-18 08:54:04,891 - INFO - 更新股票 sz002731 数据
|
||||||
|
2025-06-18 08:54:04,893 - INFO - 更新股票 sz200553 数据
|
||||||
|
2025-06-18 08:54:04,895 - INFO - 更新股票 sh603810 数据
|
||||||
|
2025-06-18 08:54:04,897 - INFO - 更新股票 sh603970 数据
|
||||||
|
2025-06-18 08:54:04,898 - INFO - 更新股票 sz301035 数据
|
||||||
|
2025-06-18 08:54:04,900 - INFO - 更新股票 sz002868 数据
|
||||||
|
2025-06-18 08:54:04,901 - INFO - 更新股票 sz003042 数据
|
||||||
|
2025-06-18 08:54:04,903 - INFO - 更新股票 sz002391 数据
|
||||||
|
2025-06-18 08:54:04,904 - INFO - 更新股票 bj870866 数据
|
||||||
|
2025-06-18 08:54:04,905 - INFO - 更新股票 sz301665 数据
|
||||||
|
2025-06-18 08:54:04,906 - INFO - 更新股票 sh600486 数据
|
||||||
|
2025-06-18 08:54:04,912 - INFO - 成功处理 67 条股票数据到数据库
|
||||||
|
2025-06-18 08:54:04,912 - INFO - 数据采集完成,共处理 67 只股票
|
||||||
|
2025-06-18 08:54:30,695 - INFO - 收到停止信号,正在关闭...
|
||||||
|
2025-06-18 08:54:30,696 - INFO - 股票数据采集器已停止
|
||||||
+108
-15
@@ -41,16 +41,75 @@ class StockCrawler:
|
|||||||
|
|
||||||
# 农业类股票代码列表(示例)
|
# 农业类股票代码列表(示例)
|
||||||
self.agricultural_stocks = [
|
self.agricultural_stocks = [
|
||||||
'sz300630', # 普利制药
|
'sz300189', # 神农种业
|
||||||
'sh600998', # 九州通
|
'sz000713', # 丰乐钟业
|
||||||
'sh600371', # 万向钱潮
|
'sh600313', # 农发种业
|
||||||
'sz000876', # 新希望
|
'bj837403', # 康农种业
|
||||||
'sz002714', # 牧原股份
|
'sz200505', # 京粮B
|
||||||
'sh600519', # 贵州茅台
|
'sz300268', # st佳沃
|
||||||
'sz000858', # 五粮液
|
'sz000930', # 中粮科技
|
||||||
'sh600887', # 伊利股份
|
'sz002299', # 圣农发展
|
||||||
'sz002304', # 洋河股份
|
'sh600371', # 万向德农
|
||||||
'sh600036', # 招商银行
|
'sh600598', # 北大荒
|
||||||
|
'sh603609', # 禾丰股份
|
||||||
|
'bj831087',
|
||||||
|
'sh603363',
|
||||||
|
'sh603336',
|
||||||
|
'sh600354',
|
||||||
|
'sz002385',
|
||||||
|
'sz000048',
|
||||||
|
'sh600251',
|
||||||
|
'sz002321',
|
||||||
|
'sz000505',
|
||||||
|
'sz001366',
|
||||||
|
'sz002772',
|
||||||
|
'sz002041',
|
||||||
|
'sh600127',
|
||||||
|
'sz002548',
|
||||||
|
'sh605296',
|
||||||
|
'sh600359',
|
||||||
|
'sh601952',
|
||||||
|
'sh600975',
|
||||||
|
# 新增股票代码
|
||||||
|
'sz300505',
|
||||||
|
'sh600141',
|
||||||
|
'sz000893',
|
||||||
|
'sh600691',
|
||||||
|
'sh600470',
|
||||||
|
'sh000912',
|
||||||
|
'sz000408',
|
||||||
|
'sz000902',
|
||||||
|
'sz002539',
|
||||||
|
'sz002599',
|
||||||
|
'sz002545',
|
||||||
|
'sz300387',
|
||||||
|
'sz002274',
|
||||||
|
'sz002470',
|
||||||
|
'sz002538',
|
||||||
|
'sz000731',
|
||||||
|
'sh600078',
|
||||||
|
'sh600227',
|
||||||
|
'sh603395',
|
||||||
|
'sz002588',
|
||||||
|
'sz000422',
|
||||||
|
'sz002556',
|
||||||
|
'sz002312',
|
||||||
|
'sz002170',
|
||||||
|
'sz000792',
|
||||||
|
'sh600096',
|
||||||
|
# 农药兽药类股票
|
||||||
|
'sz001231',
|
||||||
|
'sz002731',
|
||||||
|
'sz200553',
|
||||||
|
'sh603810',
|
||||||
|
'sh603970',
|
||||||
|
'sz301035',
|
||||||
|
'sz002868',
|
||||||
|
'sz003042',
|
||||||
|
'sz002391',
|
||||||
|
'bj870866',
|
||||||
|
'sz301665',
|
||||||
|
'sh600486',
|
||||||
]
|
]
|
||||||
|
|
||||||
# 初始化数据库连接
|
# 初始化数据库连接
|
||||||
@@ -212,7 +271,42 @@ class StockCrawler:
|
|||||||
try:
|
try:
|
||||||
cursor = self.db_connection.cursor()
|
cursor = self.db_connection.cursor()
|
||||||
|
|
||||||
# 构建插入SQL
|
# 获取当前日期
|
||||||
|
today = datetime.now().strftime('%Y-%m-%d')
|
||||||
|
|
||||||
|
for stock_data in stock_data_list:
|
||||||
|
# 查询今天是否已有该股票数据
|
||||||
|
check_sql = """
|
||||||
|
SELECT COUNT(*) FROM stock_data
|
||||||
|
WHERE stock_code = %s AND DATE(trade_date) = %s
|
||||||
|
"""
|
||||||
|
cursor.execute(check_sql, (stock_data['stock_code'], today))
|
||||||
|
count = cursor.fetchone()[0]
|
||||||
|
|
||||||
|
if count > 0:
|
||||||
|
# 已有数据,使用UPDATE更新
|
||||||
|
update_sql = """
|
||||||
|
UPDATE stock_data SET
|
||||||
|
stock_name = %(stock_name)s,
|
||||||
|
open_price = %(open_price)s,
|
||||||
|
close_price = %(current_price)s,
|
||||||
|
high_price = %(high_price)s,
|
||||||
|
low_price = %(low_price)s,
|
||||||
|
volume = %(volume)s,
|
||||||
|
turnover = %(turnover)s,
|
||||||
|
change_percent = %(change_percent)s,
|
||||||
|
change_amount = %(change_amount)s,
|
||||||
|
pe_ratio = %(pe_ratio)s,
|
||||||
|
pb_ratio = %(pb_ratio)s,
|
||||||
|
market_cap = %(market_cap)s,
|
||||||
|
float_market_cap = %(float_market_cap)s,
|
||||||
|
update_time = NOW()
|
||||||
|
WHERE stock_code = %(stock_code)s AND DATE(trade_date) = %(date)s
|
||||||
|
"""
|
||||||
|
cursor.execute(update_sql, {**stock_data, 'date': today})
|
||||||
|
logger.info(f"更新股票 {stock_data['stock_code']} 数据")
|
||||||
|
else:
|
||||||
|
# 无数据,使用INSERT插入
|
||||||
insert_sql = """
|
insert_sql = """
|
||||||
INSERT INTO stock_data (
|
INSERT INTO stock_data (
|
||||||
stock_code, stock_name, open_price, close_price, high_price, low_price,
|
stock_code, stock_name, open_price, close_price, high_price, low_price,
|
||||||
@@ -225,12 +319,11 @@ class StockCrawler:
|
|||||||
%(market_cap)s, %(float_market_cap)s, NOW(), NOW()
|
%(market_cap)s, %(float_market_cap)s, NOW(), NOW()
|
||||||
)
|
)
|
||||||
"""
|
"""
|
||||||
|
cursor.execute(insert_sql, stock_data)
|
||||||
|
logger.info(f"插入股票 {stock_data['stock_code']} 数据")
|
||||||
|
|
||||||
# 批量插入数据
|
|
||||||
cursor.executemany(insert_sql, stock_data_list)
|
|
||||||
self.db_connection.commit()
|
self.db_connection.commit()
|
||||||
|
logger.info(f"成功处理 {len(stock_data_list)} 条股票数据到数据库")
|
||||||
logger.info(f"成功保存 {len(stock_data_list)} 条股票数据到数据库")
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"保存数据到数据库失败: {e}")
|
logger.error(f"保存数据到数据库失败: {e}")
|
||||||
|
|||||||
+40
@@ -0,0 +1,40 @@
|
|||||||
|
import{j as Un,u as Wn,G as Fn}from"./main-f65d595e.js";function v(s,e,t,n,r){if(typeof e=="function"?s!==e||!0:!e.has(s))throw new TypeError("Cannot write private member to an object whose class did not declare it");return e.set(s,t),t}function a(s,e,t,n){if(t==="a"&&!n)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?s!==e||!n:!e.has(s))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t==="m"?n:t==="a"?n.call(s):n?n.value:e.get(s)}let _s=function(){const{crypto:s}=globalThis;if(s!=null&&s.randomUUID)return _s=s.randomUUID.bind(s),s.randomUUID();const e=new Uint8Array(1),t=s?()=>s.getRandomValues(e)[0]:()=>Math.random()*255&255;return"10000000-1000-4000-8000-100000000000".replace(/[018]/g,n=>(+n^t()&15>>+n/4).toString(16))};function ft(s){return typeof s=="object"&&s!==null&&("name"in s&&s.name==="AbortError"||"message"in s&&String(s.message).includes("FetchRequestCanceledException"))}const mt=s=>{if(s instanceof Error)return s;if(typeof s=="object"&&s!==null){try{if(Object.prototype.toString.call(s)==="[object Error]"){const e=new Error(s.message,s.cause?{cause:s.cause}:{});return s.stack&&(e.stack=s.stack),s.cause&&!e.cause&&(e.cause=s.cause),s.name&&(e.name=s.name),e}}catch{}try{return new Error(JSON.stringify(s))}catch{}}return new Error(s)};class w extends Error{}class D extends w{constructor(e,t,n,r){super(`${D.makeMessage(e,t,n)}`),this.status=e,this.headers=r,this.requestID=r==null?void 0:r.get("x-request-id"),this.error=t;const o=t;this.code=o==null?void 0:o.code,this.param=o==null?void 0:o.param,this.type=o==null?void 0:o.type}static makeMessage(e,t,n){const r=t!=null&&t.message?typeof t.message=="string"?t.message:JSON.stringify(t.message):t?JSON.stringify(t):n;return e&&r?`${e} ${r}`:e?`${e} status code (no body)`:r||"(no status code or body)"}static generate(e,t,n,r){if(!e||!r)return new Ye({message:n,cause:mt(t)});const o=t==null?void 0:t.error;return e===400?new vs(e,o,n,r):e===401?new bs(e,o,n,r):e===403?new xs(e,o,n,r):e===404?new Ss(e,o,n,r):e===409?new $s(e,o,n,r):e===422?new As(e,o,n,r):e===429?new Is(e,o,n,r):e>=500?new Os(e,o,n,r):new D(e,o,n,r)}}class H extends D{constructor({message:e}={}){super(void 0,void 0,e||"Request was aborted.",void 0)}}class Ye extends D{constructor({message:e,cause:t}){super(void 0,void 0,e||"Connection error.",void 0),t&&(this.cause=t)}}class It extends Ye{constructor({message:e}={}){super({message:e??"Request timed out."})}}class vs extends D{}class bs extends D{}class xs extends D{}class Ss extends D{}class $s extends D{}class As extends D{}class Is extends D{}class Os extends D{}class Rs extends w{constructor(){super("Could not parse response content as the length limit was reached")}}class ks extends w{constructor(){super("Could not parse response content as the request was rejected by the content filter")}}const Xn=/^[a-z][a-z0-9+.-]*:/i,Hn=s=>Xn.test(s);function Jn(s){return typeof s!="object"?{}:s??{}}function Kn(s){if(!s)return!0;for(const e in s)return!1;return!0}function Vn(s,e){return Object.prototype.hasOwnProperty.call(s,e)}function it(s){return s!=null&&typeof s=="object"&&!Array.isArray(s)}const zn=(s,e)=>{if(typeof e!="number"||!Number.isInteger(e))throw new w(`${s} must be an integer`);if(e<0)throw new w(`${s} must be a positive integer`);return e},Gn=s=>{try{return JSON.parse(s)}catch{return}},Ie=s=>new Promise(e=>setTimeout(e,s)),He={off:0,error:200,warn:300,info:400,debug:500},zt=(s,e,t)=>{if(s){if(Vn(He,s))return s;q(t).warn(`${e} was set to ${JSON.stringify(s)}, expected one of ${JSON.stringify(Object.keys(He))}`)}};function fe(){}function Ee(s,e,t){return!e||He[s]>He[t]?fe:e[s].bind(e)}const Qn={error:fe,warn:fe,info:fe,debug:fe};let Gt=new WeakMap;function q(s){const e=s.logger,t=s.logLevel??"off";if(!e)return Qn;const n=Gt.get(e);if(n&&n[0]===t)return n[1];const r={error:Ee("error",e,t),warn:Ee("warn",e,t),info:Ee("info",e,t),debug:Ee("debug",e,t)};return Gt.set(e,[t,r]),r}const se=s=>(s.options&&(s.options={...s.options},delete s.options.headers),s.headers&&(s.headers=Object.fromEntries((s.headers instanceof Headers?[...s.headers]:Object.entries(s.headers)).map(([e,t])=>[e,e.toLowerCase()==="authorization"||e.toLowerCase()==="cookie"||e.toLowerCase()==="set-cookie"?"***":t]))),"retryOfRequestLogID"in s&&(s.retryOfRequestLogID&&(s.retryOf=s.retryOfRequestLogID),delete s.retryOfRequestLogID),s),ce="5.0.1",Yn=()=>typeof window<"u"&&typeof window.document<"u"&&typeof navigator<"u";function Zn(){return typeof Deno<"u"&&Deno.build!=null?"deno":typeof EdgeRuntime<"u"?"edge":Object.prototype.toString.call(typeof globalThis.process<"u"?globalThis.process:0)==="[object process]"?"node":"unknown"}const er=()=>{var s;const e=Zn();if(e==="deno")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":ce,"X-Stainless-OS":Yt(Deno.build.os),"X-Stainless-Arch":Qt(Deno.build.arch),"X-Stainless-Runtime":"deno","X-Stainless-Runtime-Version":typeof DLine truncated
|
||||||
|
`):[]}}U=new WeakMap,W=new WeakMap;Ze.NEWLINE_CHARS=new Set([`
|
||||||
|
`,"\r"]);Ze.NEWLINE_REGEXP=/\r\n|[\n\r]/g;function yr(s,e){for(let t=e??0;t<s.length;t++){if(s[t]===10)return{preceding:t,index:t+1,carriage:!1};if(s[t]===13)return{preceding:t,index:t+1,carriage:!0}}return null}function wr(s){for(let e=0;e<s.length-1;e++){if(s[e]===10&&s[e+1]===10||s[e]===13&&s[e+1]===13)return e+2;if(s[e]===13&&s[e+1]===10&&e+3<s.length&&s[e+2]===13&&s[e+3]===10)return e+4}return-1}class Q{constructor(e,t){this.iterator=e,this.controller=t}static fromSSEResponse(e,t){let n=!1;async function*r(){if(n)throw new w("Cannot iterate over a consumed stream, use `.tee()` to split the stream.");n=!0;let o=!1;try{for await(const i of _r(e,t))if(!o){if(i.data.startsWith("[DONE]")){o=!0;continue}if(i.event===null||i.event.startsWith("response.")||i.event.startsWith("transcript.")){let l;try{l=JSON.parse(i.data)}catch(c){throw console.error("Could not parse message into JSON:",i.data),console.error("From chunk:",i.raw),c}if(l&&l.error)throw new D(void 0,l.error,void 0,e.headers);yield l}else{let l;try{l=JSON.parse(i.data)}catch(c){throw console.error("Could not parse message into JSON:",i.data),console.error("From chunk:",i.raw),c}if(i.event=="error")throw new D(void 0,l.error,l.message,void 0);yield{event:i.event,data:l}}}o=!0}catch(i){if(ft(i))return;throw i}finally{o||t.abort()}}return new Q(r,t)}static fromReadableStream(e,t){let n=!1;async function*r(){const i=new Ze,l=Cs(e);for await(const c of l)for(const d of i.decode(c))yield d;for(const c of i.flush())yield c}async function*o(){if(n)throw new w("Cannot iterate over a consumed stream, use `.tee()` to split the stream.");n=!0;let i=!1;try{for await(const l of r())i||l&&(yield JSON.parse(l));i=!0}catch(l){if(ft(l))return;throw l}finally{i||t.abort()}}return new Q(o,t)}[Symbol.asyncIterator](){return this.iterator()}tee(){const e=[],t=[],n=this.iterator(),r=o=>({next:()=>{if(o.length===0){const i=n.next();e.push(i),t.push(i)}return o.shift()}});return[new Q(()=>r(e),this.controller),new Q(()=>r(t),this.controller)]}toReadableStream(){const e=this;let t;return Es({async start(){t=e[Symbol.asyncIterator]()},async pull(n){try{const{value:r,done:o}=await t.next();if(o)return n.close();const i=Ot(JSON.stringify(r)+`
|
||||||
|
`);n.enqueue(i)}catch(r){n.error(r)}},async cancel(){var n;await((n=t.return)==null?void 0:n.call(t))}})}}async function*_r(s,e){if(!s.body)throw e.abort(),typeof globalThis.navigator<"u"&&globalThis.navigator.product==="ReactNative"?new w("The default react-native fetch implementation does not support streaming. Please use expo/fetch: https://docs.expo.dev/versions/latest/sdk/expo/#expofetch-api"):new w("Attempted to iterate over a response with no body");const t=new br,n=new Ze,r=Cs(s.body);for await(const o of vr(r))for(const i of n.decode(o)){const l=t.decode(i);l&&(yield l)}for(const o of n.flush()){const i=t.decode(o);i&&(yield i)}}async function*vr(s){let e=new Uint8Array;for await(const t of s){if(t==null)continue;const n=t instanceof ArrayBuffer?new Uint8Array(t):typeof t=="string"?Ot(t):t;let r=new Uint8Array(e.length+n.length);r.set(e),r.set(n,e.length),e=r;let o;for(;(o=wr(e))!==-1;)yield e.slice(0,o),e=e.slice(o)}e.length>0&&(yield e)}class br{constructor(){this.event=null,this.data=[],this.chunks=[]}decode(e){if(e.endsWith("\r")&&(e=e.substring(0,e.length-1)),!e){if(!this.event&&!this.data.length)return null;const o={event:this.event,data:this.data.join(`
|
||||||
|
`),raw:this.chunks};return this.event=null,this.data=[],this.chunks=[],o}if(this.chunks.push(e),e.startsWith(":"))return null;let[t,n,r]=xr(e,":");return r.startsWith(" ")&&(r=r.substring(1)),t==="event"?this.event=r:t==="data"&&this.data.push(r),null}}function xr(s,e){const t=s.indexOf(e);return t!==-1?[s.substring(0,t),e,s.substring(t+e.length)]:[s,"",""]}async function Ls(s,e){const{response:t,requestLogID:n,retryOfRequestLogID:r,startTime:o}=e,i=await(async()=>{var l;if(e.options.stream)return q(s).debug("response",t.status,t.url,t.headers,t.body),e.options.__streamClass?e.options.__streamClass.fromSSEResponse(t,e.controller):Q.fromSSEResponse(t,e.controller);if(t.status===204)return null;if(e.options.__binaryResponse)return t;const c=t.headers.get("content-type"),d=(l=c==null?void 0:c.split(";")[0])==null?void 0:l.trim();if(d!=null&&d.includes("application/json")||d!=null&&d.endsWith("+json")){const m=await t.json();return Ms(m,t)}return await t.text()})();return q(s).debug(`[${n}] response parsed`,se({retryOfRequestLogID:r,url:t.url,status:t.status,body:i,durationMs:Date.now()-o})),i}function Ms(s,e){return!s||typeof s!="object"||Array.isArray(s)?s:Object.defineProperty(s,"_request_id",{value:e.headers.get("x-request-id"),enumerable:!1})}var me;class et extends Promise{constructor(e,t,n=Ls){super(r=>{r(null)}),this.responsePromise=t,this.parseResponse=n,me.set(this,void 0),v(this,me,e)}_thenUnwrap(e){return new et(a(this,me,"f"),this.responsePromise,async(t,n)=>Ms(e(await this.parseResponse(t,n),n),n.response))}asResponse(){return this.responsePromise.then(e=>e.response)}async withResponse(){const[e,t]=await Promise.all([this.parse(),this.asResponse()]);return{data:e,response:t,request_id:t.headers.get("x-request-id")}}parse(){return this.parsedPromise||(this.parsedPromise=this.responsePromise.then(e=>this.parseResponse(a(this,me,"f"),e))),this.parsedPromise}then(e,t){return this.parse().then(e,t)}catch(e){return this.parse().catch(e)}finally(e){return this.parse().finally(e)}}me=new WeakMap;var Pe;class Ds{constructor(e,t,n,r){Pe.set(this,void 0),v(this,Pe,e),this.options=r,this.response=t,this.body=n}hasNextPage(){return this.getPaginatedItems().length?this.nextPageRequestOptions()!=null:!1}async getNextPage(){const e=this.nextPageRequestOptions();if(!e)throw new w("No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.");return await a(this,Pe,"f").requestAPIList(this.constructor,e)}async*iterPages(){let e=this;for(yield e;e.hasNextPage();)e=await e.getNextPage(),yield e}async*[(Pe=new WeakMap,Symbol.asyncIterator)](){for await(const e of this.iterPages())for(const t of e.getPaginatedItems())yield t}}class Sr extends et{constructor(e,t,n){super(e,t,async(r,o)=>new n(r,o.response,await Ls(r,o),o.options))}async*[Symbol.asyncIterator](){const e=await this;for await(const t of e)yield t}}class tt extends Ds{constructor(e,t,n,r){super(e,t,n,r),this.data=n.data||[],this.object=n.object}getPaginatedItems(){return this.data??[]}nextPageRequestOptions(){return null}}class C extends Ds{constructor(e,t,n,r){super(e,t,n,r),this.data=n.data||[],this.has_more=n.has_more||!1}getPaginatedItems(){return this.data??[]}hasNextPage(){return this.has_more===!1?!1:super.hasNextPage()}nextPageRequestOptions(){var e;const t=this.getPaginatedItems(),n=(e=t[t.length-1])==null?void 0:e.id;return n?{...this.options,query:{...Jn(this.options.query),after:n}}:null}}const qs=()=>{var s;if(typeof File>"u"){const{process:e}=globalThis,t=typeof((s=e==null?void 0:e.versions)==null?void 0:s.node)=="string"&&parseInt(e.versions.node.split("."))<20;throw new Error("`File` is not defined as a global, which is required for file uploads."+(t?" Update to Node 20 LTS or newer, or set `globalThis.File` to `import('node:buffer').File`.":""))}};function xe(s,e,t){return qs(),new File(s,e??"unknown_file",t)}function Me(s){return(typeof s=="object"&&s!==null&&("name"in s&&s.name&&String(s.name)||"url"in s&&s.url&&String(s.url)||"filename"in s&&s.filename&&String(s.filename)||"path"in s&&s.path&&String(s.path))||"").split(/[\\/]/).pop()||void 0}const Bs=s=>s!=null&&typeof s=="object"&&typeof s[Symbol.asyncIterator]=="function",ie=async(s,e)=>({...s,body:await Ar(s.body,e)}),rs=new WeakMap;function $r(s){const e=typeof s=="function"?s:s.fetch,t=rs.get(e);if(t)return t;const n=(async()=>{try{const r="Response"in e?e.Response:(await e("data:,")).constructor,o=new FormData;return o.toString()!==await new r(o).text()}catch{return!0}})();return rs.set(e,n),n}const Ar=async(s,e)=>{if(!await $r(e))throw new TypeError("The provided fetch function does not support file uploads with the current global FormData class.");const t=new FormData;return await Promise.all(Object.entries(s||{}).map(([n,r])=>wt(t,n,r))),t},Ir=s=>s instanceof Blob&&"name"in s,wt=async(s,e,t)=>{if(t!==void 0){if(t==null)throw new TypeError(`Received null for "${e}"; to pass null in FormData, you must use the string 'null'`);if(typeof t=="string"||typeof
Line truncated
|
||||||
|
${r}
|
||||||
|
${m}`)}return r},h=Pr(Ws);let Fs=class extends x{list(s,e={},t){return this._client.getAPIList(h`/chat/completions/${s}/messages`,C,{query:e,...t})}};function Cr(s){return typeof s.parse=="function"}const Je=s=>(s==null?void 0:s.role)==="assistant",Xs=s=>(s==null?void 0:s.role)==="tool";var vt,De,qe,ge,ye,Be,we,Z,_e,Ke,Ve,ue,Hs;class Rt{constructor(){vt.add(this),this.controller=new AbortController,De.set(this,void 0),qe.set(this,()=>{}),ge.set(this,()=>{}),ye.set(this,void 0),Be.set(this,()=>{}),we.set(this,()=>{}),Z.set(this,{}),_e.set(this,!1),Ke.set(this,!1),Ve.set(this,!1),ue.set(this,!1),v(this,De,new Promise((e,t)=>{v(this,qe,e,"f"),v(this,ge,t,"f")})),v(this,ye,new Promise((e,t)=>{v(this,Be,e,"f"),v(this,we,t,"f")})),a(this,De,"f").catch(()=>{}),a(this,ye,"f").catch(()=>{})}_run(e){setTimeout(()=>{e().then(()=>{this._emitFinal(),this._emit("end")},a(this,vt,"m",Hs).bind(this))},0)}_connected(){this.ended||(a(this,qe,"f").call(this),this._emit("connect"))}get ended(){return a(this,_e,"f")}get errored(){return a(this,Ke,"f")}get aborted(){return a(this,Ve,"f")}abort(){this.controller.abort()}on(e,t){return(a(this,Z,"f")[e]||(a(this,Z,"f")[e]=[])).push({listener:t}),this}off(e,t){const n=a(this,Z,"f")[e];if(!n)return this;const r=n.findIndex(o=>o.listener===t);return r>=0&&n.splice(r,1),this}once(e,t){return(a(this,Z,"f")[e]||(a(this,Z,"f")[e]=[])).push({listener:t,once:!0}),this}emitted(e){return new Promise((t,n)=>{v(this,ue,!0),e!=="error"&&this.once("error",n),this.once(e,t)})}async done(){v(this,ue,!0),await a(this,ye,"f")}_emit(e,...t){if(a(this,_e,"f"))return;e==="end"&&(v(this,_e,!0),a(this,Be,"f").call(this));const n=a(this,Z,"f")[e];if(n&&(a(this,Z,"f")[e]=n.filter(r=>!r.once),n.forEach(({listener:r})=>r(...t))),e==="abort"){const r=t[0];!a(this,ue,"f")&&!(n!=null&&n.length)&&Promise.reject(r),a(this,ge,"f").call(this,r),a(this,we,"f").call(this,r),this._emit("end");return}if(e==="error"){const r=t[0];!a(this,ue,"f")&&!(n!=null&&n.length)&&Promise.reject(r),a(this,ge,"f").call(this,r),a(this,we,"f").call(this,r),this._emit("end")}}_emitFinal(){}}De=new WeakMap,qe=new WeakMap,ge=new WeakMap,ye=new WeakMap,Be=new WeakMap,we=new WeakMap,Z=new WeakMap,_e=new WeakMap,Ke=new WeakMap,Ve=new WeakMap,ue=new WeakMap,vt=new WeakSet,Hs=function(s){if(v(this,Ke,!0),s instanceof Error&&s.name==="AbortError"&&(s=new H),s instanceof H)return v(this,Ve,!0),this._emit("abort",s);if(s instanceof w)return this._emit("error",s);if(s instanceof Error){const e=new w(s.message);return e.cause=s,this._emit("error",e)}return this._emit("error",new w(String(s)))};function kt(s){return(s==null?void 0:s.$brand)==="auto-parseable-response-format"}function Oe(s){return(s==null?void 0:s.$brand)==="auto-parseable-tool"}function Tr(s,e){return!e||!Js(e)?{...s,choices:s.choices.map(t=>({...t,message:{...t.message,parsed:null,...t.message.tool_calls?{tool_calls:t.message.tool_calls}:void 0}}))}:Et(s,e)}function Et(s,e){const t=s.choices.map(n=>{var r;if(n.finish_reason==="length")throw new Rs;if(n.finish_reason==="content_filter")throw new ks;return{...n,message:{...n.message,...n.message.tool_calls?{tool_calls:((r=n.message.tool_calls)==null?void 0:r.map(o=>jr(e,o)))??void 0}:void 0,parsed:n.message.content&&!n.message.refusal?Nr(e,n.message.content):null}}});return{...s,choices:t}}function Nr(s,e){var t,n;return((t=s.response_format)==null?void 0:t.type)!=="json_schema"?null:((n=s.response_format)==null?void 0:n.type)==="json_schema"?"$parseRaw"in s.response_format?s.response_format.$parseRaw(e):JSON.parse(e):null}function jr(s,e){var t;const n=(t=s.tools)==null?void 0:t.find(r=>{var o;return((o=r.function)==null?void 0:o.name)===e.function.name});return{...e,function:{...e.function,parsed_arguments:Oe(n)?n.$parseRaw(e.function.arguments):n!=null&&n.function.strict?JSON.parse(e.function.arguments):null}}}function Lr(s,e){var t;if(!s)return!1;const n=(t=s.tools)==null?void 0:t.find(r=>{var o;return((o=r.function)==null?void 0:o.name)===e.function.name});return Oe(n)||(n==null?void 0:n.function.strict)||!1}function Js(s){var e;return kt(s.response_format)?!0:((e=s.tools)==null?void 0:e.some(t=>Oe(t)||t.type==="function"&&t.function.strict===!0))??!1}function Mr(s){for(const e of s??[]){if(e.type!=="function")throw new w(`Currently only \`function\` tool types support auto-parsing; Received \`${e.type}\``);if(e.function.strict!==!0)throw new w(`The \`${e.function.name}\` tool is not marked with \`strict: true\`. Only strict function tools can be auto-parsed`)}}var B,bt,ze,xt,St,$t,Ks,Vs;const Dr=10;class zs extends Rt{constructor(){super(...arguments),B.add(this),this._chatCompletions=[],this.messages=[]}_addChatCompletion(e){var t;this._chatCompletions.push(e),this._emit("chatCompletion",e);const n=(t=e.choices[0])==null?void 0:t.message;return n&&this._addMessage(n),e}_addMessage(e,t=!0){if("content"in e||(e.content=null),this.messages.push(e),t){if(this._emit("message",e),Xs(e)&&e.content)this._emit("functionToolCallResult",Line truncated
|
||||||
|
\r `.includes(s[n]);)n++};return i()},os=s=>Wr(s,L.ALL^L.NUM);var N,Y,ae,ee,ct,Ce,ut,dt,ht,Te,pt,is;class Ae extends zs{constructor(e){super(),N.add(this),Y.set(this,void 0),ae.set(this,void 0),ee.set(this,void 0),v(this,Y,e),v(this,ae,[])}get currentChatCompletionSnapshot(){return a(this,ee,"f")}static fromReadableStream(e){const t=new Ae(null);return t._run(()=>t._fromReadableStream(e)),t}static createChatCompletion(e,t,n){const r=new Ae(t);return r._run(()=>r._runChatCompletion(e,{...t,stream:!0},{...n,headers:{...n==null?void 0:n.headers,"X-Stainless-Helper-Method":"stream"}})),r}async _createChatCompletion(e,t,n){var r;super._createChatCompletion;const o=n==null?void 0:n.signal;o&&(o.aborted&&this.controller.abort(),o.addEventListener("abort",()=>this.controller.abort())),a(this,N,"m",ct).call(this);const i=await e.chat.completions.create({...t,stream:!0},{...n,signal:this.controller.signal});this._connected();for await(const l of i)a(this,N,"m",ut).call(this,l);if((r=i.controller.signal)!=null&&r.aborted)throw new H;return this._addChatCompletion(a(this,N,"m",Te).call(this))}async _fromReadableStream(e,t){var n;const r=t==null?void 0:t.signal;r&&(r.aborted&&this.controller.abort(),r.addEventListener("abort",()=>this.controller.abort())),a(this,N,"m",ct).call(this),this._connected();const o=Q.fromReadableStream(e,this.controller);let i;for await(const l of o)i&&i!==l.id&&this._addChatCompletion(a(this,N,"m",Te).call(this)),a(this,N,"m",ut).call(this,l),i=l.id;if((n=o.controller.signal)!=null&&n.aborted)throw new H;return this._addChatCompletion(a(this,N,"m",Te).call(this))}[(Y=new WeakMap,ae=new WeakMap,ee=new WeakMap,N=new WeakSet,ct=function(){this.ended||v(this,ee,void 0)},Ce=function(e){let t=a(this,ae,"f")[e.index];return t||(t={content_done:!1,refusal_done:!1,logprobs_content_done:!1,logprobs_refusal_done:!1,done_tool_calls:new Set,current_tool_call_index:null},a(this,ae,"f")[e.index]=t,t)},ut=function(e){var t,n,r,o,i,l,c,d,m,u,g,S,p,$,b;if(this.ended)return;const E=a(this,N,"m",is).call(this,e);this._emit("chunk",e,E);for(const f of e.choices){const _=E.choices[f.index];f.delta.content!=null&&((t=_.message)==null?void 0:t.role)==="assistant"&&(n=_.message)!=null&&n.content&&(this._emit("content",f.delta.content,_.message.content),this._emit("content.delta",{delta:f.delta.content,snapshot:_.message.content,parsed:_.message.parsed})),f.delta.refusal!=null&&((r=_.message)==null?void 0:r.role)==="assistant"&&(o=_.message)!=null&&o.refusal&&this._emit("refusal.delta",{delta:f.delta.refusal,snapshot:_.message.refusal}),((i=f.logprobs)==null?void 0:i.content)!=null&&((l=_.message)==null?void 0:l.role)==="assistant"&&this._emit("logprobs.content.delta",{content:(c=f.logprobs)==null?void 0:c.content,snapshot:((d=_.logprobs)==null?void 0:d.content)??[]}),((m=f.logprobs)==null?void 0:m.refusal)!=null&&((u=_.message)==null?void 0:u.role)==="assistant"&&this._emit("logprobs.refusal.delta",{refusal:(g=f.logprobs)==null?void 0:g.refusal,snapshot:((S=_.logprobs)==null?void 0:S.refusal)??[]});const A=a(this,N,"m",Ce).call(this,_);_.finish_reason&&(a(this,N,"m",ht).call(this,_),A.current_tool_call_index!=null&&a(this,N,"m",dt).call(this,_,A.current_tool_call_index));for(const k of f.delta.tool_calls??[])A.current_tool_call_index!==k.index&&(a(this,N,"m",ht).call(this,_),A.current_tool_call_index!=null&&a(this,N,"m",dt).call(this,_,A.current_tool_call_index)),A.current_tool_call_index=k.index;for(const k of f.delta.tool_calls??[]){const R=(p=_.message.tool_calls)==null?void 0:p[k.index];R!=null&&R.type&&((R==null?void 0:R.type)==="function"?this._emit("tool_calls.function.arguments.delta",{name:($=R.function)==null?void 0:$.name,index:k.index,arguments:R.function.arguments,parsed_arguments:R.function.parsed_arguments,arguments_delta:((b=k.function)==null?void 0:b.arguments)??""}):R==null||R.type)}}},dt=function(e,t){var n,r,o;if(a(this,N,"m",Ce).call(this,e).done_tool_calls.has(t))return;const i=(n=e.message.tool_calls)==null?void 0:n[t];if(!i)throw new Error("no tool call snapshot");if(!i.type)throw new Error("tool call snapshot missing `type`");if(i.type==="function"){const l=(o=(r=a(this,Y,"f"))==null?void 0:r.tools)==null?void 0:o.find(c=>c.type==="function"&&c.function.name===i.function.name);this._emit("tool_calls.function.arguments.done",{name:i.function.name,index:t,arguments:i.function.arguments,parsed_arguments:Oe(l)?l.$parseRaw(i.function.arguments):l!=null&&l.function.strict?JSON.parse(i.function.arguments):null})}else i.type},ht=function(e){var t,n;const r=a(this,N,"m",Ce).call(this,e);if(e.message.content&&!r.content_done){r.content_done=!0;const o=a(this,N,"m",pt).call(this);this._emit("content.done",{content:e.message.content,parsed:o?o.$parseRaw(e.message.content):null})}e.message.refusal&&!r.refusal_done&&(r.refusal_done=!0,this._emit("refusal.done",{refusal:e.message.refusal})),(t=e.logprobs)!=null&&t.content&&!r.logprobs_content_done&&(r.logprobs_content_done=!0,this._emit("logprobs.content.d
Line truncated
|
||||||
|
${Ne(s)}`);if(R==null)throw new w(`missing choices[${u}].tool_calls[${A}].type
|
||||||
|
${Ne(s)}`);if(I==null)throw new w(`missing choices[${u}].tool_calls[${A}].function.name
|
||||||
|
${Ne(s)}`);if(J==null)throw new w(`missing choices[${u}].tool_calls[${A}].function.arguments
|
||||||
|
${Ne(s)}`);return{...P,id:T,type:R,function:{...X,name:I,arguments:J}}})}}:{...S,message:{...E,content:p,role:f,refusal:d.refusal??null},finish_reason:m,index:u,logprobs:g}}),created:r,model:o,object:"chat.completion",...i?{system_fingerprint:i}:{}};return Tr(c,e)}function Ne(s){return JSON.stringify(s)}class Ge extends Ae{static fromReadableStream(e){const t=new Ge(null);return t._run(()=>t._fromReadableStream(e)),t}static runTools(e,t,n){const r=new Ge(t),o={...n,headers:{...n==null?void 0:n.headers,"X-Stainless-Helper-Method":"runTools"}};return r._run(()=>r._runTools(e,t,o)),r}}let Ct=class extends x{constructor(){super(...arguments),this.messages=new Fs(this._client)}create(s,e){return this._client.post("/chat/completions",{body:s,...e,stream:s.stream??!1})}retrieve(s,e){return this._client.get(h`/chat/completions/${s}`,e)}update(s,e,t){return this._client.post(h`/chat/completions/${s}`,{body:e,...t})}list(s={},e){return this._client.getAPIList("/chat/completions",C,{query:s,...e})}delete(s,e){return this._client.delete(h`/chat/completions/${s}`,e)}parse(s,e){return Mr(s.tools),this._client.chat.completions.create(s,{...e,headers:{...e==null?void 0:e.headers,"X-Stainless-Helper-Method":"chat.completions.parse"}})._thenUnwrap(t=>Et(t,s))}runTools(s,e){return s.stream?Ge.runTools(this._client,s,e):Pt.runTools(this._client,s,e)}stream(s,e){return Ae.createChatCompletion(this._client,s,e)}};Ct.Messages=Fs;class Tt extends x{constructor(){super(...arguments),this.completions=new Ct(this._client)}}Tt.Completions=Ct;const un=Symbol("brand.privateNullableHeaders"),as=Array.isArray;function*Hr(s){if(!s)return;if(un in s){const{values:n,nulls:r}=s;yield*n.entries();for(const o of r)yield[o,null];return}let e=!1,t;s instanceof Headers?t=s.entries():as(s)?t=s:(e=!0,t=Object.entries(s??{}));for(let n of t){const r=n[0];if(typeof r!="string")throw new TypeError("expected header name to be a string");const o=as(n[1])?n[1]:[n[1]];let i=!1;for(const l of o)l!==void 0&&(e&&!i&&(i=!0,yield[r,null]),yield[r,l])}}const y=s=>{const e=new Headers,t=new Set;for(const n of s){const r=new Set;for(const[o,i]of Hr(n)){const l=o.toLowerCase();r.has(l)||(e.delete(o),r.add(l)),i===null?(e.delete(o),t.add(l)):(e.append(o,i),t.delete(l))}}return{[un]:!0,values:e,nulls:t}};class dn extends x{create(e,t){return this._client.post("/audio/speech",{body:e,...t,headers:y([{Accept:"application/octet-stream"},t==null?void 0:t.headers]),__binaryResponse:!0})}}class hn extends x{create(e,t){return this._client.post("/audio/transcriptions",ie({body:e,...t,stream:e.stream??!1,__metadata:{model:e.model}},this._client))}}class pn extends x{create(e,t){return this._client.post("/audio/translations",ie({body:e,...t,__metadata:{model:e.model}},this._client))}}class Re extends x{constructor(){super(...arguments),this.transcriptions=new hn(this._client),this.translations=new pn(this._client),this.speech=new dn(this._client)}}Re.Transcriptions=hn;Re.Translations=pn;Re.Speech=dn;class fn extends x{create(e,t){return this._client.post("/batches",{body:e,...t})}retrieve(e,t){return this._client.get(h`/batches/${e}`,t)}list(e={},t){return this._client.getAPIList("/batches",C,{query:e,...t})}cancel(e,t){return this._client.post(h`/batches/${e}/cancel`,t)}}class mn extends x{create(e,t){return this._client.post("/assistants",{body:e,...t,headers:y([{"OpenAI-Beta":"assistants=v2"},t==null?void 0:t.headers])})}retrieve(e,t){return this._client.get(h`/assistants/${e}`,{...t,headers:y([{"OpenAI-Beta":"assistants=v2"},t==null?void 0:t.headers])})}update(e,t,n){return this._client.post(h`/assistants/${e}`,{body:t,...n,headers:y([{"OpenAI-Beta":"assistants=v2"},n==null?void 0:n.headers])})}list(e={},t){return this._client.getAPIList("/assistants",C,{query:e,...t,headers:y([{"OpenAI-Beta":"assistants=v2"},t==null?void 0:t.headers])})}delete(e,t){return this._client.delete(h`/assistants/${e}`,{...t,headers:y([{"OpenAI-Beta":"assistants=v2"},t==null?void 0:t.headers])})}}class gn extends x{create(e,t){return this._client.post("/realtime/sessions",{body:e,...t,headers:y([{"OpenAI-Beta":"assistants=v2"},t==null?void 0:t.headers])})}}class yn extends x{create(e,t){return this._client.post("/realtime/transcription_sessions",{body:e,...t,headers:y([{"OpenAI-Beta":"assistants=v2"},t==null?void 0:t.headers])})}}class st extends x{constructor(){super(...arguments),this.sessions=new gn(this._client),this.transcriptionSessions=new yn(this._client)}}st.Sessions=gn;st.TranscriptionSessions=yn;class wn extends x{create(e,t,n){return this._client.post(h`/threads/${e}/messages`,{body:t,...n,headers:y([{"OpenAI-Beta":"assistants=v2"},n==null?void 0:n.headers])})}retrieve(e,t,n){const{thread_id:r}=t;return this._client.get(h`/threads/${r}/messages/${e}`,{...n,headers:y([{"OpenAI-Beta":"assistants=v2"},n==null?void 0:n.headers])})}update(e,t,n){const{thread_id:r,...o}=t;return this._client.post(h`/threads/${r}/messages/${e}`,{body:o,...n,headers:y([{"OpenAI-Beta":"assistants=v2"},n==nul
Line truncated
|
||||||
|
|
||||||
|
This is disabled by default, as it risks exposing your secret API credentials to attackers.
|
||||||
|
If you understand the risks and have appropriate mitigations in place,
|
||||||
|
you can set the \`dangerouslyAllowBrowser\` option to \`true\`, e.g.,
|
||||||
|
|
||||||
|
new OpenAI({ apiKey, dangerouslyAllowBrowser: true });
|
||||||
|
|
||||||
|
https://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety
|
||||||
|
`);this.baseURL=i.baseURL,this.timeout=i.timeout??Jt.DEFAULT_TIMEOUT,this.logger=i.logger??console;const l="warn";this.logLevel=l,this.logLevel=zt(i.logLevel,"ClientOptions.logLevel",this)??zt(pe("OPENAI_LOG"),"process.env['OPENAI_LOG']",this)??l,this.fetchOptions=i.fetchOptions,this.maxRetries=i.maxRetries??2,this.fetch=i.fetch??nr(),v(this,Xe,or),this._options=i,this.apiKey=t,this.organization=n,this.project=r}withOptions(e){return new this.constructor({...this._options,baseURL:this.baseURL,maxRetries:this.maxRetries,timeout:this.timeout,logger:this.logger,logLevel:this.logLevel,fetchOptions:this.fetchOptions,apiKey:this.apiKey,organization:this.organization,project:this.project,...e})}defaultQuery(){return this._options.defaultQuery}validateHeaders({values:e,nulls:t}){}authHeaders(e){return y([{Authorization:`Bearer ${this.apiKey}`}])}stringifyQuery(e){return mr(e,{arrayFormat:"brackets"})}getUserAgent(){return`${this.constructor.name}/JS ${ce}`}defaultIdempotencyKey(){return`stainless-node-retry-${_s()}`}makeStatusError(e,t,n,r){return D.generate(e,t,n,r)}buildURL(e,t){const n=Hn(e)?new URL(e):new URL(this.baseURL+(this.baseURL.endsWith("/")&&e.startsWith("/")?e.slice(1):e)),r=this.defaultQuery();return Kn(r)||(t={...r,...t}),typeof t=="object"&&t&&!Array.isArray(t)&&(n.search=this.stringifyQuery(t)),n.toString()}async prepareOptions(e){}async prepareRequest(e,{url:t,options:n}){}get(e,t){return this.methodRequest("get",e,t)}post(e,t){return this.methodRequest("post",e,t)}patch(e,t){return this.methodRequest("patch",e,t)}put(e,t){return this.methodRequest("put",e,t)}delete(e,t){return this.methodRequest("delete",e,t)}methodRequest(e,t,n){return this.request(Promise.resolve(n).then(r=>({method:e,path:t,...r})))}request(e,t=null){return new et(this,this.makeRequest(e,t,void 0))}async makeRequest(e,t,n){var r,o;const i=await e,l=i.maxRetries??this.maxRetries;t==null&&(t=l),await this.prepareOptions(i);const{req:c,url:d,timeout:m}=this.buildRequest(i,{retryCount:l-t});await this.prepareRequest(c,{url:d,options:i});const u="log_"+(Math.random()*(1<<24)|0).toString(16).padStart(6,"0"),g=n===void 0?"":`, retryOf: ${n}`,S=Date.now();if(q(this).debug(`[${u}] sending request`,se({retryOfRequestLogID:n,method:i.method,url:d,options:i,headers:c.headers})),(r=i.signal)!=null&&r.aborted)throw new H;const p=new AbortController,$=await this.fetchWithTimeout(d,c,m,p).catch(mt),b=Date.now();if($ instanceof Error){const _=`retrying, ${t} attempts remaining`;if((o=i.signal)!=null&&o.aborted)throw new H;const A=ft($)||/timed? ?out/i.test(String($)+("cause"in $?String($.cause):""));if(t)return q(this).info(`[${u}] connection ${A?"timed out":"failed"} - ${_}`),q(this).debug(`[${u}] connection ${A?"timed out":"failed"} (${_})`,se({retryOfRequestLogID:n,url:d,durationMs:b-S,message:$.message})),this.retryRequest(i,t,n??u);throw q(this).info(`[${u}] connection ${A?"timed out":"failed"} - error; no more retries left`),q(this).debug(`[${u}] connection ${A?"timed out":"failed"} (error; no more retries left)`,se({retryOfRequestLogID:n,url:d,durationMs:b-S,message:$.message})),A?new It:new Ye({cause:$})}const E=[...$.headers.entries()].filter(([_])=>_==="x-request-id").map(([_,A])=>", "+_+": "+JSON.stringify(A)).join(""),f=`[${u}${g}${E}] ${c.method} ${d} ${$.ok?"succeeded":"failed"} with status ${$.status} in ${b-S}ms`;if(!$.ok){const _=this.shouldRetry($);if(t&&_){const P=`retrying, ${t} attempts remaining`;return await rr($.body),q(this).info(`${f} - ${P}`),q(this).debug(`[${u}] response error (${P})`,se({retryOfRequestLogID:n,url:$.url,status:$.status,headers:$.headers,durationMs:b-S})),this.retryRequest(i,t,n??u,$.headers)}const A=_?"error; no more retries left":"error; not retryable";q(this).info(`${f} - ${A}`);const k=await $.text().catch(P=>mt(P).message),R=Gn(k),T=R?void 0:k;throw q(this).debug(`[${u}] response error (${A})`,se({retryOfRequestLogID:n,url:$.url,status:$.status,headers:$.headers,message:T,durationMs:Date.now()-S})),this.makeStatusError($.status,R,T,$.headers)}return q(this).info(f),q(this).debug(`[${u}] response start`,se({retryOfRequestLogID:n,url:$.url,status:$.status,headers:$.headers,durationMs:b-S})),{response:$,options:i,controller:p,requestLogID:u,retryOfRequestLogID:n,startTime:S}}getAPIList(e,t,n){return this.requestAPIList(t,{method:"get",path:e,...n})}requestAPIList(e,t){const n=this.makeRequest(t,null,void 0);return new Sr(this,n,e)}async fetchWithTimeout(e,t,n,r){const{signal:o,method:i,...l}=t||{};o&&o.addEventListener("abort",()=>r.abort());const c=setTimeout(()=>r.abort(),n),d=globalThis.ReadableStream&&l.body instanceof globalThis.ReadableStream||typeof l.body=="object"&&l.body!==null&&Symbol.asyncIterator in l.body,m={signal:r.signal,...d?{duplex:"half"}:{},method:"GET",...l};i&&(m.method=i.toUpperCase());try{return await this.fetch.call(void 0,e,m)}finally{clearTimeout(c)}}shouldRetry(e){const t=e.headers.get("x-should-retry");return t==="true"?!0:t==="false"?!1:e.status===408||e.status===4
Line truncated
|
||||||
|
|
||||||
|
请遵循以下原则:
|
||||||
|
1. 提供准确、有用的技术信息
|
||||||
|
2. 保持友好、专业的语调
|
||||||
|
3. 如果不确定答案,请诚实地说明
|
||||||
|
4. 尽量给出具体的代码示例或步骤
|
||||||
|
5. 使用中文回答问题
|
||||||
|
|
||||||
|
你特别擅长回答关于:
|
||||||
|
- Vue.js 开发
|
||||||
|
- 组件库使用
|
||||||
|
- 文档编写和维护
|
||||||
|
- 前端开发最佳实践
|
||||||
|
- 技术概念解释`),e.currentPage?`${t}
|
||||||
|
|
||||||
|
当前用户正在查看页面:${e.currentPage}`:e.documentContent?`${t}
|
||||||
|
|
||||||
|
相关文档内容:
|
||||||
|
${e.documentContent.slice(0,1e3)}`:t}async testConnection(){try{return{success:!0,message:"连接测试成功",response:await this.sendMessage("你好,请回复一个简短的测试消息。",{})}}catch(e){return{success:!1,message:e.message}}}handleError(e){var t,n;return e.code==="invalid_api_key"?new Error("API密钥无效,请检查配置"):e.code==="insufficient_quota"?new Error("API配额不足,请检查账户余额"):e.code==="rate_limit_exceeded"?new Error("请求频率过高,请稍后重试"):e.code==="model_not_found"?new Error("指定的模型不存在,请检查模型配置"):(t=e.message)!=null&&t.includes("fetch")?new Error("网络连接失败,请检查网络和API端点"):(n=e.message)!=null&&n.includes("CORS")?new Error("跨域请求被阻止,请检查API配置"):new Error(`AI调用失败: ${e.message}`)}clearClients(){this.clients.clear()}}const qn=new to,no=(s,e)=>qn.sendMessage(s,e),ro=()=>qn.testConnection();export{qn as default,no as sendAIMessage,ro as testAIConnection};
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
.language-switcher[data-v-1ebf0c47]{position:relative;display:inline-block}.language-btn[data-v-1ebf0c47]{display:flex;align-items:center;gap:.375rem;padding:.5rem .75rem;background:none;border:none;color:var(--text-color-light);border-radius:6px;cursor:pointer;transition:all .2s ease;font-size:.875rem;height:40px;min-width:80px}.language-btn[data-v-1ebf0c47]:hover{color:var(--primary-color);background-color:var(--bg-color-hover)}.language-btn .current-flag[data-v-1ebf0c47]{font-size:1rem;line-height:1}.language-btn .current-name[data-v-1ebf0c47]{font-weight:500;white-space:nowrap}@media (max-width: 640px){.language-btn .current-name[data-v-1ebf0c47]{display:none}}.language-btn .dropdown-icon[data-v-1ebf0c47]{transition:transform .2s ease}.language-btn .dropdown-icon.rotate[data-v-1ebf0c47]{transform:rotate(180deg)}.language-dropdown[data-v-1ebf0c47]{position:absolute;top:calc(100% + .5rem);right:0;min-width:180px;background:var(--bg-color);border:1px solid var(--border-color);border-radius:8px;box-shadow:0 8px 32px #0000001f;z-index:1000;overflow:hidden}.dark .language-dropdown[data-v-1ebf0c47]{box-shadow:0 8px 32px #0000004d}.dropdown-header[data-v-1ebf0c47]{padding:.75rem;border-bottom:1px solid var(--border-color);font-size:.75rem;font-weight:600;color:var(--text-color-light);text-transform:uppercase;letter-spacing:.05em}.language-list[data-v-1ebf0c47]{list-style:none;margin:0;padding:.5rem 0}.language-item.active .language-option[data-v-1ebf0c47]{background-color:var(--primary-color);color:#fff}.language-item.active .language-option .locale-flag[data-v-1ebf0c47],.language-item.active .language-option .locale-name[data-v-1ebf0c47],.language-item.active .language-option .check-icon[data-v-1ebf0c47]{color:#fff}.language-option[data-v-1ebf0c47]{display:flex;align-items:center;gap:.75rem;width:100%;padding:.625rem 1rem;border:none;background:none;color:var(--text-color);cursor:pointer;transition:all .2s ease;text-align:left;font-size:.875rem}.language-option[data-v-1ebf0c47]:hover{background-color:var(--bg-color-hover);color:var(--primary-color)}.language-option[data-v-1ebf0c47]:has(.check-icon):hover{background-color:var(--primary-color);color:#fff}.language-option .locale-flag[data-v-1ebf0c47]{font-size:1rem;line-height:1}.language-option .locale-name[data-v-1ebf0c47]{flex:1;font-weight:500}.language-option .check-icon[data-v-1ebf0c47]{color:var(--primary-color);opacity:.8}.dropdown-enter-active[data-v-1ebf0c47],.dropdown-leave-active[data-v-1ebf0c47]{transition:all .2s ease;transform-origin:top}.dropdown-enter-from[data-v-1ebf0c47],.dropdown-leave-to[data-v-1ebf0c47]{opacity:0;transform:scaleY(.8) translateY(-8px)}.dropdown-enter-to[data-v-1ebf0c47],.dropdown-leave-from[data-v-1ebf0c47]{opacity:1;transform:scaleY(1) translateY(0)}@media (max-width: 640px){.language-dropdown[data-v-1ebf0c47]{right:-1rem;min-width:160px}.language-btn[data-v-1ebf0c47]{min-width:60px;padding:.5rem}}.theme-switcher[data-v-55b2f18a]{position:relative;display:inline-block}.theme-button[data-v-55b2f18a]{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;background:var(--bg-color-secondary);border:1px solid var(--border-color);border-radius:var(--border-radius);color:var(--text-color);cursor:pointer;transition:all .2s ease}.theme-button[data-v-55b2f18a]:hover,.theme-button.active[data-v-55b2f18a]{background:var(--bg-color-hover);border-color:var(--primary-color)}.theme-button .theme-label[data-v-55b2f18a]{font-size:.875rem;font-weight:500}.theme-button .rotated[data-v-55b2f18a]{transform:rotate(180deg)}.theme-dropdown[data-v-55b2f18a]{position:absolute;top:100%;right:0;margin-top:.5rem;min-width:280px;background:var(--bg-color);border:1px solid var(--border-color);border-radius:var(--border-radius-lg);box-shadow:var(--shadow-lg);z-index:1000;overflow:hidden;transition:all .2s ease;animation:slideIn-55b2f18a .15s ease-out}@keyframes slideIn-55b2f18a{0%{opacity:0;transform:translateY(-.5rem)}to{opacity:1;transform:translateY(0)}}.theme-options[data-v-55b2f18a]{padding:.5rem}.theme-option[data-v-55b2f18a]{display:flex;align-items:center;gap:.75rem;padding:.75rem;border-radius:var(--border-radius);cursor:pointer;transition:all .2s ease}.theme-option[data-v-55b2f18a]:hover,.theme-option.active[data-v-55b2f18a]{background:var(--bg-color-hover)}.theme-option.active .theme-name[data-v-55b2f18a]{color:var(--primary-color);font-weight:600}.theme-preview[data-v-55b2f18a]{display:flex;gap:.25rem;flex-shrink:0}.color-dot[data-v-55b2f18a]{width:12px;height:12px;border-radius:50%;border:1px solid var(--border-color)}.theme-info[data-v-55b2f18a]{flex:1;min-width:0}.theme-name[data-v-55b2f18a]{font-size:.875rem;font-weight:500;color:var(--text-color);margin-bottom:.125rem}.theme-desc[data-v-55b2f18a]{font-size:.75rem;color:var(--text-color-muted)}.check-icon[data-v-55b2f18a]{color:var(--primary-color);flex-shrink:0}.theme-modes[data-v-55b2f18a]{border-top:1px solid var(--border-color);padding:.5rem}.mode-button[data-v-55b2f18a]{displLine truncated
|
||||||
Vendored
+420
@@ -0,0 +1,420 @@
|
|||||||
|
(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const i of s)if(i.type==="childList")for(const o of i.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(s){const i={};return s.integrity&&(i.integrity=s.integrity),s.referrerPolicy&&(i.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?i.credentials="include":s.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(s){if(s.ep)return;s.ep=!0;const i=n(s);fetch(s.href,i)}})();/**
|
||||||
|
* @vue/shared v3.5.16
|
||||||
|
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||||
|
* @license MIT
|
||||||
|
**//*! #__NO_SIDE_EFFECTS__ */function pn(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const Ee={},Ns=[],kt=()=>{},mi=()=>!1,hs=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Qc=e=>e.startsWith("onUpdate:"),we=Object.assign,Jc=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Y_=Object.prototype.hasOwnProperty,Oe=(e,t)=>Y_.call(e,t),se=Array.isArray,Os=e=>ti(e)==="[object Map]",ps=e=>ti(e)==="[object Set]",Df=e=>ti(e)==="[object Date]",Z_=e=>ti(e)==="[object RegExp]",fe=e=>typeof e=="function",ge=e=>typeof e=="string",tn=e=>typeof e=="symbol",ze=e=>e!==null&&typeof e=="object",eu=e=>(ze(e)||fe(e))&&fe(e.then)&&fe(e.catch),Sd=Object.prototype.toString,ti=e=>Sd.call(e),X_=e=>ti(e).slice(8,-1),Rl=e=>ti(e)==="[object Object]",tu=e=>ge(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Or=pn(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Q_=pn("bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"),Pl=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},J_=/-(\w)/g,Ze=Pl(e=>e.replace(J_,(t,n)=>n?n.toUpperCase():"")),ey=/\B([A-Z])/g,Qt=Pl(e=>e.replace(ey,"-$1").toLowerCase()),ds=Pl(e=>e.charAt(0).toUpperCase()+e.slice(1)),Fs=Pl(e=>e?`on${ds(e)}`:""),Ut=(e,t)=>!Object.is(e,t),Rs=(e,...t)=>{for(let n=0;n<e.length;n++)e[n](...t)},xd=(e,t,n,r=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},Yo=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Zo=e=>{const t=ge(e)?Number(e):NaN;return isNaN(t)?e:t};let Nf;const Ml=()=>Nf||(Nf=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function ty(e,t){return e+JSON.stringify(t,(n,r)=>typeof r=="function"?r.toString():r)}const ny="Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol",ry=pn(ny);function Vn(e){if(se(e)){const t={};for(let n=0;n<e.length;n++){const r=e[n],s=ge(r)?Td(r):Vn(r);if(s)for(const i in s)t[i]=s[i]}return t}else if(ge(e)||ze(e))return e}const sy=/;(?![^(]*\))/g,iy=/:([^]+)/,oy=/\/\*[^]*?\*\//g;function Td(e){const t={};return e.replace(oy,"").split(sy).forEach(n=>{if(n){const r=n.split(iy);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function Se(e){let t="";if(ge(e))t=e;else if(se(e))for(let n=0;n<e.length;n++){const r=Se(e[n]);r&&(t+=r+" ")}else if(ze(e))for(const n in e)e[n]&&(t+=n+" ");return t.trim()}function ly(e){if(!e)return null;let{class:t,style:n}=e;return t&&!ge(t)&&(e.class=Se(t)),n&&(e.style=Vn(n)),e}const ay="html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot",cy="svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view",uy="annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics",fy="area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr",hy=pn(ay),py=pn(cy),dy=pn(uy),my=pn(fy),gy="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",_y=pn(gy);function Id(e){return!!e||e===""}function yy(e,t){if(e.length!==t.length)return!1;let n=!0;for(let r=0;n&&r<e.length;r++)n=$r(e[r],t[r]);return n}function $r(e,t){if(e===t)return!0;let n=Df(e),r=Df(t);if(n||r)return n&&r?e.getTime()===t.getTime():!1;if(n=tn(e),r=tn(t),n||r)return e===t;if(n=se(e),r=se(t),n||r)return n&&r?yy(e,t):!1;if(n=ze(e),r=ze(t),n||r){if(!n||!r)return!1;const s=Object.keys(e).length,i=Object.keys(t).length
Line truncated
|
||||||
|
* @vue/reactivity v3.5.16
|
||||||
|
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||||
|
* @license MIT
|
||||||
|
**/let It;class nu{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=It,!t&&It&&(this.index=(It.scopes||(It.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].pause();for(t=0,n=this.effects.length;t<n;t++)this.effects[t].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].resume();for(t=0,n=this.effects.length;t<n;t++)this.effects[t].resume()}}run(t){if(this._active){const n=It;try{return It=this,t()}finally{It=n}}}on(){++this._on===1&&(this.prevScope=It,It=this)}off(){this._on>0&&--this._on===0&&(It=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,r;for(n=0,r=this.effects.length;n<r;n++)this.effects[n].stop();for(this.effects.length=0,n=0,r=this.cleanups.length;n<r;n++)this.cleanups[n]();if(this.cleanups.length=0,this.scopes){for(n=0,r=this.scopes.length;n<r;n++)this.scopes[n].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!t){const s=this.parent.scopes.pop();s&&s!==this&&(this.parent.scopes[this.index]=s,s.index=this.index)}this.parent=void 0}}}function Nd(e){return new nu(e)}function Od(){return It}function by(e,t=!1){It&&It.cleanups.push(e)}let Ve;const wa=new WeakSet;class Li{constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,It&&It.active&&It.effects.push(this)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,wa.has(this)&&(wa.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||Rd(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,Of(this),Pd(this);const t=Ve,n=Ln;Ve=this,Ln=!0;try{return this.fn()}finally{Md(this),Ve=t,Ln=n,this.flags&=-3}}stop(){if(this.flags&1){for(let t=this.deps;t;t=t.nextDep)iu(t);this.deps=this.depsTail=void 0,Of(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?wa.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){ec(this)&&this.run()}get dirty(){return ec(this)}}let Fd=0,bi,ki;function Rd(e,t=!1){if(e.flags|=8,t){e.next=ki,ki=e;return}e.next=bi,bi=e}function ru(){Fd++}function su(){if(--Fd>0)return;if(ki){let t=ki;for(ki=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;bi;){let t=bi;for(bi=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(r){e||(e=r)}t=n}}if(e)throw e}function Pd(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Md(e){let t,n=e.depsTail,r=n;for(;r;){const s=r.prevDep;r.version===-1?(r===n&&(n=s),iu(r),ky(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=s}e.deps=t,e.depsTail=n}function ec(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&($d(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function $d(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Di)||(e.globalVersion=Di,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!ec(e))))return;e.flags|=2;const t=e.dep,n=Ve,r=Ln;Ve=e,Ln=!0;try{Pd(e);const s=e.fn(e._value);(t.version===0||Ut(s,e._value))&&(e.flags|=128,e._value=s,t.version++)}catch(s){throw t.version++,s}finally{Ve=n,Ln=r,Md(e),e.flags&=-3}}function iu(e,t=!1){const{dep:n,prevSub:r,nextSub:s}=e;if(r&&(r.nextSub=s,e.prevSub=void 0),s&&(s.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)iu(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function ky(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}function vy(e,t){e.effect instanceof Li&&(e=e.effect.fn);const n=new Li(e);t&&we(n,t);try{n.run()}catch(s){throw n.stop(),s}const r=n.run.bind(n);return r.effect=n,r}function Ey(e){e.effect.stop()}let Ln=!0;const Bd=[];function hr(){Bd.push(Ln),Ln=!1}function pr(){const e=Bd.pop();Ln=e===void 0?!0:e}function Of(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=Ve;Ve=void 0;try{t()}finally{Ve=n}}}let Di=0;class Cy{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Bl{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0}track(t){if(!Ve||!Ln||Ve===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==Ve)n=this.activeLink=new Cy(Ve,this),Ve.deps?(n.prevDep=Ve.depsTail,Ve.depsTail.nextDep=n,Ve.depsTail=n):Ve.deps=Ve.depsTail=n,zd(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const r=n.nextDep;r.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=r),n.prevDep=Ve.depsTail,n.nextDep=void 0,Ve.depsTail.nextDep=n,Ve.depsTail=n,Ve.deps==Line truncated
|
||||||
|
* @vue/runtime-core v3.5.16
|
||||||
|
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||||
|
* @license MIT
|
||||||
|
**/const em=[];function rb(e){em.push(e)}function sb(){em.pop()}function ib(e,t){}const ob={SETUP_FUNCTION:0,0:"SETUP_FUNCTION",RENDER_FUNCTION:1,1:"RENDER_FUNCTION",NATIVE_EVENT_HANDLER:5,5:"NATIVE_EVENT_HANDLER",COMPONENT_EVENT_HANDLER:6,6:"COMPONENT_EVENT_HANDLER",VNODE_HOOK:7,7:"VNODE_HOOK",DIRECTIVE_HOOK:8,8:"DIRECTIVE_HOOK",TRANSITION_HOOK:9,9:"TRANSITION_HOOK",APP_ERROR_HANDLER:10,10:"APP_ERROR_HANDLER",APP_WARN_HANDLER:11,11:"APP_WARN_HANDLER",FUNCTION_REF:12,12:"FUNCTION_REF",ASYNC_COMPONENT_LOADER:13,13:"ASYNC_COMPONENT_LOADER",SCHEDULER:14,14:"SCHEDULER",COMPONENT_UPDATE:15,15:"COMPONENT_UPDATE",APP_UNMOUNT_CLEANUP:16,16:"APP_UNMOUNT_CLEANUP"},lb={sp:"serverPrefetch hook",bc:"beforeCreate hook",c:"created hook",bm:"beforeMount hook",m:"mounted hook",bu:"beforeUpdate hook",u:"updated",bum:"beforeUnmount hook",um:"unmounted hook",a:"activated hook",da:"deactivated hook",ec:"errorCaptured hook",rtc:"renderTracked hook",rtg:"renderTriggered hook",0:"setup function",1:"render function",2:"watcher getter",3:"watcher callback",4:"watcher cleanup function",5:"native event handler",6:"component event handler",7:"vnode hook",8:"directive hook",9:"transition hook",10:"app errorHandler",11:"app warnHandler",12:"ref function",13:"async component loader",14:"scheduler flush",15:"component update",16:"app unmount cleanup function"};function ni(e,t,n,r){try{return r?e(...r):e()}catch(s){ms(s,t,n)}}function En(e,t,n,r){if(fe(e)){const s=ni(e,t,n,r);return s&&eu(s)&&s.catch(i=>{ms(i,t,n)}),s}if(se(e)){const s=[];for(let i=0;i<e.length;i++)s.push(En(e[i],t,n,r));return s}}function ms(e,t,n,r=!0){const s=t?t.vnode:null,{errorHandler:i,throwUnhandledErrorInProduction:o}=t&&t.appContext.config||Ee;if(t){let l=t.parent;const a=t.proxy,c=`https://vuejs.org/error-reference/#runtime-${n}`;for(;l;){const u=l.ec;if(u){for(let f=0;f<u.length;f++)if(u[f](e,a,c)===!1)return}l=l.parent}if(i){hr(),ni(i,null,10,[e,a,c]),pr();return}}ab(e,n,s,r,o)}function ab(e,t,n,r=!0,s=!1){if(s)throw e;console.error(e)}const jt=[];let Mn=-1;const Ps=[];let Ar=null,Cs=0;const tm=Promise.resolve();let el=null;function qn(e){const t=el||tm;return e?t.then(this?e.bind(this):e):t}function cb(e){let t=Mn+1,n=jt.length;for(;t<n;){const r=t+n>>>1,s=jt[r],i=Fi(s);i<e||i===e&&s.flags&2?t=r+1:n=r}return t}function cu(e){if(!(e.flags&1)){const t=Fi(e),n=jt[jt.length-1];!n||!(e.flags&2)&&t>=Fi(n)?jt.push(e):jt.splice(cb(t),0,e),e.flags|=1,nm()}}function nm(){el||(el=tm.then(rm))}function Oi(e){se(e)?Ps.push(...e):Ar&&e.id===-1?Ar.splice(Cs+1,0,e):e.flags&1||(Ps.push(e),e.flags|=1),nm()}function Rf(e,t,n=Mn+1){for(;n<jt.length;n++){const r=jt[n];if(r&&r.flags&2){if(e&&r.id!==e.uid)continue;jt.splice(n,1),n--,r.flags&4&&(r.flags&=-2),r(),r.flags&4||(r.flags&=-2)}}}function tl(e){if(Ps.length){const t=[...new Set(Ps)].sort((n,r)=>Fi(n)-Fi(r));if(Ps.length=0,Ar){Ar.push(...t);return}for(Ar=t,Cs=0;Cs<Ar.length;Cs++){const n=Ar[Cs];n.flags&4&&(n.flags&=-2),n.flags&8||n(),n.flags&=-2}Ar=null,Cs=0}}const Fi=e=>e.id==null?e.flags&2?-1:1/0:e.id;function rm(e){const t=kt;try{for(Mn=0;Mn<jt.length;Mn++){const n=jt[Mn];n&&!(n.flags&8)&&(n.flags&4&&(n.flags&=-2),ni(n,n.i,n.i?15:14),n.flags&4||(n.flags&=-2))}}finally{for(;Mn<jt.length;Mn++){const n=jt[Mn];n&&(n.flags&=-2)}Mn=-1,jt.length=0,tl(),el=null,(jt.length||Ps.length)&&rm()}}let ws,vo=[];function sm(e,t){var n,r;ws=e,ws?(ws.enabled=!0,vo.forEach(({event:s,args:i})=>ws.emit(s,...i)),vo=[]):typeof window<"u"&&window.HTMLElement&&!((r=(n=window.navigator)==null?void 0:n.userAgent)!=null&&r.includes("jsdom"))?((t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push(i=>{sm(i,t)}),setTimeout(()=>{ws||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,vo=[])},3e3)):vo=[]}let dt=null,Vl=null;function Ri(e){const t=dt;return dt=e,Vl=e&&e.type.__scopeId||null,t}function ub(e){Vl=e}function fb(){Vl=null}const hb=e=>Ot;function Ot(e,t=dt,n){if(!t||e._n)return e;const r=(...s)=>{r._d&&uc(-1);const i=Ri(t);let o;try{o=e(...s)}finally{Ri(i),r._d&&uc(1)}return o};return r._n=!0,r._c=!0,r._d=!0,r}function xn(e,t){if(dt===null)return e;const n=ao(dt),r=e.dirs||(e.dirs=[]);for(let s=0;s<t.length;s++){let[i,o,l,a=Ee]=t[s];i&&(fe(i)&&(i={mounted:i,updated:i}),i.deep&&sr(o),r.push({dir:i,instance:n,value:o,oldValue:void 0,arg:l,modifiers:a}))}return e}function $n(e,t,n,r){const s=e.dirs,i=t&&t.dirs;for(let o=0;o<s.length;o++){const l=s[o];i&&(l.oldValue=i[o].value);let a=l.dir[r];a&&(hr(),En(a,n,8,[e.el,l,e,t]),pr())}}const im=Symbol("_vte"),om=e=>e.__isTeleport,vi=e=>e&&(e.disabled||e.disabled===""),Pf=e=>e&&(e.defer||e.defer===""),Mf=e=>typeof SVGElement<"u"&&e instanceof SVGElement,$f=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,rc=(e,t)=>{const n=e&&e.to;return ge(n)?t?t(n):null:n},lm={name:"Teleport",__isTeleport:!0,process(e,t,n,r,s,i,o,l,a,c){const{mc:u,pc:f,pbc:p,o:{insert:h,querySelector:d,createText:_,createComment:C}}=c,S=vi(t.props);let{shapeFlag:b,children:g,dynamicChildren:m}=t;if(e==null){const y=t.
Line truncated
|
||||||
|
`&&(g.tagName==="PRE"||g.tagName==="TEXTAREA")&&(K=K.slice(1)),g.textContent!==K&&(Ao(g,0)||ys(),g.textContent=m.children)}if(O){if(ie||!L||H&48){const K=g.tagName.includes("-");for(const ue in O)(ie&&(ue.endsWith("value")||ue==="indeterminate")||hs(ue)&&!Or(ue)||ue[0]==="."||K)&&r(g,ue,null,O[ue],void 0,y)}else if(O.onClick)r(g,"onClick",null,O.onClick,void 0,y);else if(H&4&&Fr(O.style))for(const K in O.style)O.style[K]}let G;(G=O&&O.onVnodeBeforeMount)&&Zt(G,y,m),V&&$n(m,null,y,"beforeMount"),((G=O&&O.onVnodeMounted)||V||Z)&&Vm(()=>{G&&Zt(G,y,m),Z&&oe.enter(g),V&&$n(m,null,y,"mounted")},k)}return g.nextSibling},h=(g,m,y,k,T,L,A)=>{A=A||!!m.dynamicChildren;const O=m.children,H=O.length;for(let M=0;M<H;M++){const V=A?O[M]:O[M]=Xt(O[M]),oe=V.type===ur;g?(oe&&!A&&M+1<H&&Xt(O[M+1]).type===ur&&(a(s(g.data.slice(V.children.length)),y,i(g)),g.data=V.children),g=f(g,V,k,T,L,A)):oe&&!V.children?a(V.el=s(""),y):(Ao(y,1)||ys(),n(null,V,y,null,k,T,wo(y),L))}return g},d=(g,m,y,k,T,L)=>{const{slotScopeIds:A}=m;A&&(T=T?T.concat(A):A);const O=o(g),H=h(i(g),m,O,y,k,T,L);return H&&Ts(H)&&H.data==="]"?i(m.anchor=H):(ys(),a(m.anchor=c("]"),O,H),H)},_=(g,m,y,k,T,L)=>{if(Ao(g.parentElement,1)||ys(),m.el=null,L){const H=C(g);for(;;){const M=i(g);if(M&&M!==H)l(M);else break}}const A=i(g),O=o(g);return l(g),n(null,m,O,A,y,k,wo(O),T),y&&(y.vnode.el=m.el,Zl(y,m.el)),A},C=(g,m="[",y="]")=>{let k=0;for(;g;)if(g=i(g),g&&Ts(g)&&(g.data===m&&k++,g.data===y)){if(k===0)return i(g);k--}return g},S=(g,m,y)=>{const k=m.parentNode;k&&k.replaceChild(g,m);let T=y;for(;T;)T.vnode.el===m&&(T.vnode.el=T.subTree.el=g),T=T.parent},b=g=>g.nodeType===1&&g.tagName==="TEMPLATE";return[u,f]}const Uf="data-allow-mismatch",vb={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function Ao(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(Uf);)e=e.parentElement;const n=e&&e.getAttribute(Uf);if(n==null)return!1;if(n==="")return!0;{const r=n.split(",");return t===0&&r.includes("children")?!0:n.split(",").includes(vb[t])}}const Eb=Ml().requestIdleCallback||(e=>setTimeout(e,1)),Cb=Ml().cancelIdleCallback||(e=>clearTimeout(e)),wb=(e=1e4)=>t=>{const n=Eb(t,{timeout:e});return()=>Cb(n)};function Ab(e){const{top:t,left:n,bottom:r,right:s}=e.getBoundingClientRect(),{innerHeight:i,innerWidth:o}=window;return(t>0&&t<i||r>0&&r<i)&&(n>0&&n<o||s>0&&s<o)}const Sb=e=>(t,n)=>{const r=new IntersectionObserver(s=>{for(const i of s)if(i.isIntersecting){r.disconnect(),t();break}},e);return n(s=>{if(s instanceof Element){if(Ab(s))return t(),r.disconnect(),!1;r.observe(s)}}),()=>r.disconnect()},xb=e=>t=>{if(e){const n=matchMedia(e);if(n.matches)t();else return n.addEventListener("change",t,{once:!0}),()=>n.removeEventListener("change",t)}},Tb=(e=[])=>(t,n)=>{ge(e)&&(e=[e]);let r=!1;const s=o=>{r||(r=!0,i(),t(),o.target.dispatchEvent(new o.constructor(o.type,o)))},i=()=>{n(o=>{for(const l of e)o.removeEventListener(l,s)})};return n(o=>{for(const l of e)o.addEventListener(l,s,{once:!0})}),i};function Ib(e,t){if(Ts(e)&&e.data==="["){let n=1,r=e.nextSibling;for(;r;){if(r.nodeType===1){if(t(r)===!1)break}else if(Ts(r))if(r.data==="]"){if(--n===0)break}else r.data==="["&&n++;r=r.nextSibling}}else t(e)}const Rr=e=>!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function Lb(e){fe(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:s=200,hydrate:i,timeout:o,suspensible:l=!0,onError:a}=e;let c=null,u,f=0;const p=()=>(f++,c=null,h()),h=()=>{let d;return c||(d=c=t().catch(_=>{if(_=_ instanceof Error?_:new Error(String(_)),a)return new Promise((C,S)=>{a(_,()=>C(p()),()=>S(_),f+1)});throw _}).then(_=>d!==c&&c?c:(_&&(_.__esModule||_[Symbol.toStringTag]==="Module")&&(_=_.default),u=_,_)))};return Cn({name:"AsyncComponentWrapper",__asyncLoader:h,__asyncHydrate(d,_,C){const S=i?()=>{const g=i(()=>{C()},m=>Ib(d,m));g&&(_.bum||(_.bum=[])).push(g),(_.u||(_.u=[])).push(()=>!0)}:C;u?S():h().then(()=>!_.isUnmounted&&S())},get __asyncResolved(){return u},setup(){const d=ht;if(hu(d),u)return()=>Ta(u,d);const _=g=>{c=null,ms(g,d,13,!r)};if(l&&d.suspense||zs)return h().then(g=>()=>Ta(g,d)).catch(g=>(_(g),()=>r?X(r,{error:g}):null));const C=te(!1),S=te(),b=te(!!s);return s&&setTimeout(()=>{b.value=!1},s),o!=null&&setTimeout(()=>{if(!C.value&&!S.value){const g=new Error(`Async component timed out after ${o}ms.`);_(g),S.value=g}},o),h().then(()=>{C.value=!0,d.parent&&oo(d.parent.vnode)&&d.parent.update()}).catch(g=>{_(g),S.value=g}),()=>{if(C.value&&u)return Ta(u,d);if(S.value&&r)return X(r,{error:S.value});if(n&&!b.value)return X(n)}}})}function Ta(e,t){const{ref:n,props:r,children:s,ce:i}=t.vnode,o=X(e,r,s);return o.ref=n,o.ce=i,delete t.vnode.ce,o}const oo=e=>e.type.__isKeepAlive,Db={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=Pt(),r=n.ctx;if(!r.renderer)return()=>{const b=t.default&&t.default();return b&&b.length===1?b[0]:b};const s=new Map,i=new Set;let o=null;const l=n.suspe
Line truncated
|
||||||
|
* @vue/runtime-dom v3.5.16
|
||||||
|
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||||
|
* @license MIT
|
||||||
|
**/let gc;const Yf=typeof window<"u"&&window.trustedTypes;if(Yf)try{gc=Yf.createPolicy("vue",{createHTML:e=>e})}catch{}const sg=gc?e=>gc.createHTML(e):e=>e,Zk="http://www.w3.org/2000/svg",Xk="http://www.w3.org/1998/Math/MathML",nr=typeof document<"u"?document:null,Zf=nr&&nr.createElement("template"),Qk={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t==="svg"?nr.createElementNS(Zk,e):t==="mathml"?nr.createElementNS(Xk,e):n?nr.createElement(e,{is:n}):nr.createElement(e);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>nr.createTextNode(e),createComment:e=>nr.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>nr.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,i){const o=n?n.previousSibling:t.lastChild;if(s&&(s===i||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===i||!(s=s.nextSibling)););else{Zf.innerHTML=sg(r==="svg"?`<svg>${e}</svg>`:r==="mathml"?`<math>${e}</math>`:e);const l=Zf.content;if(r==="svg"||r==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},br="transition",ci="animation",Us=Symbol("_vtc"),ig={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},og=we({},fu,ig),Jk=e=>(e.displayName="Transition",e.props=og,e),Xl=Jk((e,{slots:t})=>Dt(fm,lg(e),t)),Gr=(e,t=[])=>{se(e)?e.forEach(n=>n(...t)):e&&e(...t)},Xf=e=>e?se(e)?e.some(t=>t.length>1):e.length>1:!1;function lg(e){const t={};for(const M in e)M in ig||(t[M]=e[M]);if(e.css===!1)return t;const{name:n="v",type:r,duration:s,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=i,appearActiveClass:c=o,appearToClass:u=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,d=ev(s),_=d&&d[0],C=d&&d[1],{onBeforeEnter:S,onEnter:b,onEnterCancelled:g,onLeave:m,onLeaveCancelled:y,onBeforeAppear:k=S,onAppear:T=b,onAppearCancelled:L=g}=t,A=(M,V,oe,ie)=>{M._enterCancelled=ie,Cr(M,V?u:l),Cr(M,V?c:o),oe&&oe()},O=(M,V)=>{M._isLeaving=!1,Cr(M,f),Cr(M,h),Cr(M,p),V&&V()},H=M=>(V,oe)=>{const ie=M?T:b,Z=()=>A(V,M,oe);Gr(ie,[V,Z]),Qf(()=>{Cr(V,M?a:i),Rn(V,M?u:l),Xf(ie)||Jf(V,r,_,Z)})};return we(t,{onBeforeEnter(M){Gr(S,[M]),Rn(M,i),Rn(M,o)},onBeforeAppear(M){Gr(k,[M]),Rn(M,a),Rn(M,c)},onEnter:H(!1),onAppear:H(!0),onLeave(M,V){M._isLeaving=!0;const oe=()=>O(M,V);Rn(M,f),M._enterCancelled?(Rn(M,p),_c()):(_c(),Rn(M,p)),Qf(()=>{M._isLeaving&&(Cr(M,f),Rn(M,h),Xf(m)||Jf(M,r,C,oe))}),Gr(m,[M,oe])},onEnterCancelled(M){A(M,!1,void 0,!0),Gr(g,[M])},onAppearCancelled(M){A(M,!0,void 0,!0),Gr(L,[M])},onLeaveCancelled(M){O(M),Gr(y,[M])}})}function ev(e){if(e==null)return null;if(ze(e))return[Na(e.enter),Na(e.leave)];{const t=Na(e);return[t,t]}}function Na(e){return Zo(e)}function Rn(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Us]||(e[Us]=new Set)).add(t)}function Cr(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Us];n&&(n.delete(t),n.size||(e[Us]=void 0))}function Qf(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let tv=0;function Jf(e,t,n,r){const s=e._endId=++tv,i=()=>{s===e._endId&&r()};if(n!=null)return setTimeout(i,n);const{type:o,timeout:l,propCount:a}=ag(e,t);if(!o)return r();const c=o+"end";let u=0;const f=()=>{e.removeEventListener(c,p),i()},p=h=>{h.target===e&&++u>=a&&f()};setTimeout(()=>{u<a&&f()},l+1),e.addEventListener(c,p)}function ag(e,t){const n=window.getComputedStyle(e),r=d=>(n[d]||"").split(", "),s=r(`${br}Delay`),i=r(`${br}Duration`),o=eh(s,i),l=r(`${ci}Delay`),a=r(`${ci}Duration`),c=eh(l,a);let u=null,f=0,p=0;t===br?o>0&&(u=br,f=o,p=i.length):t===ci?c>0&&(u=ci,f=c,p=a.length):(f=Math.max(o,c),u=f>0?o>c?br:ci:null,p=u?u===br?i.length:a.length:0);const h=u===br&&/\b(transform|all)(,|$)/.test(r(`${br}Property`).toString());return{type:u,timeout:f,propCount:p,hasTransform:h}}function eh(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((n,r)=>th(n)+th(e[r])))}function th(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function _c(){return document.body.offsetHeight}function nv(e,t,n){const r=e[Us];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const al=Symbol("_vod"),cg=Symbol("_vsh"),wi={beforeMount(e,{value:t},{transition:n}){e[al]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):ui(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter
Line truncated
|
||||||
|
* @vue/compiler-core v3.5.16
|
||||||
|
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||||
|
* @license MIT
|
||||||
|
**/const zi=Symbol(""),Si=Symbol(""),wu=Symbol(""),fl=Symbol(""),Sg=Symbol(""),us=Symbol(""),xg=Symbol(""),Tg=Symbol(""),Au=Symbol(""),Su=Symbol(""),co=Symbol(""),xu=Symbol(""),Ig=Symbol(""),Tu=Symbol(""),Iu=Symbol(""),Lu=Symbol(""),Du=Symbol(""),Nu=Symbol(""),Ou=Symbol(""),Lg=Symbol(""),Dg=Symbol(""),ta=Symbol(""),hl=Symbol(""),Fu=Symbol(""),Ru=Symbol(""),Ui=Symbol(""),uo=Symbol(""),Pu=Symbol(""),bc=Symbol(""),Pv=Symbol(""),kc=Symbol(""),pl=Symbol(""),Mv=Symbol(""),$v=Symbol(""),Mu=Symbol(""),Bv=Symbol(""),zv=Symbol(""),$u=Symbol(""),Ng=Symbol(""),js={[zi]:"Fragment",[Si]:"Teleport",[wu]:"Suspense",[fl]:"KeepAlive",[Sg]:"BaseTransition",[us]:"openBlock",[xg]:"createBlock",[Tg]:"createElementBlock",[Au]:"createVNode",[Su]:"createElementVNode",[co]:"createCommentVNode",[xu]:"createTextVNode",[Ig]:"createStaticVNode",[Tu]:"resolveComponent",[Iu]:"resolveDynamicComponent",[Lu]:"resolveDirective",[Du]:"resolveFilter",[Nu]:"withDirectives",[Ou]:"renderList",[Lg]:"renderSlot",[Dg]:"createSlots",[ta]:"toDisplayString",[hl]:"mergeProps",[Fu]:"normalizeClass",[Ru]:"normalizeStyle",[Ui]:"normalizeProps",[uo]:"guardReactiveProps",[Pu]:"toHandlers",[bc]:"camelize",[Pv]:"capitalize",[kc]:"toHandlerKey",[pl]:"setBlockTracking",[Mv]:"pushScopeId",[$v]:"popScopeId",[Mu]:"withCtx",[Bv]:"unref",[zv]:"isRef",[$u]:"withMemo",[Ng]:"isMemoSame"};function Uv(e){Object.getOwnPropertySymbols(e).forEach(t=>{js[t]=e[t]})}const dn={start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0},source:""};function Hv(e,t=""){return{type:0,source:t,children:e,helpers:new Set,components:[],directives:[],hoists:[],imports:[],cached:[],temps:0,codegenNode:void 0,loc:dn}}function Hi(e,t,n,r,s,i,o,l=!1,a=!1,c=!1,u=dn){return e&&(l?(e.helper(us),e.helper(Ws(e.inSSR,c))):e.helper(qs(e.inSSR,c)),o&&e.helper(Nu)),{type:13,tag:t,props:n,children:r,patchFlag:s,dynamicProps:i,directives:o,isBlock:l,disableTracking:a,isComponent:c,loc:u}}function is(e,t=dn){return{type:17,loc:t,elements:e}}function kn(e,t=dn){return{type:15,loc:t,properties:e}}function et(e,t){return{type:16,loc:dn,key:ge(e)?_e(e,!0):e,value:t}}function _e(e,t=!1,n=dn,r=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:r}}function Dn(e,t=dn){return{type:8,loc:t,children:e}}function ft(e,t=[],n=dn){return{type:14,loc:n,callee:e,arguments:t}}function Vs(e,t=void 0,n=!1,r=!1,s=dn){return{type:18,params:e,returns:t,newline:n,isSlot:r,loc:s}}function vc(e,t,n,r=!0){return{type:19,test:e,consequent:t,alternate:n,newline:r,loc:dn}}function jv(e,t,n=!1,r=!1){return{type:20,index:e,value:t,needPauseTracking:n,inVOnce:r,needArraySpread:!1,loc:dn}}function Vv(e){return{type:21,body:e,loc:dn}}function qs(e,t){return e||t?Au:Su}function Ws(e,t){return e||t?xg:Tg}function Bu(e,{helper:t,removeHelper:n,inSSR:r}){e.isBlock||(e.isBlock=!0,n(qs(r,e.isComponent)),t(us),t(Ws(r,e.isComponent)))}const _h=new Uint8Array([123,123]),yh=new Uint8Array([125,125]);function bh(e){return e>=97&&e<=122||e>=65&&e<=90}function ln(e){return e===32||e===10||e===9||e===12||e===13}function kr(e){return e===47||e===62||ln(e)}function dl(e){const t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n);return t}const Tt={Cdata:new Uint8Array([67,68,65,84,65,91]),CdataEnd:new Uint8Array([93,93,62]),CommentEnd:new Uint8Array([45,45,62]),ScriptEnd:new Uint8Array([60,47,115,99,114,105,112,116]),StyleEnd:new Uint8Array([60,47,115,116,121,108,101]),TitleEnd:new Uint8Array([60,47,116,105,116,108,101]),TextareaEnd:new Uint8Array([60,47,116,101,120,116,97,114,101,97])};class qv{constructor(t,n){this.stack=t,this.cbs=n,this.state=1,this.buffer="",this.sectionStart=0,this.index=0,this.entityStart=0,this.baseState=1,this.inRCDATA=!1,this.inXML=!1,this.inVPre=!1,this.newlines=[],this.mode=0,this.delimiterOpen=_h,this.delimiterClose=yh,this.delimiterIndex=-1,this.currentSequence=void 0,this.sequenceIndex=0}get inSFCRoot(){return this.mode===2&&this.stack.length===0}reset(){this.state=1,this.mode=0,this.buffer="",this.sectionStart=0,this.index=0,this.baseState=1,this.inRCDATA=!1,this.currentSequence=void 0,this.newlines.length=0,this.delimiterOpen=_h,this.delimiterClose=yh}getPos(t){let n=1,r=t+1;for(let s=this.newlines.length-1;s>=0;s--){const i=this.newlines[s];if(t>i){n=s+2,r=t-i;break}}return{column:r,line:n,offset:t}}peek(){return this.buffer.charCodeAt(this.index+1)}stateText(t){t===60?(this.index>this.sectionStart&&this.cbs.ontext(this.sectionStart,this.index),this.state=5,this.sectionStart=this.index):!this.inVPre&&t===this.delimiterOpen[0]&&(this.state=2,this.delimiterIndex=0,this.stateInterpolationOpen(t))}stateInterpolationOpen(t){if(t===this.delimiterOpen[this.delimiterIndex])if(this.delimiterIndex===this.delimiterOpen.length-1){const n=this.index+1-this.delimiterOpen.length;n>this.sectionStart&&this.cbs.ontext(this.sectionStart,n),this.state=3,this.sectionStart=n}else this.delimiterIndex++;else this.inRCDATA?(this.state=32,this.stateInRCDATA(t)):(this.state=1,this.stateText(t))}stateInterpolatioLine truncated
|
||||||
|
`);else if(h2(i.content)){const o=e[s-1]&&e[s-1].type,l=e[s+1]&&e[s+1].type;!o||!l||n&&(o===3&&(l===3||l===1)||o===1&&(l===3||l===1&&p2(i.content)))?(r=!0,e[s]=null):i.content=" "}else n&&(i.content=Ug(i.content))}return r?e.filter(Boolean):e}function h2(e){for(let t=0;t<e.length;t++)if(!ln(e.charCodeAt(t)))return!1;return!0}function p2(e){for(let t=0;t<e.length;t++){const n=e.charCodeAt(t);if(n===10||n===13)return!0}return!1}function Ug(e){let t="",n=!1;for(let r=0;r<e.length;r++)ln(e.charCodeAt(r))?n||(t+=" ",n=!0):(t+=e[r],n=!1);return t}function Cc(e){(Xe[0]||qi).children.push(e)}function nt(e,t){return{start:Je.getPos(e),end:t==null?t:Je.getPos(t),source:t==null?t:Et(e,t)}}function d2(e){return nt(e.start.offset,e.end.offset)}function es(e,t){e.end=Je.getPos(t),e.source=Et(e.start.offset,t)}function m2(e){const t={type:6,name:e.rawName,nameLoc:nt(e.loc.start.offset,e.loc.start.offset+e.rawName.length),value:void 0,loc:e.loc};if(e.exp){const n=e.exp.loc;n.end.offset<e.loc.end.offset&&(n.start.offset--,n.start.column--,n.end.offset++,n.end.column++),t.value={type:2,content:e.exp.content,loc:n}}return t}function Ho(e,t=!1,n,r=0,s=0){return _e(e,t,n,r)}function Zn(e,t,n){Fe.onError(Qe(e,nt(t,t)))}function g2(){Je.reset(),Lt=null,Te=null,Gt="",er=-1,Xr=-1,Xe.length=0}function _2(e,t){if(g2(),fr=e,Fe=we({},$g),t){let s;for(s in t)t[s]!=null&&(Fe[s]=t[s])}Je.mode=Fe.parseMode==="html"?1:Fe.parseMode==="sfc"?2:0,Je.inXML=Fe.ns===1||Fe.ns===2;const n=t&&t.delimiters;n&&(Je.delimiterOpen=dl(n[0]),Je.delimiterClose=dl(n[1]));const r=qi=Hv([],e);return Je.parse(fr),r.loc=nt(0,e.length),r.children=zg(r.children),qi=null,r}function y2(e,t){jo(e,void 0,t,Hg(e,e.children[0]))}function Hg(e,t){const{children:n}=e;return n.length===1&&t.type===1&&!gl(t)}function jo(e,t,n,r=!1,s=!1){const{children:i}=e,o=[];for(let f=0;f<i.length;f++){const p=i[f];if(p.type===1&&p.tagType===0){const h=r?0:cn(p,n);if(h>0){if(h>=2){p.codegenNode.patchFlag=-1,o.push(p);continue}}else{const d=p.codegenNode;if(d.type===13){const _=d.patchFlag;if((_===void 0||_===512||_===1)&&Vg(p,n)>=2){const C=qg(p);C&&(d.props=n.hoist(C))}d.dynamicProps&&(d.dynamicProps=n.hoist(d.dynamicProps))}}}else if(p.type===12&&(r?0:cn(p,n))>=2){o.push(p);continue}if(p.type===1){const h=p.tagType===1;h&&n.scopes.vSlot++,jo(p,e,n,!1,s),h&&n.scopes.vSlot--}else if(p.type===11)jo(p,e,n,p.children.length===1,!0);else if(p.type===9)for(let h=0;h<p.branches.length;h++)jo(p.branches[h],e,n,p.branches[h].children.length===1,s)}let l=!1;const a=[];if(o.length===i.length&&e.type===1){if(e.tagType===0&&e.codegenNode&&e.codegenNode.type===13&&se(e.codegenNode.children))e.codegenNode.children=c(is(e.codegenNode.children)),l=!0;else if(e.tagType===1&&e.codegenNode&&e.codegenNode.type===13&&e.codegenNode.children&&!se(e.codegenNode.children)&&e.codegenNode.children.type===15){const f=u(e.codegenNode,"default");f&&(a.push(n.cached.length),f.returns=c(is(f.returns)),l=!0)}else if(e.tagType===3&&t&&t.type===1&&t.tagType===1&&t.codegenNode&&t.codegenNode.type===13&&t.codegenNode.children&&!se(t.codegenNode.children)&&t.codegenNode.children.type===15){const f=bn(e,"slot",!0),p=f&&f.arg&&u(t.codegenNode,f.arg);p&&(a.push(n.cached.length),p.returns=c(is(p.returns)),l=!0)}}if(!l)for(const f of o)a.push(n.cached.length),f.codegenNode=n.cache(f.codegenNode);a.length&&e.type===1&&e.tagType===1&&e.codegenNode&&e.codegenNode.type===13&&e.codegenNode.children&&!se(e.codegenNode.children)&&e.codegenNode.children.type===15&&e.codegenNode.children.properties.push(et("__",_e(JSON.stringify(a),!1)));function c(f){const p=n.cache(f);return s&&n.hmr&&(p.needArraySpread=!0),p}function u(f,p){if(f.children&&!se(f.children)&&f.children.type===15){const h=f.children.properties.find(d=>d.key===p||d.key.content===p);return h&&h.value}}o.length&&n.transformHoist&&n.transformHoist(i,n,e)}function cn(e,t){const{constantCache:n}=t;switch(e.type){case 1:if(e.tagType!==0)return 0;const r=n.get(e);if(r!==void 0)return r;const s=e.codegenNode;if(s.type!==13||s.isBlock&&e.tag!=="svg"&&e.tag!=="foreignObject"&&e.tag!=="math")return 0;if(s.patchFlag===void 0){let o=3;const l=Vg(e,t);if(l===0)return n.set(e,0),0;l<o&&(o=l);for(let a=0;a<e.children.length;a++){const c=cn(e.children[a],t);if(c===0)return n.set(e,0),0;c<o&&(o=c)}if(o>1)for(let a=0;a<e.props.length;a++){const c=e.props[a];if(c.type===7&&c.name==="bind"&&c.exp){const u=cn(c.exp,t);if(u===0)return n.set(e,0),0;u<o&&(o=u)}}if(s.isBlock){for(let a=0;a<e.props.length;a++)if(e.props[a].type===7)return n.set(e,0),0;t.removeHelper(us),t.removeHelper(Ws(t.inSSR,s.isComponent)),s.isBlock=!1,t.helper(qs(t.inSSR,s.isComponent))}return n.set(e,o),o}else return n.set(e,0),0;case 2:case 3:return 3;case 9:case 11:case 10:return 0;case 5:case 12:return cn(e.content,t);case 4:return e.constType;case 8:let i=3;for(let o=0;o<e.children.length;o++){const l=e.children[o];if(ge(l)||tn(l))continue;const a=cn(l,t);if(a===0)return 0;a<i&&(i=a)}return i;case 20:return 2;default:retur
Line truncated
|
||||||
|
`+" ".repeat(_),0)}return h}function A2(e,t={}){const n=w2(e,t);t.onContextCreated&&t.onContextCreated(n);const{mode:r,push:s,prefixIdentifiers:i,indent:o,deindent:l,newline:a,scopeId:c,ssr:u}=n,f=Array.from(e.helpers),p=f.length>0,h=!i&&r!=="module";S2(e,n);const _=u?"ssrRender":"render",S=(u?["_ctx","_push","_parent","_attrs"]:["_ctx","_cache"]).join(", ");if(s(`function ${_}(${S}) {`),o(),h&&(s("with (_ctx) {"),o(),p&&(s(`const { ${f.map(Kg).join(", ")} } = _Vue
|
||||||
|
`,-1),a())),e.components.length&&(Pa(e.components,"component",n),(e.directives.length||e.temps>0)&&a()),e.directives.length&&(Pa(e.directives,"directive",n),e.temps>0&&a()),e.filters&&e.filters.length&&(a(),Pa(e.filters,"filter",n),a()),e.temps>0){s("let ");for(let b=0;b<e.temps;b++)s(`${b>0?", ":""}_temp${b}`)}return(e.components.length||e.directives.length||e.temps)&&(s(`
|
||||||
|
`,0),a()),u||s("return "),e.codegenNode?Rt(e.codegenNode,n):s("null"),h&&(l(),s("}")),l(),s("}"),{ast:e,code:n.code,preamble:"",map:n.map?n.map.toJSON():void 0}}function S2(e,t){const{ssr:n,prefixIdentifiers:r,push:s,newline:i,runtimeModuleName:o,runtimeGlobalName:l,ssrRuntimeModuleName:a}=t,c=l,u=Array.from(e.helpers);if(u.length>0&&(s(`const _Vue = ${c}
|
||||||
|
`,-1),e.hoists.length)){const f=[Au,Su,co,xu,Ig].filter(p=>u.includes(p)).map(Kg).join(", ");s(`const { ${f} } = _Vue
|
||||||
|
`,-1)}x2(e.hoists,t),i(),s("return ")}function Pa(e,t,{helper:n,push:r,newline:s,isTS:i}){const o=n(t==="filter"?Du:t==="component"?Tu:Lu);for(let l=0;l<e.length;l++){let a=e[l];const c=a.endsWith("__self");c&&(a=a.slice(0,-6)),r(`const ${Vi(a,t)} = ${o}(${JSON.stringify(a)}${c?", true":""})${i?"!":""}`),l<e.length-1&&s()}}function x2(e,t){if(!e.length)return;t.pure=!0;const{push:n,newline:r}=t;r();for(let s=0;s<e.length;s++){const i=e[s];i&&(n(`const _hoisted_${s+1} = `),Rt(i,t),r())}t.pure=!1}function ju(e,t){const n=e.length>3||!1;t.push("["),n&&t.indent(),fo(e,t,n),n&&t.deindent(),t.push("]")}function fo(e,t,n=!1,r=!0){const{push:s,newline:i}=t;for(let o=0;o<e.length;o++){const l=e[o];ge(l)?s(l,-3):se(l)?ju(l,t):Rt(l,t),o<e.length-1&&(n?(r&&s(","),i()):r&&s(", "))}}function Rt(e,t){if(ge(e)){t.push(e,-3);return}if(tn(e)){t.push(t.helper(e));return}switch(e.type){case 1:case 9:case 11:Rt(e.codegenNode,t);break;case 2:T2(e,t);break;case 4:Gg(e,t);break;case 5:I2(e,t);break;case 12:Rt(e.codegenNode,t);break;case 8:Yg(e,t);break;case 3:D2(e,t);break;case 13:N2(e,t);break;case 14:F2(e,t);break;case 15:R2(e,t);break;case 17:P2(e,t);break;case 18:M2(e,t);break;case 19:$2(e,t);break;case 20:B2(e,t);break;case 21:fo(e.body,t,!0,!1);break}}function T2(e,t){t.push(JSON.stringify(e.content),-3,e)}function Gg(e,t){const{content:n,isStatic:r}=e;t.push(r?JSON.stringify(n):n,-3,e)}function I2(e,t){const{push:n,helper:r,pure:s}=t;s&&n(sa),n(`${r(ta)}(`),Rt(e.content,t),n(")")}function Yg(e,t){for(let n=0;n<e.children.length;n++){const r=e.children[n];ge(r)?t.push(r,-3):Rt(r,t)}}function L2(e,t){const{push:n}=t;if(e.type===8)n("["),Yg(e,t),n("]");else if(e.isStatic){const r=Uu(e.content)?e.content:JSON.stringify(e.content);n(r,-2,e)}else n(`[${e.content}]`,-3,e)}function D2(e,t){const{push:n,helper:r,pure:s}=t;s&&n(sa),n(`${r(co)}(${JSON.stringify(e.content)})`,-3,e)}function N2(e,t){const{push:n,helper:r,pure:s}=t,{tag:i,props:o,children:l,patchFlag:a,dynamicProps:c,directives:u,isBlock:f,disableTracking:p,isComponent:h}=e;let d;a&&(d=String(a)),u&&n(r(Nu)+"("),f&&n(`(${r(us)}(${p?"true":""}), `),s&&n(sa);const _=f?Ws(t.inSSR,h):qs(t.inSSR,h);n(r(_)+"(",-2,e),fo(O2([i,o,l,d,c]),t),n(")"),f&&n(")"),u&&(n(", "),Rt(u,t),n(")"))}function O2(e){let t=e.length;for(;t--&&e[t]==null;);return e.slice(0,t+1).map(n=>n||"null")}function F2(e,t){const{push:n,helper:r,pure:s}=t,i=ge(e.callee)?e.callee:r(e.callee);s&&n(sa),n(i+"(",-2,e),fo(e.arguments,t),n(")")}function R2(e,t){const{push:n,indent:r,deindent:s,newline:i}=t,{properties:o}=e;if(!o.length){n("{}",-2,e);return}const l=o.length>1||!1;n(l?"{":"{ "),l&&r();for(let a=0;a<o.length;a++){const{key:c,value:u}=o[a];L2(c,t),n(": "),Rt(u,t),a<o.length-1&&(n(","),i())}l&&s(),n(l?"}":" }")}function P2(e,t){ju(e.elements,t)}function M2(e,t){const{push:n,indent:r,deindent:s}=t,{params:i,returns:o,body:l,newline:a,isSlot:c}=e;c&&n(`_${js[Mu]}(`),n("(",-2,e),se(i)?fo(i,t):i&&Rt(i,t),n(") => "),(a||l)&&(n("{"),r()),o?(a&&n("return "),se(o)?ju(o,t):Rt(o,t)):l&&Rt(l,t),(a||l)&&(s(),n("}")),c&&(e.isNonScopedSlot&&n(", undefined, true"),n(")"))}function $2(e,t){const{test:n,consequent:r,alternate:s,newline:i}=e,{push:o,indent:l,deindent:a,newline:c}=t;if(n.type===4){const f=!Uu(n.content);f&&o("("),Gg(n,t),f&&o(")")}else o("("),Rt(n,t),o(")");i&&l(),t.indentLevel++,i||o(" "),o("? "),Rt(r,t),t.indentLevel--,i&&c(),i||o(" "),o(": ");const u=s.type===19;u||t.indentLevel++,Rt(s,t),u||t.indentLevel--,i&&a(!0)}function B2(e,t){const{push:n,helper:r,indent:s,deindent:i,newline:o}=t,{needPauseTracking:l,needArraySpread:a}=e;a&&n("[...("),n(`_cache[${e.index}] || (`),l&&(s(),n(`${r(pl)}(-1`),e.inVOnce&&n(", true"),n("),"),o(),n("(")),n(`_cache[${e.index}] = `),Rt(e.value,t),l&&(n(`).cacheIndex = ${e.index},`),o(),n(`${r(pl)}(1),`),o(),n(`_cache[${e.index}]`),i()),n(")"),a&&n(")]")}new RegExp("\\b"+"arguments,await,break,case,catch,class,const,continue,debugger,default,delete,do,else,export,extends,finally,for,function,if,import,let,new,return,super,switch,throw,try,var,void,while,with,yield".split(",").join("\\b|\\b")+"\\b");const z2=Wg(/^(if|else|else-if)$/,(e,t,n)=>U2(e,t,n,(r,s,i)=>{const o=n.parent.children;let l=o.indexOf(r),a=0;for(;l-->=0;){const c=o[l];c&&c.type===9&&(a+=c.branches.length)}return()=>{if(i)r.codegenNode=Sh(s,a,n);else{const c=H2(r.codegenNode);c.alternate=Sh(s,a+r.branches.length-1,n)}}}));function U2(e,t,n,r){if(t.name!=="else"&&(!t.exp||!t.exp.content.trim())){const s=t.exp?t.exp.loc:e.loc;n.onError(Qe(28,t.loc)),t.exp=_e("true",!1,s)}if(t.name==="if"){const s=Ah(e,t),i={type:9,loc:d2(e.loc),branches:[s]};if(n.replaceNode(i),r)return r(i,s,!0)}else{const s=n.parent.children;let i=s.indexOf(e);for(;i-->=-1;){const o=s[i];if(o&&o.type===3){n.removeNode(o);continue}if(o&&o.type===2&&!o.content.trim().length){n.removeNode(o);continue}if(o&&o.type===9){t.name==="else-if"&&o.branches[o.branches.length-1].condition===void 0&&n.onError(Qe(30,e.loc)),n.removeNode();const l=Ah(e,t);o.b
Line truncated
|
||||||
|
* @vue/compiler-dom v3.5.16
|
||||||
|
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||||
|
* @license MIT
|
||||||
|
**/const r0=Symbol(""),s0=Symbol(""),i0=Symbol(""),o0=Symbol(""),Sc=Symbol(""),l0=Symbol(""),a0=Symbol(""),c0=Symbol(""),u0=Symbol(""),f0=Symbol("");Uv({[r0]:"vModelRadio",[s0]:"vModelCheckbox",[i0]:"vModelText",[o0]:"vModelSelect",[Sc]:"vModelDynamic",[l0]:"withModifiers",[a0]:"withKeys",[c0]:"vShow",[u0]:"Transition",[f0]:"TransitionGroup"});let bs;function hE(e,t=!1){return bs||(bs=document.createElement("div")),t?(bs.innerHTML=`<div foo="${e.replace(/"/g,""")}">`,bs.children[0].getAttribute("foo")):(bs.innerHTML=e,bs.textContent)}const pE={parseMode:"html",isVoidTag:my,isNativeTag:e=>hy(e)||py(e)||dy(e),isPreTag:e=>e==="pre",isIgnoreNewlineTag:e=>e==="pre"||e==="textarea",decodeEntities:hE,isBuiltInComponent:e=>{if(e==="Transition"||e==="transition")return u0;if(e==="TransitionGroup"||e==="transition-group")return f0},getNamespace(e,t,n){let r=t?t.ns:n;if(t&&r===2)if(t.tag==="annotation-xml"){if(e==="svg")return 1;t.props.some(s=>s.type===6&&s.name==="encoding"&&s.value!=null&&(s.value.content==="text/html"||s.value.content==="application/xhtml+xml"))&&(r=0)}else/^m(?:[ions]|text)$/.test(t.tag)&&e!=="mglyph"&&e!=="malignmark"&&(r=0);else t&&r===1&&(t.tag==="foreignObject"||t.tag==="desc"||t.tag==="title")&&(r=0);if(r===0){if(e==="svg")return 1;if(e==="math")return 2}return r}},dE=e=>{e.type===1&&e.props.forEach((t,n)=>{t.type===6&&t.name==="style"&&t.value&&(e.props[n]={type:7,name:"bind",arg:_e("style",!0,t.loc),exp:mE(t.value.content,t.loc),modifiers:[],loc:t.loc})})},mE=(e,t)=>{const n=Td(e);return _e(JSON.stringify(n),!1,t,3)};function Pr(e,t){return Qe(e,t)}const gE=(e,t,n)=>{const{exp:r,loc:s}=e;return r||n.onError(Pr(53,s)),t.children.length&&(n.onError(Pr(54,s)),t.children.length=0),{props:[et(_e("innerHTML",!0,s),r||_e("",!0))]}},_E=(e,t,n)=>{const{exp:r,loc:s}=e;return r||n.onError(Pr(55,s)),t.children.length&&(n.onError(Pr(56,s)),t.children.length=0),{props:[et(_e("textContent",!0),r?cn(r,n)>0?r:ft(n.helperString(ta),[r],s):_e("",!0))]}},yE=(e,t,n)=>{const r=n0(e,t,n);if(!r.props.length||t.tagType===1)return r;e.arg&&n.onError(Pr(58,e.arg.loc));const{tag:s}=t,i=n.isCustomElement(s);if(s==="input"||s==="textarea"||s==="select"||i){let o=i0,l=!1;if(s==="input"||i){const a=na(t,"type");if(a){if(a.type===7)o=Sc;else if(a.value)switch(a.value.content){case"radio":o=r0;break;case"checkbox":o=s0;break;case"file":l=!0,n.onError(Pr(59,e.loc));break}}else e2(t)&&(o=Sc)}else s==="select"&&(o=o0);l||(r.needRuntime=n.helper(o))}else n.onError(Pr(57,e.loc));return r.props=r.props.filter(o=>!(o.key.type===4&&o.key.content==="modelValue")),r},bE=pn("passive,once,capture"),kE=pn("stop,prevent,self,ctrl,shift,alt,meta,exact,middle"),vE=pn("left,right"),h0=pn("onkeyup,onkeydown,onkeypress"),EE=(e,t,n,r)=>{const s=[],i=[],o=[];for(let l=0;l<t.length;l++){const a=t[l].content;a==="native"&&ji("COMPILER_V_ON_NATIVE",n)||bE(a)?o.push(a):vE(a)?Jt(e)?h0(e.content.toLowerCase())?s.push(a):i.push(a):(s.push(a),i.push(a)):kE(a)?i.push(a):s.push(a)}return{keyModifiers:s,nonKeyModifiers:i,eventOptionModifiers:o}},Fh=(e,t)=>Jt(e)&&e.content.toLowerCase()==="onclick"?_e(t,!0):e.type!==4?Dn(["(",e,`) === "onClick" ? "${t}" : (`,e,")"]):e,CE=(e,t,n)=>t0(e,t,n,r=>{const{modifiers:s}=e;if(!s.length)return r;let{key:i,value:o}=r.props[0];const{keyModifiers:l,nonKeyModifiers:a,eventOptionModifiers:c}=EE(i,s,n,e.loc);if(a.includes("right")&&(i=Fh(i,"onContextmenu")),a.includes("middle")&&(i=Fh(i,"onMouseup")),a.length&&(o=ft(n.helper(l0),[o,JSON.stringify(a)])),l.length&&(!Jt(i)||h0(i.content.toLowerCase()))&&(o=ft(n.helper(a0),[o,JSON.stringify(l)])),c.length){const u=c.map(ds).join("");i=Jt(i)?_e(`${i.content}${u}`,!0):Dn(["(",i,`) + "${u}"`])}return{props:[et(i,o)]}}),wE=(e,t,n)=>{const{exp:r,loc:s}=e;return r||n.onError(Pr(61,s)),{props:[],needRuntime:n.helper(c0)}},AE=(e,t)=>{e.type===1&&e.tagType===0&&(e.tag==="script"||e.tag==="style")&&t.removeNode()},SE=[dE],xE={cloak:fE,html:gE,text:_E,model:yE,on:CE,show:wE};function TE(e,t={}){return uE(e,we({},pE,t,{nodeTransforms:[AE,...SE,...t.nodeTransforms||[]],directiveTransforms:we({},xE,t.directiveTransforms||{}),transformHoist:null}))}/**
|
||||||
|
* vue v3.5.16
|
||||||
|
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||||
|
* @license MIT
|
||||||
|
**/const Rh=Object.create(null);function IE(e,t){if(!ge(e))if(e.nodeType)e=e.innerHTML;else return kt;const n=ty(e,t),r=Rh[n];if(r)return r;if(e[0]==="#"){const l=document.querySelector(e);e=l?l.innerHTML:""}const s=we({hoistStatic:!0,onError:void 0,onWarn:kt},t);!s.isCustomElement&&typeof customElements<"u"&&(s.isCustomElement=l=>!!customElements.get(l));const{code:i}=TE(e,s),o=new Function("Vue",i)(Rv);return o._rc=!0,Rh[n]=o}Jm(IE);/*!
|
||||||
|
* vue-router v4.5.1
|
||||||
|
* (c) 2025 Eduardo San Martin Morote
|
||||||
|
* @license MIT
|
||||||
|
*/const As=typeof document<"u";function p0(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function LE(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&p0(e.default)}const Re=Object.assign;function Ma(e,t){const n={};for(const r in t){const s=t[r];n[r]=Nn(s)?s.map(e):e(s)}return n}const xi=()=>{},Nn=Array.isArray,d0=/#/g,DE=/&/g,NE=/\//g,OE=/=/g,FE=/\?/g,m0=/\+/g,RE=/%5B/g,PE=/%5D/g,g0=/%5E/g,ME=/%60/g,_0=/%7B/g,$E=/%7C/g,y0=/%7D/g,BE=/%20/g;function Vu(e){return encodeURI(""+e).replace($E,"|").replace(RE,"[").replace(PE,"]")}function zE(e){return Vu(e).replace(_0,"{").replace(y0,"}").replace(g0,"^")}function xc(e){return Vu(e).replace(m0,"%2B").replace(BE,"+").replace(d0,"%23").replace(DE,"%26").replace(ME,"`").replace(_0,"{").replace(y0,"}").replace(g0,"^")}function UE(e){return xc(e).replace(OE,"%3D")}function HE(e){return Vu(e).replace(d0,"%23").replace(FE,"%3F")}function jE(e){return e==null?"":HE(e).replace(NE,"%2F")}function Wi(e){try{return decodeURIComponent(""+e)}catch{}return""+e}const VE=/\/$/,qE=e=>e.replace(VE,"");function $a(e,t,n="/"){let r,s={},i="",o="";const l=t.indexOf("#");let a=t.indexOf("?");return l<a&&l>=0&&(a=-1),a>-1&&(r=t.slice(0,a),i=t.slice(a+1,l>-1?l:t.length),s=e(i)),l>-1&&(r=r||t.slice(0,l),o=t.slice(l,t.length)),r=YE(r??t,n),{fullPath:r+(i&&"?")+i+o,path:r,query:s,hash:Wi(o)}}function WE(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function Ph(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function KE(e,t,n){const r=t.matched.length-1,s=n.matched.length-1;return r>-1&&r===s&&Ks(t.matched[r],n.matched[s])&&b0(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Ks(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function b0(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!GE(e[n],t[n]))return!1;return!0}function GE(e,t){return Nn(e)?Mh(e,t):Nn(t)?Mh(t,e):e===t}function Mh(e,t){return Nn(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function YE(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),r=e.split("/"),s=r[r.length-1];(s===".."||s===".")&&r.push("");let i=n.length-1,o,l;for(o=0;o<r.length;o++)if(l=r[o],l!==".")if(l==="..")i>1&&i--;else break;return n.slice(0,i).join("/")+"/"+r.slice(o).join("/")}const vr={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};var Ki;(function(e){e.pop="pop",e.push="push"})(Ki||(Ki={}));var Ti;(function(e){e.back="back",e.forward="forward",e.unknown=""})(Ti||(Ti={}));function ZE(e){if(!e)if(As){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),qE(e)}const XE=/^[^#]+#/;function QE(e,t){return e.replace(XE,"#")+t}function JE(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}const ia=()=>({left:window.scrollX,top:window.scrollY});function eC(e){let t;if("el"in e){const n=e.el,r=typeof n=="string"&&n.startsWith("#"),s=typeof n=="string"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!s)return;t=JE(s,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function $h(e,t){return(history.state?history.state.position-t:-1)+e}const Tc=new Map;function tC(e,t){Tc.set(e,t)}function nC(e){const t=Tc.get(e);return Tc.delete(e),t}let rC=()=>location.protocol+"//"+location.host;function k0(e,t){const{pathname:n,search:r,hash:s}=t,i=e.indexOf("#");if(i>-1){let l=s.includes(e.slice(i))?e.slice(i).length:1,a=s.slice(l);return a[0]!=="/"&&(a="/"+a),Ph(a,"")}return Ph(n,e)+r+s}function sC(e,t,n,r){let s=[],i=[],o=null;const l=({state:p})=>{const h=k0(e,location),d=n.value,_=t.value;let C=0;if(p){if(n.value=h,t.value=p,o&&o===d){o=null;return}C=_?p.position-_.position:0}else r(h);s.forEach(S=>{S(n.value,d,{delta:C,type:Ki.pop,direction:C?C>0?Ti.forward:Ti.back:Ti.unknown})})};function a(){o=n.value}function c(p){s.push(p);const h=()=>{const d=s.indexOf(p);d>-1&&s.splice(d,1)};return i.push(h),h}function u(){const{history:p}=window;p.state&&p.replaceState(Re({},p.state,{scroll:ia()}),"")}function f(){for(const p of i)p();i=[],window.removeEventListener("popstate",l),window.removeEventListener("beforeunload",u)}return window.addEventListener("popstate",l),window.addEventListener("beforeunload",u,{passive:!0}),{pauseListeners:a,listen:c,destroy:f}}function Bh(e,t,n,r=!1,s=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:s?ia():null}}function iC(e){const{history:t,location:n}=window,r={value:k0(e,n)},s={value:t.state};s.value||i(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scLine truncated
|
||||||
|
* shared v9.14.4
|
||||||
|
* (c) 2025 kazuya kawaguchi
|
||||||
|
* Released under the MIT License.
|
||||||
|
*/const bl=typeof window<"u",Vr=(e,t=!1)=>t?Symbol.for(e):Symbol(e),MC=(e,t,n)=>$C({l:e,k:t,s:n}),$C=e=>JSON.stringify(e).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029").replace(/\u0027/g,"\\u0027"),st=e=>typeof e=="number"&&isFinite(e),BC=e=>x0(e)==="[object Date]",Ur=e=>x0(e)==="[object RegExp]",aa=e=>me(e)&&Object.keys(e).length===0,St=Object.assign,zC=Object.create,Ue=(e=null)=>zC(e);let ep;const or=()=>ep||(ep=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:Ue());function tp(e){return e.replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}const UC=Object.prototype.hasOwnProperty;function Tn(e,t){return UC.call(e,t)}const Ye=Array.isArray,Ke=e=>typeof e=="function",re=e=>typeof e=="string",ve=e=>typeof e=="boolean",Ne=e=>e!==null&&typeof e=="object",HC=e=>Ne(e)&&Ke(e.then)&&Ke(e.catch),S0=Object.prototype.toString,x0=e=>S0.call(e),me=e=>{if(!Ne(e))return!1;const t=Object.getPrototypeOf(e);return t===null||t.constructor===Object},jC=e=>e==null?"":Ye(e)||me(e)&&e.toString===S0?JSON.stringify(e,null,2):String(e);function VC(e,t=""){return e.reduce((n,r,s)=>s===0?n+r:n+t+r,"")}function ca(e){let t=e;return()=>++t}function qC(e,t){typeof console<"u"&&(console.warn("[intlify] "+e),t&&console.warn(t.stack))}const Do=e=>!Ne(e)||Ye(e);function qo(e,t){if(Do(e)||Do(t))throw new Error("Invalid value");const n=[{src:e,des:t}];for(;n.length;){const{src:r,des:s}=n.pop();Object.keys(r).forEach(i=>{i!=="__proto__"&&(Ne(r[i])&&!Ne(s[i])&&(s[i]=Array.isArray(r[i])?[]:Ue()),Do(s[i])||Do(r[i])?s[i]=r[i]:n.push({src:r[i],des:s[i]}))})}}/*!
|
||||||
|
* message-compiler v9.14.4
|
||||||
|
* (c) 2025 kazuya kawaguchi
|
||||||
|
* Released under the MIT License.
|
||||||
|
*/function WC(e,t,n){return{line:e,column:t,offset:n}}function kl(e,t,n){return{start:e,end:t}}const KC=/\{([0-9a-zA-Z]+)\}/g;function T0(e,...t){return t.length===1&&GC(t[0])&&(t=t[0]),(!t||!t.hasOwnProperty)&&(t={}),e.replace(KC,(n,r)=>t.hasOwnProperty(r)?t[r]:"")}const I0=Object.assign,np=e=>typeof e=="string",GC=e=>e!==null&&typeof e=="object";function L0(e,t=""){return e.reduce((n,r,s)=>s===0?n+r:n+t+r,"")}const Wu={USE_MODULO_SYNTAX:1,__EXTEND_POINT__:2},YC={[Wu.USE_MODULO_SYNTAX]:"Use modulo before '{{0}}'."};function ZC(e,t,...n){const r=T0(YC[e],...n||[]),s={message:String(r),code:e};return t&&(s.location=t),s}const he={EXPECTED_TOKEN:1,INVALID_TOKEN_IN_PLACEHOLDER:2,UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER:3,UNKNOWN_ESCAPE_SEQUENCE:4,INVALID_UNICODE_ESCAPE_SEQUENCE:5,UNBALANCED_CLOSING_BRACE:6,UNTERMINATED_CLOSING_BRACE:7,EMPTY_PLACEHOLDER:8,NOT_ALLOW_NEST_PLACEHOLDER:9,INVALID_LINKED_FORMAT:10,MUST_HAVE_MESSAGES_IN_PLURAL:11,UNEXPECTED_EMPTY_LINKED_MODIFIER:12,UNEXPECTED_EMPTY_LINKED_KEY:13,UNEXPECTED_LEXICAL_ANALYSIS:14,UNHANDLED_CODEGEN_NODE_TYPE:15,UNHANDLED_MINIFIER_NODE_TYPE:16,__EXTEND_POINT__:17},XC={[he.EXPECTED_TOKEN]:"Expected token: '{0}'",[he.INVALID_TOKEN_IN_PLACEHOLDER]:"Invalid token in placeholder: '{0}'",[he.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER]:"Unterminated single quote in placeholder",[he.UNKNOWN_ESCAPE_SEQUENCE]:"Unknown escape sequence: \\{0}",[he.INVALID_UNICODE_ESCAPE_SEQUENCE]:"Invalid unicode escape sequence: {0}",[he.UNBALANCED_CLOSING_BRACE]:"Unbalanced closing brace",[he.UNTERMINATED_CLOSING_BRACE]:"Unterminated closing brace",[he.EMPTY_PLACEHOLDER]:"Empty placeholder",[he.NOT_ALLOW_NEST_PLACEHOLDER]:"Not allowed nest placeholder",[he.INVALID_LINKED_FORMAT]:"Invalid linked format",[he.MUST_HAVE_MESSAGES_IN_PLURAL]:"Plural must have messages",[he.UNEXPECTED_EMPTY_LINKED_MODIFIER]:"Unexpected empty linked modifier",[he.UNEXPECTED_EMPTY_LINKED_KEY]:"Unexpected empty linked key",[he.UNEXPECTED_LEXICAL_ANALYSIS]:"Unexpected lexical analysis in token: '{0}'",[he.UNHANDLED_CODEGEN_NODE_TYPE]:"unhandled codegen node type: '{0}'",[he.UNHANDLED_MINIFIER_NODE_TYPE]:"unhandled mimifier node type: '{0}'"};function si(e,t,n={}){const{domain:r,messages:s,args:i}=n,o=T0((s||XC)[e]||"",...i||[]),l=new SyntaxError(String(o));return l.code=e,t&&(l.location=t),l.domain=r,l}function QC(e){throw e}const Qn=" ",JC="\r",Yt=`
|
||||||
|
`,ew="\u2028",tw="\u2029";function nw(e){const t=e;let n=0,r=1,s=1,i=0;const o=T=>t[T]===JC&&t[T+1]===Yt,l=T=>t[T]===Yt,a=T=>t[T]===tw,c=T=>t[T]===ew,u=T=>o(T)||l(T)||a(T)||c(T),f=()=>n,p=()=>r,h=()=>s,d=()=>i,_=T=>o(T)||a(T)||c(T)?Yt:t[T],C=()=>_(n),S=()=>_(n+i);function b(){return i=0,u(n)&&(r++,s=0),o(n)&&n++,n++,s++,t[n]}function g(){return o(n+i)&&i++,i++,t[n+i]}function m(){n=0,r=1,s=1,i=0}function y(T=0){i=T}function k(){const T=n+i;for(;T!==n;)b();i=0}return{index:f,line:p,column:h,peekOffset:d,charAt:_,currentChar:C,currentPeek:S,next:b,peek:g,reset:m,resetPeek:y,skipToPeek:k}}const Er=void 0,rp="'",rw="tokenizer";function sw(e,t={}){const n=t.location!==!1,r=nw(e),s=()=>r.index(),i=()=>WC(r.line(),r.column(),r.index()),o=i(),l=s(),a={currentType:14,offset:l,startLoc:o,endLoc:o,lastType:14,lastOffset:l,lastStartLoc:o,lastEndLoc:o,braceNest:0,inLinked:!1,text:""},c=()=>a,{onError:u}=t;function f(E,w,N,...z){const D=c();if(w.column+=N,w.offset+=N,u){const $=n?kl(D.startLoc,w):null,ee=si(E,$,{domain:rw,args:z});u(ee)}}function p(E,w,N){E.endLoc=i(),E.currentType=w;const z={type:w};return n&&(z.loc=kl(E.startLoc,E.endLoc)),N!=null&&(z.value=N),z}const h=E=>p(E,14);function d(E,w){return E.currentChar()===w?(E.next(),w):(f(he.EXPECTED_TOKEN,i(),0,w),"")}function _(E){let w="";for(;E.currentPeek()===Qn||E.currentPeek()===Yt;)w+=E.currentPeek(),E.peek();return w}function C(E){const w=_(E);return E.skipToPeek(),w}function S(E){if(E===Er)return!1;const w=E.charCodeAt(0);return w>=97&&w<=122||w>=65&&w<=90||w===95}function b(E){if(E===Er)return!1;const w=E.charCodeAt(0);return w>=48&&w<=57}function g(E,w){const{currentType:N}=w;if(N!==2)return!1;_(E);const z=S(E.currentPeek());return E.resetPeek(),z}function m(E,w){const{currentType:N}=w;if(N!==2)return!1;_(E);const z=E.currentPeek()==="-"?E.peek():E.currentPeek(),D=b(z);return E.resetPeek(),D}function y(E,w){const{currentType:N}=w;if(N!==2)return!1;_(E);const z=E.currentPeek()===rp;return E.resetPeek(),z}function k(E,w){const{currentType:N}=w;if(N!==8)return!1;_(E);const z=E.currentPeek()===".";return E.resetPeek(),z}function T(E,w){const{currentType:N}=w;if(N!==9)return!1;_(E);const z=S(E.currentPeek());return E.resetPeek(),z}function L(E,w){const{currentType:N}=w;if(!(N===8||N===12))return!1;_(E);const z=E.currentPeek()===":";return E.resetPeek(),z}function A(E,w){const{currentType:N}=w;if(N!==10)return!1;const z=()=>{const $=E.currentPeek();return $==="{"?S(E.peek()):$==="@"||$==="%"||$==="|"||$===":"||$==="."||$===Qn||!$?!1:$===Yt?(E.peek(),z()):M(E,!1)},D=z();return E.resetPeek(),D}function O(E){_(E);const w=E.currentPeek()==="|";return E.resetPeek(),w}function H(E){const w=_(E),N=E.currentPeek()==="%"&&E.peek()==="{";return E.resetPeek(),{isModulo:N,hasSpace:w.length>0}}function M(E,w=!0){const N=(D=!1,$="",ee=!1)=>{const ae=E.currentPeek();return ae==="{"?$==="%"?!1:D:ae==="@"||!ae?$==="%"?!0:D:ae==="%"?(E.peek(),N(D,"%",!0)):ae==="|"?$==="%"||ee?!0:!($===Qn||$===Yt):ae===Qn?(E.peek(),N(!0,Qn,ee)):ae===Yt?(E.peek(),N(!0,Yt,ee)):!0},z=N();return w&&E.resetPeek(),z}function V(E,w){const N=E.currentChar();return N===Er?Er:w(N)?(E.next(),N):null}function oe(E){const w=E.charCodeAt(0);return w>=97&&w<=122||w>=65&&w<=90||w>=48&&w<=57||w===95||w===36}function ie(E){return V(E,oe)}function Z(E){const w=E.charCodeAt(0);return w>=97&&w<=122||w>=65&&w<=90||w>=48&&w<=57||w===95||w===36||w===45}function G(E){return V(E,Z)}function K(E){const w=E.charCodeAt(0);return w>=48&&w<=57}function ue(E){return V(E,K)}function ye(E){const w=E.charCodeAt(0);return w>=48&&w<=57||w>=65&&w<=70||w>=97&&w<=102}function ke(E){return V(E,ye)}function He(E){let w="",N="";for(;w=ue(E);)N+=w;return N}function Wt(E){C(E);const w=E.currentChar();return w!=="%"&&f(he.EXPECTED_TOKEN,i(),0,w),E.next(),"%"}function Bt(E){let w="";for(;;){const N=E.currentChar();if(N==="{"||N==="}"||N==="@"||N==="|"||!N)break;if(N==="%")if(M(E))w+=N,E.next();else break;else if(N===Qn||N===Yt)if(M(E))w+=N,E.next();else{if(O(E))break;w+=N,E.next()}else w+=N,E.next()}return w}function gn(E){C(E);let w="",N="";for(;w=G(E);)N+=w;return E.currentChar()===Er&&f(he.UNTERMINATED_CLOSING_BRACE,i(),0),N}function it(E){C(E);let w="";return E.currentChar()==="-"?(E.next(),w+=`-${He(E)}`):w+=He(E),E.currentChar()===Er&&f(he.UNTERMINATED_CLOSING_BRACE,i(),0),w}function j(E){return E!==rp&&E!==Yt}function ne(E){C(E),d(E,"'");let w="",N="";for(;w=V(E,j);)w==="\\"?N+=J(E):N+=w;const z=E.currentChar();return z===Yt||z===Er?(f(he.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER,i(),0),z===Yt&&(E.next(),d(E,"'")),N):(d(E,"'"),N)}function J(E){const w=E.currentChar();switch(w){case"\\":case"'":return E.next(),`\\${w}`;case"u":return le(E,w,4);case"U":return le(E,w,6);default:return f(he.UNKNOWN_ESCAPE_SEQUENCE,i(),0,w),""}}function le(E,w,N){d(E,w);let z="";for(let D=0;D<N;D++){const $=ke(E);if(!$){f(he.INVALID_UNICODE_ESCAPE_SEQUENCE,i(),0,`\\${w}${z}${E.currentChar()}`);break}z+=$}return`\\${w}${z}`}function be(E){return E!=="{"&&E!=="
Line truncated
|
||||||
|
`,i=t.needIndent?t.needIndent:n!=="arrow",o=e.helpers||[],l=dw(e,{filename:r,breakLineCode:s,needIndent:i});l.push(n==="normal"?"function __msg__ (ctx) {":"(ctx) => {"),l.indent(i),o.length>0&&(l.push(`const { ${L0(o.map(u=>`${u}: _${u}`),", ")} } = ctx`),l.newline()),l.push("return "),Ys(l,e),l.deindent(i),l.push("}"),delete e.helpers;const{code:a,map:c}=l.context();return{ast:e,code:a,map:c?c.toJSON():void 0}};function kw(e,t={}){const n=I0({},t),r=!!n.jit,s=!!n.minify,i=n.optimize==null?!0:n.optimize,o=aw(n).parse(e);return r?(i&&fw(o),s&&Ss(o),{ast:o,code:""}):(uw(o,n),bw(o,n))}/*!
|
||||||
|
* core-base v9.14.4
|
||||||
|
* (c) 2025 kazuya kawaguchi
|
||||||
|
* Released under the MIT License.
|
||||||
|
*/function vw(){typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(or().__INTLIFY_PROD_DEVTOOLS__=!1),typeof __INTLIFY_JIT_COMPILATION__!="boolean"&&(or().__INTLIFY_JIT_COMPILATION__=!1),typeof __INTLIFY_DROP_MESSAGE_COMPILER__!="boolean"&&(or().__INTLIFY_DROP_MESSAGE_COMPILER__=!1)}function Hn(e){return Ne(e)&&Gu(e)===0&&(Tn(e,"b")||Tn(e,"body"))}const D0=["b","body"];function Ew(e){return qr(e,D0)}const N0=["c","cases"];function Cw(e){return qr(e,N0,[])}const O0=["s","static"];function ww(e){return qr(e,O0)}const F0=["i","items"];function Aw(e){return qr(e,F0,[])}const R0=["t","type"];function Gu(e){return qr(e,R0)}const P0=["v","value"];function No(e,t){const n=qr(e,P0);if(n!=null)return n;throw Gi(t)}const M0=["m","modifier"];function Sw(e){return qr(e,M0)}const $0=["k","key"];function xw(e){const t=qr(e,$0);if(t)return t;throw Gi(6)}function qr(e,t,n){for(let r=0;r<t.length;r++){const s=t[r];if(Tn(e,s)&&e[s]!=null)return e[s]}return n}const B0=[...D0,...N0,...O0,...F0,...$0,...M0,...P0,...R0];function Gi(e){return new Error(`unhandled node type: ${e}`)}const Wr=[];Wr[0]={w:[0],i:[3,0],"[":[4],o:[7]};Wr[1]={w:[1],".":[2],"[":[4],o:[7]};Wr[2]={w:[2],i:[3,0],0:[3,0]};Wr[3]={i:[3,0],0:[3,0],w:[1,1],".":[2,1],"[":[4,1],o:[7,1]};Wr[4]={"'":[5,0],'"':[6,0],"[":[4,2],"]":[1,3],o:8,l:[4,0]};Wr[5]={"'":[4,0],o:8,l:[5,0]};Wr[6]={'"':[4,0],o:8,l:[6,0]};const Tw=/^\s?(?:true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/;function Iw(e){return Tw.test(e)}function Lw(e){const t=e.charCodeAt(0),n=e.charCodeAt(e.length-1);return t===n&&(t===34||t===39)?e.slice(1,-1):e}function Dw(e){if(e==null)return"o";switch(e.charCodeAt(0)){case 91:case 93:case 46:case 34:case 39:return e;case 95:case 36:case 45:return"i";case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"w"}return"i"}function Nw(e){const t=e.trim();return e.charAt(0)==="0"&&isNaN(parseInt(e))?!1:Iw(t)?Lw(t):"*"+t}function Ow(e){const t=[];let n=-1,r=0,s=0,i,o,l,a,c,u,f;const p=[];p[0]=()=>{o===void 0?o=l:o+=l},p[1]=()=>{o!==void 0&&(t.push(o),o=void 0)},p[2]=()=>{p[0](),s++},p[3]=()=>{if(s>0)s--,r=4,p[0]();else{if(s=0,o===void 0||(o=Nw(o),o===!1))return!1;p[1]()}};function h(){const d=e[n+1];if(r===5&&d==="'"||r===6&&d==='"')return n++,l="\\"+d,p[0](),!0}for(;r!==null;)if(n++,i=e[n],!(i==="\\"&&h())){if(a=Dw(i),f=Wr[r],c=f[a]||f.l||8,c===8||(r=c[0],c[1]!==void 0&&(u=p[c[1]],u&&(l=i,u()===!1))))return;if(r===7)return t}}const op=new Map;function Fw(e,t){return Ne(e)?e[t]:null}function Rw(e,t){if(!Ne(e))return null;let n=op.get(t);if(n||(n=Ow(t),n&&op.set(t,n)),!n)return null;const r=n.length;let s=e,i=0;for(;i<r;){const o=n[i];if(B0.includes(o)&&Hn(s))return null;const l=s[o];if(l===void 0||Ke(s))return null;s=l,i++}return s}const Pw=e=>e,Mw=e=>"",$w="text",Bw=e=>e.length===0?"":VC(e),zw=jC;function lp(e,t){return e=Math.abs(e),t===2?e?e>1?1:0:1:e?Math.min(e,2):0}function Uw(e){const t=st(e.pluralIndex)?e.pluralIndex:-1;return e.named&&(st(e.named.count)||st(e.named.n))?st(e.named.count)?e.named.count:st(e.named.n)?e.named.n:t:t}function Hw(e,t){t.count||(t.count=e),t.n||(t.n=e)}function jw(e={}){const t=e.locale,n=Uw(e),r=Ne(e.pluralRules)&&re(t)&&Ke(e.pluralRules[t])?e.pluralRules[t]:lp,s=Ne(e.pluralRules)&&re(t)&&Ke(e.pluralRules[t])?lp:void 0,i=C=>C[r(n,C.length,s)],o=e.list||[],l=C=>o[C],a=e.named||Ue();st(e.pluralIndex)&&Hw(n,a);const c=C=>a[C];function u(C){return(Ke(e.messages)?e.messages(C):Ne(e.messages)?e.messages[C]:!1)||(e.parent?e.parent.message(C):Mw)}const f=C=>e.modifiers?e.modifiers[C]:Pw,p=me(e.processor)&&Ke(e.processor.normalize)?e.processor.normalize:Bw,h=me(e.processor)&&Ke(e.processor.interpolate)?e.processor.interpolate:zw,d=me(e.processor)&&re(e.processor.type)?e.processor.type:$w,_={list:l,named:c,plural:i,linked:(C,...S)=>{const[b,g]=S;let m="text",y="";S.length===1?Ne(b)?(y=b.modifier||y,m=b.type||m):re(b)&&(y=b||y):S.length===2&&(re(b)&&(y=b||y),re(g)&&(m=g||m));const k=u(C)(_),T=m==="vnode"&&Ye(k)&&y?k[0]:k;return y?f(y)(T,m):T},message:u,type:d,interpolate:h,normalize:p,values:St(Ue(),o,a)};return _}let Yi=null;function Vw(e){Yi=e}function qw(e,t,n){Yi&&Yi.emit("i18n:init",{timestamp:Date.now(),i18n:e,version:t,meta:n})}const Ww=Kw("function:translate");function Kw(e){return t=>Yi&&Yi.emit(e,t)}const z0=Wu.__EXTEND_POINT__,Yr=ca(z0),Gw={NOT_FOUND_KEY:z0,FALLBACK_TO_TRANSLATE:Yr(),CANNOT_FORMAT_NUMBER:Yr(),FALLBACK_TO_NUMBER_FORMAT:Yr(),CANNOT_FORMAT_DATE:Yr(),FALLBACK_TO_DATE_FORMAT:Yr(),EXPERIMENTAL_CUSTOM_MESSAGE_COMPILER:Yr(),__EXTEND_POINT__:Yr()},U0=he.__EXTEND_POINT__,Zr=ca(U0),In={INVALID_ARGUMENT:U0,INVALID_DATE_ARGUMENT:Zr(),INVALID_ISO_DATE_ARGUMENT:Zr(),NOT_SUPPORT_NON_STRING_MESSAGE:Zr(),NOT_SUPPORT_LOCALE_PROMISE_VALUE:Zr(),NOT_SUPPORT_LOCALE_ASYNC_FUNCTION:Zr(),NOT_SUPPORT_LOCALE_TYPE:Zr(),__EXTEND_POINT__:Zr()};function Bn(e){return si(e,null,void 0)}function Yu(e,t){return t.locale!=null?ap(t.locale):ap(e.locale)}let za;function ap(e){if(re(e))return e;if(Ke(e)){if(e.resolvedOnce&&za!=null)return za;if(e.construLine truncated
|
||||||
|
* vue-i18n v9.14.4
|
||||||
|
* (c) 2025 kazuya kawaguchi
|
||||||
|
* Released under the MIT License.
|
||||||
|
*/const pA="9.14.4";function dA(){typeof __VUE_I18N_FULL_INSTALL__!="boolean"&&(or().__VUE_I18N_FULL_INSTALL__=!0),typeof __VUE_I18N_LEGACY_API__!="boolean"&&(or().__VUE_I18N_LEGACY_API__=!0),typeof __INTLIFY_JIT_COMPILATION__!="boolean"&&(or().__INTLIFY_JIT_COMPILATION__=!1),typeof __INTLIFY_DROP_MESSAGE_COMPILER__!="boolean"&&(or().__INTLIFY_DROP_MESSAGE_COMPILER__=!1),typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(or().__INTLIFY_PROD_DEVTOOLS__=!1)}const J0=Gw.__EXTEND_POINT__,Jn=ca(J0);Jn(),Jn(),Jn(),Jn(),Jn(),Jn(),Jn(),Jn(),Jn();const e1=In.__EXTEND_POINT__,Kt=ca(e1),mt={UNEXPECTED_RETURN_TYPE:e1,INVALID_ARGUMENT:Kt(),MUST_BE_CALL_SETUP_TOP:Kt(),NOT_INSTALLED:Kt(),NOT_AVAILABLE_IN_LEGACY_MODE:Kt(),REQUIRED_VALUE:Kt(),INVALID_VALUE:Kt(),CANNOT_SETUP_VUE_DEVTOOLS_PLUGIN:Kt(),NOT_INSTALLED_WITH_PROVIDE:Kt(),UNEXPECTED_ERROR:Kt(),NOT_COMPATIBLE_LEGACY_VUE_I18N:Kt(),BRIDGE_SUPPORT_VUE_2_ONLY:Kt(),MUST_DEFINE_I18N_OPTION_IN_ALLOW_COMPOSITION:Kt(),NOT_AVAILABLE_COMPOSITION_IN_LEGACY:Kt(),__EXTEND_POINT__:Kt()};function vt(e,...t){return si(e,null,void 0)}const Fc=Vr("__translateVNode"),Rc=Vr("__datetimeParts"),Pc=Vr("__numberParts"),t1=Vr("__setPluralRules"),n1=Vr("__injectWithOption"),Mc=Vr("__dispose");function Zi(e){if(!Ne(e)||Hn(e))return e;for(const t in e)if(Tn(e,t))if(!t.includes("."))Ne(e[t])&&Zi(e[t]);else{const n=t.split("."),r=n.length-1;let s=e,i=!1;for(let o=0;o<r;o++){if(n[o]==="__proto__")throw new Error(`unsafe key: ${n[o]}`);if(n[o]in s||(s[n[o]]=Ue()),!Ne(s[n[o]])){i=!0;break}s=s[n[o]]}if(i||(Hn(s)?B0.includes(n[r])||delete e[t]:(s[n[r]]=e[t],delete e[t])),!Hn(s)){const o=s[n[r]];Ne(o)&&Zi(o)}}return e}function fa(e,t){const{messages:n,__i18n:r,messageResolver:s,flatJson:i}=t,o=me(n)?n:Ye(r)?Ue():{[e]:Ue()};if(Ye(r)&&r.forEach(l=>{if("locale"in l&&"resource"in l){const{locale:a,resource:c}=l;a?(o[a]=o[a]||Ue(),qo(c,o[a])):qo(c,o)}else re(l)&&qo(JSON.parse(l),o)}),s==null&&i)for(const l in o)Tn(o,l)&&Zi(o[l]);return o}function mA(e){return e.type}function r1(e,t,n){let r=Ne(t.messages)?t.messages:Ue();"__i18nGlobal"in n&&(r=fa(e.locale.value,{messages:r,__i18n:n.__i18nGlobal}));const s=Object.keys(r);s.length&&s.forEach(i=>{e.mergeLocaleMessage(i,r[i])});{if(Ne(t.datetimeFormats)){const i=Object.keys(t.datetimeFormats);i.length&&i.forEach(o=>{e.mergeDateTimeFormat(o,t.datetimeFormats[o])})}if(Ne(t.numberFormats)){const i=Object.keys(t.numberFormats);i.length&&i.forEach(o=>{e.mergeNumberFormat(o,t.numberFormats[o])})}}}function Ep(e){return X(ur,null,e,0)}const Cp=()=>[],gA=()=>!1;let wp=0;function Ap(e){return(t,n,r,s)=>e(n,r,Pt()||void 0,s)}function Xu(e={},t){const{__root:n,__injectWithOption:r}=e,s=n===void 0,i=e.flatJson,o=bl?te:io,l=!!e.translateExistCompatible;let a=ve(e.inheritLocale)?e.inheritLocale:!0;const c=o(n&&a?n.locale.value:re(e.locale)?e.locale:Zs),u=o(n&&a?n.fallbackLocale.value:re(e.fallbackLocale)||Ye(e.fallbackLocale)||me(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:c.value),f=o(fa(c.value,e)),p=o(me(e.datetimeFormats)?e.datetimeFormats:{[c.value]:{}}),h=o(me(e.numberFormats)?e.numberFormats:{[c.value]:{}});let d=n?n.missingWarn:ve(e.missingWarn)||Ur(e.missingWarn)?e.missingWarn:!0,_=n?n.fallbackWarn:ve(e.fallbackWarn)||Ur(e.fallbackWarn)?e.fallbackWarn:!0,C=n?n.fallbackRoot:ve(e.fallbackRoot)?e.fallbackRoot:!0,S=!!e.fallbackFormat,b=Ke(e.missing)?e.missing:null,g=Ke(e.missing)?Ap(e.missing):null,m=Ke(e.postTranslation)?e.postTranslation:null,y=n?n.warnHtmlMessage:ve(e.warnHtmlMessage)?e.warnHtmlMessage:!0,k=!!e.escapeParameter;const T=n?n.modifiers:me(e.modifiers)?e.modifiers:{};let L=e.pluralRules||n&&n.pluralRules,A;A=(()=>{s&&pp(null);const D={version:pA,locale:c.value,fallbackLocale:u.value,messages:f.value,modifiers:T,pluralRules:L,missing:g===null?void 0:g,missingWarn:d,fallbackWarn:_,fallbackFormat:S,unresolving:!0,postTranslation:m===null?void 0:m,warnHtmlMessage:y,escapeParameter:k,messageResolver:e.messageResolver,messageCompiler:e.messageCompiler,__meta:{framework:"vue"}};D.datetimeFormats=p.value,D.numberFormats=h.value,D.__datetimeFormatters=me(A)?A.__datetimeFormatters:void 0,D.__numberFormatters=me(A)?A.__numberFormatters:void 0;const $=rA(D);return s&&pp($),$})(),hi(A,c.value,u.value);function O(){return[c.value,u.value,f.value,p.value,h.value]}const H=pe({get:()=>c.value,set:D=>{c.value=D,A.locale=c.value}}),M=pe({get:()=>u.value,set:D=>{u.value=D,A.fallbackLocale=u.value,hi(A,c.value,D)}}),V=pe(()=>f.value),oe=pe(()=>p.value),ie=pe(()=>h.value);function Z(){return Ke(m)?m:null}function G(D){m=D,A.postTranslation=D}function K(){return b}function ue(D){D!==null&&(g=Ap(D)),b=D,A.missing=g}const ye=(D,$,ee,ae,Ae,xe)=>{O();let ot;try{__INTLIFY_PROD_DEVTOOLS__,s||(A.fallbackContext=n?nA():void 0),ot=D(A)}finally{__INTLIFY_PROD_DEVTOOLS__,s||(A.fallbackContext=void 0)}if(ee!=="translate exists"&&st(ot)&&ot===ua||ee==="translate exists"&&!ot){const[_t,_n]=$();return n&&C?ae(n):Ae(_t)}else{if(xe(ot))return ot;throw vt(mt.UNEXPECTED_RETURN_TYPE)}};Line truncated
|
||||||
|
|
||||||
|
1. **多语言支持** - 支持中文和英文切换
|
||||||
|
2. **AI助手** - 可以回答文档相关问题
|
||||||
|
3. **响应式设计** - 支持各种设备尺寸
|
||||||
|
4. **主题切换** - 支持亮色和暗色主题
|
||||||
|
5. **搜索功能** - 快速查找文档内容`,user2:"这些功能很棒,可以详细介绍一下AI助手的功能吗?",ai2:`AI助手具备以下能力:
|
||||||
|
|
||||||
|
**对话功能**
|
||||||
|
- 实时对话交流
|
||||||
|
- 支持markdown格式回复
|
||||||
|
- 保存对话历史
|
||||||
|
|
||||||
|
**技术特性**
|
||||||
|
- 支持多种AI模型(OpenAI、Claude、Gemini等)
|
||||||
|
- 可配置API密钥和端点
|
||||||
|
- 连接测试功能
|
||||||
|
|
||||||
|
**用户体验**
|
||||||
|
- 可拖拽移动窗口
|
||||||
|
- 可调整窗口大小
|
||||||
|
- 平滑滚动体验`}},settings:{title:"设置",provider:"AI提供商",model:"模型ID",apiKey:"API密钥",baseUrl:"API基础URL",testing:"测试中...",testConnection:"测试连接",saveSettings:"保存设置",closeSettings:"关闭设置",saveSuccess:"设置已自动保存!",apiKeyPlaceholder:"输入您的API密钥",baseUrlPlaceholder:"API端点URL",modelPlaceholder:"例如: gpt-3.5-turbo",errors:{invalidProvider:"无效的AI提供商",missingProviderConfig:"缺少提供商配置",missingApiKey:"缺少API密钥",missingModelId:"缺少模型ID",missingBaseUrl:"缺少API基础URL",connectionFailed:"连接测试失败"}},theme:{themes:{default:{name:"默认主题",description:"经典蓝色风格"},vue:{name:"Vue主题",description:"Vue官网绿色风格"},github:{name:"GitHub主题",description:"GitHub黑白灰风格"},purple:{name:"紫色主题",description:"优雅紫色风格"},orange:{name:"橙色主题",description:"温暖橙色风格"},emerald:{name:"翠绿主题",description:"清新翠绿风格"}},darkMode:"深色模式",lightMode:"浅色模式"},readingProgress:{estimatedTime:"预计阅读",progress:"进度",words:"字",minutes:"分钟",autoScroll:"自动滚动",stopAutoScroll:"停止自动滚动",startAutoScroll:"开始自动滚动",backToTop:"回到顶部",showInfo:"显示信息",hideInfo:"隐藏信息"},feedback:{title:"页面反馈",triggerTitle:"给文档提供反馈",quickQuestion:"这个页面对您有帮助吗?",helpful:"有帮助",notHelpful:"没帮助",feedbackType:"反馈类型",selectType:"请选择",types:{content:"内容问题",typo:"错别字",missing:"缺少信息",suggestion:"改进建议",bug:"页面错误",question:"疑问",other:"其他"},detailLabel:"详细说明",detailPlaceholder:"请详细描述您的反馈...",contactLabel:"如有需要,允许我们联系您获取更多信息",emailPlaceholder:"您的邮箱(可选)",submit:"提交反馈",cancel:"取消",successMessage:"感谢您的反馈!",stats:{visitors:"访问",helpful:"有用",feedback:"反馈"}},footer:{gettingStarted:"快速开始",introduction:"介绍",installation:"安装",quickStart:"快速上手",configuration:"配置说明",advanced:"进阶指南",customThemes:"自定义主题",components:"组件开发",apiReference:"API 参考",deployment:"部署",community:"社区",discussions:"讨论区",issues:"问题反馈",contributing:"贡献指南",releases:"版本发布",support:"帮助支持",examples:"示例",sourceCode:"源代码",license:"开源许可",backToTop:"回到顶部",builtWith:"构建技术:",lastUpdated:"最后更新",connectMe:"联系我",github:"GitHub",email:"邮箱",twitter:"Twitter",discord:"Discord",bilibili:"哔哩哔哩",qq:"QQ",wechat:"微信",weibo:"微博",douyin:"抖音",zhihu:"知乎",youtube:"YouTube",telegram:"Telegram",tiktok:"TikTok"}},zA={nav:{home:"Home",guide:"Guide",api:"API",examples:"Examples",about:"About",language:"Language",tableOfContents:"Table of Contents",more:"more"},sidebar:{gettingStarted:"Getting Started",introduction:"Introduction",installation:"Installation",quickStart:"Quick Start",configuration:"Configuration",advancedGuide:"Advanced Guide",customThemes:"Custom Themes",componentDevelopment:"Component Development",apiReference:"API Reference",deployment:"Deployment",examples:"Examples",basicExample:"Basic Example"},common:{search:"Search",theme:"Theme",light:"Light",dark:"Dark",menu:"Menu",close:"Close",back:"Back",next:"Next",prev:"Previous",and:"and",toc:"Table of Contents",edit:"Edit this page",lastUpdated:"Last updated",contributors:"Contributors",custom:"Custom",draggable:"Draggable",loading:"Loading content...",error:"Failed to load",retry:"Retry",prevSection:"← Previous",nextSection:"Next →",articleTitle:"Page",noContent:"Content for this page is being written...",loadError:"Unable to load article content, please try again later."},ai:{assistant:"AI Assistant",open:"Open AI Assistant",close:"Close AI Assistant",settings:"Settings",test:"Test Connection",save:"Save Settings",placeholder:"Ask me anything about the documentation...",configNotice:"Please configure AI settings first",welcome:"Hello! I am an AI assistant that can help you answer questions related to the documentation.",demoMessages:{user1:"Hello, I would like to learn about the features of this documentation system.",ai1:`I am happy to introduce you to the main features of this documentation system:
|
||||||
|
|
||||||
|
1. **Multi-language Support** - Supports Chinese and English switching
|
||||||
|
2. **AI Assistant** - Can answer documentation-related questions
|
||||||
|
3. **Responsive Design** - Supports various device sizes
|
||||||
|
4. **Theme Switching** - Supports light and dark themes
|
||||||
|
5. **Search Function** - Quickly find document content`,user2:"These features are great! Can you introduce the AI assistant features in detail?",ai2:`AI Assistant has the following capabilities:
|
||||||
|
|
||||||
|
**Conversation Features**
|
||||||
|
- Real-time conversation
|
||||||
|
- Supports markdown format replies
|
||||||
|
- Save conversation history
|
||||||
|
|
||||||
|
**Technical Features**
|
||||||
|
- Supports multiple AI models (OpenAI, Claude, Gemini, etc.)
|
||||||
|
- Configurable API keys and endpoints
|
||||||
|
- Connection testing functionality
|
||||||
|
|
||||||
|
**User Experience**
|
||||||
|
- Draggable window
|
||||||
|
- Resizable window
|
||||||
|
- Smooth scrolling experience`}},settings:{title:"Settings",provider:"AI Provider",model:"Model ID",apiKey:"API Key",baseUrl:"API Base URL",testing:"Testing...",testConnection:"Test Connection",saveSettings:"Save Settings",closeSettings:"Close Settings",saveSuccess:"Settings auto-saved successfully!",apiKeyPlaceholder:"Enter your API key",baseUrlPlaceholder:"API endpoint URL",modelPlaceholder:"e.g: gpt-3.5-turbo",errors:{invalidProvider:"Invalid AI provider",missingProviderConfig:"Missing provider configuration",missingApiKey:"Missing API key",missingModelId:"Missing model ID",missingBaseUrl:"Missing API base URL",connectionFailed:"Connection test failed"}},theme:{themes:{default:{name:"Default Theme",description:"Classic blue style"},vue:{name:"Vue Theme",description:"Vue official green style"},github:{name:"GitHub Theme",description:"GitHub black and white style"},purple:{name:"Purple Theme",description:"Elegant purple style"},orange:{name:"Orange Theme",description:"Warm orange style"},emerald:{name:"Emerald Theme",description:"Fresh emerald style"}},darkMode:"Dark Mode",lightMode:"Light Mode"},readingProgress:{estimatedTime:"Estimated reading",progress:"Progress",words:"words",minutes:"minutes",autoScroll:"Auto scroll",stopAutoScroll:"Stop auto scroll",startAutoScroll:"Start auto scroll",backToTop:"Back to top",showInfo:"Show info",hideInfo:"Hide info"},feedback:{title:"Page Feedback",triggerTitle:"Provide feedback for documentation",quickQuestion:"Is this page helpful to you?",helpful:"Helpful",notHelpful:"Not helpful",feedbackType:"Feedback type",selectType:"Please select",types:{content:"Content issue",typo:"Typo",missing:"Missing information",suggestion:"Improvement suggestion",bug:"Page error",question:"Question",other:"Other"},detailLabel:"Detailed description",detailPlaceholder:"Please describe your feedback in detail...",contactLabel:"Allow us to contact you for more information if needed",emailPlaceholder:"Your email (optional)",submit:"Submit feedback",cancel:"Cancel",successMessage:"Thank you for your feedback!",stats:{visitors:"visitors",helpful:"helpful",feedback:"feedback"}},footer:{gettingStarted:"Getting Started",introduction:"Introduction",installation:"Installation",quickStart:"Quick Start",configuration:"Configuration",advanced:"Advanced",customThemes:"Custom Themes",components:"Components",apiReference:"API Reference",deployment:"Deployment",community:"Community",discussions:"Discussions",issues:"Issues",contributing:"Contributing",releases:"Releases",support:"Support",examples:"Examples",sourceCode:"Source Code",license:"License",backToTop:"Back to Top",builtWith:"Built with",lastUpdated:"Last updated",connectMe:"Connect Me",github:"GitHub",email:"Email",twitter:"Twitter",discord:"Discord",bilibili:"Bilibili",qq:"QQ",wechat:"WeChat",weibo:"Weibo",douyin:"Douyin",zhihu:"Zhihu",youtube:"YouTube",telegram:"Telegram",tiktok:"TikTok"}};/*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT */function o1(e){return typeof e>"u"||e===null}function UA(e){return typeof e=="object"&&e!==null}function HA(e){return Array.isArray(e)?e:o1(e)?[]:[e]}function jA(e,t){var n,r,s,i;if(t)for(i=Object.keys(t),n=0,r=i.length;n<r;n+=1)s=i[n],e[s]=t[s];return e}function VA(e,t){var n="",r;for(r=0;r<t;r+=1)n+=e;return n}function qA(e){return e===0&&Number.NEGATIVE_INFINITY===1/e}var WA=o1,KA=UA,GA=HA,YA=VA,ZA=qA,XA=jA,pt={isNothing:WA,isObject:KA,toArray:GA,repeat:YA,isNegativeZero:ZA,extend:XA};function l1(e,t){var n="",r=e.reason||"(unknown reason)";return e.mark?(e.mark.name&&(n+='in "'+e.mark.name+'" '),n+="("+(e.mark.line+1)+":"+(e.mark.column+1)+")",!t&&e.mark.snippet&&(n+=`
|
||||||
|
|
||||||
|
`+e.mark.snippet),r+" "+n):r}function Xi(e,t){Error.call(this),this.name="YAMLException",this.reason=e,this.mark=t,this.message=l1(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}Xi.prototype=Object.create(Error.prototype);Xi.prototype.constructor=Xi;Xi.prototype.toString=function(e){return this.name+": "+l1(this,e)};var Vt=Xi;function ja(e,t,n,r,s){var i="",o="",l=Math.floor(s/2)-1;return r-t>l&&(i=" ... ",t=r-l+i.length),n-r>l&&(o=" ...",n=r+l-o.length),{str:i+e.slice(t,n).replace(/\t/g,"→")+o,pos:r-t+i.length}}function Va(e,t){return pt.repeat(" ",t-e.length)+e}function QA(e,t){if(t=Object.create(t||null),!e.buffer)return null;t.maxLength||(t.maxLength=79),typeof t.indent!="number"&&(t.indent=1),typeof t.linesBefore!="number"&&(t.linesBefore=3),typeof t.linesAfter!="number"&&(t.linesAfter=2);for(var n=/\r?\n|\r|\0/g,r=[0],s=[],i,o=-1;i=n.exec(e.buffer);)s.push(i.index),r.push(i.index+i[0].length),e.position<=i.index&&o<0&&(o=r.length-2);o<0&&(o=r.length-1);var l="",a,c,u=Math.min(e.line+t.linesAfter,s.length).toString().length,f=t.maxLength-(t.indent+u+3);for(a=1;a<=t.linesBefore&&!(o-a<0);a++)c=ja(e.buffer,r[o-a],s[o-a],e.position-(r[o]-r[o-a]),f),l=pt.repeat(" ",t.indent)+Va((e.line-a+1).toString(),u)+" | "+c.str+`
|
||||||
|
`+l;for(c=ja(e.buffer,r[o],s[o],e.position,f),l+=pt.repeat(" ",t.indent)+Va((e.line+1).toString(),u)+" | "+c.str+`
|
||||||
|
`,l+=pt.repeat("-",t.indent+u+3+c.pos)+`^
|
||||||
|
`,a=1;a<=t.linesAfter&&!(o+a>=s.length);a++)c=ja(e.buffer,r[o+a],s[o+a],e.position-(r[o]-r[o+a]),f),l+=pt.repeat(" ",t.indent)+Va((e.line+a+1).toString(),u)+" | "+c.str+`
|
||||||
|
`;return l.replace(/\n$/,"")}var JA=QA,eS=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],tS=["scalar","sequence","mapping"];function nS(e){var t={};return e!==null&&Object.keys(e).forEach(function(n){e[n].forEach(function(r){t[String(r)]=n})}),t}function rS(e,t){if(t=t||{},Object.keys(t).forEach(function(n){if(eS.indexOf(n)===-1)throw new Vt('Unknown option "'+n+'" is met in definition of "'+e+'" YAML type.')}),this.options=t,this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(n){return n},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.representName=t.representName||null,this.defaultStyle=t.defaultStyle||null,this.multi=t.multi||!1,this.styleAliases=nS(t.styleAliases||null),tS.indexOf(this.kind)===-1)throw new Vt('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')}var xt=rS;function Op(e,t){var n=[];return e[t].forEach(function(r){var s=n.length;n.forEach(function(i,o){i.tag===r.tag&&i.kind===r.kind&&i.multi===r.multi&&(s=o)}),n[s]=r}),n}function sS(){var e={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}},t,n;function r(s){s.multi?(e.multi[s.kind].push(s),e.multi.fallback.push(s)):e[s.kind][s.tag]=e.fallback[s.tag]=s}for(t=0,n=arguments.length;t<n;t+=1)arguments[t].forEach(r);return e}function Bc(e){return this.extend(e)}Bc.prototype.extend=function(e){var t=[],n=[];if(e instanceof xt)n.push(e);else if(Array.isArray(e))n=n.concat(e);else if(e&&(Array.isArray(e.implicit)||Array.isArray(e.explicit)))e.implicit&&(t=t.concat(e.implicit)),e.explicit&&(n=n.concat(e.explicit));else throw new Vt("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");t.forEach(function(s){if(!(s instanceof xt))throw new Vt("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(s.loadKind&&s.loadKind!=="scalar")throw new Vt("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(s.multi)throw new Vt("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")}),n.forEach(function(s){if(!(s instanceof xt))throw new Vt("Specified list of YAML types (or a single Type object) contains a non-Type object.")});var r=Object.create(Bc.prototype);return r.implicit=(this.implicit||[]).concat(t),r.explicit=(this.explicit||[]).concat(n),r.compiledImplicit=Op(r,"implicit"),r.compiledExplicit=Op(r,"explicit"),r.compiledTypeMap=sS(r.compiledImplicit,r.compiledExplicit),r};var a1=Bc,c1=new xt("tag:yaml.org,2002:str",{kind:"scalar",construct:function(e){return e!==null?e:""}}),u1=new xt("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(e){return e!==null?e:[]}}),f1=new xt("tag:yaml.org,2002:map",{kind:"mapping",construct:function(e){return e!==null?e:{}}}),h1=new a1({explicit:[c1,u1,f1]});function iS(e){if(e===null)return!0;var t=e.length;return t===1&&e==="~"||t===4&&(e==="null"||e==="Null"||e==="NULL")}function oS(){return null}function lS(e){return e===null}var p1=new xt("tag:yaml.org,2002:null",{kind:"scalar",resolve:iS,construct:oS,predicate:lS,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"},empty:function(){return""}},defaultStyle:"lowercase"});function aS(e){if(e===null)return!1;var t=e.length;return t===4&&(e==="true"||e==="True"||e==="TRUE")||t===5&&(e==="false"||e==="False"||e==="FALSE")}function cS(e){return e==="true"||e==="True"||e==="TRUE"}function uS(e){return Object.prototype.toString.call(e)==="[object Boolean]"}var d1=new xt("tag:yaml.org,2002:bool",{kind:"scalar",resolve:aS,construct:cS,predicate:uS,represent:{lowercase:function(e){return e?"true":"false"},uppercase:function(e){return e?"TRUE":"FALSE"},camelcase:function(e){return e?"True":"False"}},defaultStyle:"lowercase"});function fS(e){return 48<=e&&e<=57||65<=e&&e<=70||97<=e&&e<=102}function hS(e){return 48<=e&&e<=55}function pS(e){return 48<=e&&e<=57}function dS(e){if(e===null)return!1;var t=e.length,n=0,r=!1,s;if(!t)return!1;if(s=e[n],(s==="-"||s==="+")&&(s=e[++n]),s==="0"){if(n+1===t)return!0;if(s=e[++n],s==="b"){for(n++;n<t;n++)if(s=e[n],s!=="_"){if(s!=="0"&&s!=="1")return!1;r=!0}return r&&s!=="_"}if(s==="x"){for(n++;n<t;n++)if(s=e[n],s!=="_"){if(!fS(e.charCodeAt(n)))return!1;r=!0}return r&&s!=="_"}if(s==="o"){for(n++;n<t;n++)if(s=e[n],s!=="_"){if(!hS(e.charCodeAt(n)))return!1;r=!0}return r&&s!=="_"}}if(s==="_")return!1;for(;n<t;n++)if(s=e[n],s!=="_"){if(!pS(e.charCodeAt(n)))return!1;r=!0}return!(!r||s==="_")}function mS(e){var t=e,n=1,r;if(t.indexOf("_")!==-1&&(t=t.replace(/_/g,"")),r=t[0],(r==="-"||r==="+")&&(r==="-"&&(n=-1),t=t.slice(1),r=t[0]),t==="0")return 0;if(r==="0"){if(t[1]==="b")return n*parseInt(t.
Line truncated
|
||||||
|
\r`;function xS(e){if(e===null)return!1;var t,n,r=0,s=e.length,i=Ju;for(n=0;n<s;n++)if(t=i.indexOf(e.charAt(n)),!(t>64)){if(t<0)return!1;r+=6}return r%8===0}function TS(e){var t,n,r=e.replace(/[\r\n=]/g,""),s=r.length,i=Ju,o=0,l=[];for(t=0;t<s;t++)t%4===0&&t&&(l.push(o>>16&255),l.push(o>>8&255),l.push(o&255)),o=o<<6|i.indexOf(r.charAt(t));return n=s%4*6,n===0?(l.push(o>>16&255),l.push(o>>8&255),l.push(o&255)):n===18?(l.push(o>>10&255),l.push(o>>2&255)):n===12&&l.push(o>>4&255),new Uint8Array(l)}function IS(e){var t="",n=0,r,s,i=e.length,o=Ju;for(r=0;r<i;r++)r%3===0&&r&&(t+=o[n>>18&63],t+=o[n>>12&63],t+=o[n>>6&63],t+=o[n&63]),n=(n<<8)+e[r];return s=i%3,s===0?(t+=o[n>>18&63],t+=o[n>>12&63],t+=o[n>>6&63],t+=o[n&63]):s===2?(t+=o[n>>10&63],t+=o[n>>4&63],t+=o[n<<2&63],t+=o[64]):s===1&&(t+=o[n>>2&63],t+=o[n<<4&63],t+=o[64],t+=o[64]),t}function LS(e){return Object.prototype.toString.call(e)==="[object Uint8Array]"}var C1=new xt("tag:yaml.org,2002:binary",{kind:"scalar",resolve:xS,construct:TS,predicate:LS,represent:IS}),DS=Object.prototype.hasOwnProperty,NS=Object.prototype.toString;function OS(e){if(e===null)return!0;var t=[],n,r,s,i,o,l=e;for(n=0,r=l.length;n<r;n+=1){if(s=l[n],o=!1,NS.call(s)!=="[object Object]")return!1;for(i in s)if(DS.call(s,i))if(!o)o=!0;else return!1;if(!o)return!1;if(t.indexOf(i)===-1)t.push(i);else return!1}return!0}function FS(e){return e!==null?e:[]}var w1=new xt("tag:yaml.org,2002:omap",{kind:"sequence",resolve:OS,construct:FS}),RS=Object.prototype.toString;function PS(e){if(e===null)return!0;var t,n,r,s,i,o=e;for(i=new Array(o.length),t=0,n=o.length;t<n;t+=1){if(r=o[t],RS.call(r)!=="[object Object]"||(s=Object.keys(r),s.length!==1))return!1;i[t]=[s[0],r[s[0]]]}return!0}function MS(e){if(e===null)return[];var t,n,r,s,i,o=e;for(i=new Array(o.length),t=0,n=o.length;t<n;t+=1)r=o[t],s=Object.keys(r),i[t]=[s[0],r[s[0]]];return i}var A1=new xt("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:PS,construct:MS}),$S=Object.prototype.hasOwnProperty;function BS(e){if(e===null)return!0;var t,n=e;for(t in n)if($S.call(n,t)&&n[t]!==null)return!1;return!0}function zS(e){return e!==null?e:{}}var S1=new xt("tag:yaml.org,2002:set",{kind:"mapping",resolve:BS,construct:zS}),ef=y1.extend({implicit:[v1,E1],explicit:[C1,w1,A1,S1]}),Hr=Object.prototype.hasOwnProperty,vl=1,x1=2,T1=3,El=4,qa=1,US=2,Fp=3,HS=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,jS=/[\x85\u2028\u2029]/,VS=/[,\[\]\{\}]/,I1=/^(?:!|!!|![a-z\-]+!)$/i,L1=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function Rp(e){return Object.prototype.toString.call(e)}function jn(e){return e===10||e===13}function ls(e){return e===9||e===32}function en(e){return e===9||e===32||e===10||e===13}function Ls(e){return e===44||e===91||e===93||e===123||e===125}function qS(e){var t;return 48<=e&&e<=57?e-48:(t=e|32,97<=t&&t<=102?t-97+10:-1)}function WS(e){return e===120?2:e===117?4:e===85?8:0}function KS(e){return 48<=e&&e<=57?e-48:-1}function Pp(e){return e===48?"\0":e===97?"\x07":e===98?"\b":e===116||e===9?" ":e===110?`
|
||||||
|
`:e===118?"\v":e===102?"\f":e===114?"\r":e===101?"\x1B":e===32?" ":e===34?'"':e===47?"/":e===92?"\\":e===78?"
":e===95?" ":e===76?"\u2028":e===80?"\u2029":""}function GS(e){return e<=65535?String.fromCharCode(e):String.fromCharCode((e-65536>>10)+55296,(e-65536&1023)+56320)}var D1=new Array(256),N1=new Array(256);for(var ks=0;ks<256;ks++)D1[ks]=Pp(ks)?1:0,N1[ks]=Pp(ks);function YS(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||ef,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function O1(e,t){var n={name:e.filename,buffer:e.input.slice(0,-1),position:e.position,line:e.line,column:e.position-e.lineStart};return n.snippet=JA(n),new Vt(t,n)}function ce(e,t){throw O1(e,t)}function Cl(e,t){e.onWarning&&e.onWarning.call(null,O1(e,t))}var Mp={YAML:function(e,t,n){var r,s,i;e.version!==null&&ce(e,"duplication of %YAML directive"),n.length!==1&&ce(e,"YAML directive accepts exactly one argument"),r=/^([0-9]+)\.([0-9]+)$/.exec(n[0]),r===null&&ce(e,"ill-formed argument of the YAML directive"),s=parseInt(r[1],10),i=parseInt(r[2],10),s!==1&&ce(e,"unacceptable YAML version of the document"),e.version=n[0],e.checkLineBreaks=i<2,i!==1&&i!==2&&Cl(e,"unsupported YAML version of the document")},TAG:function(e,t,n){var r,s;n.length!==2&&ce(e,"TAG directive accepts exactly two arguments"),r=n[0],s=n[1],I1.test(r)||ce(e,"ill-formed tag handle (first argument) of the TAG directive"),Hr.call(e.tagMap,r)&&ce(e,'there is a previously declared suffix for "'+r+'" tag handle'),L1.test(s)||ce(e,"ill-formed tag prefix (second argument) of the TAG directive");try{s=decodeURIComponent(s)}catch{ce(e,"tag prefix is malformed: "+s)}e.tagMap[r]=s}};function Mr(e,t,n,r){var s,i,o,l;if(t<n){if(l=e.input.slice(t,n),r)for(s=0,i=l.length;s<i;s+=1)o=l.charCodeAt(s),o===9||32<=o&&o<=1114111||ce(e,"expected valid JSON character");else HS.test(l)&&ce(e,"the stream contains non-printable characters");e.result+=l}}function $p(e,t,n,r){var s,i,o,l;for(pt.isObject(n)||ce(e,"cannot merge mappings; the provided source object is unacceptable"),s=Object.keys(n),o=0,l=s.length;o<l;o+=1)i=s[o],Hr.call(t,i)||(t[i]=n[i],r[i]=!0)}function Ds(e,t,n,r,s,i,o,l,a){var c,u;if(Array.isArray(s))for(s=Array.prototype.slice.call(s),c=0,u=s.length;c<u;c+=1)Array.isArray(s[c])&&ce(e,"nested arrays are not supported inside keys"),typeof s=="object"&&Rp(s[c])==="[object Object]"&&(s[c]="[object Object]");if(typeof s=="object"&&Rp(s)==="[object Object]"&&(s="[object Object]"),s=String(s),t===null&&(t={}),r==="tag:yaml.org,2002:merge")if(Array.isArray(i))for(c=0,u=i.length;c<u;c+=1)$p(e,t,i[c],n);else $p(e,t,i,n);else!e.json&&!Hr.call(n,s)&&Hr.call(t,s)&&(e.line=o||e.line,e.lineStart=l||e.lineStart,e.position=a||e.position,ce(e,"duplicated mapping key")),s==="__proto__"?Object.defineProperty(t,s,{configurable:!0,enumerable:!0,writable:!0,value:i}):t[s]=i,delete n[s];return t}function tf(e){var t;t=e.input.charCodeAt(e.position),t===10?e.position++:t===13?(e.position++,e.input.charCodeAt(e.position)===10&&e.position++):ce(e,"a line break is expected"),e.line+=1,e.lineStart=e.position,e.firstTabInLine=-1}function at(e,t,n){for(var r=0,s=e.input.charCodeAt(e.position);s!==0;){for(;ls(s);)s===9&&e.firstTabInLine===-1&&(e.firstTabInLine=e.position),s=e.input.charCodeAt(++e.position);if(t&&s===35)do s=e.input.charCodeAt(++e.position);while(s!==10&&s!==13&&s!==0);if(jn(s))for(tf(e),s=e.input.charCodeAt(e.position),r++,e.lineIndent=0;s===32;)e.lineIndent++,s=e.input.charCodeAt(++e.position);else break}return n!==-1&&r!==0&&e.lineIndent<n&&Cl(e,"deficient indentation"),r}function ha(e){var t=e.position,n;return n=e.input.charCodeAt(t),!!((n===45||n===46)&&n===e.input.charCodeAt(t+1)&&n===e.input.charCodeAt(t+2)&&(t+=3,n=e.input.charCodeAt(t),n===0||en(n)))}function nf(e,t){t===1?e.result+=" ":t>1&&(e.result+=pt.repeat(`
|
||||||
|
`,t-1))}function ZS(e,t,n){var r,s,i,o,l,a,c,u,f=e.kind,p=e.result,h;if(h=e.input.charCodeAt(e.position),en(h)||Ls(h)||h===35||h===38||h===42||h===33||h===124||h===62||h===39||h===34||h===37||h===64||h===96||(h===63||h===45)&&(s=e.input.charCodeAt(e.position+1),en(s)||n&&Ls(s)))return!1;for(e.kind="scalar",e.result="",i=o=e.position,l=!1;h!==0;){if(h===58){if(s=e.input.charCodeAt(e.position+1),en(s)||n&&Ls(s))break}else if(h===35){if(r=e.input.charCodeAt(e.position-1),en(r))break}else{if(e.position===e.lineStart&&ha(e)||n&&Ls(h))break;if(jn(h))if(a=e.line,c=e.lineStart,u=e.lineIndent,at(e,!1,-1),e.lineIndent>=t){l=!0,h=e.input.charCodeAt(e.position);continue}else{e.position=o,e.line=a,e.lineStart=c,e.lineIndent=u;break}}l&&(Mr(e,i,o,!1),nf(e,e.line-a),i=o=e.position,l=!1),ls(h)||(o=e.position+1),h=e.input.charCodeAt(++e.position)}return Mr(e,i,o,!1),e.result?!0:(e.kind=f,e.result=p,!1)}function XS(e,t){var n,r,s;if(n=e.input.charCodeAt(e.position),n!==39)return!1;for(e.kind="scalar",e.result="",e.position++,r=s=e.position;(n=e.input.charCodeAt(e.position))!==0;)if(n===39)if(Mr(e,r,e.position,!0),n=e.input.charCodeAt(++e.position),n===39)r=e.position,e.position++,s=e.position;else return!0;else jn(n)?(Mr(e,r,s,!0),nf(e,at(e,!1,t)),r=s=e.position):e.position===e.lineStart&&ha(e)?ce(e,"unexpected end of the document within a single quoted scalar"):(e.position++,s=e.position);ce(e,"unexpected end of the stream within a single quoted scalar")}function QS(e,t){var n,r,s,i,o,l;if(l=e.input.charCodeAt(e.position),l!==34)return!1;for(e.kind="scalar",e.result="",e.position++,n=r=e.position;(l=e.input.charCodeAt(e.position))!==0;){if(l===34)return Mr(e,n,e.position,!0),e.position++,!0;if(l===92){if(Mr(e,n,e.position,!0),l=e.input.charCodeAt(++e.position),jn(l))at(e,!1,t);else if(l<256&&D1[l])e.result+=N1[l],e.position++;else if((o=WS(l))>0){for(s=o,i=0;s>0;s--)l=e.input.charCodeAt(++e.position),(o=qS(l))>=0?i=(i<<4)+o:ce(e,"expected hexadecimal character");e.result+=GS(i),e.position++}else ce(e,"unknown escape sequence");n=r=e.position}else jn(l)?(Mr(e,n,r,!0),nf(e,at(e,!1,t)),n=r=e.position):e.position===e.lineStart&&ha(e)?ce(e,"unexpected end of the document within a double quoted scalar"):(e.position++,r=e.position)}ce(e,"unexpected end of the stream within a double quoted scalar")}function JS(e,t){var n=!0,r,s,i,o=e.tag,l,a=e.anchor,c,u,f,p,h,d=Object.create(null),_,C,S,b;if(b=e.input.charCodeAt(e.position),b===91)u=93,h=!1,l=[];else if(b===123)u=125,h=!0,l={};else return!1;for(e.anchor!==null&&(e.anchorMap[e.anchor]=l),b=e.input.charCodeAt(++e.position);b!==0;){if(at(e,!0,t),b=e.input.charCodeAt(e.position),b===u)return e.position++,e.tag=o,e.anchor=a,e.kind=h?"mapping":"sequence",e.result=l,!0;n?b===44&&ce(e,"expected the node content, but found ','"):ce(e,"missed comma between flow collection entries"),C=_=S=null,f=p=!1,b===63&&(c=e.input.charCodeAt(e.position+1),en(c)&&(f=p=!0,e.position++,at(e,!0,t))),r=e.line,s=e.lineStart,i=e.position,Xs(e,t,vl,!1,!0),C=e.tag,_=e.result,at(e,!0,t),b=e.input.charCodeAt(e.position),(p||e.line===r)&&b===58&&(f=!0,b=e.input.charCodeAt(++e.position),at(e,!0,t),Xs(e,t,vl,!1,!0),S=e.result),h?Ds(e,l,d,C,_,S,r,s,i):f?l.push(Ds(e,null,d,C,_,S,r,s,i)):l.push(_),at(e,!0,t),b=e.input.charCodeAt(e.position),b===44?(n=!0,b=e.input.charCodeAt(++e.position)):n=!1}ce(e,"unexpected end of the stream within a flow collection")}function ex(e,t){var n,r,s=qa,i=!1,o=!1,l=t,a=0,c=!1,u,f;if(f=e.input.charCodeAt(e.position),f===124)r=!1;else if(f===62)r=!0;else return!1;for(e.kind="scalar",e.result="";f!==0;)if(f=e.input.charCodeAt(++e.position),f===43||f===45)qa===s?s=f===43?Fp:US:ce(e,"repeat of a chomping mode identifier");else if((u=KS(f))>=0)u===0?ce(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):o?ce(e,"repeat of an indentation width identifier"):(l=t+u-1,o=!0);else break;if(ls(f)){do f=e.input.charCodeAt(++e.position);while(ls(f));if(f===35)do f=e.input.charCodeAt(++e.position);while(!jn(f)&&f!==0)}for(;f!==0;){for(tf(e),e.lineIndent=0,f=e.input.charCodeAt(e.position);(!o||e.lineIndent<l)&&f===32;)e.lineIndent++,f=e.input.charCodeAt(++e.position);if(!o&&e.lineIndent>l&&(l=e.lineIndent),jn(f)){a++;continue}if(e.lineIndent<l){s===Fp?e.result+=pt.repeat(`
|
||||||
|
`,i?1+a:a):s===qa&&i&&(e.result+=`
|
||||||
|
`);break}for(r?ls(f)?(c=!0,e.result+=pt.repeat(`
|
||||||
|
`,i?1+a:a)):c?(c=!1,e.result+=pt.repeat(`
|
||||||
|
`,a+1)):a===0?i&&(e.result+=" "):e.result+=pt.repeat(`
|
||||||
|
`,a):e.result+=pt.repeat(`
|
||||||
|
`,i?1+a:a),i=!0,o=!0,a=0,n=e.position;!jn(f)&&f!==0;)f=e.input.charCodeAt(++e.position);Mr(e,n,e.position,!1)}return!0}function Bp(e,t){var n,r=e.tag,s=e.anchor,i=[],o,l=!1,a;if(e.firstTabInLine!==-1)return!1;for(e.anchor!==null&&(e.anchorMap[e.anchor]=i),a=e.input.charCodeAt(e.position);a!==0&&(e.firstTabInLine!==-1&&(e.position=e.firstTabInLine,ce(e,"tab characters must not be used in indentation")),!(a!==45||(o=e.input.charCodeAt(e.position+1),!en(o))));){if(l=!0,e.position++,at(e,!0,-1)&&e.lineIndent<=t){i.push(null),a=e.input.charCodeAt(e.position);continue}if(n=e.line,Xs(e,t,T1,!1,!0),i.push(e.result),at(e,!0,-1),a=e.input.charCodeAt(e.position),(e.line===n||e.lineIndent>t)&&a!==0)ce(e,"bad indentation of a sequence entry");else if(e.lineIndent<t)break}return l?(e.tag=r,e.anchor=s,e.kind="sequence",e.result=i,!0):!1}function tx(e,t,n){var r,s,i,o,l,a,c=e.tag,u=e.anchor,f={},p=Object.create(null),h=null,d=null,_=null,C=!1,S=!1,b;if(e.firstTabInLine!==-1)return!1;for(e.anchor!==null&&(e.anchorMap[e.anchor]=f),b=e.input.charCodeAt(e.position);b!==0;){if(!C&&e.firstTabInLine!==-1&&(e.position=e.firstTabInLine,ce(e,"tab characters must not be used in indentation")),r=e.input.charCodeAt(e.position+1),i=e.line,(b===63||b===58)&&en(r))b===63?(C&&(Ds(e,f,p,h,d,null,o,l,a),h=d=_=null),S=!0,C=!0,s=!0):C?(C=!1,s=!0):ce(e,"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"),e.position+=1,b=r;else{if(o=e.line,l=e.lineStart,a=e.position,!Xs(e,n,x1,!1,!0))break;if(e.line===i){for(b=e.input.charCodeAt(e.position);ls(b);)b=e.input.charCodeAt(++e.position);if(b===58)b=e.input.charCodeAt(++e.position),en(b)||ce(e,"a whitespace character is expected after the key-value separator within a block mapping"),C&&(Ds(e,f,p,h,d,null,o,l,a),h=d=_=null),S=!0,C=!1,s=!1,h=e.tag,d=e.result;else if(S)ce(e,"can not read an implicit mapping pair; a colon is missed");else return e.tag=c,e.anchor=u,!0}else if(S)ce(e,"can not read a block mapping entry; a multiline key may not be an implicit key");else return e.tag=c,e.anchor=u,!0}if((e.line===i||e.lineIndent>t)&&(C&&(o=e.line,l=e.lineStart,a=e.position),Xs(e,t,El,!0,s)&&(C?d=e.result:_=e.result),C||(Ds(e,f,p,h,d,_,o,l,a),h=d=_=null),at(e,!0,-1),b=e.input.charCodeAt(e.position)),(e.line===i||e.lineIndent>t)&&b!==0)ce(e,"bad indentation of a mapping entry");else if(e.lineIndent<t)break}return C&&Ds(e,f,p,h,d,null,o,l,a),S&&(e.tag=c,e.anchor=u,e.kind="mapping",e.result=f),S}function nx(e){var t,n=!1,r=!1,s,i,o;if(o=e.input.charCodeAt(e.position),o!==33)return!1;if(e.tag!==null&&ce(e,"duplication of a tag property"),o=e.input.charCodeAt(++e.position),o===60?(n=!0,o=e.input.charCodeAt(++e.position)):o===33?(r=!0,s="!!",o=e.input.charCodeAt(++e.position)):s="!",t=e.position,n){do o=e.input.charCodeAt(++e.position);while(o!==0&&o!==62);e.position<e.length?(i=e.input.slice(t,e.position),o=e.input.charCodeAt(++e.position)):ce(e,"unexpected end of the stream within a verbatim tag")}else{for(;o!==0&&!en(o);)o===33&&(r?ce(e,"tag suffix cannot contain exclamation marks"):(s=e.input.slice(t-1,e.position+1),I1.test(s)||ce(e,"named tag handle cannot contain such characters"),r=!0,t=e.position+1)),o=e.input.charCodeAt(++e.position);i=e.input.slice(t,e.position),VS.test(i)&&ce(e,"tag suffix cannot contain flow indicator characters")}i&&!L1.test(i)&&ce(e,"tag name cannot contain such characters: "+i);try{i=decodeURIComponent(i)}catch{ce(e,"tag name is malformed: "+i)}return n?e.tag=i:Hr.call(e.tagMap,s)?e.tag=e.tagMap[s]+i:s==="!"?e.tag="!"+i:s==="!!"?e.tag="tag:yaml.org,2002:"+i:ce(e,'undeclared tag handle "'+s+'"'),!0}function rx(e){var t,n;if(n=e.input.charCodeAt(e.position),n!==38)return!1;for(e.anchor!==null&&ce(e,"duplication of an anchor property"),n=e.input.charCodeAt(++e.position),t=e.position;n!==0&&!en(n)&&!Ls(n);)n=e.input.charCodeAt(++e.position);return e.position===t&&ce(e,"name of an anchor node must contain at least one character"),e.anchor=e.input.slice(t,e.position),!0}function sx(e){var t,n,r;if(r=e.input.charCodeAt(e.position),r!==42)return!1;for(r=e.input.charCodeAt(++e.position),t=e.position;r!==0&&!en(r)&&!Ls(r);)r=e.input.charCodeAt(++e.position);return e.position===t&&ce(e,"name of an alias node must contain at least one character"),n=e.input.slice(t,e.position),Hr.call(e.anchorMap,n)||ce(e,'unidentified alias "'+n+'"'),e.result=e.anchorMap[n],at(e,!0,-1),!0}function Xs(e,t,n,r,s){var i,o,l,a=1,c=!1,u=!1,f,p,h,d,_,C;if(e.listener!==null&&e.listener("open",e),e.tag=null,e.anchor=null,e.kind=null,e.result=null,i=o=l=El===n||T1===n,r&&at(e,!0,-1)&&(c=!0,e.lineIndent>t?a=1:e.lineIndent===t?a=0:e.lineIndent<t&&(a=-1)),a===1)for(;nx(e)||rx(e);)at(e,!0,-1)?(c=!0,l=i,e.lineIndent>t?a=1:e.lineIndent===t?a=0:e.lineIndent<t&&(a=-1)):l=!1;if(l&&(l=c||s),(a===1||El===n)&&(vl===n||x1===n?_=t:_=t+1,C=e.position-e.lineStart,a===1?l&&(Bp(e,C)||tx(e,C,_))||JS(e,_)?u=!0:(o&&ex(e,_)||XS(e,_)||QS(e,_)?u=!0:sx(e)?(u=!0,(e.tag!==null||e.anchor!==null)&&ce(e,
Line truncated
|
||||||
|
`),e.charCodeAt(0)===65279&&(e=e.slice(1)));var n=new YS(e,t),r=e.indexOf("\0");for(r!==-1&&(n.position=r,ce(n,"null byte is not allowed in input")),n.input+="\0";n.input.charCodeAt(n.position)===32;)n.lineIndent+=1,n.position+=1;for(;n.position<n.length-1;)ix(n);return n.documents}function ox(e,t,n){t!==null&&typeof t=="object"&&typeof n>"u"&&(n=t,t=null);var r=F1(e,n);if(typeof t!="function")return r;for(var s=0,i=r.length;s<i;s+=1)t(r[s])}function lx(e,t){var n=F1(e,t);if(n.length!==0){if(n.length===1)return n[0];throw new Vt("expected a single document in the stream, but found more")}}var ax=ox,cx=lx,R1={loadAll:ax,load:cx},P1=Object.prototype.toString,M1=Object.prototype.hasOwnProperty,rf=65279,ux=9,Qi=10,fx=13,hx=32,px=33,dx=34,zc=35,mx=37,gx=38,_x=39,yx=42,$1=44,bx=45,wl=58,kx=61,vx=62,Ex=63,Cx=64,B1=91,z1=93,wx=96,U1=123,Ax=124,H1=125,$t={};$t[0]="\\0";$t[7]="\\a";$t[8]="\\b";$t[9]="\\t";$t[10]="\\n";$t[11]="\\v";$t[12]="\\f";$t[13]="\\r";$t[27]="\\e";$t[34]='\\"';$t[92]="\\\\";$t[133]="\\N";$t[160]="\\_";$t[8232]="\\L";$t[8233]="\\P";var Sx=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"],xx=/^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;function Tx(e,t){var n,r,s,i,o,l,a;if(t===null)return{};for(n={},r=Object.keys(t),s=0,i=r.length;s<i;s+=1)o=r[s],l=String(t[o]),o.slice(0,2)==="!!"&&(o="tag:yaml.org,2002:"+o.slice(2)),a=e.compiledTypeMap.fallback[o],a&&M1.call(a.styleAliases,l)&&(l=a.styleAliases[l]),n[o]=l;return n}function Ix(e){var t,n,r;if(t=e.toString(16).toUpperCase(),e<=255)n="x",r=2;else if(e<=65535)n="u",r=4;else if(e<=4294967295)n="U",r=8;else throw new Vt("code point within a string may not be greater than 0xFFFFFFFF");return"\\"+n+pt.repeat("0",r-t.length)+t}var Lx=1,Ji=2;function Dx(e){this.schema=e.schema||ef,this.indent=Math.max(1,e.indent||2),this.noArrayIndent=e.noArrayIndent||!1,this.skipInvalid=e.skipInvalid||!1,this.flowLevel=pt.isNothing(e.flowLevel)?-1:e.flowLevel,this.styleMap=Tx(this.schema,e.styles||null),this.sortKeys=e.sortKeys||!1,this.lineWidth=e.lineWidth||80,this.noRefs=e.noRefs||!1,this.noCompatMode=e.noCompatMode||!1,this.condenseFlow=e.condenseFlow||!1,this.quotingType=e.quotingType==='"'?Ji:Lx,this.forceQuotes=e.forceQuotes||!1,this.replacer=typeof e.replacer=="function"?e.replacer:null,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result="",this.duplicates=[],this.usedDuplicates=null}function zp(e,t){for(var n=pt.repeat(" ",t),r=0,s=-1,i="",o,l=e.length;r<l;)s=e.indexOf(`
|
||||||
|
`,r),s===-1?(o=e.slice(r),r=l):(o=e.slice(r,s+1),r=s+1),o.length&&o!==`
|
||||||
|
`&&(i+=n),i+=o;return i}function Uc(e,t){return`
|
||||||
|
`+pt.repeat(" ",e.indent*t)}function Nx(e,t){var n,r,s;for(n=0,r=e.implicitTypes.length;n<r;n+=1)if(s=e.implicitTypes[n],s.resolve(t))return!0;return!1}function Al(e){return e===hx||e===ux}function eo(e){return 32<=e&&e<=126||161<=e&&e<=55295&&e!==8232&&e!==8233||57344<=e&&e<=65533&&e!==rf||65536<=e&&e<=1114111}function Up(e){return eo(e)&&e!==rf&&e!==fx&&e!==Qi}function Hp(e,t,n){var r=Up(e),s=r&&!Al(e);return(n?r:r&&e!==$1&&e!==B1&&e!==z1&&e!==U1&&e!==H1)&&e!==zc&&!(t===wl&&!s)||Up(t)&&!Al(t)&&e===zc||t===wl&&s}function Ox(e){return eo(e)&&e!==rf&&!Al(e)&&e!==bx&&e!==Ex&&e!==wl&&e!==$1&&e!==B1&&e!==z1&&e!==U1&&e!==H1&&e!==zc&&e!==gx&&e!==yx&&e!==px&&e!==Ax&&e!==kx&&e!==vx&&e!==_x&&e!==dx&&e!==mx&&e!==Cx&&e!==wx}function Fx(e){return!Al(e)&&e!==wl}function yi(e,t){var n=e.charCodeAt(t),r;return n>=55296&&n<=56319&&t+1<e.length&&(r=e.charCodeAt(t+1),r>=56320&&r<=57343)?(n-55296)*1024+r-56320+65536:n}function j1(e){var t=/^\n* /;return t.test(e)}var V1=1,Hc=2,q1=3,W1=4,xs=5;function Rx(e,t,n,r,s,i,o,l){var a,c=0,u=null,f=!1,p=!1,h=r!==-1,d=-1,_=Ox(yi(e,0))&&Fx(yi(e,e.length-1));if(t||o)for(a=0;a<e.length;c>=65536?a+=2:a++){if(c=yi(e,a),!eo(c))return xs;_=_&&Hp(c,u,l),u=c}else{for(a=0;a<e.length;c>=65536?a+=2:a++){if(c=yi(e,a),c===Qi)f=!0,h&&(p=p||a-d-1>r&&e[d+1]!==" ",d=a);else if(!eo(c))return xs;_=_&&Hp(c,u,l),u=c}p=p||h&&a-d-1>r&&e[d+1]!==" "}return!f&&!p?_&&!o&&!s(e)?V1:i===Ji?xs:Hc:n>9&&j1(e)?xs:o?i===Ji?xs:Hc:p?W1:q1}function Px(e,t,n,r,s){e.dump=function(){if(t.length===0)return e.quotingType===Ji?'""':"''";if(!e.noCompatMode&&(Sx.indexOf(t)!==-1||xx.test(t)))return e.quotingType===Ji?'"'+t+'"':"'"+t+"'";var i=e.indent*Math.max(1,n),o=e.lineWidth===-1?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-i),l=r||e.flowLevel>-1&&n>=e.flowLevel;function a(c){return Nx(e,c)}switch(Rx(t,l,e.indent,o,a,e.quotingType,e.forceQuotes&&!r,s)){case V1:return t;case Hc:return"'"+t.replace(/'/g,"''")+"'";case q1:return"|"+jp(t,e.indent)+Vp(zp(t,i));case W1:return">"+jp(t,e.indent)+Vp(zp(Mx(t,o),i));case xs:return'"'+$x(t)+'"';default:throw new Vt("impossible error: invalid scalar style")}}()}function jp(e,t){var n=j1(e)?String(t):"",r=e[e.length-1]===`
|
||||||
|
`,s=r&&(e[e.length-2]===`
|
||||||
|
`||e===`
|
||||||
|
`),i=s?"+":r?"":"-";return n+i+`
|
||||||
|
`}function Vp(e){return e[e.length-1]===`
|
||||||
|
`?e.slice(0,-1):e}function Mx(e,t){for(var n=/(\n+)([^\n]*)/g,r=function(){var c=e.indexOf(`
|
||||||
|
`);return c=c!==-1?c:e.length,n.lastIndex=c,qp(e.slice(0,c),t)}(),s=e[0]===`
|
||||||
|
`||e[0]===" ",i,o;o=n.exec(e);){var l=o[1],a=o[2];i=a[0]===" ",r+=l+(!s&&!i&&a!==""?`
|
||||||
|
`:"")+qp(a,t),s=i}return r}function qp(e,t){if(e===""||e[0]===" ")return e;for(var n=/ [^ ]/g,r,s=0,i,o=0,l=0,a="";r=n.exec(e);)l=r.index,l-s>t&&(i=o>s?o:l,a+=`
|
||||||
|
`+e.slice(s,i),s=i+1),o=l;return a+=`
|
||||||
|
`,e.length-s>t&&o>s?a+=e.slice(s,o)+`
|
||||||
|
`+e.slice(o+1):a+=e.slice(s),a.slice(1)}function $x(e){for(var t="",n=0,r,s=0;s<e.length;n>=65536?s+=2:s++)n=yi(e,s),r=$t[n],!r&&eo(n)?(t+=e[s],n>=65536&&(t+=e[s+1])):t+=r||Ix(n);return t}function Bx(e,t,n){var r="",s=e.tag,i,o,l;for(i=0,o=n.length;i<o;i+=1)l=n[i],e.replacer&&(l=e.replacer.call(n,String(i),l)),(_r(e,t,l,!1,!1)||typeof l>"u"&&_r(e,t,null,!1,!1))&&(r!==""&&(r+=","+(e.condenseFlow?"":" ")),r+=e.dump);e.tag=s,e.dump="["+r+"]"}function Wp(e,t,n,r){var s="",i=e.tag,o,l,a;for(o=0,l=n.length;o<l;o+=1)a=n[o],e.replacer&&(a=e.replacer.call(n,String(o),a)),(_r(e,t+1,a,!0,!0,!1,!0)||typeof a>"u"&&_r(e,t+1,null,!0,!0,!1,!0))&&((!r||s!=="")&&(s+=Uc(e,t)),e.dump&&Qi===e.dump.charCodeAt(0)?s+="-":s+="- ",s+=e.dump);e.tag=i,e.dump=s||"[]"}function zx(e,t,n){var r="",s=e.tag,i=Object.keys(n),o,l,a,c,u;for(o=0,l=i.length;o<l;o+=1)u="",r!==""&&(u+=", "),e.condenseFlow&&(u+='"'),a=i[o],c=n[a],e.replacer&&(c=e.replacer.call(n,a,c)),_r(e,t,a,!1,!1)&&(e.dump.length>1024&&(u+="? "),u+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),_r(e,t,c,!1,!1)&&(u+=e.dump,r+=u));e.tag=s,e.dump="{"+r+"}"}function Ux(e,t,n,r){var s="",i=e.tag,o=Object.keys(n),l,a,c,u,f,p;if(e.sortKeys===!0)o.sort();else if(typeof e.sortKeys=="function")o.sort(e.sortKeys);else if(e.sortKeys)throw new Vt("sortKeys must be a boolean or a function");for(l=0,a=o.length;l<a;l+=1)p="",(!r||s!=="")&&(p+=Uc(e,t)),c=o[l],u=n[c],e.replacer&&(u=e.replacer.call(n,c,u)),_r(e,t+1,c,!0,!0,!0)&&(f=e.tag!==null&&e.tag!=="?"||e.dump&&e.dump.length>1024,f&&(e.dump&&Qi===e.dump.charCodeAt(0)?p+="?":p+="? "),p+=e.dump,f&&(p+=Uc(e,t)),_r(e,t+1,u,!0,f)&&(e.dump&&Qi===e.dump.charCodeAt(0)?p+=":":p+=": ",p+=e.dump,s+=p));e.tag=i,e.dump=s||"{}"}function Kp(e,t,n){var r,s,i,o,l,a;for(s=n?e.explicitTypes:e.implicitTypes,i=0,o=s.length;i<o;i+=1)if(l=s[i],(l.instanceOf||l.predicate)&&(!l.instanceOf||typeof t=="object"&&t instanceof l.instanceOf)&&(!l.predicate||l.predicate(t))){if(n?l.multi&&l.representName?e.tag=l.representName(t):e.tag=l.tag:e.tag="?",l.represent){if(a=e.styleMap[l.tag]||l.defaultStyle,P1.call(l.represent)==="[object Function]")r=l.represent(t,a);else if(M1.call(l.represent,a))r=l.represent[a](t,a);else throw new Vt("!<"+l.tag+'> tag resolver accepts not "'+a+'" style');e.dump=r}return!0}return!1}function _r(e,t,n,r,s,i,o){e.tag=null,e.dump=n,Kp(e,n,!1)||Kp(e,n,!0);var l=P1.call(e.dump),a=r,c;r&&(r=e.flowLevel<0||e.flowLevel>t);var u=l==="[object Object]"||l==="[object Array]",f,p;if(u&&(f=e.duplicates.indexOf(n),p=f!==-1),(e.tag!==null&&e.tag!=="?"||p||e.indent!==2&&t>0)&&(s=!1),p&&e.usedDuplicates[f])e.dump="*ref_"+f;else{if(u&&p&&!e.usedDuplicates[f]&&(e.usedDuplicates[f]=!0),l==="[object Object]")r&&Object.keys(e.dump).length!==0?(Ux(e,t,e.dump,s),p&&(e.dump="&ref_"+f+e.dump)):(zx(e,t,e.dump),p&&(e.dump="&ref_"+f+" "+e.dump));else if(l==="[object Array]")r&&e.dump.length!==0?(e.noArrayIndent&&!o&&t>0?Wp(e,t-1,e.dump,s):Wp(e,t,e.dump,s),p&&(e.dump="&ref_"+f+e.dump)):(Bx(e,t,e.dump),p&&(e.dump="&ref_"+f+" "+e.dump));else if(l==="[object String]")e.tag!=="?"&&Px(e,e.dump,t,i,a);else{if(l==="[object Undefined]"||e.skipInvalid)return!1;throw new Vt("unacceptable kind of an object to dump "+l)}e.tag!==null&&e.tag!=="?"&&(c=encodeURI(e.tag[0]==="!"?e.tag.slice(1):e.tag).replace(/!/g,"%21"),e.tag[0]==="!"?c="!"+c:c.slice(0,18)==="tag:yaml.org,2002:"?c="!!"+c.slice(18):c="!<"+c+">",e.dump=c+" "+e.dump)}return!0}function Hx(e,t){var n=[],r=[],s,i;for(jc(e,n,r),s=0,i=r.length;s<i;s+=1)t.duplicates.push(n[r[s]]);t.usedDuplicates=new Array(i)}function jc(e,t,n){var r,s,i;if(e!==null&&typeof e=="object")if(s=t.indexOf(e),s!==-1)n.indexOf(s)===-1&&n.push(s);else if(t.push(e),Array.isArray(e))for(s=0,i=e.length;s<i;s+=1)jc(e[s],t,n);else for(r=Object.keys(e),s=0,i=r.length;s<i;s+=1)jc(e[r[s]],t,n)}function jx(e,t){t=t||{};var n=new Dx(t);n.noRefs||Hx(e,n);var r=e;return n.replacer&&(r=n.replacer.call({"":r},"",r)),_r(n,0,r,!0,!0)?n.dump+`
|
||||||
|
`:""}var Vx=jx,qx={dump:Vx};function sf(e,t){return function(){throw new Error("Function yaml."+e+" is removed in js-yaml 4. Use yaml."+t+" instead, which is now safe by default.")}}var Wx=xt,Kx=a1,Gx=h1,Yx=_1,Zx=y1,Xx=ef,Qx=R1.load,Jx=R1.loadAll,eT=qx.dump,tT=Vt,nT={binary:C1,float:g1,map:f1,null:p1,pairs:A1,set:S1,timestamp:v1,bool:d1,int:m1,merge:E1,omap:w1,seq:u1,str:c1},rT=sf("safeLoad","load"),sT=sf("safeLoadAll","loadAll"),iT=sf("safeDump","dump"),oT={Type:Wx,Schema:Kx,FAILSAFE_SCHEMA:Gx,JSON_SCHEMA:Yx,CORE_SCHEMA:Zx,DEFAULT_SCHEMA:Xx,load:Qx,loadAll:Jx,dump:eT,YAMLException:tT,types:nT,safeLoad:rT,safeLoadAll:sT,safeDump:iT};const tr={OPENAI:"openai",CLAUDE:"claude",GEMINI:"gemini",DEEPSEEK:"deepseek",DEEPSEEK_V3:"deepseek-v3",DEEPSEEK_REASONER:"deepseek-reasoner",CUSTOM:"custom"},Wo={enabled:!1,provider:tr.OPENAI,systemPrompt:`你是Vue Docs UI文档网站的AI助手。你的任务是帮助用户理解文档内容,回答技术问题,并提供有用的指导。
|
||||||
|
|
||||||
|
请遵循以下原则:
|
||||||
|
1. 提供准确、有用的技术信息
|
||||||
|
2. 保持友好、专业的语调
|
||||||
|
3. 如果不确定答案,请诚实地说明
|
||||||
|
4. 尽量给出具体的代码示例或步骤
|
||||||
|
5. 使用中文回答问题
|
||||||
|
|
||||||
|
你特别擅长回答关于:
|
||||||
|
- Vue.js 开发
|
||||||
|
- 组件库使用
|
||||||
|
- 文档编写和维护
|
||||||
|
- 前端开发最佳实践
|
||||||
|
- 技术概念解释`,models:{[tr.OPENAI]:{modelId:"gpt-3.5-turbo",apiKey:"",baseUrl:"https://api.openai.com/v1",maxTokens:4e3,temperature:.7},[tr.CLAUDE]:{modelId:"claude-3-sonnet-20240229",apiKey:"",baseUrl:"https://api.anthropic.com",maxTokens:4e3,temperature:.7},[tr.GEMINI]:{modelId:"gemini-pro",apiKey:"",baseUrl:"https://generativelanguage.googleapis.com/v1",maxTokens:4e3,temperature:.7},[tr.DEEPSEEK]:{modelId:"deepseek-chat",apiKey:"",baseUrl:"https://api.deepseek.com",maxTokens:4e3,temperature:.7},[tr.DEEPSEEK_V3]:{modelId:"deepseek-chat",apiKey:"",baseUrl:"https://api.deepseek.com",maxTokens:4e3,temperature:.7},[tr.DEEPSEEK_REASONER]:{modelId:"deepseek-reasoner",apiKey:"",baseUrl:"https://api.deepseek.com",maxTokens:4e3,temperature:.7},[tr.CUSTOM]:{modelId:"",apiKey:"",baseUrl:"",maxTokens:4e3,temperature:.7}},features:{chatAssistant:!0,documentSummary:!0,codeExplanation:!0,searchEnhancement:!1},ui:{position:"bottom-right",theme:"auto",size:"medium"}};let an=null;async function K1(){if(an)return an;try{let e=Wo;const t=await fetch("/config/ai.json");if(t.ok){const r=await t.json();e={...Wo,...r}}const n=localStorage.getItem("vue-docs-ai-config");if(n){const r=JSON.parse(n);r.models&&Object.keys(r.models).forEach(s=>{e.models[s]&&(e.models[s]={...e.models[s],...r.models[s]})}),r.provider&&(e.provider=r.provider),r.systemPrompt}return an=e,an}catch(e){console.error("❌ AI配置加载失败,使用默认配置:",e)}return an=Wo,an}function pa(){return an||Wo}function lT(){return an=null,K1()}function vs(e){an={...an,...e};const t={...an};return delete t.systemPrompt,localStorage.setItem("vue-docs-ai-config",JSON.stringify(t)),an}function sO(){const e=pa();return{provider:e.provider,...e.models[e.provider]}}function G1(e){var t;const n=[],r=Object.values(tr);(!e.provider||!r.includes(e.provider))&&n.push("settings.errors.invalidProvider");const s=(t=e.models)==null?void 0:t[e.provider];return s?((!s.apiKey||s.apiKey.trim()==="")&&n.push("settings.errors.missingApiKey"),(!s.modelId||s.modelId.trim()==="")&&n.push("settings.errors.missingModelId"),(!s.baseUrl||s.baseUrl.trim()==="")&&n.push("settings.errors.missingBaseUrl")):n.push("settings.errors.missingProviderConfig"),{isValid:n.length===0,errors:n}}async function aT(){const e=G1(pa());if(!e.isValid)return{success:!1,message:e.errors.join(", ")};try{const{testAIConnection:t}=await A0(()=>import("./aiService-C9Fe_Phd-d1533d53.js"),[]);return await t()}catch(t){return{success:!1,message:`settings.errors.connectionFailed: ${t.message}`}}}typeof window<"u"&&(window.debugAI={async reloadConfig(){return await lT()},async testSystemPrompt(){return(await K1()).systemPrompt},getCurrentConfig(){return pa()},clearCache(){an=null},checkLocalStorage(){const e=localStorage.getItem("vue-docs-ai-config");if(e){const t=JSON.parse(e);return t.systemPrompt,t}else return null},cleanLocalStorage(){localStorage.removeItem("vue-docs-ai-config")},async fullReset(){return this.cleanLocalStorage(),this.clearCache(),await this.reloadConfig()}});let lt=null,Ko=null;function Y1(){lt=null,Ko=null}function cT(){return localStorage.getItem("language")||((navigator.language||navigator.userLanguage).startsWith("zh")?"zh":"en")}async function ii(e=null){const t=e||cT();if(Ko&&Ko!==t&&Y1(),Ko=t,lt)return lt;try{const n=await fetch(t==="en"?"/config/site.en.yaml":"/config/site.yaml");if(!n.ok)throw new Error(`HTTP ${n.status}: ${n.statusText}`);const r=await n.text();if(lt=oT.load(r),!lt)throw new Error("YAML解析返回空值");return Yp(lt),lt}catch(n){return console.error("配置加载失败,使用默认配置:",n),lt=pT(t),Yp(lt),lt}}function of(){return(lt==null?void 0:lt.site)||{}}function Z1(){return(lt==null?void 0:lt.navbar)||{}}function uT(){return(lt==null?void 0:lt.sidebar)||{}}function Gp(){return(lt==null?void 0:lt.toc)||{maxLevel:2,enabled:!0,title:"目录"}}function fT(){if(!lt)return{enabled:!0,copyright:"© 2024 Documentation Site. All rights reserved.",links:[],social:[],repository:{url:"https://github.com/shenjianZ/vue-docs-ui",branch:"master"}};const e=lt.footer||{enabled:!0,copyright:"© 2024 Documentation Site. All rights reserved.",links:[],social:[],repository:{url:"https://github.com/shenjianZ/vue-docs-ui",branch:"master"}};return e.repository||(e.repository={url:"https://github.com/shenjianZ/vue-docs-ui",branch:"master"}),e}async function hT(e){return Y1(),await ii(e)}function Yp(e){const t=(e==null?void 0:e.theme)||{};if(!t.theme&&!t.defaultMode)return;const n=document.body;t.theme&&t.theme!=="default"&&(n.classList.remove("theme-vue","theme-github","theme-purple","theme-orange","theme-emerald"),n.classList.add(`theme-${t.theme}`)),t.defaultMode&&(t.defaultMode==="dark"?n.classList.add("dark"):t.defaultMode==="light"?n.classList.remove("dark"):t.defaultMode==="auto"&&(window.matchMedia("(prefers-color-scheme: dark)").matches?n.classList.add("dark"):n.classList.remove("dark")))}function pT(e="zh"){const t=e==="en";return{site:{title:t?"Documentation Site":
Line truncated
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const Zp=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),yT=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(t,n,r)=>r?r.toUpperCase():n.toLowerCase()),bT=e=>{const t=yT(e);return t.charAt(0).toUpperCase()+t.slice(1)},kT=(...e)=>e.filter((t,n,r)=>!!t&&t.trim()!==""&&r.indexOf(t)===n).join(" ").trim();/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/var Oo={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const vT=({size:e,strokeWidth:t=2,absoluteStrokeWidth:n,color:r,iconNode:s,name:i,class:o,...l},{slots:a})=>Dt("svg",{...Oo,width:e||Oo.width,height:e||Oo.height,stroke:r||Oo.stroke,"stroke-width":n?Number(t)*24/Number(e):t,class:kT("lucide",...i?[`lucide-${Zp(bT(i))}-icon`,`lucide-${Zp(i)}`]:["lucide-icon"]),...l},[...s.map(c=>Dt(...c)),...a.default?[a.default()]:[]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const Le=(e,t)=>(n,{slots:r})=>Dt(vT,{...n,iconNode:t,name:e},r);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const ET=Le("arrow-up",[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const af=Le("bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const X1=Le("check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const Q1=Le("chevron-down",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const CT=Le("circle-alert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const wT=Le("circle-check-big",[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335",key:"yps3ct"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const AT=Le("clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const ST=Le("external-link",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const xT=Le("eye-off",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const TT=Le("eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const IT=Le("file-search",[["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M4.268 21a2 2 0 0 0 1.727 1H18a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v3",key:"ms7g94"}],["path",{d:"m9 18-1.5-1.5",key:"1j6qii"}],["circle",{cx:"5",cy:"14",r:"3",key:"ufru5t"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const J1=Le("file-text",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const e_=Le("github",[["path",{d:"M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4",key:"tonef"}],["path",{d:"M9 18c-4.51 2-5-2-7-2",key:"9comsn"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const LT=Le("mail",[["path",{d:"m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7",key:"132q7q"}],["rect",{x:"2",y:"4",width:"20",height:"16",rx:"2",key:"izxlao"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const DT=Le("menu",[["path",{d:"M4 12h16",key:"1lakjw"}],["path",{d:"M4 18h16",key:"19g7jn"}],["path",{d:"M4 6h16",key:"1o0s65"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const Sl=Le("message-circle",[["path",{d:"M7.9 20A9 9 0 1 0 4 16.1L2 22Z",key:"vv11sd"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const t_=Le("moon",[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const NT=Le("palette",[["path",{d:"M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z",key:"e79jfc"}],["circle",{cx:"13.5",cy:"6.5",r:".5",fill:"currentColor",key:"1okk4w"}],["circle",{cx:"17.5",cy:"10.5",r:".5",fill:"currentColor",key:"f64h9f"}],["circle",{cx:"6.5",cy:"12.5",r:".5",fill:"currentColor",key:"qy21gx"}],["circle",{cx:"8.5",cy:"7.5",r:".5",fill:"currentColor",key:"fotxhn"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const OT=Le("pause",[["rect",{x:"14",y:"4",width:"4",height:"16",rx:"1",key:"zuxfzm"}],["rect",{x:"6",y:"4",width:"4",height:"16",rx:"1",key:"1okwgv"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const FT=Le("play",[["polygon",{points:"6 3 20 12 6 21 6 3",key:"1oa8hb"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const RT=Le("plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const PT=Le("save",[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const cf=Le("search",[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const n_=Le("send",[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const MT=Le("settings",[["path",{d:"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z",key:"1qme2f"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const r_=Le("sun",[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const $T=Le("thumbs-down",[["path",{d:"M17 14V2",key:"8ymqnk"}],["path",{d:"M9 18.12 10 14H4.17a2 2 0 0 1-1.92-2.56l2.33-8A2 2 0 0 1 6.5 2H20a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2.76a2 2 0 0 0-1.79 1.11L12 22a3.13 3.13 0 0 1-3-3.88Z",key:"m61m77"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const Xp=Le("thumbs-up",[["path",{d:"M7 10v12",key:"1qc93n"}],["path",{d:"M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88Z",key:"emmmcr"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const BT=Le("trending-up",[["path",{d:"M16 7h6v6",key:"box55l"}],["path",{d:"m22 7-8.5 8.5-5-5L2 17",key:"1t1m79"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const zT=Le("twitter",[["path",{d:"M22 4s-.7 2.1-2 3.4c1.6 10-9.4 17.3-18 11.6 2.2.1 4.4-.6 6-2C3 15.5.5 9.6 3 5c2.2 2.6 5.6 4.1 9 4-.9-4.2 4-6.6 7-3.8 1.1 0 3-1.2 3-1.2z",key:"pff0z6"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const UT=Le("users",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744",key:"16gr8j"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const ma=Le("x",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);/**
|
||||||
|
* @license lucide-vue-next v0.511.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/const HT=Le("zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]),rn=(e,t)=>{const n=e.__vccOpts||e;for(const[r,s]of t)n[r]=s;return n},jT={name:"LanguageSwitcher",components:{ChevronDown:Q1,Check:X1},setup(){const{locale:e,t}=mn(),n=te(!1),r=te(null),s=pe(()=>gT()),i=pe(()=>_T(s.value)),o=()=>{n.value=!n.value},l=u=>{mT(u),n.value=!1},a=u=>{r.value&&!r.value.contains(u.target)&&(n.value=!1)},c=u=>{u.key==="Escape"&&n.value&&(n.value=!1)};return gt(()=>{document.addEventListener("click",a),document.addEventListener("keydown",c)}),Mt(()=>{document.removeEventListener("click",a),document.removeEventListener("keydown",c)}),{isOpen:n,switcherRef:r,currentLocale:s,currentLocaleInfo:i,SUPPORTED_LOCALES:da,toggleDropdown:o,switchLanguage:l,t}}},VT={class:"language-switcher",ref:"switcherRef"},qT=["title","aria-expanded"],WT={class:"current-flag"},KT={class:"current-name"},GT={key:0,class:"language-dropdown"},YT={class:"dropdown-header"},ZT={class:"language-list"},XT=["onClick","aria-pressed"],QT={class:"locale-flag"},JT={class:"locale-name"};function e3(e,t,n,r,s,i){var o,l;const a=$e("ChevronDown"),c=$e("Check");return B(),q("div",VT,[I("button",{class:"language-btn",onClick:t[0]||(t[0]=(...u)=>r.toggleDropdown&&r.toggleDropdown(...u)),title:r.t("nav.language"),"aria-expanded":r.isOpen,"aria-haspopup":"true"},[I("span",WT,W((o=r.currentLocaleInfo)==null?void 0:o.flag),1),I("span",KT,W((l=r.currentLocaleInfo)==null?void 0:l.name),1),X(a,{size:14,class:Se(["dropdown-icon",{rotate:r.isOpen}])},null,8,["class"])],8,qT),X(Xl,{name:"dropdown"},{default:Ot(()=>[r.isOpen?(B(),q("div",GT,[I("div",YT,[I("span",null,W(r.t("nav.language")),1)]),I("ul",ZT,[(B(!0),q(Ce,null,wt(r.SUPPORTED_LOCALES,u=>(B(),q("li",{key:u.code,class:Se(["language-item",{active:u.code===r.currentLocale}])},[I("button",{class:"language-option",onClick:f=>r.switchLanguage(u.code),"aria-pressed":u.code===r.currentLocale},[I("span",QT,W(u.flag),1),I("span",JT,W(u.name),1),u.code===r.currentLocale?(B(),Be(c,{key:0,size:16,class:"check-icon"})):de("",!0)],8,XT)],2))),128))])])):de("",!0)]),_:1})],512)}const t3=rn(jT,[["render",e3],["__scopeId","data-v-1ebf0c47"]]),n3={key:0,class:"theme-switcher"},r3={class:"theme-label"},s3={key:0,class:"theme-dropdown"},i3={key:0,class:"theme-options"},o3=["onClick"],l3={class:"theme-preview"},a3={class:"theme-info"},c3={class:"theme-name"},u3={class:"theme-desc"},f3={key:1,class:"theme-modes"},h3={__name:"ThemeSwitcher",props:{visible:{type:Boolean,default:!0},allowThemeToggle:{type:Boolean,default:!0},allowModeToggle:{type:Boolean,default:!0}},setup(e){const{t}=mn(),n=e,r=tt("docsConfig",{}),s=te(!1),i=te("default"),o=te(!1),l=pe(()=>[{id:"default",name:t("theme.themes.default.name"),description:t("theme.themes.default.description"),colors:{primary:"#3b82f6",accent:"#10b981"}},{id:"vue",name:t("theme.themes.vue.name"),description:t("theme.themes.vue.description"),colors:{primary:"#41b883",accent:"#35495e"}},{id:"github",name:t("theme.themes.github.name"),description:t("theme.themes.github.description"),colors:{primary:"#0969da",accent:"#6f42c1"}},{id:"purple",name:t("theme.themes.purple.name"),description:t("theme.themes.purple.description"),colors:{primary:"#8b5cf6",accent:"#ec4899"}},{id:"orange",name:t("theme.themes.orange.name"),description:t("theme.themes.orange.description"),colors:{primary:"#ea580c",accent:"#dc2626"}},{id:"emerald",name:t("theme.themes.emerald.name"),description:t("theme.themes.emerald.description"),colors:{primary:"#059669",accent:"#0d9488"}}]),a=pe(()=>{const m=l.value.find(y=>y.id===i.value);return m?m.name:t("theme.themes.default.name")}),c=pe(()=>{if(!n.visible)return!1;const m=(r==null?void 0:r.theme)||{};return!(m.showThemeSwitcher===!1||m.allowToggle===!1&&!n.allowThemeToggle&&!n.allowModeToggle)}),u=()=>{s.value=!s.value,s.value&&qn(()=>{f()})},f=()=>{const m=document.querySelector(".theme-switcher"),y=document.querySelector(".theme-dropdown");if(!m||!y||window.innerWidth>768)return;const k=m.getBoundingClientRect(),T=240,L=window.innerWidth,A=16;m.classList.remove("align-left","align-right"),k.right-T<A?m.classList.add("align-left"):(k.left+T>L-A,m.classList.add("align-right"))},p=()=>{s.value=!1},h=m=>{i.value=m,_(),p(),localStorage.setItem("vue-docs-theme",m)},d=()=>{o.value=!o.value,_(),localStorage.setItem("vue-docs-dark",o.value.toString())},_=()=>{const m=document.body;m.classList.remove("theme-vue","theme-github","theme-purple","theme-orange","theme-emerald"),i.value!=="default"&&m.classList.add(`theme-${i.value}`),o.value?m.classList.add("dark"):m.classList.remove("dark")},C=()=>{const m=(r==null?void 0:r.theme)||{},y=localStorage.getItem("vue-docs-theme"),k=localStorage.getItem("vue-docs-dark");y&&l.value.find(T=>T.id===y)?i.value=y:m.theme&&l.value.find(T=>T.id===m.theme)&&(i.value=m.theme),k!==null?o.value=k==="true":m.defaultMode?mLine truncated
|
||||||
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||||
|
<polyline points="6,9 12,15 18,9"></polyline>
|
||||||
|
</svg>
|
||||||
|
`},D3={name:"SidebarNav",components:{ChevronIcon:L3},props:{isOpen:{type:Boolean,default:!1},uniqueExpansion:{type:Boolean,default:!0}},emits:["close"],setup(e,{emit:t}){const n=ri(),r=te([]),s=Ht(new Set),i=u=>{if(!u)return!1;const f=n.path;return!!(f===u||u!=="/books"&&f.startsWith(u+"/"))},o=u=>{var f;((f=u.children)==null?void 0:f.length)>0&&(s.has(u.title)?s.delete(u.title):(e.uniqueExpansion&&s.clear(),s.add(u.title)))},l=()=>{const u=n.path;s.clear(),r.value.forEach(f=>{var p,h;(f.path&&u.startsWith(f.path)||(p=f.children)!=null&&p.some(d=>u===d.path||u.startsWith(d.path+"/")))&&((h=f.children)==null?void 0:h.length)>0&&s.add(f.title)})},a=async()=>{try{await ii();const u=uT();u&&u.sections&&(r.value=u.sections,l())}catch(u){console.error("Failed to load sidebar config:",u)}},c=()=>{a()};return gt(()=>{a(),window.addEventListener("locale-changed",c)}),Mt(()=>{window.removeEventListener("locale-changed",c)}),At(()=>n.path,()=>{l()}),{sections:r,expandedSections:s,isActive:i,toggleSection:o}}},N3={class:"sidebar-content"},O3={class:"nav-sections"},F3={class:"section-title"},R3=["onClick"],P3={class:"section-title"},M3={key:0,class:"section-children"},$3={class:"child-title"};function B3(e,t,n,r,s,i){const o=$e("ChevronIcon"),l=$e("router-link");return B(),q("aside",{class:Se(["sidebar-nav",{"mobile-open":n.isOpen}])},[I("div",N3,[I("nav",O3,[(B(!0),q(Ce,null,wt(r.sections,a=>{var c,u,f;return B(),q("div",{key:a.title,class:"nav-section"},[a.path?(B(),Be(l,{key:0,to:a.path,class:Se(["section-link",{active:r.isActive(a.path),"has-children":((c=a.children)==null?void 0:c.length)>0}]),onClick:p=>r.toggleSection(a)},{default:Ot(()=>{var p;return[I("span",F3,W(a.title),1),((p=a.children)==null?void 0:p.length)>0?(B(),Be(o,{key:0,class:Se(["chevron-icon",{expanded:r.expandedSections.has(a.title)}])},null,8,["class"])):de("",!0)]}),_:2},1032,["to","class","onClick"])):(B(),q("div",{key:1,class:Se(["section-link","section-header",{"has-children":((u=a.children)==null?void 0:u.length)>0}]),onClick:p=>r.toggleSection(a)},[I("span",P3,W(a.title),1),((f=a.children)==null?void 0:f.length)>0?(B(),Be(o,{key:0,class:Se(["chevron-icon",{expanded:r.expandedSections.has(a.title)}])},null,8,["class"])):de("",!0)],10,R3)),X(Xl,{name:"children-slide"},{default:Ot(()=>{var p;return[((p=a.children)==null?void 0:p.length)>0&&r.expandedSections.has(a.title)?(B(),q("div",M3,[(B(!0),q(Ce,null,wt(a.children,h=>(B(),Be(l,{key:h.title,to:h.path,class:Se(["child-link",{active:r.isActive(h.path)}])},{default:Ot(()=>[I("span",$3,W(h.title),1)]),_:2},1032,["to","class"]))),128))])):de("",!0)]}),_:2},1024)])}),128))])])],2)}const o_=rn(D3,[["render",B3],["__scopeId","data-v-8d878718"]]),Qp={};function z3(e){let t=Qp[e];if(t)return t;t=Qp[e]=[];for(let n=0;n<128;n++){const r=String.fromCharCode(n);t.push(r)}for(let n=0;n<e.length;n++){const r=e.charCodeAt(n);t[r]="%"+("0"+r.toString(16).toUpperCase()).slice(-2)}return t}function Qs(e,t){typeof t!="string"&&(t=Qs.defaultChars);const n=z3(t);return e.replace(/(%[a-f0-9]{2})+/gi,function(r){let s="";for(let i=0,o=r.length;i<o;i+=3){const l=parseInt(r.slice(i+1,i+3),16);if(l<128){s+=n[l];continue}if((l&224)===192&&i+3<o){const a=parseInt(r.slice(i+4,i+6),16);if((a&192)===128){const c=l<<6&1984|a&63;c<128?s+="��":s+=String.fromCharCode(c),i+=3;continue}}if((l&240)===224&&i+6<o){const a=parseInt(r.slice(i+4,i+6),16),c=parseInt(r.slice(i+7,i+9),16);if((a&192)===128&&(c&192)===128){const u=l<<12&61440|a<<6&4032|c&63;u<2048||u>=55296&&u<=57343?s+="���":s+=String.fromCharCode(u),i+=6;continue}}if((l&248)===240&&i+9<o){const a=parseInt(r.slice(i+4,i+6),16),c=parseInt(r.slice(i+7,i+9),16),u=parseInt(r.slice(i+10,i+12),16);if((a&192)===128&&(c&192)===128&&(u&192)===128){let f=l<<18&1835008|a<<12&258048|c<<6&4032|u&63;f<65536||f>1114111?s+="����":(f-=65536,s+=String.fromCharCode(55296+(f>>10),56320+(f&1023))),i+=9;continue}}s+="�"}return s})}Qs.defaultChars=";/?:@&=+$,#";Qs.componentChars="";const Jp={};function U3(e){let t=Jp[e];if(t)return t;t=Jp[e]=[];for(let n=0;n<128;n++){const r=String.fromCharCode(n);/^[0-9a-z]$/i.test(r)?t.push(r):t.push("%"+("0"+n.toString(16).toUpperCase()).slice(-2))}for(let n=0;n<e.length;n++)t[e.charCodeAt(n)]=e[n];return t}function ho(e,t,n){typeof t!="string"&&(n=t,t=ho.defaultChars),typeof n>"u"&&(n=!0);const r=U3(t);let s="";for(let i=0,o=e.length;i<o;i++){const l=e.charCodeAt(i);if(n&&l===37&&i+2<o&&/^[0-9a-f]{2}$/i.test(e.slice(i+1,i+3))){s+=e.slice(i,i+3),i+=2;continue}if(l<128){s+=r[l];continue}if(l>=55296&&l<=57343){if(l>=55296&&l<=56319&&i+1<o){const a=e.charCodeAt(i+1);if(a>=56320&&a<=57343){s+=encodeURIComponent(e[i]+e[i+1]),i++;continue}}s+="%EF%BF%BD";continue}s+=encodeURIComponent(e[i])}return s}ho.defaultChars=";/?:@&=+$,-_.!~*'()#";ho.componentChars="-_.!~*'()";function uf(e){let t="";return t+=e.protocol||"",t+=e.slashes?"//":"",t+=e.auth?e.auth+"@":"",e.hostname&&e.hostname.indexOf(":")!==-1?t+="["+e.hostname+"]":t+=e.hostname||"",t
Line truncated
|
||||||
|
`," "],W3=["{","}","|","\\","^","`"].concat(q3),K3=["'"].concat(W3),ed=["%","/","?",";","#"].concat(K3),td=["/","?","#"],G3=255,nd=/^[+a-z0-9A-Z_-]{0,63}$/,Y3=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,rd={javascript:!0,"javascript:":!0},sd={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};function ff(e,t){if(e&&e instanceof xl)return e;const n=new xl;return n.parse(e,t),n}xl.prototype.parse=function(e,t){let n,r,s,i=e;if(i=i.trim(),!t&&e.split("#").length===1){const c=V3.exec(i);if(c)return this.pathname=c[1],c[2]&&(this.search=c[2]),this}let o=H3.exec(i);if(o&&(o=o[0],n=o.toLowerCase(),this.protocol=o,i=i.substr(o.length)),(t||o||i.match(/^\/\/[^@\/]+@[^@\/]+/))&&(s=i.substr(0,2)==="//",s&&!(o&&rd[o])&&(i=i.substr(2),this.slashes=!0)),!rd[o]&&(s||o&&!sd[o])){let c=-1;for(let d=0;d<td.length;d++)r=i.indexOf(td[d]),r!==-1&&(c===-1||r<c)&&(c=r);let u,f;c===-1?f=i.lastIndexOf("@"):f=i.lastIndexOf("@",c),f!==-1&&(u=i.slice(0,f),i=i.slice(f+1),this.auth=u),c=-1;for(let d=0;d<ed.length;d++)r=i.indexOf(ed[d]),r!==-1&&(c===-1||r<c)&&(c=r);c===-1&&(c=i.length),i[c-1]===":"&&c--;const p=i.slice(0,c);i=i.slice(c),this.parseHost(p),this.hostname=this.hostname||"";const h=this.hostname[0]==="["&&this.hostname[this.hostname.length-1]==="]";if(!h){const d=this.hostname.split(/\./);for(let _=0,C=d.length;_<C;_++){const S=d[_];if(S&&!S.match(nd)){let b="";for(let g=0,m=S.length;g<m;g++)S.charCodeAt(g)>127?b+="x":b+=S[g];if(!b.match(nd)){const g=d.slice(0,_),m=d.slice(_+1),y=S.match(Y3);y&&(g.push(y[1]),m.unshift(y[2])),m.length&&(i=m.join(".")+i),this.hostname=g.join(".");break}}}}this.hostname.length>G3&&(this.hostname=""),h&&(this.hostname=this.hostname.substr(1,this.hostname.length-2))}const l=i.indexOf("#");l!==-1&&(this.hash=i.substr(l),i=i.slice(0,l));const a=i.indexOf("?");return a!==-1&&(this.search=i.substr(a),i=i.slice(0,a)),i&&(this.pathname=i),sd[n]&&this.hostname&&!this.pathname&&(this.pathname=""),this};xl.prototype.parseHost=function(e){let t=j3.exec(e);t&&(t=t[0],t!==":"&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)};const Z3=Object.freeze(Object.defineProperty({__proto__:null,decode:Qs,encode:ho,format:uf,parse:ff},Symbol.toStringTag,{value:"Module"})),l_=/[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,a_=/[\0-\x1F\x7F-\x9F]/,X3=/[\xAD\u0600-\u0605\u061C\u06DD\u070F\u0890\u0891\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804[\uDCBD\uDCCD]|\uD80D[\uDC30-\uDC3F]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]/,hf=/[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061D-\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1B7D\u1B7E\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u2E52-\u2E5D\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDEAD\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3E]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2\uDF00-\uDF09]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDF43-\uDF4F\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/,c_=/[\$\+<->\^`\|~\xA2-\xA6\xA8\xA9\xAC\xAE-\xB1\xB4\xB8\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u03F6\u0482\u058D-\u058F\u0606-\u0608\u060B\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u07FE\u07FF\u0888\u09F2\u09F3\u09FA\u09FB\u0AF1\u0B70\u0BF3-\u0BFA
Line truncated
|
||||||
|
`};Kn.fence=function(e,t,n,r,s){const i=e[t],o=i.info?Js(i.info).trim():"";let l="",a="";if(o){const u=o.split(/(\s+)/g);l=u[0],a=u.slice(2).join("")}let c;if(n.highlight?c=n.highlight(i.content,l,a)||jr(i.content):c=jr(i.content),c.indexOf("<pre")===0)return c+`
|
||||||
|
`;if(o){const u=i.attrIndex("class"),f=i.attrs?i.attrs.slice():[];u<0?f.push(["class",n.langPrefix+l]):(f[u]=f[u].slice(),f[u][1]+=" "+n.langPrefix+l);const p={attrs:f};return`<pre><code${s.renderAttrs(p)}>${c}</code></pre>
|
||||||
|
`}return`<pre><code${s.renderAttrs(i)}>${c}</code></pre>
|
||||||
|
`};Kn.image=function(e,t,n,r,s){const i=e[t];return i.attrs[i.attrIndex("alt")][1]=s.renderInlineAsText(i.children,n,r),s.renderToken(e,t,n)};Kn.hardbreak=function(e,t,n){return n.xhtmlOut?`<br />
|
||||||
|
`:`<br>
|
||||||
|
`};Kn.softbreak=function(e,t,n){return n.breaks?n.xhtmlOut?`<br />
|
||||||
|
`:`<br>
|
||||||
|
`:`
|
||||||
|
`};Kn.text=function(e,t){return jr(e[t].content)};Kn.html_block=function(e,t){return e[t].content};Kn.html_inline=function(e,t){return e[t].content};function oi(){this.rules=ga({},Kn)}oi.prototype.renderAttrs=function(e){let t,n,r;if(!e.attrs)return"";for(r="",t=0,n=e.attrs.length;t<n;t++)r+=" "+jr(e.attrs[t][0])+'="'+jr(e.attrs[t][1])+'"';return r};oi.prototype.renderToken=function(e,t,n){const r=e[t];let s="";if(r.hidden)return"";r.block&&r.nesting!==-1&&t&&e[t-1].hidden&&(s+=`
|
||||||
|
`),s+=(r.nesting===-1?"</":"<")+r.tag,s+=this.renderAttrs(r),r.nesting===0&&n.xhtmlOut&&(s+=" /");let i=!1;if(r.block&&(i=!0,r.nesting===1&&t+1<e.length)){const o=e[t+1];(o.type==="inline"||o.hidden||o.nesting===-1&&o.tag===r.tag)&&(i=!1)}return s+=i?`>
|
||||||
|
`:">",s};oi.prototype.renderInline=function(e,t,n){let r="";const s=this.rules;for(let i=0,o=e.length;i<o;i++){const l=e[i].type;typeof s[l]<"u"?r+=s[l](e,i,t,n,this):r+=this.renderToken(e,i,t)}return r};oi.prototype.renderInlineAsText=function(e,t,n){let r="";for(let s=0,i=e.length;s<i;s++)switch(e[s].type){case"text":r+=e[s].content;break;case"image":r+=this.renderInlineAsText(e[s].children,t,n);break;case"html_inline":case"html_block":r+=e[s].content;break;case"softbreak":case"hardbreak":r+=`
|
||||||
|
`;break}return r};oi.prototype.render=function(e,t,n){let r="";const s=this.rules;for(let i=0,o=e.length;i<o;i++){const l=e[i].type;l==="inline"?r+=this.renderInline(e[i].children,t,n):typeof s[l]<"u"?r+=s[l](e,i,t,n,this):r+=this.renderToken(e,i,t,n)}return r};function nn(){this.__rules__=[],this.__cache__=null}nn.prototype.__find__=function(e){for(let t=0;t<this.__rules__.length;t++)if(this.__rules__[t].name===e)return t;return-1};nn.prototype.__compile__=function(){const e=this,t=[""];e.__rules__.forEach(function(n){n.enabled&&n.alt.forEach(function(r){t.indexOf(r)<0&&t.push(r)})}),e.__cache__={},t.forEach(function(n){e.__cache__[n]=[],e.__rules__.forEach(function(r){r.enabled&&(n&&r.alt.indexOf(n)<0||e.__cache__[n].push(r.fn))})})};nn.prototype.at=function(e,t,n){const r=this.__find__(e),s=n||{};if(r===-1)throw new Error("Parser rule not found: "+e);this.__rules__[r].fn=t,this.__rules__[r].alt=s.alt||[],this.__cache__=null};nn.prototype.before=function(e,t,n,r){const s=this.__find__(e),i=r||{};if(s===-1)throw new Error("Parser rule not found: "+e);this.__rules__.splice(s,0,{name:t,enabled:!0,fn:n,alt:i.alt||[]}),this.__cache__=null};nn.prototype.after=function(e,t,n,r){const s=this.__find__(e),i=r||{};if(s===-1)throw new Error("Parser rule not found: "+e);this.__rules__.splice(s+1,0,{name:t,enabled:!0,fn:n,alt:i.alt||[]}),this.__cache__=null};nn.prototype.push=function(e,t,n){const r=n||{};this.__rules__.push({name:e,enabled:!0,fn:t,alt:r.alt||[]}),this.__cache__=null};nn.prototype.enable=function(e,t){Array.isArray(e)||(e=[e]);const n=[];return e.forEach(function(r){const s=this.__find__(r);if(s<0){if(t)return;throw new Error("Rules manager: invalid rule name "+r)}this.__rules__[s].enabled=!0,n.push(r)},this),this.__cache__=null,n};nn.prototype.enableOnly=function(e,t){Array.isArray(e)||(e=[e]),this.__rules__.forEach(function(n){n.enabled=!1}),this.enable(e,t)};nn.prototype.disable=function(e,t){Array.isArray(e)||(e=[e]);const n=[];return e.forEach(function(r){const s=this.__find__(r);if(s<0){if(t)return;throw new Error("Rules manager: invalid rule name "+r)}this.__rules__[s].enabled=!1,n.push(r)},this),this.__cache__=null,n};nn.prototype.getRules=function(e){return this.__cache__===null&&this.__compile__(),this.__cache__[e]||[]};function On(e,t,n){this.type=e,this.tag=t,this.attrs=null,this.map=null,this.nesting=n,this.level=0,this.children=null,this.content="",this.markup="",this.info="",this.meta=null,this.block=!1,this.hidden=!1}On.prototype.attrIndex=function(e){if(!this.attrs)return-1;const t=this.attrs;for(let n=0,r=t.length;n<r;n++)if(t[n][0]===e)return n;return-1};On.prototype.attrPush=function(e){this.attrs?this.attrs.push(e):this.attrs=[e]};On.prototype.attrSet=function(e,t){const n=this.attrIndex(e),r=[e,t];n<0?this.attrPush(r):this.attrs[n]=r};On.prototype.attrGet=function(e){const t=this.attrIndex(e);let n=null;return t>=0&&(n=this.attrs[t][1]),n};On.prototype.attrJoin=function(e,t){const n=this.attrIndex(e);n<0?this.attrPush([e,t]):this.attrs[n][1]=this.attrs[n][1]+" "+t};function m_(e,t,n){this.src=e,this.env=n,this.tokens=[],this.inlineMode=!1,this.md=t}m_.prototype.Token=On;const D4=/\r\n?|\n/g,N4=/\0/g;function O4(e){let t;t=e.src.replace(D4,`
|
||||||
|
`),t=t.replace(N4,"�"),e.src=t}function F4(e){let t;e.inlineMode?(t=new e.Token("inline","",0),t.content=e.src,t.map=[0,1],t.children=[],e.tokens.push(t)):e.md.block.parse(e.src,e.md,e.env,e.tokens)}function R4(e){const t=e.tokens;for(let n=0,r=t.length;n<r;n++){const s=t[n];s.type==="inline"&&e.md.inline.parse(s.content,e.md,e.env,s.children)}}function P4(e){return/^<a[>\s]/i.test(e)}function M4(e){return/^<\/a\s*>/i.test(e)}function $4(e){const t=e.tokens;if(e.md.options.linkify)for(let n=0,r=t.length;n<r;n++){if(t[n].type!=="inline"||!e.md.linkify.pretest(t[n].content))continue;let s=t[n].children,i=0;for(let o=s.length-1;o>=0;o--){const l=s[o];if(l.type==="link_close"){for(o--;s[o].level!==l.level&&s[o].type!=="link_open";)o--;continue}if(l.type==="html_inline"&&(P4(l.content)&&i>0&&i--,M4(l.content)&&i++),!(i>0)&&l.type==="text"&&e.md.linkify.test(l.content)){const a=l.content;let c=e.md.linkify.match(a);const u=[];let f=l.level,p=0;c.length>0&&c[0].index===0&&o>0&&s[o-1].type==="text_special"&&(c=c.slice(1));for(let h=0;h<c.length;h++){const d=c[h].url,_=e.md.normalizeLink(d);if(!e.md.validateLink(_))continue;let C=c[h].text;c[h].schema?c[h].schema==="mailto:"&&!/^mailto:/i.test(C)?C=e.md.normalizeLinkText("mailto:"+C).replace(/^mailto:/,""):C=e.md.normalizeLinkText(C):C=e.md.normalizeLinkText("http://"+C).replace(/^http:\/\//,"");const S=c[h].index;if(S>p){const y=new e.Token("text","",0);y.content=a.slice(p,S),y.level=f,u.push(y)}const b=new e.Token("link_open","a",1);b.attrs=[["href",_]],b.level=f++,b.markup="linkify",b.info="auto",u.push(b);const g=new e.Token("text","",0);g.content=C,g.level=f,u.push(g);const m=new e.Token("link_close","a",-1);m.level=--f,m.markup="linkify",m.info="auto",u.push(m),p=c[h].lastIndex}if(p<a.length){const h=new e.Token("text","",0);h.content=a.slice(p),h.level=f,u.push(h)}t[n].children=s=p_(s,o,u)}}}}const g_=/\+-|\.\.|\?\?\?\?|!!!!|,,|--/,B4=/\((c|tm|r)\)/i,z4=/\((c|tm|r)\)/ig,U4={c:"©",r:"®",tm:"™"};function H4(e,t){return U4[t.toLowerCase()]}function j4(e){let t=0;for(let n=e.length-1;n>=0;n--){const r=e[n];r.type==="text"&&!t&&(r.content=r.content.replace(z4,H4)),r.type==="link_open"&&r.info==="auto"&&t--,r.type==="link_close"&&r.info==="auto"&&t++}}function V4(e){let t=0;for(let n=e.length-1;n>=0;n--){const r=e[n];r.type==="text"&&!t&&g_.test(r.content)&&(r.content=r.content.replace(/\+-/g,"±").replace(/\.{2,}/g,"…").replace(/([?!])…/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---(?=[^-]|$)/mg,"$1—").replace(/(^|\s)--(?=\s|$)/mg,"$1–").replace(/(^|[^-\s])--(?=[^-\s]|$)/mg,"$1–")),r.type==="link_open"&&r.info==="auto"&&t--,r.type==="link_close"&&r.info==="auto"&&t++}}function q4(e){let t;if(e.md.options.typographer)for(t=e.tokens.length-1;t>=0;t--)e.tokens[t].type==="inline"&&(B4.test(e.tokens[t].content)&&j4(e.tokens[t].children),g_.test(e.tokens[t].content)&&V4(e.tokens[t].children))}const W4=/['"]/,id=/['"]/g,od="’";function Fo(e,t,n){return e.slice(0,t)+n+e.slice(t+1)}function K4(e,t){let n;const r=[];for(let s=0;s<e.length;s++){const i=e[s],o=e[s].level;for(n=r.length-1;n>=0&&!(r[n].level<=o);n--);if(r.length=n+1,i.type!=="text")continue;let l=i.content,a=0,c=l.length;e:for(;a<c;){id.lastIndex=a;const u=id.exec(l);if(!u)break;let f=!0,p=!0;a=u.index+1;const h=u[0]==="'";let d=32;if(u.index-1>=0)d=l.charCodeAt(u.index-1);else for(n=s-1;n>=0&&!(e[n].type==="softbreak"||e[n].type==="hardbreak");n--)if(e[n].content){d=e[n].content.charCodeAt(e[n].content.length-1);break}let _=32;if(a<c)_=l.charCodeAt(a);else for(n=s+1;n<e.length&&!(e[n].type==="softbreak"||e[n].type==="hardbreak");n++)if(e[n].content){_=e[n].content.charCodeAt(0);break}const C=ro(d)||no(String.fromCharCode(d)),S=ro(_)||no(String.fromCharCode(_)),b=to(d),g=to(_);if(g?f=!1:S&&(b||C||(f=!1)),b?p=!1:C&&(g||S||(p=!1)),_===34&&u[0]==='"'&&d>=48&&d<=57&&(p=f=!1),f&&p&&(f=C,p=S),!f&&!p){h&&(i.content=Fo(i.content,u.index,od));continue}if(p)for(n=r.length-1;n>=0;n--){let m=r[n];if(r[n].level<o)break;if(m.single===h&&r[n].level===o){m=r[n];let y,k;h?(y=t.md.options.quotes[2],k=t.md.options.quotes[3]):(y=t.md.options.quotes[0],k=t.md.options.quotes[1]),i.content=Fo(i.content,u.index,k),e[m.token].content=Fo(e[m.token].content,m.pos,y),a+=k.length-1,m.token===s&&(a+=y.length-1),l=i.content,c=l.length,r.length=n;continue e}}f?r.push({token:s,pos:u.index,single:h,level:o}):p&&h&&(i.content=Fo(i.content,u.index,od))}}}function G4(e){if(e.md.options.typographer)for(let t=e.tokens.length-1;t>=0;t--)e.tokens[t].type!=="inline"||!W4.test(e.tokens[t].content)||K4(e.tokens[t].children,e)}function Y4(e){let t,n;const r=e.tokens,s=r.length;for(let i=0;i<s;i++){if(r[i].type!=="inline")continue;const o=r[i].children,l=o.length;for(t=0;t<l;t++)o[t].type==="text_special"&&(o[t].type="text");for(t=n=0;t<l;t++)o[t].type==="text"&&t+1<l&&o[t+1].type==="text"?o[t+1].content=o[t].content+o[t+1].content:(t!==n&&(o[n]=o[t]),n++);t!==n&&(o.length=n)}}const Ka=[["normalize",
Line truncated
|
||||||
|
`,i.map=[t,e.line],!0}function J4(e,t,n,r){let s=e.bMarks[t]+e.tShift[t],i=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4||s+3>i)return!1;const o=e.src.charCodeAt(s);if(o!==126&&o!==96)return!1;let l=s;s=e.skipChars(s,o);let a=s-l;if(a<3)return!1;const c=e.src.slice(l,s),u=e.src.slice(s,i);if(o===96&&u.indexOf(String.fromCharCode(o))>=0)return!1;if(r)return!0;let f=t,p=!1;for(;f++,!(f>=n||(s=l=e.bMarks[f]+e.tShift[f],i=e.eMarks[f],s<i&&e.sCount[f]<e.blkIndent));)if(e.src.charCodeAt(s)===o&&!(e.sCount[f]-e.blkIndent>=4)&&(s=e.skipChars(s,o),!(s-l<a)&&(s=e.skipSpaces(s),!(s<i)))){p=!0;break}a=e.sCount[t],e.line=f+(p?1:0);const h=e.push("fence","code",0);return h.info=u,h.content=e.getLines(t+1,f,a,!0),h.markup=c,h.map=[t,e.line],!0}function eI(e,t,n,r){let s=e.bMarks[t]+e.tShift[t],i=e.eMarks[t];const o=e.lineMax;if(e.sCount[t]-e.blkIndent>=4||e.src.charCodeAt(s)!==62)return!1;if(r)return!0;const l=[],a=[],c=[],u=[],f=e.md.block.ruler.getRules("blockquote"),p=e.parentType;e.parentType="blockquote";let h=!1,d;for(d=t;d<n;d++){const g=e.sCount[d]<e.blkIndent;if(s=e.bMarks[d]+e.tShift[d],i=e.eMarks[d],s>=i)break;if(e.src.charCodeAt(s++)===62&&!g){let y=e.sCount[d]+1,k,T;e.src.charCodeAt(s)===32?(s++,y++,T=!1,k=!0):e.src.charCodeAt(s)===9?(k=!0,(e.bsCount[d]+y)%4===3?(s++,y++,T=!1):T=!0):k=!1;let L=y;for(l.push(e.bMarks[d]),e.bMarks[d]=s;s<i;){const A=e.src.charCodeAt(s);if(Ge(A))A===9?L+=4-(L+e.bsCount[d]+(T?1:0))%4:L++;else break;s++}h=s>=i,a.push(e.bsCount[d]),e.bsCount[d]=e.sCount[d]+1+(k?1:0),c.push(e.sCount[d]),e.sCount[d]=L-y,u.push(e.tShift[d]),e.tShift[d]=s-e.bMarks[d];continue}if(h)break;let m=!1;for(let y=0,k=f.length;y<k;y++)if(f[y](e,d,n,!0)){m=!0;break}if(m){e.lineMax=d,e.blkIndent!==0&&(l.push(e.bMarks[d]),a.push(e.bsCount[d]),u.push(e.tShift[d]),c.push(e.sCount[d]),e.sCount[d]-=e.blkIndent);break}l.push(e.bMarks[d]),a.push(e.bsCount[d]),u.push(e.tShift[d]),c.push(e.sCount[d]),e.sCount[d]=-1}const _=e.blkIndent;e.blkIndent=0;const C=e.push("blockquote_open","blockquote",1);C.markup=">";const S=[t,0];C.map=S,e.md.block.tokenize(e,t,d);const b=e.push("blockquote_close","blockquote",-1);b.markup=">",e.lineMax=o,e.parentType=p,S[1]=e.line;for(let g=0;g<u.length;g++)e.bMarks[g+t]=l[g],e.tShift[g+t]=u[g],e.sCount[g+t]=c[g],e.bsCount[g+t]=a[g];return e.blkIndent=_,!0}function tI(e,t,n,r){const s=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4)return!1;let i=e.bMarks[t]+e.tShift[t];const o=e.src.charCodeAt(i++);if(o!==42&&o!==45&&o!==95)return!1;let l=1;for(;i<s;){const c=e.src.charCodeAt(i++);if(c!==o&&!Ge(c))return!1;c===o&&l++}if(l<3)return!1;if(r)return!0;e.line=t+1;const a=e.push("hr","hr",0);return a.map=[t,e.line],a.markup=Array(l+1).join(String.fromCharCode(o)),!0}function ad(e,t){const n=e.eMarks[t];let r=e.bMarks[t]+e.tShift[t];const s=e.src.charCodeAt(r++);if(s!==42&&s!==45&&s!==43)return-1;if(r<n){const i=e.src.charCodeAt(r);if(!Ge(i))return-1}return r}function cd(e,t){const n=e.bMarks[t]+e.tShift[t],r=e.eMarks[t];let s=n;if(s+1>=r)return-1;let i=e.src.charCodeAt(s++);if(i<48||i>57)return-1;for(;;){if(s>=r)return-1;if(i=e.src.charCodeAt(s++),i>=48&&i<=57){if(s-n>=10)return-1;continue}if(i===41||i===46)break;return-1}return s<r&&(i=e.src.charCodeAt(s),!Ge(i))?-1:s}function nI(e,t){const n=e.level+2;for(let r=t+2,s=e.tokens.length-2;r<s;r++)e.tokens[r].level===n&&e.tokens[r].type==="paragraph_open"&&(e.tokens[r+2].hidden=!0,e.tokens[r].hidden=!0,r+=2)}function rI(e,t,n,r){let s,i,o,l,a=t,c=!0;if(e.sCount[a]-e.blkIndent>=4||e.listIndent>=0&&e.sCount[a]-e.listIndent>=4&&e.sCount[a]<e.blkIndent)return!1;let u=!1;r&&e.parentType==="paragraph"&&e.sCount[a]>=e.blkIndent&&(u=!0);let f,p,h;if((h=cd(e,a))>=0){if(f=!0,o=e.bMarks[a]+e.tShift[a],p=Number(e.src.slice(o,h-1)),u&&p!==1)return!1}else if((h=ad(e,a))>=0)f=!1;else return!1;if(u&&e.skipSpaces(h)>=e.eMarks[a])return!1;if(r)return!0;const d=e.src.charCodeAt(h-1),_=e.tokens.length;f?(l=e.push("ordered_list_open","ol",1),p!==1&&(l.attrs=[["start",p]])):l=e.push("bullet_list_open","ul",1);const C=[a,0];l.map=C,l.markup=String.fromCharCode(d);let S=!1;const b=e.md.block.ruler.getRules("list"),g=e.parentType;for(e.parentType="list";a<n;){i=h,s=e.eMarks[a];const m=e.sCount[a]+h-(e.bMarks[a]+e.tShift[a]);let y=m;for(;i<s;){const ie=e.src.charCodeAt(i);if(ie===9)y+=4-(y+e.bsCount[a])%4;else if(ie===32)y++;else break;i++}const k=i;let T;k>=s?T=1:T=y-m,T>4&&(T=1);const L=m+T;l=e.push("list_item_open","li",1),l.markup=String.fromCharCode(d);const A=[a,0];l.map=A,f&&(l.info=e.src.slice(o,h-1));const O=e.tight,H=e.tShift[a],M=e.sCount[a],V=e.listIndent;if(e.listIndent=e.blkIndent,e.blkIndent=L,e.tight=!0,e.tShift[a]=k-e.bMarks[a],e.sCount[a]=y,k>=s&&e.isEmpty(a+1)?e.line=Math.min(e.line+2,n):e.md.block.tokenize(e,a,n,!0),(!e.tight||S)&&(c=!1),S=e.line-a>1&&e.isEmpty(e.line-1),e.blkIndent=e.listIndent,e.listIndent=V,e.tShift[a]=H,e.sCount[a]=M,e.tight=O,l=e.push("list_item_close","li",-1),l.markup=String.fromCharCode(d),a=e.line,A[1]=a,a>=n||e.sCount[a]<e.blkIndent||e.sCount
Line truncated
|
||||||
|
`})),r.tokens.splice(s+3+u.length+1,0,Object.assign(new r.Token("html_block","",0),{content:t.wrapper[1]+`
|
||||||
|
`})))});function yd(e,t,n,r){var s=e,i=r;if(n&&Object.prototype.hasOwnProperty.call(t,s))throw new Error("User defined `id` attribute `"+e+"` is not unique. Please fix it in your Markdown to continue.");for(;Object.prototype.hasOwnProperty.call(t,s);)s=e+"-"+i,i+=1;return t[s]=!0,s}function lr(e,t){t=Object.assign({},lr.defaults,t),e.core.ruler.push("anchor",function(n){for(var r,s={},i=n.tokens,o=Array.isArray(t.level)?(r=t.level,function(f){return r.includes(f)}):function(f){return function(p){return p>=f}}(t.level),l=0;l<i.length;l++){var a=i[l];if(a.type==="heading_open"&&o(Number(a.tag.substr(1)))){var c=t.getTokensText(i[l+1].children),u=a.attrGet("id");u=u==null?yd(u=t.slugifyWithState?t.slugifyWithState(c,n):t.slugify(c),s,!1,t.uniqueSlugStartIndex):yd(u,s,!0,t.uniqueSlugStartIndex),a.attrSet("id",u),t.tabIndex!==!1&&a.attrSet("tabindex",""+t.tabIndex),typeof t.permalink=="function"?t.permalink(u,t,n,l):(t.permalink||t.renderPermalink&&t.renderPermalink!==Kc)&&t.renderPermalink(u,t,n,l),l=i.indexOf(a),t.callback&&t.callback(a,{slug:u,title:c})}}})}Object.assign(_d.defaults,{style:"visually-hidden",space:!0,placement:"after",wrapper:null}),lr.permalink={__proto__:null,legacy:Kc,renderHref:N_,renderAttrs:O_,makePermalink:go,linkInsideHeader:ka,ariaHidden:Qr,headerLink:F_,linkAfterHeader:_d},lr.defaults={level:1,slugify:function(e){return encodeURIComponent(String(e).trim().toLowerCase().replace(/\s+/g,"-"))},uniqueSlugStartIndex:1,tabIndex:"-1",getTokensText:function(e){return e.filter(function(t){return["text","code_inline"].includes(t.type)}).map(function(t){return t.content}).join("")},permalink:!1,renderPermalink:Kc,permalinkClass:Qr.defaults.class,permalinkSpace:Qr.defaults.space,permalinkSymbol:"¶",permalinkBefore:Qr.defaults.placement==="before",permalinkHref:Qr.defaults.renderHref,permalinkAttrs:Qr.defaults.renderAttrs},lr.default=lr;const bf=new hn({html:!0,linkify:!0,typographer:!0,breaks:!1}),S6=e=>e.toLowerCase().trim().replace(/[\s]+/g,"-").replace(/[^\w\u4e00-\u9fa5-]/g,"").replace(/--+/g,"-").replace(/^-|-$/g,"");bf.use(lr,{slugify:S6,permalink:lr.permalink.headerLink({symbol:"#",renderAttrs:()=>({"aria-hidden":"true"})})});const bd=bf.renderer.rules.fence||function(e,t,n,r,s){return s.renderToken(e,t,n)};bf.renderer.rules.fence=function(e,t,n,r,s){const i=e[t],o=i.info?i.info.trim():"",l=o?o.split(/\s+/g)[0]:"";if(l){const a=`<div class="code-lang">${l}</div>`,c=bd(e,t,n,r,s);return`<div class="code-block-wrapper">${a}${c}</div>`}return bd(e,t,n,r,s)};function x6(e,t=2){if(!Array.isArray(e)||t<1)return[];const n=r=>r.filter(s=>s.level<=t).map(s=>({...s,children:s.children?n(s.children):[]}));return n(e)}const T6={name:"TableOfContents",props:{headers:{type:Array,default:()=>[]}},setup(e){const{t}=mn(),n=te(""),r=pe(()=>{if(!e.headers||!Array.isArray(e.headers))return[];const c=Gp().maxLevel||2;return x6(e.headers,c)}),s=pe(()=>r.value&&r.value.length>0),i=pe(()=>Gp().title||"目录");function o(c){const u=document.getElementById(c);u&&(u.scrollIntoView({behavior:"smooth",block:"start"}),n.value=c,history.pushState(null,"",`#${c}`))}function l(){const c=document.querySelectorAll("h1, h2, h3, h4, h5, h6");let u="";for(const f of c)f.getBoundingClientRect().top<=100&&(u=f.id);n.value=u}let a;return gt(()=>{const c=location.hash.slice(1);c&&(n.value=c),a=()=>l(),window.addEventListener("scroll",a,{passive:!0}),l()}),Mt(()=>{a&&window.removeEventListener("scroll",a)}),{activeAnchor:n,scrollToAnchor:o,hasHeaders:s,filteredHeaders:r,tocTitle:i,t}}},I6={class:"table-of-contents"},L6={class:"toc-header"},D6={key:0,class:"toc-nav"},N6=["href","onClick"],O6={key:0,class:"toc-children"},F6=["href","onClick"],R6={key:0,class:"toc-children"},P6=["href","onClick"],M6={key:1,class:"toc-empty"};function $6(e,t,n,r,s,i){return B(),q("aside",I6,[I("div",L6,[I("h3",null,W(r.t("common.toc")),1)]),r.hasHeaders?(B(),q("nav",D6,[(B(!0),q(Ce,null,wt(r.filteredHeaders,o=>(B(),q("div",{key:o.anchor,class:Se(["toc-item","toc-level-"+o.level])},[I("a",{href:"#"+o.anchor,class:Se([{active:r.activeAnchor===o.anchor},"toc-link"]),onClick:je(l=>r.scrollToAnchor(o.anchor),["prevent"])},W(o.text),11,N6),o.children&&o.children.length>0?(B(),q("div",O6,[(B(!0),q(Ce,null,wt(o.children,l=>(B(),q("div",{key:l.anchor,class:Se(["toc-item","toc-level-"+l.level])},[I("a",{href:"#"+l.anchor,class:Se([{active:r.activeAnchor===l.anchor},"toc-link"]),onClick:je(a=>r.scrollToAnchor(l.anchor),["prevent"])},W(l.text),11,F6),l.children&&l.children.length>0?(B(),q("div",R6,[(B(!0),q(Ce,null,wt(l.children,a=>(B(),q("div",{key:a.anchor,class:Se(["toc-item","toc-level-"+a.level])},[I("a",{href:"#"+a.anchor,class:Se([{active:r.activeAnchor===a.anchor},"toc-link"]),onClick:je(c=>r.scrollToAnchor(a.anchor),["prevent"])},W(a.text),11,P6)],2))),128))])):de("",!0)],2))),128))])):de("",!0)],2))),128))])):(B(),q("div",M6,[I("p",null,W(r.t("common.noContent")),1)]))])}const R_=rn(T6,[["render",$6],["__scopeId","data-v-fab21543"]]);function kf(){reLine truncated
|
||||||
|
]`).replace("lheading",$_).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},X6=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,Q6=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,z_=/^( {2,}|\\)\n(?!\s*$)/,J6=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,Ea=/[\p{P}\p{S}]/u,Sf=/[\s\p{P}\p{S}]/u,U_=/[^\s\p{P}\p{S}]/u,eL=Me(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,Sf).getRegex(),H_=/(?!~)[\p{P}\p{S}]/u,tL=/(?!~)[\s\p{P}\p{S}]/u,nL=/(?:[^\s\p{P}\p{S}]|~)/u,rL=/\[[^[\]]*?\]\((?:\\.|[^\\\(\)]|\((?:\\.|[^\\\(\)])*\))*\)|`[^`]*?`|<[^<>]*?>/g,j_=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,sL=Me(j_,"u").replace(/punct/g,Ea).getRegex(),iL=Me(j_,"u").replace(/punct/g,H_).getRegex(),V_="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",oL=Me(V_,"gu").replace(/notPunctSpace/g,U_).replace(/punctSpace/g,Sf).replace(/punct/g,Ea).getRegex(),lL=Me(V_,"gu").replace(/notPunctSpace/g,nL).replace(/punctSpace/g,tL).replace(/punct/g,H_).getRegex(),aL=Me("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,U_).replace(/punctSpace/g,Sf).replace(/punct/g,Ea).getRegex(),cL=Me(/\\(punct)/,"gu").replace(/punct/g,Ea).getRegex(),uL=Me(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),fL=Me(wf).replace("(?:-->|$)","-->").getRegex(),hL=Me("^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment",fL).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),Dl=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,pL=Me(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",Dl).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),q_=Me(/^!?\[(label)\]\[(ref)\]/).replace("label",Dl).replace("ref",Cf).getRegex(),W_=Me(/^!?\[(ref)\](?:\[\])?/).replace("ref",Cf).getRegex(),dL=Me("reflink|nolink(?!\\()","g").replace("reflink",q_).replace("nolink",W_).getRegex(),xf={_backpedal:Ii,anyPunctuation:cL,autolink:uL,blockSkip:rL,br:z_,code:Q6,del:Ii,emStrongLDelim:sL,emStrongRDelimAst:oL,emStrongRDelimUnd:aL,escape:X6,link:pL,nolink:W_,punctuation:eL,reflink:q_,reflinkSearch:dL,tag:hL,text:J6,url:Ii},mL={...xf,link:Me(/^!?\[(label)\]\((.*?)\)/).replace("label",Dl).getRegex(),reflink:Me(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Dl).getRegex()},Gc={...xf,emStrongRDelimAst:lL,emStrongLDelim:iL,url:Me(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,"i").replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\.|[^\\])*?(?:\\.|[^\s~\\]))\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/},gL={...Gc,br:Me(z_).replace("{2,}","*").getRegex(),text:Me(Gc.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()},Po={normal:Af,gfm:Y6,pedantic:Z6},pi={normal:xf,gfm:Gc,breaks:gL,pedantic:mL},_L={"&":"&","<":"<",">":">",'"':""","'":"'"},vd=e=>_L[e];function Pn(e,t){if(t){if(qt.escapeTest.test(e))return e.replace(qt.escapeReplace,vd)}else if(qt.escapeTestNoEncode.test(e))return e.replace(qt.escapeReplaceNoEncode,vd);return e}function Ed(e){try{e=encodeURI(e).replace(qt.percentDecode,"%")}catch{return null}return e}function Cd(e,t){var n;const r=e.replace(qt.findPipe,(o,l,a)=>{let c=!1,u=l;for(;--u>=0&&a[u]==="\\";)c=!c;return c?"|":" |"}),s=r.split(qt.splitPipe);let i=0;if(s[0].trim()||s.shift(),s.length>0&&!((n=s.at(-1))!=null&&n.trim())&&s.pop(),t)if(s.length>t)s.splice(t);else for(;s.length<t;)s.push("");for(;i<s.length;i++)s[i]=s[i].trim().replace(qt.slashPipe,"|");return s}function di(e,t,n){const r=e.length;if(r===0)return"";let s=0;for(;s<r&&e.charAt(r-s-1)===t;)s++;return e.slice(0,r-s)}function yL(e,t){if(e.indexOf(t[1])===-1)return-1;let n=0;for(let r=0;r<e.length;r++)if(e[r]==="\\")r++;else if(e[r]===t[0])n++;else if(e[r]===t[1]Line truncated
|
||||||
|
`).map(i=>{const o=i.match(n.other.beginningSpace);if(o===null)return i;const[l]=o;return l.length>=s.length?i.slice(s.length):i}).join(`
|
||||||
|
`)}var Nl=class{constructor(e){qe(this,"options"),qe(this,"rules"),qe(this,"lexer"),this.options=e||gs}space(e){const t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:"space",raw:t[0]}}code(e){const t=this.rules.block.code.exec(e);if(t){const n=t[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?n:di(n,`
|
||||||
|
`)}}}fences(e){const t=this.rules.block.fences.exec(e);if(t){const n=t[0],r=bL(n,t[3]||"",this.rules);return{type:"code",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:r}}}heading(e){const t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){const r=di(n,"#");(this.options.pedantic||!r||this.rules.other.endingSpaceChar.test(r))&&(n=r.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){const t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:di(t[0],`
|
||||||
|
`)}}blockquote(e){const t=this.rules.block.blockquote.exec(e);if(t){let n=di(t[0],`
|
||||||
|
`).split(`
|
||||||
|
`),r="",s="";const i=[];for(;n.length>0;){let o=!1;const l=[];let a;for(a=0;a<n.length;a++)if(this.rules.other.blockquoteStart.test(n[a]))l.push(n[a]),o=!0;else if(!o)l.push(n[a]);else break;n=n.slice(a);const c=l.join(`
|
||||||
|
`),u=c.replace(this.rules.other.blockquoteSetextReplace,`
|
||||||
|
$1`).replace(this.rules.other.blockquoteSetextReplace2,"");r=r?`${r}
|
||||||
|
${c}`:c,s=s?`${s}
|
||||||
|
${u}`:u;const f=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(u,i,!0),this.lexer.state.top=f,n.length===0)break;const p=i.at(-1);if((p==null?void 0:p.type)==="code")break;if((p==null?void 0:p.type)==="blockquote"){const h=p,d=h.raw+`
|
||||||
|
`+n.join(`
|
||||||
|
`),_=this.blockquote(d);i[i.length-1]=_,r=r.substring(0,r.length-h.raw.length)+_.raw,s=s.substring(0,s.length-h.text.length)+_.text;break}else if((p==null?void 0:p.type)==="list"){const h=p,d=h.raw+`
|
||||||
|
`+n.join(`
|
||||||
|
`),_=this.list(d);i[i.length-1]=_,r=r.substring(0,r.length-p.raw.length)+_.raw,s=s.substring(0,s.length-h.raw.length)+_.raw,n=d.substring(i.at(-1).raw.length).split(`
|
||||||
|
`);continue}}return{type:"blockquote",raw:r,tokens:i,text:s}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim();const r=n.length>1,s={type:"list",raw:"",ordered:r,start:r?+n.slice(0,-1):"",loose:!1,items:[]};n=r?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=r?n:"[*+-]");const i=this.rules.other.listItemRegex(n);let o=!1;for(;e;){let a=!1,c="",u="";if(!(t=i.exec(e))||this.rules.block.hr.test(e))break;c=t[0],e=e.substring(c.length);let f=t[2].split(`
|
||||||
|
`,1)[0].replace(this.rules.other.listReplaceTabs,S=>" ".repeat(3*S.length)),p=e.split(`
|
||||||
|
`,1)[0],h=!f.trim(),d=0;if(this.options.pedantic?(d=2,u=f.trimStart()):h?d=t[1].length+1:(d=t[2].search(this.rules.other.nonSpaceChar),d=d>4?1:d,u=f.slice(d),d+=t[1].length),h&&this.rules.other.blankLine.test(p)&&(c+=p+`
|
||||||
|
`,e=e.substring(p.length+1),a=!0),!a){const S=this.rules.other.nextBulletRegex(d),b=this.rules.other.hrRegex(d),g=this.rules.other.fencesBeginRegex(d),m=this.rules.other.headingBeginRegex(d),y=this.rules.other.htmlBeginRegex(d);for(;e;){const k=e.split(`
|
||||||
|
`,1)[0];let T;if(p=k,this.options.pedantic?(p=p.replace(this.rules.other.listReplaceNesting," "),T=p):T=p.replace(this.rules.other.tabCharGlobal," "),g.test(p)||m.test(p)||y.test(p)||S.test(p)||b.test(p))break;if(T.search(this.rules.other.nonSpaceChar)>=d||!p.trim())u+=`
|
||||||
|
`+T.slice(d);else{if(h||f.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||g.test(f)||m.test(f)||b.test(f))break;u+=`
|
||||||
|
`+p}!h&&!p.trim()&&(h=!0),c+=k+`
|
||||||
|
`,e=e.substring(k.length+1),f=T.slice(d)}}s.loose||(o?s.loose=!0:this.rules.other.doubleBlankLine.test(c)&&(o=!0));let _=null,C;this.options.gfm&&(_=this.rules.other.listIsTask.exec(u),_&&(C=_[0]!=="[ ] ",u=u.replace(this.rules.other.listReplaceTask,""))),s.items.push({type:"list_item",raw:c,task:!!_,checked:C,loose:!1,text:u,tokens:[]}),s.raw+=c}const l=s.items.at(-1);if(l)l.raw=l.raw.trimEnd(),l.text=l.text.trimEnd();else return;s.raw=s.raw.trimEnd();for(let a=0;a<s.items.length;a++)if(this.lexer.state.top=!1,s.items[a].tokens=this.lexer.blockTokens(s.items[a].text,[]),!s.loose){const c=s.items[a].tokens.filter(f=>f.type==="space"),u=c.length>0&&c.some(f=>this.rules.other.anyLine.test(f.raw));s.loose=u}if(s.loose)for(let a=0;a<s.items.length;a++)s.items[a].loose=!0;return s}}html(e){const t=this.rules.block.html.exec(e);if(t)return{type:"html",block:!0,raw:t[0],pre:t[1]==="pre"||t[1]==="script"||t[1]==="style",text:t[0]}}def(e){const t=this.rules.block.def.exec(e);if(t){const n=t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),r=t[2]?t[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",s=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):t[3];return{type:"def",tag:n,raw:t[0],href:r,title:s}}}table(e){var t;const n=this.rules.block.table.exec(e);if(!n||!this.rules.other.tableDelimiter.test(n[2]))return;const r=Cd(n[1]),s=n[2].replace(this.rules.other.tableAlignChars,"").split("|"),i=(t=n[3])!=null&&t.trim()?n[3].replace(this.rules.other.tableRowBlankLine,"").split(`
|
||||||
|
`):[],o={type:"table",raw:n[0],header:[],align:[],rows:[]};if(r.length===s.length){for(const l of s)this.rules.other.tableAlignRight.test(l)?o.align.push("right"):this.rules.other.tableAlignCenter.test(l)?o.align.push("center"):this.rules.other.tableAlignLeft.test(l)?o.align.push("left"):o.align.push(null);for(let l=0;l<r.length;l++)o.header.push({text:r[l],tokens:this.lexer.inline(r[l]),header:!0,align:o.align[l]});for(const l of i)o.rows.push(Cd(l,o.header.length).map((a,c)=>({text:a,tokens:this.lexer.inline(a),header:!1,align:o.align[c]})));return o}}lheading(e){const t=this.rules.block.lheading.exec(e);if(t)return{type:"heading",raw:t[0],depth:t[2].charAt(0)==="="?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){const t=this.rules.block.paragraph.exec(e);if(t){const n=t[1].charAt(t[1].length-1)===`
|
||||||
|
`?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){const t=this.rules.block.text.exec(e);if(t)return{type:"text",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){const t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:t[1]}}tag(e){const t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){const t=this.rules.inline.link.exec(e);if(t){const n=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;const i=di(n.slice(0,-1),"\\");if((n.length-i.length)%2===0)return}else{const i=yL(t[2],"()");if(i===-2)return;if(i>-1){const o=(t[0].indexOf("!")===0?5:4)+t[1].length+i;t[2]=t[2].substring(0,i),t[0]=t[0].substring(0,o).trim(),t[3]=""}}let r=t[2],s="";if(this.options.pedantic){const i=this.rules.other.pedanticHrefTitle.exec(r);i&&(r=i[1],s=i[3])}else s=t[3]?t[3].slice(1,-1):"";return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?r=r.slice(1):r=r.slice(1,-1)),wd(t,{href:r&&r.replace(this.rules.inline.anyPunctuation,"$1"),title:s&&s.replace(this.rules.inline.anyPunctuation,"$1")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){const r=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal," "),s=t[r.toLowerCase()];if(!s){const i=n[0].charAt(0);return{type:"text",raw:i,text:i}}return wd(n,s,n[0],this.lexer,this.rules)}}emStrong(e,t,n=""){let r=this.rules.inline.emStrongLDelim.exec(e);if(!(!r||r[3]&&n.match(this.rules.other.unicodeAlphaNumeric))&&(!(r[1]||r[2])||!n||this.rules.inline.punctuation.exec(n))){const s=[...r[0]].length-1;let i,o,l=s,a=0;const c=r[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(c.lastIndex=0,t=t.slice(-1*e.length+s);(r=c.exec(t))!=null;){if(i=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!i)continue;if(o=[...i].length,r[3]||r[4]){l+=o;continue}else if((r[5]||r[6])&&s%3&&!((s+o)%3)){a+=o;continue}if(l-=o,l>0)continue;o=Math.min(o,o+l+a);const u=[...r[0]][0].length,f=e.slice(0,s+r.index+u+o);if(Math.min(s,o)%2){const h=f.slice(1,-1);return{type:"em",raw:f,text:h,tokens:this.lexer.inlineTokens(h)}}const p=f.slice(2,-2);return{type:"strong",raw:f,text:p,tokens:this.lexer.inlineTokens(p)}}}}codespan(e){const t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal," ");const r=this.rules.other.nonSpaceChar.test(n),s=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return r&&s&&(n=n.substring(1,n.length-1)),{type:"codespan",raw:t[0],text:n}}}br(e){const t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e){const t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e){const t=this.rules.inline.autolink.exec(e);if(t){let n,r;return t[2]==="@"?(n=t[1],r="mailto:"+n):(n=t[1],r=n),{type:"link",raw:t[0],text:n,href:r,tokens:[{type:"text",raw:n,text:n}]}}}url(e){var t;let n;if(n=this.rules.inline.url.exec(e)){let r,s;if(n[2]==="@")r=n[0],s="mailto:"+r;else{let i;do i=n[0],n[0]=((t=this.rules.inline._backpedal.exec(n[0]))==null?void 0:t[0])??"";while(i!==n[0]);r=n[0],n[1]==="www."?s="http://"+n[0]:s=n[0]}return{type:"link",raw:n[0],text:r,href:s,tokens:[{type:"text",raw:r,text:r}]}}}inlineText(e){const t=this.rules.inline.text.exec(e);if(t){const n=this.lexer.state.inRawBlock;return{type:"text",raw:t[0],text:t[0],escaped:n}}}},ar=class Yc{constructor(t){qe(this,"tokens"),qe(this,"options"),qe(this,"state"),qe(this,"tokenizer"),qe(this,"inlineQueue"),this.tokens=[],this.tokens.links=Object.create(null),this.options=t||gs,this.options.tokenizer=this.options.tokenizer||new Nl,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};const n={other:qt,block:Po.normal,inline:pi.normal};this.options.pedantic?(n.block=Po.pedantic,n.inline=pi.pedantic):this.options.gfm&&(n.block=Po.gfm,this.options.breaks?n.inline=pi.breaks:n.inline=pi.gfm),this.tokenizer.rules=n}static get rules(){return{block:Po,inline:pi}}static lex(t,n){return new Yc(n).lex(t)}static lexInline(t,n){return new Yc(n).inlineTokens(t)}lex(t){t=t.replace(qt.carriageReturn,`
|
||||||
|
`),this.blockTokens(t,this.tokens);for(let n=0;n<this.inlineQueue.length;n++){const r=this.inlineQueue[n];this.inlineTokens(r.src,r.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(t,n=[],r=!1){var s,i,o;for(this.options.pedantic&&(t=t.replace(qt.tabCharGlobal," ").replace(qt.spaceLine,""));t;){let l;if((i=(s=this.options.extensions)==null?void 0:s.block)!=null&&i.some(c=>(l=c.call({lexer:this},t,n))?(t=t.substring(l.raw.length),n.push(l),!0):!1))continue;if(l=this.tokenizer.space(t)){t=t.substring(l.raw.length);const c=n.at(-1);l.raw.length===1&&c!==void 0?c.raw+=`
|
||||||
|
`:n.push(l);continue}if(l=this.tokenizer.code(t)){t=t.substring(l.raw.length);const c=n.at(-1);(c==null?void 0:c.type)==="paragraph"||(c==null?void 0:c.type)==="text"?(c.raw+=`
|
||||||
|
`+l.raw,c.text+=`
|
||||||
|
`+l.text,this.inlineQueue.at(-1).src=c.text):n.push(l);continue}if(l=this.tokenizer.fences(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.heading(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.hr(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.blockquote(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.list(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.html(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.def(t)){t=t.substring(l.raw.length);const c=n.at(-1);(c==null?void 0:c.type)==="paragraph"||(c==null?void 0:c.type)==="text"?(c.raw+=`
|
||||||
|
`+l.raw,c.text+=`
|
||||||
|
`+l.raw,this.inlineQueue.at(-1).src=c.text):this.tokens.links[l.tag]||(this.tokens.links[l.tag]={href:l.href,title:l.title});continue}if(l=this.tokenizer.table(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.lheading(t)){t=t.substring(l.raw.length),n.push(l);continue}let a=t;if((o=this.options.extensions)!=null&&o.startBlock){let c=1/0;const u=t.slice(1);let f;this.options.extensions.startBlock.forEach(p=>{f=p.call({lexer:this},u),typeof f=="number"&&f>=0&&(c=Math.min(c,f))}),c<1/0&&c>=0&&(a=t.substring(0,c+1))}if(this.state.top&&(l=this.tokenizer.paragraph(a))){const c=n.at(-1);r&&(c==null?void 0:c.type)==="paragraph"?(c.raw+=`
|
||||||
|
`+l.raw,c.text+=`
|
||||||
|
`+l.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=c.text):n.push(l),r=a.length!==t.length,t=t.substring(l.raw.length);continue}if(l=this.tokenizer.text(t)){t=t.substring(l.raw.length);const c=n.at(-1);(c==null?void 0:c.type)==="text"?(c.raw+=`
|
||||||
|
`+l.raw,c.text+=`
|
||||||
|
`+l.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=c.text):n.push(l);continue}if(t){const c="Infinite loop on byte: "+t.charCodeAt(0);if(this.options.silent){console.error(c);break}else throw new Error(c)}}return this.state.top=!0,n}inline(t,n=[]){return this.inlineQueue.push({src:t,tokens:n}),n}inlineTokens(t,n=[]){var r,s,i;let o=t,l=null;if(this.tokens.links){const u=Object.keys(this.tokens.links);if(u.length>0)for(;(l=this.tokenizer.rules.inline.reflinkSearch.exec(o))!=null;)u.includes(l[0].slice(l[0].lastIndexOf("[")+1,-1))&&(o=o.slice(0,l.index)+"["+"a".repeat(l[0].length-2)+"]"+o.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(l=this.tokenizer.rules.inline.anyPunctuation.exec(o))!=null;)o=o.slice(0,l.index)+"++"+o.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;(l=this.tokenizer.rules.inline.blockSkip.exec(o))!=null;)o=o.slice(0,l.index)+"["+"a".repeat(l[0].length-2)+"]"+o.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);let a=!1,c="";for(;t;){a||(c=""),a=!1;let u;if((s=(r=this.options.extensions)==null?void 0:r.inline)!=null&&s.some(p=>(u=p.call({lexer:this},t,n))?(t=t.substring(u.raw.length),n.push(u),!0):!1))continue;if(u=this.tokenizer.escape(t)){t=t.substring(u.raw.length),n.push(u);continue}if(u=this.tokenizer.tag(t)){t=t.substring(u.raw.length),n.push(u);continue}if(u=this.tokenizer.link(t)){t=t.substring(u.raw.length),n.push(u);continue}if(u=this.tokenizer.reflink(t,this.tokens.links)){t=t.substring(u.raw.length);const p=n.at(-1);u.type==="text"&&(p==null?void 0:p.type)==="text"?(p.raw+=u.raw,p.text+=u.text):n.push(u);continue}if(u=this.tokenizer.emStrong(t,o,c)){t=t.substring(u.raw.length),n.push(u);continue}if(u=this.tokenizer.codespan(t)){t=t.substring(u.raw.length),n.push(u);continue}if(u=this.tokenizer.br(t)){t=t.substring(u.raw.length),n.push(u);continue}if(u=this.tokenizer.del(t)){t=t.substring(u.raw.length),n.push(u);continue}if(u=this.tokenizer.autolink(t)){t=t.substring(u.raw.length),n.push(u);continue}if(!this.state.inLink&&(u=this.tokenizer.url(t))){t=t.substring(u.raw.length),n.push(u);continue}let f=t;if((i=this.options.extensions)!=null&&i.startInline){let p=1/0;const h=t.slice(1);let d;this.options.extensions.startInline.forEach(_=>{d=_.call({lexer:this},h),typeof d=="number"&&d>=0&&(p=Math.min(p,d))}),p<1/0&&p>=0&&(f=t.substring(0,p+1))}if(u=this.tokenizer.inlineText(f)){t=t.substring(u.raw.length),u.raw.slice(-1)!=="_"&&(c=u.raw.slice(-1)),a=!0;const p=n.at(-1);(p==null?void 0:p.type)==="text"?(p.raw+=u.raw,p.text+=u.text):n.push(u);continue}if(t){const p="Infinite loop on byte: "+t.charCodeAt(0);if(this.options.silent){console.error(p);break}else throw new Error(p)}}return n}},Ol=class{constructor(e){qe(this,"options"),qe(this,"parser"),this.options=e||gs}space(e){return""}code({text:e,lang:t,escaped:n}){var r;const s=(r=(t||"").match(qt.notSpaceStart))==null?void 0:r[0],i=e.replace(qt.endingNewline,"")+`
|
||||||
|
`;return s?'<pre><code class="language-'+Pn(s)+'">'+(n?i:Pn(i,!0))+`</code></pre>
|
||||||
|
`:"<pre><code>"+(n?i:Pn(i,!0))+`</code></pre>
|
||||||
|
`}blockquote({tokens:e}){return`<blockquote>
|
||||||
|
${this.parser.parse(e)}</blockquote>
|
||||||
|
`}html({text:e}){return e}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>
|
||||||
|
`}hr(e){return`<hr>
|
||||||
|
`}list(e){const t=e.ordered,n=e.start;let r="";for(let o=0;o<e.items.length;o++){const l=e.items[o];r+=this.listitem(l)}const s=t?"ol":"ul",i=t&&n!==1?' start="'+n+'"':"";return"<"+s+i+`>
|
||||||
|
`+r+"</"+s+`>
|
||||||
|
`}listitem(e){var t;let n="";if(e.task){const r=this.checkbox({checked:!!e.checked});e.loose?((t=e.tokens[0])==null?void 0:t.type)==="paragraph"?(e.tokens[0].text=r+" "+e.tokens[0].text,e.tokens[0].tokens&&e.tokens[0].tokens.length>0&&e.tokens[0].tokens[0].type==="text"&&(e.tokens[0].tokens[0].text=r+" "+Pn(e.tokens[0].tokens[0].text),e.tokens[0].tokens[0].escaped=!0)):e.tokens.unshift({type:"text",raw:r+" ",text:r+" ",escaped:!0}):n+=r+" "}return n+=this.parser.parse(e.tokens,!!e.loose),`<li>${n}</li>
|
||||||
|
`}checkbox({checked:e}){return"<input "+(e?'checked="" ':"")+'disabled="" type="checkbox">'}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>
|
||||||
|
`}table(e){let t="",n="";for(let s=0;s<e.header.length;s++)n+=this.tablecell(e.header[s]);t+=this.tablerow({text:n});let r="";for(let s=0;s<e.rows.length;s++){const i=e.rows[s];n="";for(let o=0;o<i.length;o++)n+=this.tablecell(i[o]);r+=this.tablerow({text:n})}return r&&(r=`<tbody>${r}</tbody>`),`<table>
|
||||||
|
<thead>
|
||||||
|
`+t+`</thead>
|
||||||
|
`+r+`</table>
|
||||||
|
`}tablerow({text:e}){return`<tr>
|
||||||
|
${e}</tr>
|
||||||
|
`}tablecell(e){const t=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+`</${n}>
|
||||||
|
`}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${Pn(e,!0)}</code>`}br(e){return"<br>"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:n}){const r=this.parser.parseInline(n),s=Ed(e);if(s===null)return r;e=s;let i='<a href="'+e+'"';return t&&(i+=' title="'+Pn(t)+'"'),i+=">"+r+"</a>",i}image({href:e,title:t,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));const s=Ed(e);if(s===null)return Pn(n);e=s;let i=`<img src="${e}" alt="${n}"`;return t&&(i+=` title="${Pn(t)}"`),i+=">",i}text(e){return"tokens"in e&&e.tokens?this.parser.parseInline(e.tokens):"escaped"in e&&e.escaped?e.text:Pn(e.text)}},Tf=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return""+e}image({text:e}){return""+e}br(){return""}},cr=class Zc{constructor(t){qe(this,"options"),qe(this,"renderer"),qe(this,"textRenderer"),this.options=t||gs,this.options.renderer=this.options.renderer||new Ol,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new Tf}static parse(t,n){return new Zc(n).parse(t)}static parseInline(t,n){return new Zc(n).parseInline(t)}parse(t,n=!0){var r,s;let i="";for(let o=0;o<t.length;o++){const l=t[o];if((s=(r=this.options.extensions)==null?void 0:r.renderers)!=null&&s[l.type]){const c=l,u=this.options.extensions.renderers[c.type].call({parser:this},c);if(u!==!1||!["space","hr","heading","code","table","blockquote","list","html","paragraph","text"].includes(c.type)){i+=u||"";continue}}const a=l;switch(a.type){case"space":{i+=this.renderer.space(a);continue}case"hr":{i+=this.renderer.hr(a);continue}case"heading":{i+=this.renderer.heading(a);continue}case"code":{i+=this.renderer.code(a);continue}case"table":{i+=this.renderer.table(a);continue}case"blockquote":{i+=this.renderer.blockquote(a);continue}case"list":{i+=this.renderer.list(a);continue}case"html":{i+=this.renderer.html(a);continue}case"paragraph":{i+=this.renderer.paragraph(a);continue}case"text":{let c=a,u=this.renderer.text(c);for(;o+1<t.length&&t[o+1].type==="text";)c=t[++o],u+=`
|
||||||
|
`+this.renderer.text(c);n?i+=this.renderer.paragraph({type:"paragraph",raw:u,text:u,tokens:[{type:"text",raw:u,text:u,escaped:!0}]}):i+=u;continue}default:{const c='Token with "'+a.type+'" type was not found.';if(this.options.silent)return console.error(c),"";throw new Error(c)}}}return i}parseInline(t,n=this.renderer){var r,s;let i="";for(let o=0;o<t.length;o++){const l=t[o];if((s=(r=this.options.extensions)==null?void 0:r.renderers)!=null&&s[l.type]){const c=this.options.extensions.renderers[l.type].call({parser:this},l);if(c!==!1||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(l.type)){i+=c||"";continue}}const a=l;switch(a.type){case"escape":{i+=n.text(a);break}case"html":{i+=n.html(a);break}case"link":{i+=n.link(a);break}case"image":{i+=n.image(a);break}case"strong":{i+=n.strong(a);break}case"em":{i+=n.em(a);break}case"codespan":{i+=n.codespan(a);break}case"br":{i+=n.br(a);break}case"del":{i+=n.del(a);break}case"text":{i+=n.text(a);break}default:{const c='Token with "'+a.type+'" type was not found.';if(this.options.silent)return console.error(c),"";throw new Error(c)}}}return i}},Ja,Go=(Ja=class{constructor(e){qe(this,"options"),qe(this,"block"),this.options=e||gs}preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}provideLexer(){return this.block?ar.lex:ar.lexInline}provideParser(){return this.block?cr.parse:cr.parseInline}},qe(Ja,"passThroughHooks",new Set(["preprocess","postprocess","processAllTokens"])),Ja),kL=class{constructor(...e){qe(this,"defaults",kf()),qe(this,"options",this.setOptions),qe(this,"parse",this.parseMarkdown(!0)),qe(this,"parseInline",this.parseMarkdown(!1)),qe(this,"Parser",cr),qe(this,"Renderer",Ol),qe(this,"TextRenderer",Tf),qe(this,"Lexer",ar),qe(this,"Tokenizer",Nl),qe(this,"Hooks",Go),this.use(...e)}walkTokens(e,t){var n,r;let s=[];for(const i of e)switch(s=s.concat(t.call(this,i)),i.type){case"table":{const o=i;for(const l of o.header)s=s.concat(this.walkTokens(l.tokens,t));for(const l of o.rows)for(const a of l)s=s.concat(this.walkTokens(a.tokens,t));break}case"list":{const o=i;s=s.concat(this.walkTokens(o.items,t));break}default:{const o=i;(r=(n=this.defaults.extensions)==null?void 0:n.childTokens)!=null&&r[o.type]?this.defaults.extensions.childTokens[o.type].forEach(l=>{const a=o[l].flat(1/0);s=s.concat(this.walkTokens(a,t))}):o.tokens&&(s=s.concat(this.walkTokens(o.tokens,t)))}}return s}use(...e){const t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{const r={...n};if(r.async=this.defaults.async||r.async||!1,n.extensions&&(n.extensions.forEach(s=>{if(!s.name)throw new Error("extension name required");if("renderer"in s){const i=t.renderers[s.name];i?t.renderers[s.name]=function(...o){let l=s.renderer.apply(this,o);return l===!1&&(l=i.apply(this,o)),l}:t.renderers[s.name]=s.renderer}if("tokenizer"in s){if(!s.level||s.level!=="block"&&s.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");const i=t[s.level];i?i.unshift(s.tokenizer):t[s.level]=[s.tokenizer],s.start&&(s.level==="block"?t.startBlock?t.startBlock.push(s.start):t.startBlock=[s.start]:s.level==="inline"&&(t.startInline?t.startInline.push(s.start):t.startInline=[s.start]))}"childTokens"in s&&s.childTokens&&(t.childTokens[s.name]=s.childTokens)}),r.extensions=t),n.renderer){const s=this.defaults.renderer||new Ol(this.defaults);for(const i in n.renderer){if(!(i in s))throw new Error(`renderer '${i}' does not exist`);if(["options","parser"].includes(i))continue;const o=i,l=n.renderer[o],a=s[o];s[o]=(...c)=>{let u=l.apply(s,c);return u===!1&&(u=a.apply(s,c)),u||""}}r.renderer=s}if(n.tokenizer){const s=this.defaults.tokenizer||new Nl(this.defaults);for(const i in n.tokenizer){if(!(i in s))throw new Error(`tokenizer '${i}' does not exist`);if(["options","rules","lexer"].includes(i))continue;const o=i,l=n.tokenizer[o],a=s[o];s[o]=(...c)=>{let u=l.apply(s,c);return u===!1&&(u=a.apply(s,c)),u}}r.tokenizer=s}if(n.hooks){const s=this.defaults.hooks||new Go;for(const i in n.hooks){if(!(i in s))throw new Error(`hook '${i}' does not exist`);if(["options","block"].includes(i))continue;const o=i,l=n.hooks[o],a=s[o];Go.passThroughHooks.has(i)?s[o]=c=>{if(this.defaults.async)return Promise.resolve(l.call(s,c)).then(f=>a.call(s,f));const u=l.call(s,c);return a.call(s,u)}:s[o]=(...c)=>{let u=l.apply(s,c);return u===!1&&(u=a.apply(s,c)),u}}r.hooks=s}if(n.walkTokens){const s=this.defaults.walkTokens,i=n.walkTokens;r.walkTokens=function(o){let l=[];return l.push(i.call(this,o)),s&&(l=l.concat(s.call(this,o))),l}}this.defaults={...this.defaults,...r}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return ar.lex(e,t??this.defaults)}parser(e,t){return cr.parse(e,t??this.defaults)}parseMarkdown(e){return(t,n)=>{const r={...n},s={...this.defaults,...r},i=this.onError(!!s.silent,!!s.async);if(this.defaults.async===!0&&r.async===!1)return i(new Error("marked(): The async option was set to t
Line truncated
|
||||||
|
Please report this to https://github.com/markedjs/marked.`,e){const r="<p>An error occurred:</p><pre>"+Pn(n.message+"",!0)+"</pre>";return t?Promise.resolve(r):r}if(t)return Promise.reject(n);throw n}}},fs=new kL;function Pe(e,t){return fs.parse(e,t)}Pe.options=Pe.setOptions=function(e){return fs.setOptions(e),Pe.defaults=fs.defaults,P_(Pe.defaults),Pe};Pe.getDefaults=kf;Pe.defaults=gs;Pe.use=function(...e){return fs.use(...e),Pe.defaults=fs.defaults,P_(Pe.defaults),Pe};Pe.walkTokens=function(e,t){return fs.walkTokens(e,t)};Pe.parseInline=fs.parseInline;Pe.Parser=cr;Pe.parser=cr.parse;Pe.Renderer=Ol;Pe.TextRenderer=Tf;Pe.Lexer=ar;Pe.lexer=ar.lex;Pe.Tokenizer=Nl;Pe.Hooks=Go;Pe.parse=Pe;Pe.options;Pe.setOptions;Pe.use;Pe.walkTokens;Pe.parseInline;cr.parse;ar.lex;const vL={name:"AIAssistant",components:{Bot:af,Settings:MT,X:ma,Send:n_,Save:PT,Zap:HT,AlertCircle:CT},props:{hideButton:{type:Boolean,default:!1}},setup(e){const{t}=mn(),n=te(!1),r=te(!1),s=te(""),i=te([]),o=te(!1),l=te(!1),a=te(null),c=te(!1),u=te(null),f=te(null),p=te(!1),h=Ht({x:0,y:0}),d=Ht({x:0,y:0}),_=te(!1),C=te(""),S=Ht({x:0,y:0}),b=Ht({width:0,height:0}),g=Ht({width:430,height:770}),m=pe(()=>({transform:`translate(${d.x}px, ${d.y}px)`,width:`${g.width}px`,height:`${g.height}px`,cursor:p.value?"grabbing":"default"})),y=Ht({}),k=pe({get(){var F;return((F=y.models)==null?void 0:F[y.provider])||{}},set(F){y.models&&y.provider&&(Object.assign(y.models[y.provider],F),vs(y))}}),T=pe(()=>G1(y).isValid),L=pe(()=>s.value.trim()&&T.value&&!o.value);At(()=>k.value,(F,P)=>{F&&y.provider&&JSON.stringify(F)!==JSON.stringify(P)&&(vs(y),a.value=null)},{deep:!0}),At(()=>y.provider,(F,P)=>{F&&F!==P&&(vs(y),a.value=null)});const A=()=>{i.value=[],ke("ai",t("ai.welcome")),ke("user",t("ai.demoMessages.user1")),ke("ai",t("ai.demoMessages.ai1")),ke("user",t("ai.demoMessages.user2")),ke("ai",t("ai.demoMessages.ai2"))},O=()=>{A()};gt(async()=>{const F=pa();Object.assign(y,F),A(),window.addEventListener("locale-changed",O)});const H=()=>{n.value=!n.value,n.value&&(c.value=!1,r.value=!1,qn(()=>{var F;(F=f.value)==null||F.focus()}))},M=()=>{n.value=!1,r.value=!1},V=()=>{r.value=!r.value},oe=(F,P)=>{y.models&&y.provider&&(y.models[y.provider]||(y.models[y.provider]={}),y.models[y.provider][F]=P,vs(y),a.value=null)},ie=()=>{vs(y)},Z=()=>{ie(),a.value=null},G=async()=>{l.value=!0,a.value=null;try{const F={...y};F.models[F.provider]={...k.value};const P=await aT();a.value=P}catch(F){a.value={success:!1,message:`${t("settings.errors.connectionFailed")}: ${F.message}`}}finally{l.value=!1}},K=()=>{vs(y),r.value=!1,ke("ai",t("settings.saveSuccess"))},ue=async()=>{if(!L.value)return;const F=s.value.trim();s.value="",ke("user",F),await Wt(F)},ye=F=>{F.key==="Enter"&&!F.shiftKey&&(F.preventDefault(),ue())},ke=(F,P)=>{const U={id:Date.now()+Math.random(),type:F,text:P,timestamp:new Date};i.value.push(U),qn(()=>{He()}),F==="ai"&&!n.value&&(c.value=!0)},He=()=>{u.value&&(u.value.scrollTop=u.value.scrollHeight)},Wt=async F=>{o.value=!0;try{if(!T.value)throw new Error("AI配置不完整,请先完成配置");const{sendAIMessage:P}=await A0(()=>import("./aiService-C9Fe_Phd-d1533d53.js"),[]),U={history:i.value.slice(-6),currentPage:window.location.pathname},Y=await P(F,U);if(!Y)throw new Error("AI返回了空响应");ke("ai",Y)}catch(P){console.error("AI请求失败:",P);let U="AI服务暂时不可用,请稍后重试。";P.message.includes("API密钥")?U="请检查API密钥配置是否正确。":P.message.includes("网络")?U="网络连接失败,请检查网络设置。":P.message.includes("配额")?U="API配额不足,请检查账户余额。":P.message.includes("频率")&&(U="请求过于频繁,请稍后重试。"),ke("ai",`抱歉,${U}
|
||||||
|
|
||||||
|
错误详情:${P.message}`)}finally{o.value=!1}},Bt=F=>F.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}),gn=F=>{if(!F)return"";if(F.startsWith("settings.errors."))return t(F);if(F.includes("settings.errors."))return F.split(", ").map(P=>P.startsWith("settings.errors.")?t(P):P).join(", ");if(F.startsWith("settings.errors.connectionFailed:")){const[P,U]=F.split(": ");return`${t(P)}: ${U}`}return F},it=F=>{try{return Pe.setOptions({breaks:!0,gfm:!0,sanitize:!1,highlight:function(P,U){return`<code class="hljs language-${U}">${j(P)}</code>`}}),Pe(F)}catch(P){return console.error("Markdown渲染失败:",P),j(F)}},j=F=>{const P=document.createElement("div");return P.textContent=F,P.innerHTML},ne=F=>{const P=u.value;if(!P){F.stopPropagation();return}const{scrollTop:U,scrollHeight:Y,clientHeight:E}=P,w=U<=2,N=Math.abs(U+E-Y)<=2,z=F.deltaY<0,D=F.deltaY>0;if(z&&w||D&&N){F.preventDefault(),F.stopPropagation();return}if(Y<=E){F.preventDefault(),F.stopPropagation();return}F.stopPropagation()},J=F=>{var P,U,Y,E;if(window.innerWidth<=768||_.value)return;F.preventDefault(),p.value=!0;const w=F.clientX||((U=(P=F.touches)==null?void 0:P[0])==null?void 0:U.clientX)||0,N=F.clientY||((E=(Y=F.touches)==null?void 0:Y[0])==null?void 0:E.clientY)||0;h.x=w-d.x,h.y=N-d.y,document.addEventListener("mousemove",le,{passive:!1}),document.addEventListener("mouseup",be,{passive:!0}),document.addEventListener("touchmove",le,{passive:!1}),document.addEventListener("touchend",be,{passive:!0}),document.body.style.userSelect="none"},le=F=>{var P,U,Y,E;if(!p.value)return;const w=F.clientX||((U=(P=F.touches)==null?void 0:P[0])==null?void 0:U.clientX)||0,N=F.clientY||((E=(Y=F.touches)==null?void 0:Y[0])==null?void 0:E.clientY)||0;d.x=w-h.x,d.y=N-h.y},be=()=>{p.value=!1,document.removeEventListener("mousemove",le,{passive:!1}),document.removeEventListener("mouseup",be,{passive:!0}),document.removeEventListener("touchmove",le,{passive:!1}),document.removeEventListener("touchend",be,{passive:!0}),document.body.style.userSelect=""},De=(F,P)=>{window.innerWidth<=768||(_.value=!0,C.value=F,S.x=P.clientX,S.y=P.clientY,b.width=g.width,b.height=g.height,S.panelX=d.x,S.panelY=d.y,document.addEventListener("mousemove",x,{passive:!1}),document.addEventListener("mouseup",v,{passive:!0}),document.body.style.userSelect="none",document.body.style.cursor=R(F),P.preventDefault(),P.stopPropagation())},x=F=>{if(!_.value)return;const P=F.clientX-S.x,U=F.clientY-S.y,Y=C.value;let E=b.width,w=b.height,N=S.panelX,z=S.panelY;if(Y.includes("e")&&(E=Math.max(300,Math.min(window.innerWidth-50,b.width+P))),Y.includes("w")){const D=S.panelX+b.width-50;E=Math.max(300,Math.min(D,b.width-P)),N=S.panelX+b.width-E}if(Y.includes("s")&&(w=Math.max(400,Math.min(window.innerHeight-50,b.height+U))),Y.includes("n")){const D=S.panelY+b.height-50;w=Math.max(400,Math.min(D,b.height-U)),z=S.panelY+b.height-w}g.width=E,g.height=w,d.x=N,d.y=z},v=()=>{_.value=!1,C.value="",document.removeEventListener("mousemove",x,{passive:!1}),document.removeEventListener("mouseup",v,{passive:!0}),document.body.style.userSelect="",document.body.style.cursor=""},R=F=>({n:"n-resize",s:"s-resize",w:"w-resize",e:"e-resize",nw:"nw-resize",ne:"ne-resize",sw:"sw-resize",se:"se-resize"})[F]||"default";return Mt(()=>{be(),v(),window.removeEventListener("locale-changed",O)}),{isOpen:n,showSettings:r,currentMessage:s,messages:i,isLoading:o,testing:l,testResult:a,hasUnreadMessages:c,messagesContainer:u,messageInput:f,currentConfig:y,currentProviderConfig:k,isConfigured:T,canSend:L,toggleAI:H,closeAI:M,toggleSettings:V,updateProviderConfig:oe,onConfigChange:ie,onProviderChange:Z,testConnection:G,saveSettings:K,sendMessage:ue,handleKeydown:ye,formatTime:Bt,formatErrorMessage:gn,renderMarkdown:it,escapeHtml:j,handleChatWheel:ne,startDrag:J,startResize:De,panelStyle:m,t,toggleAI:H,closeAI:M,isOpen:n}}},EL=["title"],CL={key:0,class:"notification-dot"},wL={class:"ai-title"},AL={class:"drag-hint"},SL={class:"ai-actions"},xL=["title"],TL=["title"],IL={class:"setting-group"},LL={value:"custom"},DL={class:"setting-group"},NL=["value","placeholder"],OL={class:"setting-group"},FL=["value","placeholder"],RL={class:"setting-group"},PL=["value","placeholder"],ML={class:"setting-actions"},$L=["disabled"],BL={key:1,class:"ai-chat"},zL={class:"message-content"},UL=["innerHTML"],HL={class:"message-time"},jL={key:0,class:"message ai loading"},VL={class:"chat-input"},qL={class:"input-wrapper"},WL=["placeholder","disabled"],KL=["disabled"],GL={key:0,class:"config-notice"},YL={class:"resize-handles"};function ZL(e,t,n,r,s,i){const o=$e("Bot"),l=$e("Settings"),a=$e("X"),c=$e("Zap"),u=$e("AlertCircle"),f=$e("Save"),p=$e("Send");return B(),q("div",{class:Se(["ai-assistant",{"ai-assistant--open":r.isOpen}])},[n.hideButton?de("",!0):(B(),q("button",{key:0,class:"ai-trigger-btn",onClick:t[0]||(t[0]=(...h)=>r.toggleAI&&r.toggleAI(...h)),title:r.isOpen?r.t("ai.close"):r.t("ai.open")},[X(o,{size:20}),r.hasUnreadMessages?(B(),q("span",CL)):deLine truncated
|
||||||
|
`),n={};let r=0;function s(l){const a=l.trim();return a==="true"?!0:a==="false"?!1:/^\d+$/.test(a)?parseInt(a):a.startsWith('"')&&a.endsWith('"')?a.slice(1,-1):a}function i(l){const a={};for(;r<t.length;){const c=t[r],u=c.trim();if(!u||u.startsWith("#")){r++;continue}const f=c.length-c.trimStart().length;if(f<l)break;if(f===l&&u.includes(":")){const p=u.indexOf(":"),h=u.substring(0,p).trim(),d=u.substring(p+1).trim();if(d){const _=s(d);a[h]=_,r++}else if(r++,r<t.length){const _=t[r],C=_.trim(),S=_.length-_.trimStart().length;S>f&&C.startsWith("- ")?a[h]=o(S):S>f?a[h]=i(S):a[h]={}}else a[h]={}}else r++}return a}function o(l){const a=[];for(;r<t.length;){const c=t[r],u=c.trim();if(!u||u.startsWith("#")){r++;continue}const f=c.length-c.trimStart().length;if(f<l)break;if(f===l&&u.startsWith("- ")){const p=u.substring(2).trim();if(p.includes(":")){const h=p.indexOf(":"),d=p.substring(0,h).trim(),_=p.substring(h+1).trim(),C={};if(_)C[d]=s(_),r++;else if(r++,r<t.length){const S=t[r],b=S.length-S.trimStart().length;b>f?C[d]=i(b):C[d]={}}else C[d]={};for(;r<t.length;){const S=t[r],b=S.trim();if(!b||b.startsWith("#")){r++;continue}const g=S.length-S.trimStart().length;if(g<=l)break;if(g===l+2&&b.includes(":")){const m=b.indexOf(":"),y=b.substring(0,m).trim(),k=b.substring(m+1).trim();if(k)C[y]=s(k),r++;else if(r++,r<t.length){const T=t[r],L=T.length-T.trimStart().length;L>g?T.trim().startsWith("- ")?C[y]=o(L):C[y]=i(L):C[y]={}}else C[y]={}}else break}a.push(C)}else a.push(s(p)),r++}else r++}return a}for(;r<t.length;){const l=t[r],a=l.trim();if(!a||a.startsWith("#")){r++;continue}if(l.length-l.trimStart().length===0&&a.includes(":")){const c=a.indexOf(":"),u=a.substring(0,c).trim(),f=a.substring(c+1).trim();if(f)n[u]=s(f),r++;else if(r++,r<t.length){const p=t[r],h=p.trim(),d=p.length-p.trimStart().length;d>0&&h.startsWith("- ")?n[u]=o(d):d>0?n[u]=i(d):n[u]={}}else n[u]={}}else r++}return n}async function _5(e){try{const t=await(await fetch(e)).text();return g5(t)}catch(t){throw console.error("Failed to load config:",t),t}}function Fl(e){var t;return{text:e.text||e.title,title:e.title||e.text,link:e.link||e.path,path:e.path||e.link,children:(t=e.children)==null?void 0:t.map(Fl),collapsed:e.collapsed}}function Xc(e){let t=[];return e.sidebar&&(Array.isArray(e.sidebar)?t=e.sidebar:e.sidebar.sections&&(t=e.sidebar.sections)),t.map(Fl)}function y5(e,t){const n=[];let r=[];Array.isArray(e)?r=e.map(Fl):e!=null&&e.sections&&(r=e.sections.map(Fl));function s(i,o=""){const l=i.link||i.path;if(l){const a={path:l,name:i.text||i.title,component:t||(()=>Promise.resolve({template:"<div>Page not found</div>"})),props:{title:i.text||i.title}};n.push(a)}i.children&&i.children.forEach(a=>s(a,l||o))}return r.forEach(i=>s(i)),n}function b5(e,t=2){const n=[],r=e.split(`
|
||||||
|
`);for(const s of r){const i=s.match(/^(#{1,6})\s+(.+)/);if(i){const o=i[1].length,l=i[2].trim();if(o<=t){const a=l.toLowerCase().replace(/[^\w\s\u4e00-\u9fff-]/g,"").replace(/\s+/g,"-").replace(/^-+|-+$/g,"");n.push({text:l,anchor:a,level:o})}}}return k5(n)}function k5(e){const t=[],n=[];for(const r of e){for(;n.length>0&&n[n.length-1].level>=r.level;)n.pop();if(n.length===0)t.push(r);else{const s=n[n.length-1];s.children||(s.children=[]),s.children.push(r)}n.push(r)}return t}function K_(e){var t,n;return{depth:((t=e==null?void 0:e.toc)==null?void 0:t.depth)||2,enabled:((n=e==null?void 0:e.toc)==null?void 0:n.enabled)!==!1}}const v5={class:"docs-layout"},E5={class:"docs-container"},C5={class:"docs-main"},w5={class:"docs-content"},Ad=Cn({__name:"DocsLayout",props:{config:{},showToc:{type:Boolean,default:!0}},setup(e,{expose:t}){const n=e;ri();const r=te(!1),s=te([]),i=te(null),o=te(null),l=te(null),a=te(null),c=te(!1),u=te(!1),f=pe(()=>K_(n.config));rs("docsConfig",n.config),rs("updateTocHeaders",_);function p(){r.value=!r.value}function h(){r.value=!1}function d(){const y=document.documentElement;y.classList.contains("dark")?(y.classList.remove("dark"),localStorage.setItem("theme","light")):(y.classList.add("dark"),localStorage.setItem("theme","dark"))}function _(y){s.value=y}function C(){var y;(y=i.value)==null||y.toggleAI()}function S(){var y;(y=o.value)==null||y.openSearch()}function b(){var y;(y=i.value)==null||y.toggleAI()}function g(){var y;(y=a.value)==null||y.toggleFeedbackPanel()}function m(){var y;(y=o.value)==null||y.openSearch()}return gt(()=>{var y;const k=(y=n.config)==null?void 0:y.theme,T=localStorage.getItem("theme"),L=window.matchMedia("(prefers-color-scheme: dark)").matches;let A=!1;if(T)A=T==="dark";else if(k!=null&&k.defaultMode)switch(k.defaultMode){case"dark":A=!0;break;case"light":A=!1;break;case"auto":default:A=L;break}else A=L;A?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark"),setTimeout(()=>{var O,H;(O=i.value)!=null&&O.hasUnreadMessages&&(c.value=i.value.hasUnreadMessages),(H=a.value)!=null&&H.hasNewNotifications&&(u.value=a.value.hasNewNotifications)},1e3)}),t({updateTocHeaders:_}),(y,k)=>{const T=$e("router-view");return B(),q("div",v5,[X(i_,{config:y.config,onToggleSidebar:p,onToggleTheme:d,onToggleAi:C,onToggleSearch:S},null,8,["config"]),I("div",E5,[X(o_,{config:y.config,"is-open":r.value,onClose:h},null,8,["config","is-open"]),r.value?(B(),q("div",{key:0,class:"sidebar-overlay",onClick:h})):de("",!0),I("main",C5,[I("div",w5,[X(T,{onTocUpdated:_})]),X(m5,{config:y.config},null,8,["config"])]),y.showToc&&f.value.enabled?(B(),Be(R_,{key:1,headers:s.value,class:"docs-toc"},null,8,["headers"])):de("",!0)]),X(XL,{ref_key:"aiAssistant",ref:i,"hide-button":!0},null,512),X(mD,{ref_key:"searchModal",ref:o},null,512),X(LD,{ref_key:"readingProgress",ref:l},null,512),X(lN,{ref_key:"feedbackSystem",ref:a,"hide-button":!0},null,512),X(pN,{"has-ai-notifications":c.value,"has-feedback-notifications":u.value,onAiClick:b,onFeedbackClick:g,onSearchClick:m},null,8,["has-ai-notifications","has-feedback-notifications"])])}}}),A5={class:"default-home"},S5={class:"hero"},x5={class:"hero-content"},T5={class:"hero-title"},I5={class:"hero-logo"},L5=["src","alt"],D5={key:1,class:"logo-text"},N5={class:"hero-description"},O5={class:"chapters"},F5={class:"chapter-grid"},R5=["onClick"],P5={class:"chapter-sections"},M5={key:0,class:"more-sections"},$5=Cn({__name:"DefaultHome",props:{config:{}},setup(e){const t=e,n=tt("docsConfig"),r=pe(()=>t.config||n),{t:s}=mn(),i=la(),o=Ht({title:"",description:"",logo:"",author:""}),l=te(null),a=pe(()=>{const h=l.value||r.value;return h?Xc(h):[]}),c=h=>{if(!h||typeof h!="string")return!1;const d=h.match(/^(https?:\/\/|\/|\.\/|\.\.\/)/i),_=h.match(/\.(jpg|jpeg|png|gif|svg|webp|ico)(\?.*)?$/i);return!!d&&!!_},u=async()=>{try{const h=await ii();l.value=h;const d=of();Object.assign(o,d)}catch(h){console.error("DefaultHome: 加载配置失败:",h),Object.assign(o,{title:"Documentation",description:"Welcome to our documentation",logo:"📚",author:""}),l.value=null}},f=()=>{u()};function p(h){const d=h.link||h.path;if(d)i.push(d);else if(h.children&&h.children.length>0){const _=h.children[0],C=_.link||_.path;C&&i.push(C)}}return gt(async()=>{await u(),window.addEventListener("locale-changed",f)}),Mt(()=>{window.removeEventListener("locale-changed",f)}),(h,d)=>{const _=$e("router-link");return B(),q("div",A5,[I("div",S5,[I("div",x5,[I("h1",T5,[I("div",I5,[c(o.logo)?(B(),q("img",{key:0,src:o.logo,alt:o.title,class:"logo-image"},null,8,L5)):(B(),q("span",D5,W(o.logo),1))]),We(" "+W(o.title),1)]),I("p",N5,W(o.description),1)])]),I("div",O5,[I("h2",null,W(Q(s)("nav.tableOfContents")),1),I("div",F5,[(B(!0),q(Ce,null,wt(a.value,C=>{var S;return B(),q("div",{key:C.text||C.title,class:"chapter-card",onClick:b=>p(C)},[I("h3",null,W(C.text||C.title),1),I("div",P5,[(B(!0),q(Ce,null,wt((S=C.children)==null?void 0:S.slice(0,3),b=>(B(),q("di
Line truncated
|
||||||
|
|
||||||
|
${r("common.noContent")}
|
||||||
|
|
||||||
|
${r("common.loadError")}`}else throw new Error(`HTTP ${L.status}: ${L.statusText}`)}catch(y){console.error("加载Markdown内容失败:",y),u.value=y instanceof Error?y.message:r("common.error")}finally{c.value=!1}}function S(g){i&&i(g)}const b=()=>{_().then(()=>{C()})};return At(()=>n.path,()=>{C()},{immediate:!1}),gt(async()=>{await _(),await C(),window.addEventListener("locale-changed",b)}),Mt(()=>{window.removeEventListener("locale-changed",b)}),(g,m)=>{const y=$e("router-link");return B(),q("div",U5,[f.value.length>0?(B(),q("nav",H5,[X(y,{to:"/"},{default:Ot(()=>[We(W(Q(r)("nav.home")),1)]),_:1}),(B(!0),q(Ce,null,wt(f.value,(k,T)=>(B(),q("span",{key:T},[m[0]||(m[0]=I("span",{class:"separator"}," / ",-1)),T===f.value.length-1?(B(),q("span",j5,W(k.title),1)):(B(),Be(y,{key:1,to:k.path},{default:Ot(()=>[We(W(k.title),1)]),_:2},1032,["to"]))]))),128))])):de("",!0),c.value?(B(),q("div",V5,[I("p",null,W(Q(r)("common.loading")),1)])):u.value?(B(),q("div",q5,[I("h2",null,"⚠️ "+W(Q(r)("common.error")),1),I("p",null,W(u.value),1),I("button",{onClick:C,class:"retry-btn"},W(Q(r)("common.retry")),1)])):(B(),q("div",W5,[X(G_,{content:a.value,"enable-toc":!0,onTocGenerated:S},null,8,["content"])])),!c.value&&!u.value?(B(),q("nav",K5,[h.value?(B(),Be(y,{key:0,to:h.value.link,class:"nav-link prev"},{default:Ot(()=>[m[1]||(m[1]=I("span",{class:"nav-arrow"},"←",-1)),I("div",G5,[I("div",Y5,W(Q(r)("common.prev")),1),I("div",Z5,W(h.value.text),1)])]),_:1,__:[1]},8,["to"])):de("",!0),d.value?(B(),Be(y,{key:1,to:d.value.link,class:"nav-link next"},{default:Ot(()=>[I("div",X5,[I("div",Q5,W(Q(r)("common.next")),1),I("div",J5,W(d.value.text),1)]),m[2]||(m[2]=I("span",{class:"nav-arrow"},"→",-1))]),_:1,__:[2]},8,["to"])):de("",!0)])):de("",!0)])}}}),tO=rn(eO,[["__scopeId","data-v-45369187"]]);function nO(e){if(e&&(e.title&&(document.title=e.title),e.description)){let t=document.querySelector('meta[name="description"]');t?t.setAttribute("content",e.description):(t=document.createElement("meta"),t.setAttribute("name","description"),t.setAttribute("content",e.description),document.head.appendChild(t))}}async function rO(e={}){const{configPath:t="/config/site.yaml",el:n="#app",customComponents:r={}}=e;try{const s=document.querySelector(n);if(!s)throw new Error(`目标元素 "${n}" 不存在,请确保DOM已加载完成`);s.innerHTML="";const i=await _5(t);i.site&&nO(i.site);const o=[{path:"/",name:"Home",component:r.home||B5,props:{config:i}},...y5(i.sidebar,r.article||tO)],l=DC({history:oC(),routes:o}),a=Bi({render(){return Dt(Ad,{config:i,showToc:!0})},setup(){return{config:i}}});a.component("DocsLayout",Ad),a.component("HeaderNav",i_),a.component("SidebarNav",o_),a.component("TableOfContents",R_),a.component("MarkdownRenderer",G_),a.component("ThemeSwitcher",s_),a.use(l),a.use(lf),a.provide("docsConfig",i);const c=a.mount(n);return{app:a,router:l,config:i,mountedApp:c}}catch(s){console.error("创建文档应用失败:",s);const i=s instanceof Error?s.message:"未知错误",o=s instanceof Error?s.stack:String(s);throw document.querySelector(n)&&Bi({render(){return Dt("div",{style:{padding:"2rem",textAlign:"center",color:"#ef4444"}},[Dt("h2","❌ 加载失败"),Dt("p",i),Dt("details",[Dt("summary","详细信息"),Dt("pre",{style:{textAlign:"left",fontSize:"12px"}},o)])])}}).mount(n),s}}document.addEventListener("DOMContentLoaded",()=>{rO({configPath:"/config/site.yaml",el:"#app"}).catch(e=>{console.error("启动文档应用失败:",e);const t=document.getElementById("app");t&&(t.innerHTML=`
|
||||||
|
<div style="padding: 2rem; text-align: center; color: #ef4444;">
|
||||||
|
<h2>❌ 加载失败</h2>
|
||||||
|
<p>${e.message||"未知错误"}</p>
|
||||||
|
<button onclick="location.reload()" style="margin-top: 1rem; padding: 0.5rem 1rem; background: #3b82f6; color: white; border: none; border-radius: 4px; cursor: pointer;">重新加载</button>
|
||||||
|
</div>
|
||||||
|
`)})});export{K1 as G,pa as j,sO as u};
|
||||||
Vendored
+59
@@ -0,0 +1,59 @@
|
|||||||
|
{
|
||||||
|
"enabled": true,
|
||||||
|
"provider": "openai",
|
||||||
|
"models": {
|
||||||
|
"openai": {
|
||||||
|
"modelId": "gpt-3.5-turbo",
|
||||||
|
"apiKey": "",
|
||||||
|
"baseUrl": "https://api.openai.com/v1",
|
||||||
|
"maxTokens": 4000,
|
||||||
|
"temperature": 0.7
|
||||||
|
},
|
||||||
|
"claude": {
|
||||||
|
"modelId": "claude-3-sonnet-20240229",
|
||||||
|
"apiKey": "",
|
||||||
|
"baseUrl": "https://api.anthropic.com",
|
||||||
|
"maxTokens": 4000,
|
||||||
|
"temperature": 0.7
|
||||||
|
},
|
||||||
|
"gemini": {
|
||||||
|
"modelId": "gemini-pro",
|
||||||
|
"apiKey": "",
|
||||||
|
"baseUrl": "https://generativelanguage.googleapis.com/v1",
|
||||||
|
"maxTokens": 4000,
|
||||||
|
"temperature": 0.7
|
||||||
|
},
|
||||||
|
"deepseek-v3": {
|
||||||
|
"modelId": "deepseek-chat",
|
||||||
|
"apiKey": "",
|
||||||
|
"baseUrl": "https://api.deepseek.com",
|
||||||
|
"maxTokens": 4000,
|
||||||
|
"temperature": 0.7
|
||||||
|
},
|
||||||
|
"deepseek-r1": {
|
||||||
|
"modelId": "deepseek-reasoner",
|
||||||
|
"apiKey": "",
|
||||||
|
"baseUrl": "https://api.deepseek.com",
|
||||||
|
"maxTokens": 4000,
|
||||||
|
"temperature": 0.7
|
||||||
|
},
|
||||||
|
"custom": {
|
||||||
|
"modelId": "",
|
||||||
|
"apiKey": "",
|
||||||
|
"baseUrl": "",
|
||||||
|
"maxTokens": 4000,
|
||||||
|
"temperature": 0.7
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"features": {
|
||||||
|
"chatAssistant": true,
|
||||||
|
"documentSummary": true,
|
||||||
|
"codeExplanation": true,
|
||||||
|
"searchEnhancement": false
|
||||||
|
},
|
||||||
|
"ui": {
|
||||||
|
"position": "bottom-right",
|
||||||
|
"theme": "auto",
|
||||||
|
"size": "medium"
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+133
@@ -0,0 +1,133 @@
|
|||||||
|
# Website Configuration
|
||||||
|
site:
|
||||||
|
title: "Agricultural Stock Data Analysis System"
|
||||||
|
description: "Big data-driven agricultural stock data analysis platform"
|
||||||
|
# Logo formats supported:
|
||||||
|
# 1. emoji: "🤖"
|
||||||
|
# 2. image URL: "https://example.com/logo.png"
|
||||||
|
# 3. local image: "/images/logo.png"
|
||||||
|
# 4. relative path: "./assets/logo.svg"
|
||||||
|
logo: "🌾"
|
||||||
|
author: "Agricultural Stock Platform Team"
|
||||||
|
|
||||||
|
# Navigation Bar Configuration
|
||||||
|
navbar:
|
||||||
|
items:
|
||||||
|
- title: "Home"
|
||||||
|
link: "/"
|
||||||
|
active: true
|
||||||
|
- title: "Guide"
|
||||||
|
link: "/guide"
|
||||||
|
- title: "Gitea"
|
||||||
|
link: "https://gitea.shenjianl.cn/shenjianZ/agricultural-sock-amalysis"
|
||||||
|
external: true
|
||||||
|
|
||||||
|
# Sidebar Navigation Configuration
|
||||||
|
sidebar:
|
||||||
|
sections:
|
||||||
|
- title: "System Guide"
|
||||||
|
path: "/guide"
|
||||||
|
children:
|
||||||
|
- title: "Data Collector"
|
||||||
|
path: "/guide/data-collector"
|
||||||
|
- title: "Spark Processor"
|
||||||
|
path: "/guide/spark-processor"
|
||||||
|
- title: "Backend API"
|
||||||
|
path: "/guide/backend"
|
||||||
|
- title: "Frontend Interface"
|
||||||
|
path: "/guide/frontend"
|
||||||
|
|
||||||
|
|
||||||
|
# Theme Configuration
|
||||||
|
theme:
|
||||||
|
# Default theme mode: 'light' | 'dark' | 'auto'
|
||||||
|
# light: Force light mode
|
||||||
|
# dark: Force dark mode
|
||||||
|
# auto: Follow system preference (default)
|
||||||
|
defaultMode: "auto"
|
||||||
|
|
||||||
|
# Allow users to toggle theme (show theme toggle button)
|
||||||
|
allowToggle: true
|
||||||
|
|
||||||
|
# Color Configuration
|
||||||
|
colors:
|
||||||
|
primary: "#3b82f6"
|
||||||
|
secondary: "#64748b"
|
||||||
|
accent: "#06b6d4"
|
||||||
|
background: "#ffffff"
|
||||||
|
surface: "#f8fafc"
|
||||||
|
text: "#1e293b"
|
||||||
|
textSecondary: "#64748b"
|
||||||
|
border: "#e2e8f0"
|
||||||
|
|
||||||
|
fonts:
|
||||||
|
primary: "Inter, -apple-system, BlinkMacSystemFont, sans-serif"
|
||||||
|
mono: "JetBrains Mono, Consolas, monospace"
|
||||||
|
|
||||||
|
# Table of Contents Configuration
|
||||||
|
toc:
|
||||||
|
# Maximum heading level to display in TOC (1-6)
|
||||||
|
maxLevel: 2
|
||||||
|
|
||||||
|
# Enable table of contents
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
# TOC title
|
||||||
|
title: "On This Page"
|
||||||
|
|
||||||
|
# Footer Configuration
|
||||||
|
footer:
|
||||||
|
enabled: true
|
||||||
|
copyright: "© 2024 Vue Docs UI. All rights reserved."
|
||||||
|
repository:
|
||||||
|
url: "https://gitea.shenjianl.cn/shenjianZ/agricultural-sock-amalysis"
|
||||||
|
branch: "master"
|
||||||
|
lastUpdated: "2024-12-19"
|
||||||
|
links:
|
||||||
|
- title: "Documentation"
|
||||||
|
link: "/guide/introduction"
|
||||||
|
- title: "GitHub"
|
||||||
|
link: "https://gitea.shenjianl.cn/shenjianZ/agricultural-sock-amalysis"
|
||||||
|
external: true
|
||||||
|
- title: "License"
|
||||||
|
link: "/license"
|
||||||
|
social:
|
||||||
|
- name: "email"
|
||||||
|
url: "mailto:15202078626@163.com"
|
||||||
|
icon: "mail"
|
||||||
|
- name: "gitea"
|
||||||
|
url: "https://gitea.shenjianl.cn/shenjianZ/agricultural-sock-amalysis"
|
||||||
|
icon: "gitea"
|
||||||
|
# - name: "youtube"
|
||||||
|
# url: "https://youtube.com/@yourhandle"
|
||||||
|
# icon: "youtube"
|
||||||
|
# - name: "twitter"
|
||||||
|
# url: "https://twitter.com/yourhandle"
|
||||||
|
# icon: "twitter"
|
||||||
|
# - name: "discord"
|
||||||
|
# url: "https://discord.gg/yourinvite"
|
||||||
|
# icon: "discord"
|
||||||
|
# - name: "telegram"
|
||||||
|
# url: "https://t.me/yourhandle"
|
||||||
|
# icon: "telegram"
|
||||||
|
# - name: "tiktok"
|
||||||
|
# url: "https://tiktok.com/@yourhandle"
|
||||||
|
# icon: "tiktok"
|
||||||
|
- name: "bilibili"
|
||||||
|
url: "https://space.bilibili.com/443299209"
|
||||||
|
icon: "bilibili"
|
||||||
|
- name: "qq"
|
||||||
|
url: "mqqapi://card/show_pslcard?src_type=internal&version=1&uin=2934674522&card_type=person&source=qrcode"
|
||||||
|
icon: "qq"
|
||||||
|
- name: "wechat"
|
||||||
|
url: "weixin://dl/add?zlt2629496476520"
|
||||||
|
icon: "wechat"
|
||||||
|
# - name: "weibo"
|
||||||
|
# url: "https://weibo.com/yourhandle"
|
||||||
|
# icon: "weibo"
|
||||||
|
# - name: "douyin"
|
||||||
|
# url: "https://www.douyin.com/user/yourhandle"
|
||||||
|
# icon: "douyin"
|
||||||
|
# - name: "zhihu"
|
||||||
|
# url: "https://www.zhihu.com/people/yourhandle"
|
||||||
|
# icon: "zhihu"
|
||||||
Vendored
+164
@@ -0,0 +1,164 @@
|
|||||||
|
# 网站基本配置
|
||||||
|
site:
|
||||||
|
title: "农业股票数据分析系统"
|
||||||
|
description: "基于大数据技术的农业股票数据分析平台"
|
||||||
|
# logo支持以下格式:
|
||||||
|
# 1. emoji: "🤖"
|
||||||
|
# 2. 图片URL: "https://example.com/logo.png"
|
||||||
|
# 3. 本地图片: "/images/logo.png"
|
||||||
|
# 4. 相对路径: "./assets/logo.svg"
|
||||||
|
logo: "🌾"
|
||||||
|
author: "Agricultural Stock Platform Team"
|
||||||
|
|
||||||
|
# 顶部导航配置
|
||||||
|
navbar:
|
||||||
|
items:
|
||||||
|
- title: "首页"
|
||||||
|
link: "/"
|
||||||
|
active: true
|
||||||
|
- title: "指南"
|
||||||
|
link: "/guide"
|
||||||
|
- title: "Gitea"
|
||||||
|
link: "https://gitea.shenjianl.cn/shenjianZ/agricultural-sock-amalysis"
|
||||||
|
external: true
|
||||||
|
|
||||||
|
# 侧边栏导航配置
|
||||||
|
sidebar:
|
||||||
|
sections:
|
||||||
|
- title: "系统指南"
|
||||||
|
path: "/guide"
|
||||||
|
children:
|
||||||
|
- title: "数据采集器"
|
||||||
|
path: "/guide/data-collector"
|
||||||
|
- title: "Spark数据处理器"
|
||||||
|
path: "/guide/spark-processor"
|
||||||
|
- title: "后端API服务"
|
||||||
|
path: "/guide/backend"
|
||||||
|
- title: "前端界面"
|
||||||
|
path: "/guide/frontend"
|
||||||
|
|
||||||
|
|
||||||
|
# Theme Configuration
|
||||||
|
theme:
|
||||||
|
# Default theme mode: 'light' | 'dark' | 'auto'
|
||||||
|
# light: Force light mode
|
||||||
|
# dark: Force dark mode
|
||||||
|
# auto: Follow system preference (default)
|
||||||
|
defaultMode: "auto"
|
||||||
|
|
||||||
|
# Allow users to toggle theme (show theme toggle button)
|
||||||
|
allowToggle: true
|
||||||
|
|
||||||
|
# Color Configuration
|
||||||
|
colors:
|
||||||
|
primary: "#3b82f6"
|
||||||
|
secondary: "#64748b"
|
||||||
|
accent: "#06b6d4"
|
||||||
|
background: "#ffffff"
|
||||||
|
surface: "#f8fafc"
|
||||||
|
text: "#1e293b"
|
||||||
|
textSecondary: "#64748b"
|
||||||
|
border: "#e2e8f0"
|
||||||
|
success: "#10b981"
|
||||||
|
warning: "#f59e0b"
|
||||||
|
error: "#ef4444"
|
||||||
|
|
||||||
|
fonts:
|
||||||
|
primary: "Inter, -apple-system, BlinkMacSystemFont, sans-serif"
|
||||||
|
mono: "JetBrains Mono, Consolas, Monaco, monospace"
|
||||||
|
|
||||||
|
# Layout Configuration
|
||||||
|
layout:
|
||||||
|
headerHeight: "60px"
|
||||||
|
sidebarWidth: "280px"
|
||||||
|
tocWidth: "240px"
|
||||||
|
contentMaxWidth: "1200px"
|
||||||
|
|
||||||
|
# Table of Contents Configuration
|
||||||
|
toc:
|
||||||
|
# Maximum heading level to display in TOC (1-6)
|
||||||
|
maxLevel: 3
|
||||||
|
|
||||||
|
# Enable table of contents
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
# TOC title
|
||||||
|
title: "本页目录"
|
||||||
|
|
||||||
|
# Show TOC on mobile devices
|
||||||
|
showOnMobile: false
|
||||||
|
|
||||||
|
# Footer Configuration
|
||||||
|
footer:
|
||||||
|
enabled: true
|
||||||
|
copyright: "© 2024 Vue Docs UI. All rights reserved."
|
||||||
|
repository:
|
||||||
|
url: "https://gitea.shenjianl.cn/shenjianZ/agricultural-sock-amalysis"
|
||||||
|
branch: "master"
|
||||||
|
lastUpdated: "2024-12-19"
|
||||||
|
links:
|
||||||
|
- title: "Documentation"
|
||||||
|
link: "/guide/introduction"
|
||||||
|
- title: "GitHub"
|
||||||
|
link: "https://gitea.shenjianl.cn/shenjianZ/agricultural-sock-amalysis"
|
||||||
|
external: true
|
||||||
|
- title: "License"
|
||||||
|
link: "/license"
|
||||||
|
social:
|
||||||
|
- name: "email"
|
||||||
|
url: "mailto:15202078626@163.com"
|
||||||
|
icon: "mail"
|
||||||
|
- name: "gitea"
|
||||||
|
url: "https://gitea.shenjianl.cn/shenjianZ/agricultural-sock-amalysis"
|
||||||
|
icon: "gitea"
|
||||||
|
# - name: "youtube"
|
||||||
|
# url: "https://youtube.com/@yourhandle"
|
||||||
|
# icon: "youtube"
|
||||||
|
# - name: "twitter"
|
||||||
|
# url: "https://twitter.com/yourhandle"
|
||||||
|
# icon: "twitter"
|
||||||
|
# - name: "discord"
|
||||||
|
# url: "https://discord.gg/yourinvite"
|
||||||
|
# icon: "discord"
|
||||||
|
# - name: "telegram"
|
||||||
|
# url: "https://t.me/yourhandle"
|
||||||
|
# icon: "telegram"
|
||||||
|
# - name: "tiktok"
|
||||||
|
# url: "https://tiktok.com/@yourhandle"
|
||||||
|
# icon: "tiktok"
|
||||||
|
- name: "bilibili"
|
||||||
|
url: "https://space.bilibili.com/443299209"
|
||||||
|
icon: "bilibili"
|
||||||
|
- name: "qq"
|
||||||
|
url: "mqqapi://card/show_pslcard?src_type=internal&version=1&uin=2934674522&card_type=person&source=qrcode"
|
||||||
|
icon: "qq"
|
||||||
|
- name: "wechat"
|
||||||
|
url: "weixin://contacts/profile/zlt2629496476520"
|
||||||
|
icon: "wechat"
|
||||||
|
# - name: "weibo"
|
||||||
|
# url: "https://weibo.com/yourhandle"
|
||||||
|
# icon: "weibo"
|
||||||
|
# - name: "douyin"
|
||||||
|
# url: "https://www.douyin.com/user/yourhandle"
|
||||||
|
# icon: "douyin"
|
||||||
|
# - name: "zhihu"
|
||||||
|
# url: "https://www.zhihu.com/people/yourhandle"
|
||||||
|
# icon: "zhihu"
|
||||||
|
|
||||||
|
# Analytics Configuration
|
||||||
|
analytics:
|
||||||
|
# Google Analytics
|
||||||
|
google:
|
||||||
|
enabled: false
|
||||||
|
id: ""
|
||||||
|
|
||||||
|
# Other analytics providers can be added here
|
||||||
|
|
||||||
|
# PWA Configuration
|
||||||
|
pwa:
|
||||||
|
enabled: false
|
||||||
|
name: "农业股票数据分析系统"
|
||||||
|
shortName: "AgricStock"
|
||||||
|
description: "基于大数据技术的农业股票数据分析平台"
|
||||||
|
themeColor: "#3b82f6"
|
||||||
|
backgroundColor: "#ffffff"
|
||||||
Vendored
+83
@@ -0,0 +1,83 @@
|
|||||||
|
# 🌾 Agricultural Stock Data Analysis System Development Guide
|
||||||
|
|
||||||
|
## 📋 Project Collaboration Overview
|
||||||
|
|
||||||
|
The Agricultural Stock Data Analysis System consists of four core sub-projects that implement a complete data pipeline from data collection to user presentation through a sophisticated collaboration mechanism. This guide provides detailed explanations of the collaboration relationships, development processes, and operational mechanisms of each sub-project.
|
||||||
|
|
||||||
|
## 🏗️ System Architecture & Data Flow
|
||||||
|
|
||||||
|
### Overall Data Flow
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
||||||
|
│ External APIs │ │ Data Collector │ │ Spark Processor │ │ Backend API │
|
||||||
|
│ │───▶│ data-collector │───▶│ spark-processor │───▶│ backend │
|
||||||
|
│ │ │ │ │ │ │ │
|
||||||
|
│ • Tencent API │ │ • Python Crawler│ │ • Data Cleaning │ │ • RESTful API │
|
||||||
|
│ • Sina Finance │ │ • Real-time Col │ │ • Tech Indicators│ │ • Data Caching │
|
||||||
|
│ • East Money │ │ • Data Validation│ │ • Market Analysis│ │ • WebSocket │
|
||||||
|
└─────────────────┘ └─────────────────┘ └─────────────────┘ └─────────────────┘
|
||||||
|
│ │
|
||||||
|
▼ ▼
|
||||||
|
┌─────────────────┐ ┌─────────────────┐
|
||||||
|
│ MySQL DB │ │ Frontend UI │
|
||||||
|
│ Database │ │ frontend │
|
||||||
|
│ │ │ │
|
||||||
|
│ • Raw Data │ │ • Vue.js UI │
|
||||||
|
│ • Analysis Data │ │ • Chart Display │
|
||||||
|
│ • Index Opt │◀───│ • User Interact │
|
||||||
|
└─────────────────┘ └─────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Deployment Collaboration Checklist
|
||||||
|
|
||||||
|
#### Database Team Responsibilities
|
||||||
|
- [ ] MySQL 8.0 environment setup completed
|
||||||
|
- [ ] Database table structure creation completed
|
||||||
|
- [ ] Index optimization configuration completed
|
||||||
|
- [ ] Database connection pool configuration completed
|
||||||
|
- [ ] Backup strategy configuration completed
|
||||||
|
|
||||||
|
#### Data Collector Team Responsibilities
|
||||||
|
- [ ] Python 3.8+ environment configuration completed
|
||||||
|
- [ ] Dependency package installation completed
|
||||||
|
- [ ] Configuration file environment variables setup completed
|
||||||
|
- [ ] Scheduled task configuration completed
|
||||||
|
- [ ] Log monitoring configuration completed
|
||||||
|
|
||||||
|
#### Spark Processor Team Responsibilities
|
||||||
|
- [ ] Java 8 environment configuration completed
|
||||||
|
- [ ] Spark 3.4.0 cluster setup completed
|
||||||
|
- [ ] Maven dependency management configuration completed
|
||||||
|
- [ ] Job scheduling configuration completed
|
||||||
|
- [ ] Performance monitoring configuration completed
|
||||||
|
|
||||||
|
#### Backend API Team Responsibilities
|
||||||
|
- [ ] Spring Boot application packaging completed
|
||||||
|
- [ ] Redis cache service configuration completed
|
||||||
|
- [ ] API interface testing passed
|
||||||
|
- [ ] WebSocket service configuration completed
|
||||||
|
- [ ] Load balancing configuration completed
|
||||||
|
|
||||||
|
#### Frontend UI Team Responsibilities
|
||||||
|
- [ ] Node.js environment configuration completed
|
||||||
|
- [ ] Vue project build completed
|
||||||
|
- [ ] Static resource deployment completed
|
||||||
|
- [ ] CDN configuration optimization completed
|
||||||
|
- [ ] Browser compatibility testing completed
|
||||||
|
|
||||||
|
## 📋 Key Success Factors for Collaboration
|
||||||
|
|
||||||
|
### 1. Unified Technology Stack
|
||||||
|
- **Standardized Development Languages**: Python 3.8+, Java 8+, Node.js 16+
|
||||||
|
- **Unified Database**: MySQL 8.0 + Redis 6.0
|
||||||
|
- **Containerized Deployment**: Docker + Kubernetes
|
||||||
|
- **Unified Monitoring Tools**: ELK Stack + Prometheus
|
||||||
|
|
||||||
|
### 2. Documentation Collaboration Standards
|
||||||
|
- **API Documentation**: Using Swagger/OpenAPI 3.0
|
||||||
|
- **Database Documentation**: Auto-generated using DbDoc
|
||||||
|
- **Deployment Documentation**: Using Markdown + Flowcharts
|
||||||
|
- **User Manual**: Using GitBook or VuePress
|
||||||
|
|
||||||
|
Through the above collaborative development process, the four sub-projects can organically combine to form an efficient, stable, and scalable agricultural stock data analysis system. While each team focuses on developing their own modules, they ensure overall system consistency and reliability through standardized interfaces and collaboration mechanisms.
|
||||||
Vendored
+500
@@ -0,0 +1,500 @@
|
|||||||
|
# 🏠 Backend API Service Documentation
|
||||||
|
|
||||||
|
## 📋 Module Overview
|
||||||
|
|
||||||
|
**backend** is the API service module of the Agricultural Stock Data Analysis System, built on Spring Boot 2.7.0. It provides RESTful API interfaces, business logic processing, real-time data push, and data caching optimization services.
|
||||||
|
|
||||||
|
## 🏗️ Technical Architecture
|
||||||
|
|
||||||
|
### Core Technology Stack
|
||||||
|
- **Spring Boot 2.7.0** - Main Application Framework
|
||||||
|
- **Spring Data JPA** - Data Access Layer
|
||||||
|
- **MyBatis Plus 3.5.2** - Enhanced MyBatis Framework
|
||||||
|
- **MySQL 8.0** - Primary Database
|
||||||
|
- **Redis 6.0** - Caching and Session Management
|
||||||
|
- **WebSocket** - Real-time Data Push
|
||||||
|
- **SpringDoc OpenAPI 3** - API Documentation Generation
|
||||||
|
- **Lombok** - Code Simplification Tool
|
||||||
|
|
||||||
|
### Swagger UI Access
|
||||||
|
|
||||||
|
After starting the application, you can access the API documentation through:
|
||||||
|
- **Swagger UI:** http://localhost:8080/swagger-ui/index.html
|
||||||
|
- **OpenAPI JSON:** http://localhost:8080/v3/api-docs
|
||||||
|
|
||||||
|
## 📁 Project Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
backend/
|
||||||
|
├── src/main/java/com/agricultural/stock/
|
||||||
|
│ ├── StockApplication.java # Main application class
|
||||||
|
│ ├── controller/ # Controller layer
|
||||||
|
│ │ ├── StockController.java # Stock data interfaces
|
||||||
|
│ │ ├── MarketController.java # Market analysis interfaces
|
||||||
|
│ │ └── HealthController.java # Health check interfaces
|
||||||
|
│ ├── service/ # Service layer
|
||||||
|
│ │ ├── StockService.java # Stock business logic
|
||||||
|
│ │ ├── MarketAnalysisService.java # Market analysis service
|
||||||
|
│ │ └── CacheService.java # Cache management service
|
||||||
|
│ ├── entity/ # Entity classes
|
||||||
|
│ │ ├── StockData.java # Stock data entity
|
||||||
|
│ │ ├── MarketAnalysis.java # Market analysis entity
|
||||||
|
│ │ └── TechnicalIndicator.java # Technical indicator entity
|
||||||
|
│ ├── mapper/ # Data access layer
|
||||||
|
│ │ ├── StockMapper.java # Stock data mapper
|
||||||
|
│ │ └── MarketMapper.java # Market data mapper
|
||||||
|
│ └── vo/ # View objects
|
||||||
|
│ ├── ApiResponse.java # Unified response format
|
||||||
|
│ ├── StockVO.java # Stock view object
|
||||||
|
│ └── MarketAnalysisVO.java # Market analysis view object
|
||||||
|
├── src/main/resources/
|
||||||
|
│ ├── application.yml # Application configuration
|
||||||
|
│ ├── mapper/ # MyBatis mapping files
|
||||||
|
│ └── static/ # Static resources
|
||||||
|
└── pom.xml # Maven configuration
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 Core Functional Modules
|
||||||
|
|
||||||
|
### 1. Stock Data Controller (StockController)
|
||||||
|
|
||||||
|
**Description:** Provides stock data query and management interfaces.
|
||||||
|
|
||||||
|
**Main Interfaces:**
|
||||||
|
- `GET /api/stock/realtime` - Get real-time stock data
|
||||||
|
- `GET /api/stock/history/{stockCode}` - Get historical stock data
|
||||||
|
- `GET /api/stock/search` - Search stocks
|
||||||
|
- `GET /api/stock/ranking/growth` - Get growth ranking
|
||||||
|
- `GET /api/stock/ranking/volume` - Get volume ranking
|
||||||
|
- `GET /api/stock/detail/{stockCode}` - Get stock details
|
||||||
|
|
||||||
|
### 2. Market Analysis Controller (MarketController)
|
||||||
|
|
||||||
|
**Description:** Provides market analysis data interfaces.
|
||||||
|
|
||||||
|
**Main Interfaces:**
|
||||||
|
- `GET /api/market/latest` - Get latest market analysis
|
||||||
|
- `GET /api/market/recent/{days}` - Get recent market data
|
||||||
|
- `GET /api/market/range` - Get market data by date range
|
||||||
|
- `GET /api/market/industry` - Get industry analysis
|
||||||
|
- `GET /api/market/trends` - Get market trends
|
||||||
|
|
||||||
|
### 3. Health Check Controller (HealthController)
|
||||||
|
|
||||||
|
**Description:** Provides system health monitoring interfaces.
|
||||||
|
|
||||||
|
**Main Interfaces:**
|
||||||
|
- `GET /api/health/status` - Get system status
|
||||||
|
- `GET /api/health/database` - Check database connection
|
||||||
|
- `GET /api/health/cache` - Check cache status
|
||||||
|
|
||||||
|
## 🗄️ Database Integration
|
||||||
|
|
||||||
|
### Entity Design
|
||||||
|
|
||||||
|
**StockData Entity:**
|
||||||
|
```java
|
||||||
|
@Entity
|
||||||
|
@Table(name = "stock_data")
|
||||||
|
public class StockData {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Column(name = "stock_code")
|
||||||
|
private String stockCode;
|
||||||
|
|
||||||
|
@Column(name = "stock_name")
|
||||||
|
private String stockName;
|
||||||
|
|
||||||
|
@Column(name = "open_price")
|
||||||
|
private BigDecimal openPrice;
|
||||||
|
|
||||||
|
@Column(name = "close_price")
|
||||||
|
private BigDecimal closePrice;
|
||||||
|
|
||||||
|
// Other fields...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Data Access Layer
|
||||||
|
|
||||||
|
**Using MyBatis Plus for efficient data operations:**
|
||||||
|
```java
|
||||||
|
@Mapper
|
||||||
|
public interface StockMapper extends BaseMapper<StockData> {
|
||||||
|
|
||||||
|
@Select("SELECT * FROM stock_data WHERE stock_code = #{stockCode} ORDER BY trade_date DESC LIMIT #{limit}")
|
||||||
|
List<StockData> getHistoryData(@Param("stockCode") String stockCode, @Param("limit") int limit);
|
||||||
|
|
||||||
|
@Select("SELECT * FROM stock_data WHERE trade_date = #{date}")
|
||||||
|
List<StockData> getStockDataByDate(@Param("date") LocalDate date);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## ⚙️ Configuration Management
|
||||||
|
|
||||||
|
### Application Configuration (application.yml)
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
server:
|
||||||
|
port: 8080
|
||||||
|
servlet:
|
||||||
|
context-path: /
|
||||||
|
|
||||||
|
spring:
|
||||||
|
application:
|
||||||
|
name: agricultural-stock-backend
|
||||||
|
|
||||||
|
datasource:
|
||||||
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
|
url: jdbc:mysql://localhost:3306/agricultural_stock?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
|
||||||
|
username: root
|
||||||
|
password: 123456
|
||||||
|
hikari:
|
||||||
|
minimum-idle: 5
|
||||||
|
maximum-pool-size: 20
|
||||||
|
idle-timeout: 300000
|
||||||
|
connection-timeout: 20000
|
||||||
|
|
||||||
|
redis:
|
||||||
|
host: localhost
|
||||||
|
port: 6379
|
||||||
|
password:
|
||||||
|
database: 0
|
||||||
|
timeout: 2000ms
|
||||||
|
lettuce:
|
||||||
|
pool:
|
||||||
|
max-active: 20
|
||||||
|
max-idle: 10
|
||||||
|
min-idle: 5
|
||||||
|
|
||||||
|
jpa:
|
||||||
|
hibernate:
|
||||||
|
ddl-auto: none
|
||||||
|
show-sql: false
|
||||||
|
database-platform: org.hibernate.dialect.MySQL8Dialect
|
||||||
|
|
||||||
|
mybatis-plus:
|
||||||
|
mapper-locations: classpath:mapper/*.xml
|
||||||
|
type-aliases-package: com.agricultural.stock.entity
|
||||||
|
configuration:
|
||||||
|
map-underscore-to-camel-case: true
|
||||||
|
cache-enabled: true
|
||||||
|
|
||||||
|
springdoc:
|
||||||
|
api-docs:
|
||||||
|
path: /v3/api-docs
|
||||||
|
swagger-ui:
|
||||||
|
path: /swagger-ui.html
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚀 Deployment and Running
|
||||||
|
|
||||||
|
### 1. Environment Requirements
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Java 8+
|
||||||
|
java -version
|
||||||
|
|
||||||
|
# Maven 3.6+
|
||||||
|
mvn -version
|
||||||
|
|
||||||
|
# MySQL 8.0
|
||||||
|
mysql --version
|
||||||
|
|
||||||
|
# Redis 6.0
|
||||||
|
redis-server --version
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Database Setup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Start MySQL service
|
||||||
|
systemctl start mysql
|
||||||
|
|
||||||
|
# Create database
|
||||||
|
mysql -u root -p -e "CREATE DATABASE agricultural_stock CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
|
||||||
|
|
||||||
|
# Import data structure
|
||||||
|
mysql -u root -p agricultural_stock < ../spark-processor/database_tables.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Redis Setup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Start Redis service
|
||||||
|
systemctl start redis
|
||||||
|
|
||||||
|
# Test Redis connection
|
||||||
|
redis-cli ping
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Application Startup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Compile and package
|
||||||
|
mvn clean package
|
||||||
|
|
||||||
|
# Run application
|
||||||
|
java -jar target/agricultural-stock-backend-1.0.0.jar
|
||||||
|
|
||||||
|
# Or use Maven to run directly
|
||||||
|
mvn spring-boot:run
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 API Interface Documentation
|
||||||
|
|
||||||
|
### Unified Response Format
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"code": 200,
|
||||||
|
"message": "Success",
|
||||||
|
"data": {
|
||||||
|
// Actual data content
|
||||||
|
},
|
||||||
|
"timestamp": 1705123456789
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Stock Data Interfaces
|
||||||
|
|
||||||
|
**Get Real-time Stock Data:**
|
||||||
|
```http
|
||||||
|
GET /api/stock/realtime
|
||||||
|
Response:
|
||||||
|
{
|
||||||
|
"code": 200,
|
||||||
|
"message": "Success",
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"stockCode": "sz000876",
|
||||||
|
"stockName": "New Hope",
|
||||||
|
"currentPrice": 15.68,
|
||||||
|
"changePercent": 2.34,
|
||||||
|
"volume": 1234567,
|
||||||
|
"marketCap": 6789012345
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Get Stock Details:**
|
||||||
|
```http
|
||||||
|
GET /api/stock/detail/sz000876
|
||||||
|
Response:
|
||||||
|
{
|
||||||
|
"code": 200,
|
||||||
|
"message": "Success",
|
||||||
|
"data": {
|
||||||
|
"stockCode": "sz000876",
|
||||||
|
"stockName": "New Hope",
|
||||||
|
"currentPrice": 15.68,
|
||||||
|
"openPrice": 15.32,
|
||||||
|
"highPrice": 15.89,
|
||||||
|
"lowPrice": 15.21,
|
||||||
|
"volume": 1234567,
|
||||||
|
"turnover": 19456789,
|
||||||
|
"changePercent": 2.34,
|
||||||
|
"changeAmount": 0.36,
|
||||||
|
"peRatio": 12.5,
|
||||||
|
"marketCap": 6789012345
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Market Analysis Interfaces
|
||||||
|
|
||||||
|
**Get Latest Market Analysis:**
|
||||||
|
```http
|
||||||
|
GET /api/market/latest
|
||||||
|
Response:
|
||||||
|
{
|
||||||
|
"code": 200,
|
||||||
|
"message": "Success",
|
||||||
|
"data": {
|
||||||
|
"analysisDate": "2024-01-15",
|
||||||
|
"upCount": 7,
|
||||||
|
"downCount": 2,
|
||||||
|
"flatCount": 1,
|
||||||
|
"totalCount": 10,
|
||||||
|
"totalMarketCap": 38147.05,
|
||||||
|
"totalVolume": 1878844,
|
||||||
|
"avgChangePercent": 0.33
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔄 Real-time Data Push
|
||||||
|
|
||||||
|
### WebSocket Configuration
|
||||||
|
|
||||||
|
```java
|
||||||
|
@Configuration
|
||||||
|
@EnableWebSocket
|
||||||
|
public class WebSocketConfig implements WebSocketConfigurer {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
|
||||||
|
registry.addHandler(new StockWebSocketHandler(), "/ws/stock/*")
|
||||||
|
.setAllowedOrigins("*");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Real-time Data Handler
|
||||||
|
|
||||||
|
```java
|
||||||
|
@Component
|
||||||
|
public class StockWebSocketHandler extends TextWebSocketHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterConnectionEstablished(WebSocketSession session) {
|
||||||
|
// Handle connection establishment
|
||||||
|
String stockCode = extractStockCode(session.getUri());
|
||||||
|
subscribeToStockUpdates(session, stockCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void handleTextMessage(WebSocketSession session, TextMessage message) {
|
||||||
|
// Handle received messages
|
||||||
|
}
|
||||||
|
|
||||||
|
public void broadcastStockUpdate(String stockCode, StockData data) {
|
||||||
|
// Broadcast stock updates to subscribed clients
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🎯 Caching Strategy
|
||||||
|
|
||||||
|
### Redis Cache Configuration
|
||||||
|
|
||||||
|
```java
|
||||||
|
@Configuration
|
||||||
|
@EnableCaching
|
||||||
|
public class CacheConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public CacheManager cacheManager(RedisConnectionFactory factory) {
|
||||||
|
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
|
||||||
|
.entryTtl(Duration.ofMinutes(10))
|
||||||
|
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
|
||||||
|
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
|
||||||
|
|
||||||
|
return RedisCacheManager.builder(factory).cacheDefaults(config).build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Cache Usage
|
||||||
|
|
||||||
|
```java
|
||||||
|
@Service
|
||||||
|
public class StockService {
|
||||||
|
|
||||||
|
@Cacheable(value = "stock:realtime", key = "#stockCode")
|
||||||
|
public StockData getRealtimeData(String stockCode) {
|
||||||
|
// Query from database
|
||||||
|
return stockMapper.getByStockCode(stockCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
@CacheEvict(value = "stock:realtime", key = "#stockCode")
|
||||||
|
public void updateStockData(String stockCode, StockData data) {
|
||||||
|
// Update database and clear cache
|
||||||
|
stockMapper.updateByStockCode(stockCode, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📈 Performance Optimization
|
||||||
|
|
||||||
|
### Database Query Optimization
|
||||||
|
|
||||||
|
- **Index Creation:** Create appropriate indexes for frequently queried fields
|
||||||
|
- **Query Optimization:** Use efficient SQL queries and avoid N+1 problems
|
||||||
|
- **Connection Pool:** Use HikariCP for optimal connection management
|
||||||
|
- **Pagination:** Implement proper pagination for large datasets
|
||||||
|
|
||||||
|
### Cache Optimization
|
||||||
|
|
||||||
|
- **Multi-level Caching:** Combine local cache and Redis
|
||||||
|
- **Cache Warming:** Pre-load frequently accessed data
|
||||||
|
- **Cache Invalidation:** Implement proper cache invalidation strategies
|
||||||
|
- **Cache Monitoring:** Monitor cache hit rates and performance
|
||||||
|
|
||||||
|
## 🔒 Security Measures
|
||||||
|
|
||||||
|
### Data Validation
|
||||||
|
|
||||||
|
```java
|
||||||
|
@RestController
|
||||||
|
@Validated
|
||||||
|
public class StockController {
|
||||||
|
|
||||||
|
@GetMapping("/stock/detail/{stockCode}")
|
||||||
|
public ApiResponse<StockVO> getStockDetail(
|
||||||
|
@PathVariable @Pattern(regexp = "^(sz|sh)\\d{6}$", message = "Invalid stock code format")
|
||||||
|
String stockCode) {
|
||||||
|
// Implementation
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### SQL Injection Prevention
|
||||||
|
|
||||||
|
- Use parameterized queries
|
||||||
|
- Input validation and sanitization
|
||||||
|
- ORM framework usage (JPA/MyBatis)
|
||||||
|
|
||||||
|
### CORS Configuration
|
||||||
|
|
||||||
|
```java
|
||||||
|
@Configuration
|
||||||
|
public class WebConfig implements WebMvcConfigurer {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addCorsMappings(CorsRegistry registry) {
|
||||||
|
registry.addMapping("/api/**")
|
||||||
|
.allowedOrigins("http://localhost:3000")
|
||||||
|
.allowedMethods("GET", "POST", "PUT", "DELETE")
|
||||||
|
.allowedHeaders("*")
|
||||||
|
.allowCredentials(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📋 Development Guidelines
|
||||||
|
|
||||||
|
### Code Standards
|
||||||
|
|
||||||
|
- Follow Spring Boot best practices
|
||||||
|
- Use proper layer separation (Controller-Service-Repository)
|
||||||
|
- Implement comprehensive error handling
|
||||||
|
- Add proper logging
|
||||||
|
- Write unit and integration tests
|
||||||
|
|
||||||
|
### Testing Strategy
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Run unit tests
|
||||||
|
mvn test
|
||||||
|
|
||||||
|
# Run integration tests
|
||||||
|
mvn verify
|
||||||
|
|
||||||
|
# Generate test coverage report
|
||||||
|
mvn jacoco:report
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📄 License
|
||||||
|
|
||||||
|
This module is licensed under the MIT License. See the LICENSE file in the project root directory for details.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Contact Information:**
|
||||||
|
- Project Repository: [Agricultural Stock Platform](https://github.com/agricultural-stock-platform)
|
||||||
|
- Technical Support: support@agricultural-stock.com
|
||||||
|
- Development Team: Agricultural Stock Platform Team
|
||||||
+179
@@ -0,0 +1,179 @@
|
|||||||
|
# 📊 Python Data Collector Documentation
|
||||||
|
|
||||||
|
## 📋 Module Overview
|
||||||
|
|
||||||
|
**data-collector** is the data collection module of the Agricultural Stock Data Analysis System, built on Python 3.8+. It is responsible for real-time collection of agricultural listed companies' stock data from external data sources and storing the data in MySQL database for subsequent analysis.
|
||||||
|
|
||||||
|
## 🏗️ Technical Architecture
|
||||||
|
|
||||||
|
### Core Technology Stack
|
||||||
|
- **Python 3.8+** - Programming Language
|
||||||
|
- **Requests 2.31.0** - HTTP Request Library
|
||||||
|
- **Pandas 2.1.0** - Data Processing Library
|
||||||
|
- **BeautifulSoup4 4.12.2** - HTML Parsing Library
|
||||||
|
- **MySQL Connector 8.1.0** - MySQL Database Connector
|
||||||
|
- **Schedule 1.2.0** - Task Scheduling Library
|
||||||
|
- **NumPy 1.26.0** - Numerical Computing Library
|
||||||
|
|
||||||
|
## 📁 Project Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
data-collector/
|
||||||
|
├── stock_crawler.py # Main crawler program
|
||||||
|
├── config.ini # Configuration file
|
||||||
|
├── requirements.txt # Python dependencies
|
||||||
|
└── stock_crawler.log # Runtime logs
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 Core Features
|
||||||
|
|
||||||
|
### 1. Stock Data Collection
|
||||||
|
|
||||||
|
Supports collecting agricultural stock data from Tencent Finance API:
|
||||||
|
- New Hope (sz000876)
|
||||||
|
- Muyuan Foodstuff (sz002714)
|
||||||
|
- Kweichow Moutai (sh600519)
|
||||||
|
- Wuliangye Yibin (sz000858)
|
||||||
|
- Inner Mongolia Yili (sh600887)
|
||||||
|
- Jiangsu Yanghe (sz002304)
|
||||||
|
|
||||||
|
### 2. Data Processing Features
|
||||||
|
|
||||||
|
- Real-time price data acquisition
|
||||||
|
- Automatic percentage change calculation
|
||||||
|
- Trading volume calculation
|
||||||
|
- Data format standardization
|
||||||
|
- Anomalous data filtering
|
||||||
|
|
||||||
|
### 3. Database Storage
|
||||||
|
|
||||||
|
- MySQL batch writing
|
||||||
|
- Duplicate data updates
|
||||||
|
- Transaction management
|
||||||
|
- Connection pool management
|
||||||
|
|
||||||
|
### 4. Task Scheduling
|
||||||
|
|
||||||
|
- Scheduled data collection
|
||||||
|
- Error retry mechanism
|
||||||
|
- Logging
|
||||||
|
- Status monitoring
|
||||||
|
|
||||||
|
## ⚙️ Configuration Management
|
||||||
|
|
||||||
|
### config.ini Configuration File
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[database]
|
||||||
|
host = localhost
|
||||||
|
port = 3306
|
||||||
|
user = root
|
||||||
|
password = 123456
|
||||||
|
database = agricultural_stock
|
||||||
|
|
||||||
|
[crawler]
|
||||||
|
request_interval = 0.5
|
||||||
|
request_timeout = 10
|
||||||
|
max_retries = 3
|
||||||
|
user_agent = Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
|
||||||
|
|
||||||
|
[logging]
|
||||||
|
level = INFO
|
||||||
|
file = stock_crawler.log
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚀 Deployment and Running
|
||||||
|
|
||||||
|
### 1. Environment Setup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check Python version
|
||||||
|
python --version # Requires 3.8+
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Configuration Setup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Edit configuration file
|
||||||
|
vim config.ini
|
||||||
|
|
||||||
|
# Configure database connection
|
||||||
|
[database]
|
||||||
|
host = localhost
|
||||||
|
port = 3306
|
||||||
|
user = your_username
|
||||||
|
password = your_password
|
||||||
|
database = agricultural_stock
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Running Methods
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Execute data collection once
|
||||||
|
python stock_crawler.py
|
||||||
|
|
||||||
|
# Run in background
|
||||||
|
nohup python stock_crawler.py > /dev/null 2>&1 &
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 Data Quality Assurance
|
||||||
|
|
||||||
|
### Data Validation Mechanism
|
||||||
|
|
||||||
|
- Required field completeness check
|
||||||
|
- Price data rationality validation
|
||||||
|
- Percentage change anomaly detection
|
||||||
|
- Trading volume negative value filtering
|
||||||
|
|
||||||
|
### Exception Handling
|
||||||
|
|
||||||
|
- Network request retry mechanism
|
||||||
|
- Database connection failure recovery
|
||||||
|
- Detailed error logging
|
||||||
|
- Graceful exception handling
|
||||||
|
|
||||||
|
## 📈 Monitoring and Maintenance
|
||||||
|
|
||||||
|
### Log Management
|
||||||
|
|
||||||
|
The system automatically records the following information:
|
||||||
|
- Data collection start/end time
|
||||||
|
- Number of successfully collected stocks
|
||||||
|
- Failed stock codes and reasons
|
||||||
|
- Database operation results
|
||||||
|
- Exception error details
|
||||||
|
|
||||||
|
### Performance Monitoring
|
||||||
|
|
||||||
|
- Collection time statistics
|
||||||
|
- Success rate monitoring
|
||||||
|
- Error rate statistics
|
||||||
|
- Database performance monitoring
|
||||||
|
|
||||||
|
## 📋 Dependency Management
|
||||||
|
|
||||||
|
### requirements.txt
|
||||||
|
|
||||||
|
```txt
|
||||||
|
requests>=2.31.0
|
||||||
|
pandas>=2.1.0
|
||||||
|
beautifulsoup4>=4.12.2
|
||||||
|
lxml>=4.9.3
|
||||||
|
mysql-connector-python>=8.1.0
|
||||||
|
schedule>=1.2.0
|
||||||
|
numpy>=1.26.0
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📄 License
|
||||||
|
|
||||||
|
This module is licensed under the MIT License. See the LICENSE file in the project root directory for details.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Contact Information:**
|
||||||
|
- Project Repository: [Agricultural Stock Platform](https://github.com/agricultural-stock-platform)
|
||||||
|
- Technical Support: support@agricultural-stock.com
|
||||||
|
- Development Team: Agricultural Stock Platform Team
|
||||||
Vendored
+205
@@ -0,0 +1,205 @@
|
|||||||
|
# 🎨 Frontend Interface Documentation
|
||||||
|
|
||||||
|
## 📋 Module Overview
|
||||||
|
|
||||||
|
**frontend** is the user interface module of the Agricultural Stock Data Analysis System, built on Vue.js 3.3.0. It provides real-time stock data display, interactive charts, market analysis visualization, and responsive user experience.
|
||||||
|
|
||||||
|
## 🏗️ Technical Architecture
|
||||||
|
|
||||||
|
### Core Technology Stack
|
||||||
|
- **Vue.js 3.3.0** - Progressive JavaScript Framework
|
||||||
|
- **Vue Router 4.2.0** - Official Router for Vue.js
|
||||||
|
- **Vuex 4.0.2** - State Management Pattern and Library
|
||||||
|
- **Element Plus 2.3.0** - Vue 3 Component Library
|
||||||
|
- **ECharts 5.4.0** - Data Visualization Library
|
||||||
|
- **Axios 1.4.0** - HTTP Client Library
|
||||||
|
- **Vite 4.3.0** - Build Tool and Development Server
|
||||||
|
|
||||||
|
## 📁 Project Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
frontend/
|
||||||
|
├── src/
|
||||||
|
│ ├── main.ts # Application entry point
|
||||||
|
│ ├── App.vue # Root component
|
||||||
|
│ ├── views/ # Page components
|
||||||
|
│ │ ├── Dashboard.vue # Dashboard overview
|
||||||
|
│ │ ├── MarketAnalysis.vue # Market analysis
|
||||||
|
│ │ ├── StockDetail.vue # Stock details
|
||||||
|
│ │ ├── StockSearch.vue # Stock search
|
||||||
|
│ │ └── Rankings.vue # Stock rankings
|
||||||
|
│ ├── components/ # Reusable components
|
||||||
|
│ ├── router/ # Routing configuration
|
||||||
|
│ ├── store/ # State management
|
||||||
|
│ ├── api/ # API interface encapsulation
|
||||||
|
│ └── utils/ # Utility functions
|
||||||
|
├── package.json # Dependencies and scripts
|
||||||
|
└── vite.config.js # Vite configuration
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 Core Functional Modules
|
||||||
|
|
||||||
|
### 1. Dashboard Overview (Dashboard.vue)
|
||||||
|
|
||||||
|
**Main Features:**
|
||||||
|
- Real-time market summary cards
|
||||||
|
- Market trend charts
|
||||||
|
- Industry distribution visualization
|
||||||
|
- Top gainers/losers lists
|
||||||
|
- Market news display
|
||||||
|
|
||||||
|
### 2. Market Analysis Page (MarketAnalysis.vue)
|
||||||
|
|
||||||
|
**Main Features:**
|
||||||
|
- Market trend analysis
|
||||||
|
- Technical indicator charts
|
||||||
|
- Industry comparison analysis
|
||||||
|
- Historical data backtesting
|
||||||
|
|
||||||
|
### 3. Stock Detail Page (StockDetail.vue)
|
||||||
|
|
||||||
|
**Main Features:**
|
||||||
|
- Real-time price information
|
||||||
|
- Interactive price charts
|
||||||
|
- Trading volume analysis
|
||||||
|
- Financial metrics
|
||||||
|
- Related news
|
||||||
|
|
||||||
|
### 4. Stock Search Page (StockSearch.vue)
|
||||||
|
|
||||||
|
**Main Features:**
|
||||||
|
- Keyword-based search
|
||||||
|
- Advanced filtering options
|
||||||
|
- Search result display
|
||||||
|
- Search history tracking
|
||||||
|
|
||||||
|
### 5. Rankings Page (Rankings.vue)
|
||||||
|
|
||||||
|
**Main Features:**
|
||||||
|
- Top gainers/losers rankings
|
||||||
|
- Volume rankings
|
||||||
|
- Market cap rankings
|
||||||
|
- Custom sorting options
|
||||||
|
|
||||||
|
## 🚀 Deployment and Running
|
||||||
|
|
||||||
|
### 1. Environment Requirements
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Node.js 16+
|
||||||
|
node --version
|
||||||
|
|
||||||
|
# npm or yarn
|
||||||
|
npm --version
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Installation and Setup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install dependencies
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# Start development server
|
||||||
|
npm run dev
|
||||||
|
|
||||||
|
# Build for production
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Environment Configuration
|
||||||
|
|
||||||
|
```env
|
||||||
|
# Development
|
||||||
|
VITE_API_BASE_URL=http://localhost:8080
|
||||||
|
VITE_WS_BASE_URL=ws://localhost:8080
|
||||||
|
|
||||||
|
# Production
|
||||||
|
VITE_API_BASE_URL=https://api.agricultural-stock.com
|
||||||
|
VITE_WS_BASE_URL=wss://api.agricultural-stock.com
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 Data Visualization
|
||||||
|
|
||||||
|
### ECharts Integration
|
||||||
|
|
||||||
|
The system uses ECharts for creating interactive charts:
|
||||||
|
- Stock price trend charts
|
||||||
|
- Market distribution pie charts
|
||||||
|
- Technical indicator visualizations
|
||||||
|
- Volume analysis charts
|
||||||
|
|
||||||
|
## 🎯 State Management
|
||||||
|
|
||||||
|
### Vuex Store
|
||||||
|
|
||||||
|
Global state management for:
|
||||||
|
- Stock data caching
|
||||||
|
- User interface state
|
||||||
|
- Real-time data updates
|
||||||
|
- Application configuration
|
||||||
|
|
||||||
|
## 🔌 API Integration
|
||||||
|
|
||||||
|
### HTTP Client
|
||||||
|
|
||||||
|
Axios-based HTTP client with:
|
||||||
|
- Request/response interceptors
|
||||||
|
- Error handling
|
||||||
|
- Loading state management
|
||||||
|
- API response standardization
|
||||||
|
|
||||||
|
## ⚙️ Build Configuration
|
||||||
|
|
||||||
|
### Vite Configuration
|
||||||
|
|
||||||
|
- Hot module replacement
|
||||||
|
- Proxy configuration for development
|
||||||
|
- Production build optimization
|
||||||
|
- Asset bundling and compression
|
||||||
|
|
||||||
|
## 📱 Responsive Design
|
||||||
|
|
||||||
|
### Mobile Adaptation
|
||||||
|
|
||||||
|
- Responsive grid layouts
|
||||||
|
- Mobile-optimized navigation
|
||||||
|
- Touch-friendly interactions
|
||||||
|
- Adaptive chart sizing
|
||||||
|
|
||||||
|
## 🔒 Security Measures
|
||||||
|
|
||||||
|
### Client-side Security
|
||||||
|
|
||||||
|
- XSS protection
|
||||||
|
- Input validation
|
||||||
|
- CSRF token handling
|
||||||
|
- Secure API communication
|
||||||
|
|
||||||
|
## 📈 Performance Optimization
|
||||||
|
|
||||||
|
### Optimization Strategies
|
||||||
|
|
||||||
|
- Component lazy loading
|
||||||
|
- Virtual scrolling for large lists
|
||||||
|
- Data caching strategies
|
||||||
|
- Bundle size optimization
|
||||||
|
|
||||||
|
## 📋 Development Guidelines
|
||||||
|
|
||||||
|
### Code Standards
|
||||||
|
|
||||||
|
- ESLint + Prettier configuration
|
||||||
|
- TypeScript support
|
||||||
|
- Component naming conventions
|
||||||
|
- Testing best practices
|
||||||
|
|
||||||
|
## 📄 License
|
||||||
|
|
||||||
|
This module is licensed under the MIT License. See the LICENSE file in the project root directory for details.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Contact Information:**
|
||||||
|
- Project Repository: [Agricultural Stock Platform](https://github.com/agricultural-stock-platform)
|
||||||
|
- Technical Support: support@agricultural-stock.com
|
||||||
|
- Development Team: Agricultural Stock Platform Team
|
||||||
+330
@@ -0,0 +1,330 @@
|
|||||||
|
# 🌾 Spark Data Processing Module Documentation
|
||||||
|
|
||||||
|
## 📋 Module Overview
|
||||||
|
|
||||||
|
**spark-processor** is the core data processing engine of the Agricultural Stock Data Analysis System, built on Apache Spark 3.4.0. It is responsible for large-scale processing, technical analysis, and market analysis of agricultural listed companies' stock data.
|
||||||
|
|
||||||
|
## 🏗️ Technical Architecture
|
||||||
|
|
||||||
|
### Core Technology Stack
|
||||||
|
- **Apache Spark 3.4.0** - Distributed Big Data Processing Framework
|
||||||
|
- **Spark SQL** - Structured Data Query and Processing
|
||||||
|
- **Spark Streaming** - Real-time Stream Data Processing
|
||||||
|
- **MySQL 8.0** - Data Storage and Persistence
|
||||||
|
- **Java 8** - Programming Language
|
||||||
|
- **Maven 3.6+** - Project Build Management
|
||||||
|
|
||||||
|
### Architecture Design
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────────────────┐
|
||||||
|
│ Spark Data Processing Module │
|
||||||
|
├─────────────────────────────────────────────────────────────┤
|
||||||
|
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐ │
|
||||||
|
│ │ Data Cleaning │ │ Technical │ │ Market │ │
|
||||||
|
│ │ Service │ │ Indicator │ │ Analysis │ │
|
||||||
|
│ │ │ │ Service │ │ Service │ │
|
||||||
|
│ └─────────────────┘ └─────────────────┘ └─────────────┘ │
|
||||||
|
│ ┌─────────────────┐ ┌─────────────────┐ │
|
||||||
|
│ │ Database Save │ │ Configuration │ │
|
||||||
|
│ │ Service │ │ SparkConfig │ │
|
||||||
|
│ │ │ │ │ │
|
||||||
|
│ └─────────────────┘ └─────────────────┘ │
|
||||||
|
├─────────────────────────────────────────────────────────────┤
|
||||||
|
│ StockDataProcessor (Main Processing Class) │
|
||||||
|
└─────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📁 Project Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
spark-processor/
|
||||||
|
├── src/main/java/com/agricultural/spark/
|
||||||
|
│ ├── StockDataProcessor.java # Main processing class
|
||||||
|
│ ├── config/
|
||||||
|
│ │ └── SparkConfig.java # Configuration management
|
||||||
|
│ └── service/
|
||||||
|
│ ├── DataCleaningService.java # Data cleaning service
|
||||||
|
│ ├── TechnicalIndicatorService.java # Technical indicator service
|
||||||
|
│ ├── MarketAnalysisService.java # Market analysis service
|
||||||
|
│ └── DatabaseSaveService.java # Database save service
|
||||||
|
├── src/main/resources/
|
||||||
|
│ ├── application.conf # Application configuration
|
||||||
|
│ └── logback.xml # Logging configuration
|
||||||
|
├── database_tables.sql # Database table structure
|
||||||
|
├── pom.xml # Maven configuration
|
||||||
|
└── README_DATABASE.md # Database documentation
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 Core Functional Modules
|
||||||
|
|
||||||
|
### 1. Main Data Processor (StockDataProcessor)
|
||||||
|
|
||||||
|
**Description:** The core scheduler of the system, responsible for coordinating the workflow of various service modules.
|
||||||
|
|
||||||
|
**Main Responsibilities:**
|
||||||
|
- Spark session management and initialization
|
||||||
|
- Data loading and preprocessing coordination
|
||||||
|
- Batch processing and stream processing mode switching
|
||||||
|
- Exception handling and resource management
|
||||||
|
|
||||||
|
**Key Methods:**
|
||||||
|
```java
|
||||||
|
// Batch processing mode
|
||||||
|
public void runBatchProcessing()
|
||||||
|
|
||||||
|
// Stream processing mode
|
||||||
|
public void runStreamProcessing()
|
||||||
|
|
||||||
|
// Load data from MySQL
|
||||||
|
public Dataset<Row> loadStockDataFromMySQL()
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Data Cleaning Service (DataCleaningService)
|
||||||
|
|
||||||
|
**Description:** Standardized cleaning and preprocessing of raw stock data.
|
||||||
|
|
||||||
|
**Processing Flow:**
|
||||||
|
1. **Deduplication** - Remove duplicate records based on stock code and trading date
|
||||||
|
2. **Missing Value Handling** - Fill numerical fields with 0, string fields with empty values
|
||||||
|
3. **Data Type Conversion** - Ensure field type correctness
|
||||||
|
4. **Outlier Detection** - Identify and handle anomalous data in prices, volumes, etc.
|
||||||
|
5. **Derived Field Calculation** - Calculate percentage changes, market cap, and other derived metrics
|
||||||
|
|
||||||
|
**Key Functions:**
|
||||||
|
```java
|
||||||
|
// Main cleaning method
|
||||||
|
public Dataset<Row> cleanData(Dataset<Row> rawData)
|
||||||
|
|
||||||
|
// Missing value handling
|
||||||
|
private Dataset<Row> handleMissingValues(Dataset<Row> data)
|
||||||
|
|
||||||
|
// Outlier handling
|
||||||
|
private Dataset<Row> handleOutliers(Dataset<Row> data)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Technical Indicator Service (TechnicalIndicatorService)
|
||||||
|
|
||||||
|
**Description:** Calculate various technical analysis indicators to provide data support for quantitative analysis.
|
||||||
|
|
||||||
|
**Supported Technical Indicators:**
|
||||||
|
- **Moving Averages (MA)** - MA5, MA10, MA20, MA30
|
||||||
|
- **Relative Strength Index (RSI)** - 14-day RSI indicator
|
||||||
|
- **MACD Indicator** - Fast line, slow line, histogram
|
||||||
|
- **Bollinger Bands** - Upper band, middle band, lower band
|
||||||
|
- **Volume Moving Average** - Volume technical analysis
|
||||||
|
|
||||||
|
**Calculation Methods:**
|
||||||
|
```java
|
||||||
|
// Calculate technical indicators
|
||||||
|
public Dataset<Row> calculateTechnicalIndicators(Dataset<Row> data)
|
||||||
|
|
||||||
|
// Moving averages calculation
|
||||||
|
private Dataset<Row> calculateMovingAverages(Dataset<Row> data)
|
||||||
|
|
||||||
|
// RSI indicator calculation
|
||||||
|
private Dataset<Row> calculateRSI(Dataset<Row> data)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Market Analysis Service (MarketAnalysisService)
|
||||||
|
|
||||||
|
**Description:** Analyze overall market performance and industry distribution from a macro perspective.
|
||||||
|
|
||||||
|
**Analysis Dimensions:**
|
||||||
|
- **Market Overview** - Rise/fall statistics, average percentage change, total market cap
|
||||||
|
- **Industry Performance** - Stock performance statistics by industry classification
|
||||||
|
- **Market Trends** - Historical trend analysis and forecasting
|
||||||
|
- **Sector Rotation** - Fund flow analysis between different sectors
|
||||||
|
|
||||||
|
**Core Analysis:**
|
||||||
|
```java
|
||||||
|
// Market overview analysis
|
||||||
|
public Map<String, Object> analyzeMarketOverview(Dataset<Row> data)
|
||||||
|
|
||||||
|
// Industry performance analysis
|
||||||
|
public Dataset<Row> analyzeIndustryPerformance(Dataset<Row> data)
|
||||||
|
|
||||||
|
// Market trend analysis
|
||||||
|
public Dataset<Row> analyzeTrends(Dataset<Row> data)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Database Save Service (DatabaseSaveService)
|
||||||
|
|
||||||
|
**Description:** Persist Spark-processed result data to MySQL database.
|
||||||
|
|
||||||
|
**Save Strategy:**
|
||||||
|
- **Incremental Updates** - Save only new or changed data
|
||||||
|
- **Batch Writing** - Improve data writing efficiency
|
||||||
|
- **Transaction Management** - Ensure data consistency
|
||||||
|
- **Connection Pool Management** - Optimize database connection performance
|
||||||
|
|
||||||
|
**Main Functions:**
|
||||||
|
```java
|
||||||
|
// Save market analysis results
|
||||||
|
public void saveMarketAnalysis(Map<String, Object> analysisResult)
|
||||||
|
|
||||||
|
// Save technical indicator data
|
||||||
|
public void saveTechnicalIndicators(Dataset<Row> indicators)
|
||||||
|
|
||||||
|
// Batch save processing results
|
||||||
|
public void batchSaveResults(List<Dataset<Row>> datasets)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🗄️ Database Design
|
||||||
|
|
||||||
|
### Main Data Tables
|
||||||
|
|
||||||
|
| Table Name | Description | Key Fields |
|
||||||
|
|------------|-------------|------------|
|
||||||
|
| `stock_data` | Stock basic data | stock_code, stock_name, open_price, close_price, volume, trade_date |
|
||||||
|
| `market_analysis` | Market analysis results | analysis_date, up_count, down_count, total_market_cap, avg_change_percent |
|
||||||
|
| `stock_technical_indicators` | Technical indicator data | stock_code, trade_date, ma5, ma10, ma20, rsi, macd |
|
||||||
|
| `industry_analysis` | Industry analysis data | industry_name, stock_count, avg_change_percent, total_market_cap |
|
||||||
|
| `market_trends` | Market trend data | trade_date, avg_price, total_volume, stock_count |
|
||||||
|
|
||||||
|
## ⚙️ Configuration Management
|
||||||
|
|
||||||
|
### Configuration File (application.conf)
|
||||||
|
|
||||||
|
```hocon
|
||||||
|
# Spark configuration
|
||||||
|
spark {
|
||||||
|
master = "local[*]"
|
||||||
|
app.name = "AgriculturalStockDataProcessor"
|
||||||
|
}
|
||||||
|
|
||||||
|
# MySQL database configuration
|
||||||
|
mysql {
|
||||||
|
host = "localhost"
|
||||||
|
port = 3306
|
||||||
|
database = "agricultural_stock"
|
||||||
|
username = "root"
|
||||||
|
password = "123456"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Processing configuration
|
||||||
|
processing {
|
||||||
|
batch.size = 1000
|
||||||
|
window.duration = "10 seconds"
|
||||||
|
checkpoint.location = "/tmp/spark-checkpoint"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚀 Deployment and Running
|
||||||
|
|
||||||
|
### 1. Environment Requirements
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Java 8+ (recommended OpenJDK 8)
|
||||||
|
java -version
|
||||||
|
|
||||||
|
# Maven 3.6+
|
||||||
|
mvn -version
|
||||||
|
|
||||||
|
# MySQL 8.0+
|
||||||
|
mysql --version
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Database Setup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create database
|
||||||
|
mysql -u root -p -e "CREATE DATABASE agricultural_stock CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
|
||||||
|
|
||||||
|
# Import table structure
|
||||||
|
mysql -u root -p agricultural_stock < database_tables.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Build and Run
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Compile project
|
||||||
|
mvn clean compile
|
||||||
|
|
||||||
|
# Run batch processing
|
||||||
|
mvn exec:java -Dexec.mainClass="com.agricultural.spark.StockDataProcessor"
|
||||||
|
|
||||||
|
# Run with custom parameters
|
||||||
|
mvn exec:java -Dexec.mainClass="com.agricultural.spark.StockDataProcessor" -Dexec.args="--mode batch --date 2024-01-01"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 Performance Optimization
|
||||||
|
|
||||||
|
### Spark Optimization Strategies
|
||||||
|
|
||||||
|
- **Memory Management** - Optimize heap size and garbage collection
|
||||||
|
- **Parallelism Tuning** - Adjust partition and executor numbers
|
||||||
|
- **Cache Strategy** - Cache frequently accessed datasets
|
||||||
|
- **Broadcast Variables** - Use broadcast for small lookup tables
|
||||||
|
|
||||||
|
### Database Optimization
|
||||||
|
|
||||||
|
- **Index Creation** - Create appropriate indexes for query optimization
|
||||||
|
- **Connection Pooling** - Use HikariCP for connection management
|
||||||
|
- **Batch Operations** - Use batch inserts for better performance
|
||||||
|
- **Query Optimization** - Optimize SQL queries and use prepared statements
|
||||||
|
|
||||||
|
## 📈 Monitoring and Maintenance
|
||||||
|
|
||||||
|
### Performance Monitoring
|
||||||
|
|
||||||
|
- **Spark UI** - Monitor job execution and resource usage
|
||||||
|
- **Application Metrics** - Track processing time and throughput
|
||||||
|
- **Database Metrics** - Monitor connection pool and query performance
|
||||||
|
- **System Resources** - Monitor CPU, memory, and disk usage
|
||||||
|
|
||||||
|
### Log Management
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<!-- logback.xml configuration -->
|
||||||
|
<configuration>
|
||||||
|
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
|
<file>logs/spark-processor.log</file>
|
||||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||||
|
<fileNamePattern>logs/spark-processor.%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||||
|
<maxHistory>30</maxHistory>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="INFO">
|
||||||
|
<appender-ref ref="FILE" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📋 Development Guidelines
|
||||||
|
|
||||||
|
### Code Standards
|
||||||
|
|
||||||
|
- Follow Java coding conventions
|
||||||
|
- Use meaningful variable and method names
|
||||||
|
- Add comprehensive comments and documentation
|
||||||
|
- Implement proper error handling
|
||||||
|
- Write unit tests for critical components
|
||||||
|
|
||||||
|
### Testing Strategy
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Run unit tests
|
||||||
|
mvn test
|
||||||
|
|
||||||
|
# Run integration tests
|
||||||
|
mvn verify
|
||||||
|
|
||||||
|
# Generate coverage report
|
||||||
|
mvn jacoco:report
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📄 License
|
||||||
|
|
||||||
|
This module is licensed under the MIT License. See the LICENSE file in the project root directory for details.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Contact Information:**
|
||||||
|
- Project Repository: [Agricultural Stock Platform](https://github.com/agricultural-stock-platform)
|
||||||
|
- Technical Support: support@agricultural-stock.com
|
||||||
|
- Development Team: Agricultural Stock Platform Team
|
||||||
Vendored
+64
@@ -0,0 +1,64 @@
|
|||||||
|
# Welcome to Agricultural Stock Data Analysis System
|
||||||
|
|
||||||
|
The Agricultural Stock Data Analysis System is a comprehensive big data-driven platform focused on agricultural listed companies' stock data collection, processing, analysis, and visualization.
|
||||||
|
|
||||||
|
## 🌟 Key Features
|
||||||
|
|
||||||
|
- **🚀 Real-time Data Collection** - Automated collection of agricultural stock data from multiple sources
|
||||||
|
- **🎨 Interactive Visualization** - Beautiful charts and dashboards with real-time updates
|
||||||
|
- **📱 Responsive Design** - Perfect experience across desktop and mobile devices
|
||||||
|
- **🌐 Comprehensive Analysis** - Technical indicators, market trends, and industry analysis
|
||||||
|
- **🤖 Big Data Processing** - Apache Spark-powered large-scale data processing
|
||||||
|
- **⚡ High Performance** - Optimized for handling millions of data points
|
||||||
|
- **🔍 Advanced Search** - Intelligent stock search and filtering capabilities
|
||||||
|
- **📝 Rich Documentation** - Complete technical documentation and user guides
|
||||||
|
|
||||||
|
## 🏗️ System Architecture
|
||||||
|
|
||||||
|
- **Microservices Design** - Modular architecture with independent services
|
||||||
|
- **Scalable Processing** - Distributed computing with Apache Spark
|
||||||
|
- **Modern Tech Stack** - Vue.js 3, Spring Boot, Python, and MySQL
|
||||||
|
- **Real-time Updates** - WebSocket-based live data streaming
|
||||||
|
|
||||||
|
## 📦 System Components
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Data Collection Layer
|
||||||
|
├── Python Data Collector # Real-time stock data collection
|
||||||
|
├── External APIs Integration # Tencent Finance, Sina Finance
|
||||||
|
|
||||||
|
# Data Processing Layer
|
||||||
|
├── Apache Spark Processor # Big data processing engine
|
||||||
|
├── Technical Indicators # MA, RSI, MACD, Bollinger Bands
|
||||||
|
├── Market Analysis # Industry trends, market overview
|
||||||
|
|
||||||
|
# Service Layer
|
||||||
|
├── Spring Boot Backend # RESTful API services
|
||||||
|
├── WebSocket Services # Real-time data streaming
|
||||||
|
├── Redis Caching # Performance optimization
|
||||||
|
|
||||||
|
# Presentation Layer
|
||||||
|
├── Vue.js Frontend # Interactive user interface
|
||||||
|
├── ECharts Visualization # Charts and graphs
|
||||||
|
└── Responsive Design # Mobile-friendly UI
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 Supported Agricultural Stocks
|
||||||
|
|
||||||
|
- **New Hope (sz000876)** - Leading livestock and feed company
|
||||||
|
- **Muyuan Foodstuff (sz002714)** - Major pig farming enterprise
|
||||||
|
- **Kweichow Moutai (sh600519)** - Premium liquor producer
|
||||||
|
- **Wuliangye Yibin (sz000858)** - Famous Chinese spirits brand
|
||||||
|
- **Inner Mongolia Yili (sh600887)** - Dairy industry leader
|
||||||
|
- **Jiangsu Yanghe (sz002304)** - Renowned liquor manufacturer
|
||||||
|
|
||||||
|
## 🚀 Getting Started
|
||||||
|
|
||||||
|
Visit our [System Guide](/guide) to learn about each component and how to deploy the platform.
|
||||||
|
|
||||||
|
## 🔗 Related Links
|
||||||
|
|
||||||
|
- [GitHub Repository](https://github.com/agricultural-stock-platform)
|
||||||
|
- [System Guide](/guide)
|
||||||
|
- [Data Collector](/guide/data-collector)
|
||||||
|
- [Spark Processor](/guide/spark-processor)
|
||||||
Vendored
+87
@@ -0,0 +1,87 @@
|
|||||||
|
# 🌾 农业股票数据分析系统开发指南
|
||||||
|
|
||||||
|
## 📋 项目协作概述
|
||||||
|
|
||||||
|
农业股票数据分析系统由四个核心子项目组成,通过精密的协作机制实现从数据采集到用户展示的完整数据流水线。本指南详细说明各子项目的协作关系、开发流程和运作机制。
|
||||||
|
|
||||||
|
## 🏗️ 系统架构与数据流
|
||||||
|
|
||||||
|
### 整体数据流向
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
||||||
|
│ 外部数据源 │ │ 数据采集器 │ │ Spark处理器 │ │ 后端API服务 │
|
||||||
|
│ External APIs │───▶│ data-collector │───▶│ spark-processor │───▶│ backend │
|
||||||
|
│ │ │ │ │ │ │ │
|
||||||
|
│ • 腾讯财经API │ │ • Python爬虫 │ │ • 数据清洗 │ │ • RESTful API │
|
||||||
|
│ • 新浪财经API │ │ • 实时采集 │ │ • 技术指标计算 │ │ • 数据缓存 │
|
||||||
|
│ • 东方财富API │ │ • 数据验证 │ │ • 市场分析 │ │ • WebSocket │
|
||||||
|
└─────────────────┘ └─────────────────┘ └─────────────────┘ └─────────────────┘
|
||||||
|
│ │
|
||||||
|
▼ ▼
|
||||||
|
┌─────────────────┐ ┌─────────────────┐
|
||||||
|
│ MySQL数据库 │ │ 前端界面 │
|
||||||
|
│ Database │ │ frontend │
|
||||||
|
│ │ │ │
|
||||||
|
│ • 原始数据存储 │ │ • Vue.js界面 │
|
||||||
|
│ • 分析结果存储 │ │ • 图表展示 │
|
||||||
|
│ • 索引优化 │◀───│ • 用户交互 │
|
||||||
|
└─────────────────┘ └─────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 2. 部署协作检查清单
|
||||||
|
|
||||||
|
#### 数据库团队责任
|
||||||
|
- [ ] MySQL 8.0环境搭建完成
|
||||||
|
- [ ] 数据库表结构创建完成
|
||||||
|
- [ ] 索引优化配置完成
|
||||||
|
- [ ] 数据库连接池配置完成
|
||||||
|
- [ ] 备份策略配置完成
|
||||||
|
|
||||||
|
#### 数据采集器团队责任
|
||||||
|
- [ ] Python 3.8+环境配置完成
|
||||||
|
- [ ] 依赖包安装完成
|
||||||
|
- [ ] 配置文件环境变量设置完成
|
||||||
|
- [ ] 定时任务调度配置完成
|
||||||
|
- [ ] 日志监控配置完成
|
||||||
|
|
||||||
|
#### Spark处理器团队责任
|
||||||
|
- [ ] Java 8环境配置完成
|
||||||
|
- [ ] Spark 3.4.0集群搭建完成
|
||||||
|
- [ ] Maven依赖管理配置完成
|
||||||
|
- [ ] 作业调度配置完成
|
||||||
|
- [ ] 性能监控配置完成
|
||||||
|
|
||||||
|
#### 后端API团队责任
|
||||||
|
- [ ] Spring Boot应用打包完成
|
||||||
|
- [ ] Redis缓存服务配置完成
|
||||||
|
- [ ] API接口测试通过
|
||||||
|
- [ ] WebSocket服务配置完成
|
||||||
|
- [ ] 负载均衡配置完成
|
||||||
|
|
||||||
|
#### 前端界面团队责任
|
||||||
|
- [ ] Node.js环境配置完成
|
||||||
|
- [ ] Vue项目构建完成
|
||||||
|
- [ ] 静态资源部署完成
|
||||||
|
- [ ] CDN配置优化完成
|
||||||
|
- [ ] 浏览器兼容性测试完成
|
||||||
|
|
||||||
|
|
||||||
|
## 📋 协作成功要素
|
||||||
|
|
||||||
|
### 1. 技术栈统一
|
||||||
|
- **开发语言标准化**:Python 3.8+, Java 8+, Node.js 16+
|
||||||
|
- **数据库统一**:MySQL 8.0 + Redis 6.0
|
||||||
|
- **容器化部署**:Docker + Kubernetes
|
||||||
|
- **监控工具统一**:ELK Stack + Prometheus
|
||||||
|
|
||||||
|
### 2. 文档协作规范
|
||||||
|
- **API文档**:使用Swagger/OpenAPI 3.0
|
||||||
|
- **数据库文档**:使用DbDoc自动生成
|
||||||
|
- **部署文档**:使用Markdown + 流程图
|
||||||
|
- **用户手册**:使用GitBook或VuePress
|
||||||
|
|
||||||
|
|
||||||
|
通过以上协作开发流程,四个子项目能够有机结合,形成一个高效、稳定、可扩展的农业股票数据分析系统。每个团队在专注自身模块开发的同时,通过标准化的接口和协作机制,确保系统整体的一致性和可靠性。
|
||||||
+280
@@ -0,0 +1,280 @@
|
|||||||
|
# 🏠 Spring Boot后端API文档
|
||||||
|
|
||||||
|
## 📋 模块概述
|
||||||
|
|
||||||
|
**backend** 是农业股票数据分析系统的后端API服务模块,基于Spring Boot 2.7.0构建,负责提供RESTful API接口、业务逻辑处理、数据库操作和系统集成服务。
|
||||||
|
|
||||||
|
## Swagger UI访问
|
||||||
|
|
||||||
|
启动应用后,可通过以下地址访问API文档:
|
||||||
|
- **Swagger UI:** http://localhost:8080/swagger-ui/index.html
|
||||||
|
- **OpenAPI JSON:** http://localhost:8080/v3/api-docs
|
||||||
|
|
||||||
|
|
||||||
|
## 🏗️ 技术架构
|
||||||
|
|
||||||
|
### 核心技术栈
|
||||||
|
- **Spring Boot 2.7.0** - 核心框架
|
||||||
|
- **Spring Web** - RESTful API支持
|
||||||
|
- **Spring Data JPA** - 数据持久化
|
||||||
|
- **MyBatis Plus 3.5.2** - 数据库操作增强
|
||||||
|
- **MySQL 8.0** - 关系型数据库
|
||||||
|
- **Redis** - 缓存与会话管理
|
||||||
|
- **WebSocket** - 实时数据推送
|
||||||
|
- **SpringDoc OpenAPI 3** - API文档生成
|
||||||
|
- **Lombok** - 代码简化工具
|
||||||
|
|
||||||
|
|
||||||
|
### 系统架构图
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────────────────┐
|
||||||
|
│ Spring Boot 后端服务 │
|
||||||
|
├─────────────────────────────────────────────────────────────┤
|
||||||
|
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐ │
|
||||||
|
│ │ 控制器层 │ │ 服务层 │ │ 数据层 │ │
|
||||||
|
│ │ Controllers │ │ Services │ │ Mappers │ │
|
||||||
|
│ │ │ │ │ │ │ │
|
||||||
|
│ │ • 股票数据API │ │ • 股票数据服务 │ │ • 数据访问 │ │
|
||||||
|
│ │ • 市场分析API │ │ • 市场分析服务 │ │ • SQL映射 │ │
|
||||||
|
│ │ • 健康检查API │ │ • 缓存服务 │ │ • 实体映射 │ │
|
||||||
|
│ └─────────────────┘ └─────────────────┘ └─────────────┘ │
|
||||||
|
├─────────────────────────────────────────────────────────────┤
|
||||||
|
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐ │
|
||||||
|
│ │ 实体层 │ │ 配置层 │ │ 工具层 │ │
|
||||||
|
│ │ Entities │ │ Configurations │ │ Utils │ │
|
||||||
|
│ │ │ │ │ │ │ │
|
||||||
|
│ │ • 数据模型 │ │ • 数据库配置 │ │ • 响应封装 │ │
|
||||||
|
│ │ • VO对象 │ │ • Redis配置 │ │ • 异常处理 │ │
|
||||||
|
│ │ • DTO对象 │ │ • WebSocket配置 │ │ • 工具类 │ │
|
||||||
|
│ └─────────────────┘ └─────────────────┘ └─────────────┘ │
|
||||||
|
└─────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📁 项目结构
|
||||||
|
|
||||||
|
```
|
||||||
|
backend/
|
||||||
|
├── src/main/java/com/agricultural/stock/
|
||||||
|
│ ├── StockPlatformApplication.java # 应用启动类
|
||||||
|
│ ├── controller/ # 控制器层
|
||||||
|
│ │ ├── StockController.java # 股票数据API控制器
|
||||||
|
│ │ ├── MarketAnalysisController.java # 市场分析API控制器
|
||||||
|
│ │ └── HealthController.java # 健康检查控制器
|
||||||
|
│ ├── service/ # 服务层
|
||||||
|
│ │ ├── StockService.java # 股票数据服务接口
|
||||||
|
│ │ ├── MarketAnalysisService.java # 市场分析服务
|
||||||
|
│ │ └── impl/
|
||||||
|
│ │ └── StockServiceImpl.java # 股票数据服务实现
|
||||||
|
│ ├── entity/ # 实体层
|
||||||
|
│ │ ├── StockData.java # 股票数据实体
|
||||||
|
│ │ ├── MarketAnalysis.java # 市场分析实体
|
||||||
|
│ │ └── MarketTrends.java # 市场趋势实体
|
||||||
|
│ ├── mapper/ # 数据访问层
|
||||||
|
│ │ ├── StockDataMapper.java # 股票数据Mapper
|
||||||
|
│ │ └── MarketAnalysisMapper.java # 市场分析Mapper
|
||||||
|
│ ├── vo/ # 视图对象
|
||||||
|
│ │ ├── Result.java # 统一响应结果
|
||||||
|
│ │ ├── StockAnalysisVO.java # 股票分析视图对象
|
||||||
|
│ │ └── StockTrendVO.java # 股票趋势视图对象
|
||||||
|
│ └── config/ # 配置类
|
||||||
|
│ ├── WebConfig.java # Web配置
|
||||||
|
│ ├── RedisConfig.java # Redis配置
|
||||||
|
│ └── WebSocketConfig.java # WebSocket配置
|
||||||
|
├── src/main/resources/
|
||||||
|
│ ├── application.yml # 应用配置文件
|
||||||
|
│ ├── mapper/ # MyBatis映射文件
|
||||||
|
│ └── static/ # 静态资源
|
||||||
|
└── pom.xml # Maven配置文件
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 核心功能模块
|
||||||
|
|
||||||
|
### 1. 股票数据API (StockController)
|
||||||
|
|
||||||
|
**功能描述:** 提供股票数据的增删改查、排行榜、搜索等核心API接口。
|
||||||
|
|
||||||
|
**主要接口:**
|
||||||
|
|
||||||
|
| HTTP方法 | 路径 | 描述 | 响应格式 |
|
||||||
|
|---------|------|------|----------|
|
||||||
|
| GET | `/api/stock/realtime` | 获取实时股票数据 | `Result<List<StockData>>` |
|
||||||
|
| GET | `/api/stock/history/{stockCode}` | 获取历史数据 | `Result<List<StockData>>` |
|
||||||
|
| GET | `/api/stock/ranking/growth` | 涨幅排行榜 | `Result<List<StockData>>` |
|
||||||
|
| GET | `/api/stock/ranking/market-cap` | 市值排行榜 | `Result<List<StockData>>` |
|
||||||
|
| GET | `/api/stock/ranking/volume` | 成交量排行榜 | `Result<List<StockData>>` |
|
||||||
|
| GET | `/api/stock/trend/{stockCode}` | 股票趋势分析 | `Result<StockTrendVO>` |
|
||||||
|
| GET | `/api/stock/analysis` | 市场综合分析 | `Result<StockAnalysisVO>` |
|
||||||
|
| GET | `/api/stock/search` | 股票搜索 | `Result<List<StockData>>` |
|
||||||
|
| POST | `/api/stock/save` | 保存股票数据 | `Result<StockData>` |
|
||||||
|
| POST | `/api/stock/batch-save` | 批量保存数据 | `Result<Integer>` |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 2. 市场分析API (MarketAnalysisController)
|
||||||
|
|
||||||
|
**功能描述:** 提供市场分析数据的查询和统计接口。
|
||||||
|
|
||||||
|
**主要接口:**
|
||||||
|
|
||||||
|
| HTTP方法 | 路径 | 描述 | 参数 |
|
||||||
|
|---------|------|------|------|
|
||||||
|
| GET | `/api/market/latest` | 获取最新市场分析 | 无 |
|
||||||
|
| GET | `/api/market/recent/{days}` | 获取最近N天数据 | days: 天数 |
|
||||||
|
| GET | `/api/market/range` | 获取日期范围数据 | startDate, endDate |
|
||||||
|
|
||||||
|
|
||||||
|
## 🚀 部署与运行
|
||||||
|
|
||||||
|
### 1. 环境准备
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 检查Java版本
|
||||||
|
java -version
|
||||||
|
|
||||||
|
# 检查Maven版本
|
||||||
|
mvn -version
|
||||||
|
|
||||||
|
# 启动MySQL服务
|
||||||
|
sudo systemctl start mysql
|
||||||
|
|
||||||
|
# 启动Redis服务
|
||||||
|
sudo systemctl start redis
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 数据库初始化
|
||||||
|
|
||||||
|
```sql
|
||||||
|
# 创建数据库
|
||||||
|
CREATE DATABASE agricultural_stock CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
# 导入表结构
|
||||||
|
mysql -u root -p agricultural_stock < ../agricultural_stock.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 编译运行
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 进入后端目录
|
||||||
|
cd backend
|
||||||
|
|
||||||
|
# 清理编译
|
||||||
|
mvn clean compile
|
||||||
|
|
||||||
|
# 运行应用
|
||||||
|
mvn spring-boot:run
|
||||||
|
|
||||||
|
# 或打包后运行
|
||||||
|
mvn package
|
||||||
|
java -jar target/stock-platform-backend-1.0.0.jar
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Docker部署
|
||||||
|
|
||||||
|
**Dockerfile:**
|
||||||
|
```dockerfile
|
||||||
|
FROM openjdk:8-jre-alpine
|
||||||
|
VOLUME /tmp
|
||||||
|
COPY target/stock-platform-backend-1.0.0.jar app.jar
|
||||||
|
EXPOSE 8080
|
||||||
|
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
|
||||||
|
```
|
||||||
|
|
||||||
|
**构建镜像:**
|
||||||
|
```bash
|
||||||
|
# 构建Docker镜像
|
||||||
|
docker build -t agricultural-stock-backend .
|
||||||
|
|
||||||
|
# 运行容器
|
||||||
|
docker run -d -p 8080:8080 \
|
||||||
|
-e SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/agricultural_stock \
|
||||||
|
-e SPRING_REDIS_HOST=redis \
|
||||||
|
--name backend agricultural-stock-backend
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 API文档
|
||||||
|
|
||||||
|
### Swagger UI访问
|
||||||
|
|
||||||
|
启动应用后,可通过以下地址访问API文档:
|
||||||
|
- **Swagger UI:** http://localhost:8080/swagger-ui/index.html
|
||||||
|
- **OpenAPI JSON:** http://localhost:8080/v3/api-docs
|
||||||
|
|
||||||
|
|
||||||
|
## 📈 性能优化
|
||||||
|
|
||||||
|
### 1. 数据库优化
|
||||||
|
|
||||||
|
**连接池配置:**
|
||||||
|
```yaml
|
||||||
|
spring:
|
||||||
|
datasource:
|
||||||
|
hikari:
|
||||||
|
minimum-idle: 5 # 最小空闲连接
|
||||||
|
maximum-pool-size: 20 # 最大连接池大小
|
||||||
|
max-lifetime: 1800000 # 连接最大生存时间
|
||||||
|
connection-timeout: 30000 # 连接超时时间
|
||||||
|
```
|
||||||
|
|
||||||
|
**索引优化:**
|
||||||
|
```sql
|
||||||
|
# 股票代码索引
|
||||||
|
CREATE INDEX idx_stock_code ON stock_data(stock_code);
|
||||||
|
|
||||||
|
# 交易日期索引
|
||||||
|
CREATE INDEX idx_trade_date ON stock_data(trade_date);
|
||||||
|
|
||||||
|
# 复合索引
|
||||||
|
CREATE INDEX idx_stock_trade ON stock_data(stock_code, trade_date);
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 📋 监控与维护
|
||||||
|
|
||||||
|
### 1. 健康检查
|
||||||
|
**健康检查接口:**
|
||||||
|
```java
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/health")
|
||||||
|
public class HealthController {
|
||||||
|
@GetMapping("/check")
|
||||||
|
public Result<Map<String, Object>> healthCheck() {
|
||||||
|
Map<String, Object> status = new HashMap<>();
|
||||||
|
status.put("status", "UP");
|
||||||
|
status.put("timestamp", System.currentTimeMillis());
|
||||||
|
status.put("database", checkDatabase());
|
||||||
|
status.put("redis", checkRedis());
|
||||||
|
return Result.success(status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
### 2. 日志管理
|
||||||
|
|
||||||
|
**日志配置示例:**
|
||||||
|
```yaml
|
||||||
|
logging:
|
||||||
|
level:
|
||||||
|
root: INFO
|
||||||
|
com.agricultural.stock: DEBUG
|
||||||
|
pattern:
|
||||||
|
console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
|
||||||
|
file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
|
||||||
|
file:
|
||||||
|
name: logs/backend.log
|
||||||
|
max-size: 100MB
|
||||||
|
max-history: 30
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📄 许可证
|
||||||
|
|
||||||
|
本模块采用 MIT 许可证,详见项目根目录 LICENSE 文件。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**联系信息:**
|
||||||
|
- 项目仓库: [Agricultural Stock Platform](https://github.com/agricultural-stock-platform)
|
||||||
|
- 技术支持: support@agricultural-stock.com
|
||||||
|
- 开发团队: Agricultural Stock Platform Team
|
||||||
+179
@@ -0,0 +1,179 @@
|
|||||||
|
# 📊 Python数据采集器文档
|
||||||
|
|
||||||
|
## 📋 模块概述
|
||||||
|
|
||||||
|
**data-collector** 是农业股票数据分析系统的数据采集模块,基于Python 3.8+构建,负责从外部数据源实时采集农业类上市公司的股票数据,并将数据存储到MySQL数据库中供后续分析使用。
|
||||||
|
|
||||||
|
## 🏗️ 技术架构
|
||||||
|
|
||||||
|
### 核心技术栈
|
||||||
|
- **Python 3.8+** - 编程语言
|
||||||
|
- **Requests 2.31.0** - HTTP请求库
|
||||||
|
- **Pandas 2.1.0** - 数据处理库
|
||||||
|
- **BeautifulSoup4 4.12.2** - HTML解析库
|
||||||
|
- **MySQL Connector 8.1.0** - MySQL数据库连接器
|
||||||
|
- **Schedule 1.2.0** - 任务调度库
|
||||||
|
- **NumPy 1.26.0** - 数值计算库
|
||||||
|
|
||||||
|
## 📁 项目结构
|
||||||
|
|
||||||
|
```
|
||||||
|
data-collector/
|
||||||
|
├── stock_crawler.py # 主要爬虫程序
|
||||||
|
├── config.ini # 配置文件
|
||||||
|
├── requirements.txt # Python依赖
|
||||||
|
└── stock_crawler.log # 运行日志
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 核心功能
|
||||||
|
|
||||||
|
### 1. 股票数据采集
|
||||||
|
|
||||||
|
支持从腾讯财经API采集以下农业股票数据:
|
||||||
|
- 新希望 (sz000876)
|
||||||
|
- 牧原股份 (sz002714)
|
||||||
|
- 贵州茅台 (sh600519)
|
||||||
|
- 五粮液 (sz000858)
|
||||||
|
- 伊利股份 (sh600887)
|
||||||
|
- 洋河股份 (sz002304)
|
||||||
|
|
||||||
|
### 2. 数据处理功能
|
||||||
|
|
||||||
|
- 实时价格数据获取
|
||||||
|
- 涨跌幅自动计算
|
||||||
|
- 成交额计算
|
||||||
|
- 数据格式标准化
|
||||||
|
- 异常数据过滤
|
||||||
|
|
||||||
|
### 3. 数据库存储
|
||||||
|
|
||||||
|
- MySQL批量写入
|
||||||
|
- 重复数据更新
|
||||||
|
- 事务管理
|
||||||
|
- 连接池管理
|
||||||
|
|
||||||
|
### 4. 任务调度
|
||||||
|
|
||||||
|
- 定时数据采集
|
||||||
|
- 错误重试机制
|
||||||
|
- 日志记录
|
||||||
|
- 状态监控
|
||||||
|
|
||||||
|
## ⚙️ 配置管理
|
||||||
|
|
||||||
|
### config.ini 配置文件
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[database]
|
||||||
|
host = localhost
|
||||||
|
port = 3306
|
||||||
|
user = root
|
||||||
|
password = 123456
|
||||||
|
database = agricultural_stock
|
||||||
|
|
||||||
|
[crawler]
|
||||||
|
request_interval = 0.5
|
||||||
|
request_timeout = 10
|
||||||
|
max_retries = 3
|
||||||
|
user_agent = Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
|
||||||
|
|
||||||
|
[logging]
|
||||||
|
level = INFO
|
||||||
|
file = stock_crawler.log
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚀 部署与运行
|
||||||
|
|
||||||
|
### 1. 环境准备
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 检查Python版本
|
||||||
|
python --version # 需要 3.8+
|
||||||
|
|
||||||
|
# 安装依赖
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 配置设置
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 编辑配置文件
|
||||||
|
vim config.ini
|
||||||
|
|
||||||
|
# 配置数据库连接信息
|
||||||
|
[database]
|
||||||
|
host = localhost
|
||||||
|
port = 3306
|
||||||
|
user = your_username
|
||||||
|
password = your_password
|
||||||
|
database = agricultural_stock
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 运行方式
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 执行一次数据采集
|
||||||
|
python stock_crawler.py
|
||||||
|
|
||||||
|
# 后台运行
|
||||||
|
nohup python stock_crawler.py > /dev/null 2>&1 &
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 数据质量保证
|
||||||
|
|
||||||
|
### 数据验证机制
|
||||||
|
|
||||||
|
- 必填字段完整性检查
|
||||||
|
- 价格数据合理性验证
|
||||||
|
- 涨跌幅异常值检测
|
||||||
|
- 成交量负值过滤
|
||||||
|
|
||||||
|
### 异常处理
|
||||||
|
|
||||||
|
- 网络请求重试机制
|
||||||
|
- 数据库连接故障恢复
|
||||||
|
- 错误日志详细记录
|
||||||
|
- 优雅异常处理
|
||||||
|
|
||||||
|
## 📈 监控与维护
|
||||||
|
|
||||||
|
### 日志管理
|
||||||
|
|
||||||
|
系统自动记录以下信息:
|
||||||
|
- 数据采集开始/结束时间
|
||||||
|
- 成功采集的股票数量
|
||||||
|
- 失败的股票代码和原因
|
||||||
|
- 数据库操作结果
|
||||||
|
- 异常错误详情
|
||||||
|
|
||||||
|
### 性能监控
|
||||||
|
|
||||||
|
- 采集耗时统计
|
||||||
|
- 成功率监控
|
||||||
|
- 错误率统计
|
||||||
|
- 数据库性能监控
|
||||||
|
|
||||||
|
## 📋 依赖管理
|
||||||
|
|
||||||
|
### requirements.txt
|
||||||
|
|
||||||
|
```txt
|
||||||
|
requests>=2.31.0
|
||||||
|
pandas>=2.1.0
|
||||||
|
beautifulsoup4>=4.12.2
|
||||||
|
lxml>=4.9.3
|
||||||
|
mysql-connector-python>=8.1.0
|
||||||
|
schedule>=1.2.0
|
||||||
|
numpy>=1.26.0
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📄 许可证
|
||||||
|
|
||||||
|
本模块采用 MIT 许可证,详见项目根目录 LICENSE 文件。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**联系信息:**
|
||||||
|
- 项目仓库: [Agricultural Stock Platform](https://github.com/agricultural-stock-platform)
|
||||||
|
- 技术支持: support@agricultural-stock.com
|
||||||
|
- 开发团队: Agricultural Stock Platform Team
|
||||||
+248
@@ -0,0 +1,248 @@
|
|||||||
|
# 🎨 Vue.js前端界面文档
|
||||||
|
|
||||||
|
## 📋 模块概述
|
||||||
|
|
||||||
|
**frontend** 是农业股票数据分析系统的前端用户界面模块,基于Vue.js 3.3.0构建,提供现代化的响应式Web界面,支持实时数据展示、交互式图表、股票分析和市场监控功能。
|
||||||
|
|
||||||
|
## 🏗️ 技术架构
|
||||||
|
|
||||||
|
### 核心技术栈
|
||||||
|
- **Vue 3.3.0** - 渐进式JavaScript框架
|
||||||
|
- **Vue Router 4.2.0** - 官方路由管理器
|
||||||
|
- **Vuex 4.0.2** - 状态管理模式
|
||||||
|
- **Element Plus 2.3.0** - Vue 3组件库
|
||||||
|
- **ECharts 5.4.0** - 数据可视化图表库
|
||||||
|
- **Axios 1.4.0** - HTTP客户端
|
||||||
|
- **Vite 4.3.0** - 构建工具
|
||||||
|
- **SASS 1.62.0** - CSS预处理器
|
||||||
|
- **WebSocket** - 实时数据通信
|
||||||
|
|
||||||
|
### 系统架构图
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────────────────┐
|
||||||
|
│ Vue.js 前端应用 │
|
||||||
|
├─────────────────────────────────────────────────────────────┤
|
||||||
|
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐ │
|
||||||
|
│ │ 视图层 │ │ 状态管理 │ │ 路由管理 │ │
|
||||||
|
│ │ Views │ │ Vuex │ │ Vue Router │ │
|
||||||
|
│ │ │ │ │ │ │ │
|
||||||
|
│ │ • 仪表板页面 │ │ • 股票数据状态 │ │ • 路由配置 │ │
|
||||||
|
│ │ • 市场分析页面 │ │ • 用户界面状态 │ │ • 导航守卫 │ │
|
||||||
|
│ │ • 股票详情页面 │ │ • 异步操作 │ │ • 懒加载 │ │
|
||||||
|
│ │ • 数据管理页面 │ │ • 缓存管理 │ │ • 嵌套路由 │ │
|
||||||
|
│ └─────────────────┘ └─────────────────┘ └─────────────┘ │
|
||||||
|
├─────────────────────────────────────────────────────────────┤
|
||||||
|
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐ │
|
||||||
|
│ │ 组件层 │ │ 服务层 │ │ 工具层 │ │
|
||||||
|
│ │ Components │ │ Services │ │ Utils │ │
|
||||||
|
│ │ │ │ │ │ │ │
|
||||||
|
│ │ • 图表组件 │ │ • API接口 │ │ • 工具函数 │ │
|
||||||
|
│ │ • 表格组件 │ │ • WebSocket │ │ • 常量定义 │ │
|
||||||
|
│ │ • 搜索组件 │ │ • 数据处理 │ │ • 格式化 │ │
|
||||||
|
│ │ • 排行榜组件 │ │ • 错误处理 │ │ • 验证器 │ │
|
||||||
|
│ └─────────────────┘ └─────────────────┘ └─────────────┘ │
|
||||||
|
└─────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📁 项目结构
|
||||||
|
|
||||||
|
```
|
||||||
|
frontend/
|
||||||
|
├── public/
|
||||||
|
│ ├── index.html # 入口HTML文件
|
||||||
|
│ └── favicon.ico # 网站图标
|
||||||
|
├── src/
|
||||||
|
│ ├── main.js # 应用入口文件
|
||||||
|
│ ├── App.vue # 根组件
|
||||||
|
│ ├── views/ # 页面视图
|
||||||
|
│ │ ├── Dashboard.vue # 仪表板页面
|
||||||
|
│ │ ├── MarketAnalysis.vue # 市场分析页面
|
||||||
|
│ │ ├── StockDetail.vue # 股票详情页面
|
||||||
|
│ │ ├── StockSearch.vue # 股票搜索页面
|
||||||
|
│ │ ├── Rankings.vue # 排行榜页面
|
||||||
|
│ │ ├── DataManagement.vue # 数据管理页面
|
||||||
|
│ │ └── HealthCheck.vue # 健康检查页面
|
||||||
|
│ ├── components/ # 可复用组件
|
||||||
|
│ │ └── MarketOverview.vue # 市场总览组件
|
||||||
|
│ ├── router/ # 路由配置
|
||||||
|
│ │ └── index.js # 路由定义
|
||||||
|
│ ├── store/ # 状态管理
|
||||||
|
│ │ ├── index.js # Vuex store
|
||||||
|
│ │ └── modules/ # 模块化store
|
||||||
|
│ ├── api/ # API接口
|
||||||
|
│ │ ├── stock.js # 股票数据API
|
||||||
|
│ │ └── market.js # 市场分析API
|
||||||
|
│ ├── utils/ # 工具函数
|
||||||
|
│ │ ├── request.js # HTTP请求封装
|
||||||
|
│ │ ├── format.js # 数据格式化
|
||||||
|
│ │ └── constants.js # 常量定义
|
||||||
|
│ └── styles/ # 样式文件
|
||||||
|
│ ├── main.scss # 主样式文件
|
||||||
|
│ └── variables.scss # 样式变量
|
||||||
|
├── package.json # 项目依赖配置
|
||||||
|
├── vite.config.js # Vite构建配置
|
||||||
|
└── .eslintrc.js # ESLint配置
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 核心功能模块
|
||||||
|
|
||||||
|
### 1. 仪表板页面 (Dashboard.vue)
|
||||||
|
|
||||||
|
**功能描述:** 系统主页面,提供股票市场的整体概览和关键指标展示。
|
||||||
|
|
||||||
|
**主要功能:**
|
||||||
|
- 实时市场数据展示
|
||||||
|
- 涨跌分布统计图表
|
||||||
|
- 成交量趋势分析
|
||||||
|
- 热门股票快速入口
|
||||||
|
- 市场新闻资讯展示
|
||||||
|
|
||||||
|
|
||||||
|
### 2. 市场分析页面 (MarketAnalysis.vue)
|
||||||
|
|
||||||
|
**功能描述:** 提供深度的市场分析功能,包括技术指标、趋势分析和预测模型。
|
||||||
|
|
||||||
|
**主要功能:**
|
||||||
|
- K线图表展示
|
||||||
|
- 技术指标分析(MA、RSI、MACD)
|
||||||
|
- 市场热力图
|
||||||
|
- 行业对比分析
|
||||||
|
- 历史数据回测
|
||||||
|
|
||||||
|
### 3. 股票详情页面 (StockDetail.vue)
|
||||||
|
|
||||||
|
**功能描述:** 展示单个股票的详细信息,包括实时价格、历史走势和基本面分析。
|
||||||
|
|
||||||
|
**主要功能:**
|
||||||
|
- 实时价格展示
|
||||||
|
- 历史价格走势图
|
||||||
|
- 成交量分析
|
||||||
|
- 基本面数据(PE、PB、市值等)
|
||||||
|
- 相关新闻和公告
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 4. 股票搜索页面 (StockSearch.vue)
|
||||||
|
|
||||||
|
**功能描述:** 提供智能的股票搜索功能,支持多种搜索条件和筛选器。
|
||||||
|
|
||||||
|
**主要功能:**
|
||||||
|
- 关键词搜索(股票代码、名称)
|
||||||
|
- 高级筛选(价格区间、市值、行业)
|
||||||
|
- 搜索结果排序
|
||||||
|
- 收藏夹功能
|
||||||
|
- 搜索历史记录
|
||||||
|
|
||||||
|
|
||||||
|
### 5. 排行榜页面 (Rankings.vue)
|
||||||
|
|
||||||
|
**功能描述:** 展示各类股票排行榜,帮助用户快速发现市场热点。
|
||||||
|
|
||||||
|
**主要功能:**
|
||||||
|
- 涨幅排行榜
|
||||||
|
- 跌幅排行榜
|
||||||
|
- 成交量排行榜
|
||||||
|
- 市值排行榜
|
||||||
|
- 换手率排行榜
|
||||||
|
|
||||||
|
### 6. 数据管理页面 (DataManagement.vue)
|
||||||
|
|
||||||
|
**功能描述:** 为管理员提供数据管理功能,包括数据导入、导出和系统监控。
|
||||||
|
|
||||||
|
**主要功能:**
|
||||||
|
- 股票数据批量导入
|
||||||
|
- 历史数据导出
|
||||||
|
- 数据同步状态监控
|
||||||
|
- 系统健康检查
|
||||||
|
- 错误日志查看
|
||||||
|
|
||||||
|
|
||||||
|
## 🚀 部署与运行
|
||||||
|
|
||||||
|
### 1. 开发环境
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 安装依赖
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# 启动开发服务器
|
||||||
|
npm run dev
|
||||||
|
|
||||||
|
# 代码检查
|
||||||
|
npm run lint
|
||||||
|
|
||||||
|
# 代码格式化
|
||||||
|
npm run format
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 生产构建
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 构建生产版本
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# 预览构建结果
|
||||||
|
npm run preview
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Docker部署
|
||||||
|
|
||||||
|
**Dockerfile:**
|
||||||
|
```dockerfile
|
||||||
|
# 构建阶段
|
||||||
|
FROM node:16-alpine as builder
|
||||||
|
WORKDIR /app
|
||||||
|
COPY package*.json ./
|
||||||
|
RUN npm ci --only=production
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
RUN npm run build
|
||||||
|
|
||||||
|
# 生产阶段
|
||||||
|
FROM nginx:alpine
|
||||||
|
COPY --from=builder /app/dist /usr/share/nginx/html
|
||||||
|
COPY nginx.conf /etc/nginx/nginx.conf
|
||||||
|
EXPOSE 80
|
||||||
|
CMD ["nginx", "-g", "daemon off;"]
|
||||||
|
```
|
||||||
|
|
||||||
|
**nginx.conf:**
|
||||||
|
```nginx
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name localhost;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
root /usr/share/nginx/html;
|
||||||
|
index index.html;
|
||||||
|
try_files $uri $uri/ /index.html;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /api {
|
||||||
|
proxy_pass http://backend:8080;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /ws {
|
||||||
|
proxy_pass http://backend:8080;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 📄 许可证
|
||||||
|
|
||||||
|
本模块采用 MIT 许可证,详见项目根目录 LICENSE 文件。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**联系信息:**
|
||||||
|
- 项目仓库: [Agricultural Stock Platform](https://github.com/agricultural-stock-platform)
|
||||||
|
- 技术支持: support@agricultural-stock.com
|
||||||
|
- 开发团队: Agricultural Stock Platform Team
|
||||||
+422
@@ -0,0 +1,422 @@
|
|||||||
|
# 🌾 Spark数据处理模块文档
|
||||||
|
|
||||||
|
## 📋 模块概述
|
||||||
|
|
||||||
|
**spark-processor** 是农业股票数据分析系统的核心数据处理引擎,基于Apache Spark 3.4.0构建,负责对农业相关上市公司的股票数据进行大规模处理、技术分析和市场分析。
|
||||||
|
|
||||||
|
## 🏗️ 技术架构
|
||||||
|
|
||||||
|
### 核心技术栈
|
||||||
|
- **Apache Spark 3.4.0** - 分布式大数据处理框架
|
||||||
|
- **Spark SQL** - 结构化数据查询与处理
|
||||||
|
- **Spark Streaming** - 实时流数据处理
|
||||||
|
- **MySQL 8.0** - 数据存储与持久化
|
||||||
|
- **Java 8** - 编程语言
|
||||||
|
- **Maven 3.6+** - 项目构建管理
|
||||||
|
|
||||||
|
### 架构设计
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────────────────┐
|
||||||
|
│ Spark数据处理模块 │
|
||||||
|
├─────────────────────────────────────────────────────────────┤
|
||||||
|
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐ │
|
||||||
|
│ │ 数据清洗服务 │ │ 技术指标服务 │ │ 市场分析服务 │ │
|
||||||
|
│ │ DataCleaning │ │ TechnicalIndica │ │ MarketAnaly │ │
|
||||||
|
│ │ Service │ │ torService │ │ sisService │ │
|
||||||
|
│ └─────────────────┘ └─────────────────┘ └─────────────┘ │
|
||||||
|
│ ┌─────────────────┐ ┌─────────────────┐ │
|
||||||
|
│ │ 数据库保存服务 │ │ 配置管理 │ │
|
||||||
|
│ │ DatabaseSave │ │ SparkConfig │ │
|
||||||
|
│ │ Service │ │ │ │
|
||||||
|
│ └─────────────────┘ └─────────────────┘ │
|
||||||
|
├─────────────────────────────────────────────────────────────┤
|
||||||
|
│ StockDataProcessor (主处理类) │
|
||||||
|
└─────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📁 项目结构
|
||||||
|
|
||||||
|
```
|
||||||
|
spark-processor/
|
||||||
|
├── src/main/java/com/agricultural/spark/
|
||||||
|
│ ├── StockDataProcessor.java # 主处理类
|
||||||
|
│ ├── config/
|
||||||
|
│ │ └── SparkConfig.java # 配置管理类
|
||||||
|
│ └── service/
|
||||||
|
│ ├── DataCleaningService.java # 数据清洗服务
|
||||||
|
│ ├── TechnicalIndicatorService.java # 技术指标计算服务
|
||||||
|
│ ├── MarketAnalysisService.java # 市场分析服务
|
||||||
|
│ └── DatabaseSaveService.java # 数据库保存服务
|
||||||
|
├── src/main/resources/
|
||||||
|
│ ├── application.conf # 应用配置文件
|
||||||
|
│ └── logback.xml # 日志配置
|
||||||
|
├── database_tables.sql # 数据库表结构
|
||||||
|
├── pom.xml # Maven配置文件
|
||||||
|
└── README_DATABASE.md # 数据库文档
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 核心功能模块
|
||||||
|
|
||||||
|
### 1. 数据处理主类 (StockDataProcessor)
|
||||||
|
|
||||||
|
**功能描述:** 系统的核心调度器,负责协调各个服务模块的工作流程。
|
||||||
|
|
||||||
|
**主要职责:**
|
||||||
|
- Spark会话管理与初始化
|
||||||
|
- 数据加载与预处理协调
|
||||||
|
- 批处理与流处理模式切换
|
||||||
|
- 异常处理与资源管理
|
||||||
|
|
||||||
|
**关键方法:**
|
||||||
|
```java
|
||||||
|
// 批处理模式
|
||||||
|
public void runBatchProcessing()
|
||||||
|
|
||||||
|
// 流处理模式
|
||||||
|
public void runStreamProcessing()
|
||||||
|
|
||||||
|
// 从MySQL加载数据
|
||||||
|
public Dataset<Row> loadStockDataFromMySQL()
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 数据清洗服务 (DataCleaningService)
|
||||||
|
|
||||||
|
**功能描述:** 对原始股票数据进行标准化清洗和预处理。
|
||||||
|
|
||||||
|
**处理流程:**
|
||||||
|
1. **去重处理** - 基于股票代码和交易日期去除重复记录
|
||||||
|
2. **缺失值处理** - 数值字段填充0,字符串字段填充空值
|
||||||
|
3. **数据类型转换** - 确保字段类型正确性
|
||||||
|
4. **异常值检测** - 识别并处理价格、成交量等异常数据
|
||||||
|
5. **派生字段计算** - 计算涨跌幅、市值等衍生指标
|
||||||
|
|
||||||
|
**关键功能:**
|
||||||
|
```java
|
||||||
|
// 主要清洗方法
|
||||||
|
public Dataset<Row> cleanData(Dataset<Row> rawData)
|
||||||
|
|
||||||
|
// 缺失值处理
|
||||||
|
private Dataset<Row> handleMissingValues(Dataset<Row> data)
|
||||||
|
|
||||||
|
// 异常值处理
|
||||||
|
private Dataset<Row> handleOutliers(Dataset<Row> data)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 技术指标服务 (TechnicalIndicatorService)
|
||||||
|
|
||||||
|
**功能描述:** 计算各种技术分析指标,为量化分析提供数据支撑。
|
||||||
|
|
||||||
|
**支持的技术指标:**
|
||||||
|
- **移动平均线 (MA)** - MA5, MA10, MA20, MA30
|
||||||
|
- **相对强弱指数 (RSI)** - 14日RSI指标
|
||||||
|
- **MACD指标** - 快线、慢线、柱状图
|
||||||
|
- **布林带 (Bollinger Bands)** - 上轨、中轨、下轨
|
||||||
|
- **成交量移动平均** - 成交量技术分析
|
||||||
|
|
||||||
|
**计算方法:**
|
||||||
|
```java
|
||||||
|
// 计算技术指标
|
||||||
|
public Dataset<Row> calculateTechnicalIndicators(Dataset<Row> data)
|
||||||
|
|
||||||
|
// 移动平均线计算
|
||||||
|
private Dataset<Row> calculateMovingAverages(Dataset<Row> data)
|
||||||
|
|
||||||
|
// RSI指标计算
|
||||||
|
private Dataset<Row> calculateRSI(Dataset<Row> data)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. 市场分析服务 (MarketAnalysisService)
|
||||||
|
|
||||||
|
**功能描述:** 从宏观角度分析市场整体表现和行业分布。
|
||||||
|
|
||||||
|
**分析维度:**
|
||||||
|
- **市场总览** - 涨跌统计、平均涨跌幅、总市值
|
||||||
|
- **行业表现** - 按行业分类的股票表现统计
|
||||||
|
- **市场趋势** - 历史走势分析和预测
|
||||||
|
- **板块轮动** - 不同板块间的资金流向分析
|
||||||
|
|
||||||
|
**核心分析:**
|
||||||
|
```java
|
||||||
|
// 市场总览分析
|
||||||
|
public Map<String, Object> analyzeMarketOverview(Dataset<Row> data)
|
||||||
|
|
||||||
|
// 行业表现分析
|
||||||
|
public Dataset<Row> analyzeIndustryPerformance(Dataset<Row> data)
|
||||||
|
|
||||||
|
// 市场趋势分析
|
||||||
|
public Dataset<Row> analyzeTrends(Dataset<Row> data)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. 数据库保存服务 (DatabaseSaveService)
|
||||||
|
|
||||||
|
**功能描述:** 将Spark处理后的结果数据持久化到MySQL数据库。
|
||||||
|
|
||||||
|
**保存策略:**
|
||||||
|
- **增量更新** - 仅保存新增或变更的数据
|
||||||
|
- **批量写入** - 提高数据写入效率
|
||||||
|
- **事务管理** - 保证数据一致性
|
||||||
|
- **连接池管理** - 优化数据库连接性能
|
||||||
|
|
||||||
|
**主要功能:**
|
||||||
|
```java
|
||||||
|
// 保存市场分析结果
|
||||||
|
public void saveMarketAnalysis(Map<String, Object> analysisResult)
|
||||||
|
|
||||||
|
// 保存技术指标数据
|
||||||
|
public void saveTechnicalIndicators(Dataset<Row> indicators)
|
||||||
|
|
||||||
|
// 批量保存处理结果
|
||||||
|
public void batchSaveResults(List<Dataset<Row>> datasets)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🗄️ 数据库设计
|
||||||
|
|
||||||
|
### 主要数据表
|
||||||
|
|
||||||
|
| 表名 | 描述 | 主要字段 |
|
||||||
|
|------|------|----------|
|
||||||
|
| `stock_data` | 股票基础数据 | stock_code, stock_name, open_price, close_price, volume, trade_date |
|
||||||
|
| `market_analysis` | 市场分析结果 | analysis_date, up_count, down_count, total_market_cap, avg_change_percent |
|
||||||
|
| `stock_technical_indicators` | 技术指标数据 | stock_code, trade_date, ma5, ma10, ma20, rsi, macd |
|
||||||
|
| `industry_analysis` | 行业分析数据 | industry_name, stock_count, avg_change_percent, total_market_cap |
|
||||||
|
| `market_trends` | 市场趋势数据 | trade_date, avg_price, total_volume, stock_count |
|
||||||
|
|
||||||
|
## ⚙️ 配置管理
|
||||||
|
|
||||||
|
### 配置文件 (application.conf)
|
||||||
|
|
||||||
|
```hocon
|
||||||
|
# Spark配置
|
||||||
|
spark {
|
||||||
|
master = "local[*]"
|
||||||
|
app.name = "AgriculturalStockDataProcessor"
|
||||||
|
}
|
||||||
|
|
||||||
|
# MySQL数据库配置
|
||||||
|
mysql {
|
||||||
|
host = "localhost"
|
||||||
|
port = 3306
|
||||||
|
database = "agricultural_stock"
|
||||||
|
user = "root"
|
||||||
|
password = "your_password"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 输出路径配置
|
||||||
|
output {
|
||||||
|
path = "/tmp/spark-output"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 环境配置说明
|
||||||
|
|
||||||
|
**开发环境:**
|
||||||
|
- Spark Master: `local[*]` (使用所有可用CPU核心)
|
||||||
|
- 内存设置: 建议4GB以上
|
||||||
|
- MySQL: 本地实例
|
||||||
|
|
||||||
|
**生产环境:**
|
||||||
|
- Spark Master: `spark://master:7077` (集群模式)
|
||||||
|
- 内存设置: 根据数据量调整
|
||||||
|
- MySQL: 高可用集群
|
||||||
|
|
||||||
|
## 🚀 部署与运行
|
||||||
|
|
||||||
|
### 1. 环境准备
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 检查Java版本
|
||||||
|
java -version
|
||||||
|
|
||||||
|
# 检查Maven版本
|
||||||
|
mvn -version
|
||||||
|
|
||||||
|
# 启动MySQL服务
|
||||||
|
systemctl start mysql
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 编译打包
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 进入项目目录
|
||||||
|
cd spark-processor
|
||||||
|
|
||||||
|
# 清理并编译
|
||||||
|
mvn clean compile
|
||||||
|
|
||||||
|
# 打包为可执行JAR
|
||||||
|
mvn package
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 运行方式
|
||||||
|
|
||||||
|
**批处理模式:**
|
||||||
|
```bash
|
||||||
|
# 方式1: 使用Maven运行
|
||||||
|
mvn exec:java -Dexec.mainClass="com.agricultural.spark.StockDataProcessor"
|
||||||
|
|
||||||
|
# 方式2: 使用JAR包运行
|
||||||
|
java -jar target/spark-data-processor-1.0.0.jar
|
||||||
|
```
|
||||||
|
|
||||||
|
**流处理模式:**
|
||||||
|
```bash
|
||||||
|
# 启动流处理
|
||||||
|
java -jar target/spark-data-processor-1.0.0.jar stream
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. 集群部署
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 提交到Spark集群
|
||||||
|
spark-submit \
|
||||||
|
--class com.agricultural.spark.StockDataProcessor \
|
||||||
|
--master spark://master:7077 \
|
||||||
|
--executor-memory 2g \
|
||||||
|
--total-executor-cores 4 \
|
||||||
|
target/spark-data-processor-1.0.0.jar
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 性能优化
|
||||||
|
|
||||||
|
### Spark优化配置
|
||||||
|
|
||||||
|
```java
|
||||||
|
SparkSession spark = SparkSession.builder()
|
||||||
|
.appName("AgriculturalStockDataProcessor")
|
||||||
|
.config("spark.sql.adaptive.enabled", "true") // 启用自适应查询
|
||||||
|
.config("spark.sql.adaptive.coalescePartitions.enabled", "true") // 分区合并
|
||||||
|
.config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") // 序列化优化
|
||||||
|
.config("spark.sql.shuffle.partitions", "200") // 调整分区数
|
||||||
|
.getOrCreate();
|
||||||
|
```
|
||||||
|
|
||||||
|
### 数据处理优化策略
|
||||||
|
|
||||||
|
1. **分区策略**
|
||||||
|
- 按交易日期分区,提高查询效率
|
||||||
|
- 控制分区大小在128MB-1GB之间
|
||||||
|
|
||||||
|
2. **缓存策略**
|
||||||
|
- 对频繁使用的数据集进行缓存
|
||||||
|
- 使用`MEMORY_AND_DISK`存储级别
|
||||||
|
|
||||||
|
3. **SQL优化**
|
||||||
|
- 使用列式存储减少I/O
|
||||||
|
- 谓词下推减少数据传输
|
||||||
|
|
||||||
|
## 📈 监控与日志
|
||||||
|
|
||||||
|
### 日志配置
|
||||||
|
|
||||||
|
**logback.xml配置:**
|
||||||
|
```xml
|
||||||
|
<configuration>
|
||||||
|
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
|
||||||
|
<file>logs/spark-processor.log</file>
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<logger name="com.agricultural.spark" level="INFO"/>
|
||||||
|
<root level="WARN">
|
||||||
|
<appender-ref ref="FILE"/>
|
||||||
|
</root>
|
||||||
|
</configuration>
|
||||||
|
```
|
||||||
|
|
||||||
|
### 性能监控指标
|
||||||
|
|
||||||
|
- **处理速度:** 每秒处理记录数
|
||||||
|
- **内存使用:** 堆内存和Off-heap内存使用情况
|
||||||
|
- **任务执行时间:** 各阶段耗时统计
|
||||||
|
- **错误率:** 数据处理错误比例
|
||||||
|
|
||||||
|
## 🔧 故障排查
|
||||||
|
|
||||||
|
### 常见问题
|
||||||
|
|
||||||
|
**1. 内存不足 (OutOfMemoryError)**
|
||||||
|
```bash
|
||||||
|
# 解决方案:增加executor内存
|
||||||
|
--executor-memory 4g --driver-memory 2g
|
||||||
|
```
|
||||||
|
|
||||||
|
**2. 连接超时**
|
||||||
|
```bash
|
||||||
|
# 检查数据库连接
|
||||||
|
telnet localhost 3306
|
||||||
|
# 调整超时配置
|
||||||
|
--conf spark.sql.execution.arrow.pyspark.enabled=false
|
||||||
|
```
|
||||||
|
|
||||||
|
**3. 数据倾斜**
|
||||||
|
```java
|
||||||
|
// 使用salting技术解决
|
||||||
|
data.withColumn("salt", rand().multiply(100).cast("int"))
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📋 API接口
|
||||||
|
|
||||||
|
### 核心处理接口
|
||||||
|
|
||||||
|
**批量数据处理:**
|
||||||
|
```java
|
||||||
|
// 处理全量历史数据
|
||||||
|
processor.runBatchProcessing();
|
||||||
|
|
||||||
|
// 处理增量数据
|
||||||
|
processor.processIncrementalData(startDate, endDate);
|
||||||
|
```
|
||||||
|
|
||||||
|
**实时数据处理:**
|
||||||
|
```java
|
||||||
|
// 启动流处理
|
||||||
|
processor.runStreamProcessing();
|
||||||
|
|
||||||
|
// 停止流处理
|
||||||
|
processor.stopStreamProcessing();
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🤝 开发指南
|
||||||
|
|
||||||
|
### 添加新的技术指标
|
||||||
|
|
||||||
|
1. **在TechnicalIndicatorService中添加计算方法**
|
||||||
|
```java
|
||||||
|
private Dataset<Row> calculateNewIndicator(Dataset<Row> data) {
|
||||||
|
// 指标计算逻辑
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **在主流程中调用**
|
||||||
|
```java
|
||||||
|
Dataset<Row> withIndicators = technicalIndicatorService
|
||||||
|
.calculateNewIndicator(cleanedData);
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **更新数据库表结构**
|
||||||
|
```sql
|
||||||
|
ALTER TABLE stock_technical_indicators
|
||||||
|
ADD COLUMN new_indicator DECIMAL(10,2);
|
||||||
|
```
|
||||||
|
|
||||||
|
### 扩展市场分析功能
|
||||||
|
|
||||||
|
1. **实现新的分析算法**
|
||||||
|
2. **添加相应的数据存储表**
|
||||||
|
3. **更新保存服务方法**
|
||||||
|
4. **编写单元测试**
|
||||||
|
|
||||||
|
## 📄 许可证
|
||||||
|
|
||||||
|
本模块采用 MIT 许可证,详见项目根目录 LICENSE 文件。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**联系信息:**
|
||||||
|
- 项目仓库: [Agricultural Stock Platform](https://github.com/agricultural-stock-platform)
|
||||||
|
- 技术支持: support@agricultural-stock.com
|
||||||
|
- 开发团队: Agricultural Stock Platform Team
|
||||||
Vendored
+58
@@ -0,0 +1,58 @@
|
|||||||
|
# 欢迎使用 Vue Docs UI
|
||||||
|
|
||||||
|
Vue Docs UI 是一个现代化的文档网站构建工具,基于 Vue 3 开发,提供开箱即用的文档解决方案。
|
||||||
|
|
||||||
|
## 🌟 主要特性
|
||||||
|
|
||||||
|
- **🚀 开箱即用** - 只需 3 行代码即可启动文档网站
|
||||||
|
- **🎨 现代设计** - 精美的界面设计,支持明暗主题切换
|
||||||
|
- **📱 移动端适配** - 完美的响应式设计
|
||||||
|
- **🌐 国际化支持** - 内置多语言支持
|
||||||
|
- **🤖 AI 助手** - 集成 AI 聊天助手,支持多种模型
|
||||||
|
- **⚡ 高性能** - 基于 Vite 构建,快速热重载
|
||||||
|
- **🔍 全文搜索** - 智能搜索功能
|
||||||
|
- **📝 Markdown 增强** - 丰富的 Markdown 扩展
|
||||||
|
|
||||||
|
## 🏗️ 架构特点
|
||||||
|
|
||||||
|
- **组件化设计** - 模块化组件,易于扩展
|
||||||
|
- **TypeScript 支持** - 完整的类型支持
|
||||||
|
- **可自定义主题** - 灵活的主题配置
|
||||||
|
- **插件系统** - 可扩展的插件架构
|
||||||
|
|
||||||
|
## 📦 快速开始
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 创建新项目
|
||||||
|
npm create vue-docs-ui@latest my-docs
|
||||||
|
|
||||||
|
# 进入项目目录
|
||||||
|
cd my-docs
|
||||||
|
|
||||||
|
# 安装依赖
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# 启动开发服务器
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📖 使用方式
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import { createDocsApp } from 'vue-docs-ui'
|
||||||
|
import 'vue-docs-ui/dist/vue-docs-ui.css'
|
||||||
|
|
||||||
|
createDocsApp({
|
||||||
|
configPath: '/config/site.yaml',
|
||||||
|
el: '#app'
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
就这么简单!无需复杂配置,立即拥有一个功能完整的文档网站。
|
||||||
|
|
||||||
|
## 🔗 相关链接
|
||||||
|
|
||||||
|
- [GitHub 仓库](https://github.com/shenjianZ/vue-docs-ui)
|
||||||
|
- [在线演示](https://vue-docs-ui.example.com)
|
||||||
|
- [使用指南](/guide/introduction)
|
||||||
|
- [API 文档](/advanced/api)
|
||||||
Vendored
BIN
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
Vendored
+25
@@ -0,0 +1,25 @@
|
|||||||
|
# 图片目录
|
||||||
|
|
||||||
|
将您的图片文件放在这个目录中。
|
||||||
|
|
||||||
|
支持的格式:
|
||||||
|
- PNG
|
||||||
|
- JPG/JPEG
|
||||||
|
- SVG
|
||||||
|
- WebP
|
||||||
|
- GIF
|
||||||
|
|
||||||
|
## 使用方式
|
||||||
|
|
||||||
|
在 Markdown 中引用图片:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|

|
||||||
|
```
|
||||||
|
|
||||||
|
在配置文件中使用:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
site:
|
||||||
|
logo: "/images/logo.png"
|
||||||
|
```
|
||||||
Vendored
+16
@@ -0,0 +1,16 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/favicon.ico" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Vue Docs UI</title>
|
||||||
|
<meta name="description" content="Beautiful documentation website built with Vue Docs UI" />
|
||||||
|
<script type="module" crossorigin src="/assets/main-f65d595e.js"></script>
|
||||||
|
<link rel="stylesheet" href="/assets/index-64e04f5b.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Generated
+4
-4
@@ -9,7 +9,7 @@
|
|||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"vue": "^3.3.0",
|
"vue": "^3.3.0",
|
||||||
"vue-docs-ui": "^1.0.9",
|
"vue-docs-ui": "^1.0.11",
|
||||||
"vue-router": "^4.2.0"
|
"vue-router": "^4.2.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -998,9 +998,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/vue-docs-ui": {
|
"node_modules/vue-docs-ui": {
|
||||||
"version": "1.0.9",
|
"version": "1.0.11",
|
||||||
"resolved": "https://registry.npmjs.org/vue-docs-ui/-/vue-docs-ui-1.0.9.tgz",
|
"resolved": "https://registry.npmjs.org/vue-docs-ui/-/vue-docs-ui-1.0.11.tgz",
|
||||||
"integrity": "sha512-ULjwsw3OoLlb4EGVQ5roevTlPS1GksMCvJ98AK98V/Mn3+Wldu2mW6O4KsHQ6jov2ZXOu92JyL/dV/2Ggm2GuA==",
|
"integrity": "sha512-dVt5HBAw+jxmfilB9rDalr2iSJrErww9MqmM7050Eua/s4CYQTuPdg7CplMnOsBhoXSN2zl0ripyJmP5/aIG6A==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/js-yaml": "^4.0.9",
|
"@types/js-yaml": "^4.0.9",
|
||||||
"@types/markdown-it": "^14.1.2",
|
"@types/markdown-it": "^14.1.2",
|
||||||
|
|||||||
+1
-1
@@ -11,7 +11,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"vue": "^3.3.0",
|
"vue": "^3.3.0",
|
||||||
"vue-router": "^4.2.0",
|
"vue-router": "^4.2.0",
|
||||||
"vue-docs-ui": "^1.0.9"
|
"vue-docs-ui": "^1.0.11"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@vitejs/plugin-vue": "^4.4.0",
|
"@vitejs/plugin-vue": "^4.4.0",
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ navbar:
|
|||||||
active: true
|
active: true
|
||||||
- title: "Guide"
|
- title: "Guide"
|
||||||
link: "/guide"
|
link: "/guide"
|
||||||
- title: "GitHub"
|
- title: "Gitea"
|
||||||
link: "https://gitea.shenjianl.cn/shenjianZ/agricultural-sock-amalysis"
|
link: "https://gitea.shenjianl.cn/shenjianZ/agricultural-sock-amalysis"
|
||||||
external: true
|
external: true
|
||||||
|
|
||||||
@@ -74,3 +74,60 @@ toc:
|
|||||||
|
|
||||||
# TOC title
|
# TOC title
|
||||||
title: "On This Page"
|
title: "On This Page"
|
||||||
|
|
||||||
|
# Footer Configuration
|
||||||
|
footer:
|
||||||
|
enabled: true
|
||||||
|
copyright: "© 2024 Vue Docs UI. All rights reserved."
|
||||||
|
repository:
|
||||||
|
url: "https://gitea.shenjianl.cn/shenjianZ/agricultural-sock-amalysis"
|
||||||
|
branch: "master"
|
||||||
|
lastUpdated: "2024-12-19"
|
||||||
|
links:
|
||||||
|
- title: "Documentation"
|
||||||
|
link: "/guide/introduction"
|
||||||
|
- title: "GitHub"
|
||||||
|
link: "https://gitea.shenjianl.cn/shenjianZ/agricultural-sock-amalysis"
|
||||||
|
external: true
|
||||||
|
- title: "License"
|
||||||
|
link: "/license"
|
||||||
|
social:
|
||||||
|
- name: "email"
|
||||||
|
url: "mailto:15202078626@163.com"
|
||||||
|
icon: "mail"
|
||||||
|
- name: "gitea"
|
||||||
|
url: "https://gitea.shenjianl.cn/shenjianZ/agricultural-sock-amalysis"
|
||||||
|
icon: "gitea"
|
||||||
|
# - name: "youtube"
|
||||||
|
# url: "https://youtube.com/@yourhandle"
|
||||||
|
# icon: "youtube"
|
||||||
|
# - name: "twitter"
|
||||||
|
# url: "https://twitter.com/yourhandle"
|
||||||
|
# icon: "twitter"
|
||||||
|
# - name: "discord"
|
||||||
|
# url: "https://discord.gg/yourinvite"
|
||||||
|
# icon: "discord"
|
||||||
|
# - name: "telegram"
|
||||||
|
# url: "https://t.me/yourhandle"
|
||||||
|
# icon: "telegram"
|
||||||
|
# - name: "tiktok"
|
||||||
|
# url: "https://tiktok.com/@yourhandle"
|
||||||
|
# icon: "tiktok"
|
||||||
|
- name: "bilibili"
|
||||||
|
url: "https://space.bilibili.com/443299209"
|
||||||
|
icon: "bilibili"
|
||||||
|
- name: "qq"
|
||||||
|
url: "mqqapi://card/show_pslcard?src_type=internal&version=1&uin=2934674522&card_type=person&source=qrcode"
|
||||||
|
icon: "qq"
|
||||||
|
- name: "wechat"
|
||||||
|
url: "weixin://dl/add?zlt2629496476520"
|
||||||
|
icon: "wechat"
|
||||||
|
# - name: "weibo"
|
||||||
|
# url: "https://weibo.com/yourhandle"
|
||||||
|
# icon: "weibo"
|
||||||
|
# - name: "douyin"
|
||||||
|
# url: "https://www.douyin.com/user/yourhandle"
|
||||||
|
# icon: "douyin"
|
||||||
|
# - name: "zhihu"
|
||||||
|
# url: "https://www.zhihu.com/people/yourhandle"
|
||||||
|
# icon: "zhihu"
|
||||||
@@ -18,7 +18,7 @@ navbar:
|
|||||||
active: true
|
active: true
|
||||||
- title: "指南"
|
- title: "指南"
|
||||||
link: "/guide"
|
link: "/guide"
|
||||||
- title: "GitHub"
|
- title: "Gitea"
|
||||||
link: "https://gitea.shenjianl.cn/shenjianZ/agricultural-sock-amalysis"
|
link: "https://gitea.shenjianl.cn/shenjianZ/agricultural-sock-amalysis"
|
||||||
external: true
|
external: true
|
||||||
|
|
||||||
@@ -91,16 +91,59 @@ toc:
|
|||||||
# Footer Configuration
|
# Footer Configuration
|
||||||
footer:
|
footer:
|
||||||
enabled: true
|
enabled: true
|
||||||
copyright: "© 2024 农业股票数据分析系统. All rights reserved."
|
copyright: "© 2024 Vue Docs UI. All rights reserved."
|
||||||
|
repository:
|
||||||
|
url: "https://gitea.shenjianl.cn/shenjianZ/agricultural-sock-amalysis"
|
||||||
|
branch: "master"
|
||||||
|
lastUpdated: "2024-12-19"
|
||||||
links:
|
links:
|
||||||
- title: "系统指南"
|
- title: "Documentation"
|
||||||
link: "/guide"
|
link: "/guide/introduction"
|
||||||
- title: "GitHub"
|
- title: "GitHub"
|
||||||
link: "https://gitea.shenjianl.cn/shenjianZ/agricultural-sock-amalysis"
|
link: "https://gitea.shenjianl.cn/shenjianZ/agricultural-sock-amalysis"
|
||||||
external: true
|
external: true
|
||||||
- title: "许可证"
|
- title: "License"
|
||||||
link: "/license"
|
link: "/license"
|
||||||
|
social:
|
||||||
|
- name: "email"
|
||||||
|
url: "mailto:15202078626@163.com"
|
||||||
|
icon: "mail"
|
||||||
|
- name: "gitea"
|
||||||
|
url: "https://gitea.shenjianl.cn/shenjianZ/agricultural-sock-amalysis"
|
||||||
|
icon: "gitea"
|
||||||
|
# - name: "youtube"
|
||||||
|
# url: "https://youtube.com/@yourhandle"
|
||||||
|
# icon: "youtube"
|
||||||
|
# - name: "twitter"
|
||||||
|
# url: "https://twitter.com/yourhandle"
|
||||||
|
# icon: "twitter"
|
||||||
|
# - name: "discord"
|
||||||
|
# url: "https://discord.gg/yourinvite"
|
||||||
|
# icon: "discord"
|
||||||
|
# - name: "telegram"
|
||||||
|
# url: "https://t.me/yourhandle"
|
||||||
|
# icon: "telegram"
|
||||||
|
# - name: "tiktok"
|
||||||
|
# url: "https://tiktok.com/@yourhandle"
|
||||||
|
# icon: "tiktok"
|
||||||
|
- name: "bilibili"
|
||||||
|
url: "https://space.bilibili.com/443299209"
|
||||||
|
icon: "bilibili"
|
||||||
|
- name: "qq"
|
||||||
|
url: "mqqapi://card/show_pslcard?src_type=internal&version=1&uin=2934674522&card_type=person&source=qrcode"
|
||||||
|
icon: "qq"
|
||||||
|
- name: "wechat"
|
||||||
|
url: "weixin://contacts/profile/zlt2629496476520"
|
||||||
|
icon: "wechat"
|
||||||
|
# - name: "weibo"
|
||||||
|
# url: "https://weibo.com/yourhandle"
|
||||||
|
# icon: "weibo"
|
||||||
|
# - name: "douyin"
|
||||||
|
# url: "https://www.douyin.com/user/yourhandle"
|
||||||
|
# icon: "douyin"
|
||||||
|
# - name: "zhihu"
|
||||||
|
# url: "https://www.zhihu.com/people/yourhandle"
|
||||||
|
# icon: "zhihu"
|
||||||
|
|
||||||
# Analytics Configuration
|
# Analytics Configuration
|
||||||
analytics:
|
analytics:
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
server {
|
||||||
|
listen 443 ssl;
|
||||||
|
server_name a1.shenjianl.cn;
|
||||||
|
ssl_certificate /usr/local/nginx/conf/ssl_certificate/a1/a1.shenjianl.cn_bundle.pem;
|
||||||
|
ssl_certificate_key /usr/local/nginx/conf/ssl_certificate/a1/a1.shenjianl.cn.key;
|
||||||
|
location / {
|
||||||
|
root /data/a1;
|
||||||
|
index index.html;
|
||||||
|
}
|
||||||
|
error_page 500 502 503 504 /50x.html;
|
||||||
|
location = /50x.html {
|
||||||
|
root html;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user