Compare commits
10
Commits
3b61f0ba38
...
2b2e3197be
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2b2e3197be | ||
|
|
c01bd53ea1 | ||
|
|
98d2a23589 | ||
|
|
33687e31b7 | ||
|
|
af8941e880 | ||
|
|
8ebe30a077 | ||
|
|
89d41de3dd | ||
|
|
42d243971e | ||
|
|
3a5d571e53 | ||
|
|
c9ac46faa7 |
@@ -28,3 +28,7 @@ bin-release/
|
||||
**/.hbuilderx/
|
||||
**/unpackage/
|
||||
qa/
|
||||
.code-graph/
|
||||
./vscode/
|
||||
.tmp*
|
||||
.codex/
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
[ 9545ms] [WARNING] Manifest: property 'start_url' ignored, should be same origin as document. @ https://git.zones.sbnews.net/assets/site-manifest.json:0
|
||||
@@ -0,0 +1 @@
|
||||
[ 11298ms] [WARNING] Manifest: property 'start_url' ignored, should be same origin as document. @ https://git.zones.sbnews.net/assets/site-manifest.json:0
|
||||
@@ -0,0 +1,75 @@
|
||||
- generic [active] [ref=e1]:
|
||||
- generic [ref=e2]:
|
||||
- navigation "导航栏" [ref=e3]:
|
||||
- generic [ref=e4]:
|
||||
- link "首页" [ref=e5] [cursor=pointer]:
|
||||
- /url: /
|
||||
- link "探索" [ref=e7] [cursor=pointer]:
|
||||
- /url: /explore/repos
|
||||
- link "帮助" [ref=e8] [cursor=pointer]:
|
||||
- /url: https://docs.gitea.com
|
||||
- generic [ref=e9]:
|
||||
- link "注册" [ref=e10] [cursor=pointer]:
|
||||
- /url: /user/sign_up
|
||||
- link "登录" [ref=e14] [cursor=pointer]:
|
||||
- /url: /user/login
|
||||
- main "首页" [ref=e18]:
|
||||
- generic [ref=e20]:
|
||||
- img "Logo" [ref=e21]
|
||||
- generic [ref=e22]:
|
||||
- heading "HAHA" [level=1] [ref=e23]
|
||||
- heading "一款极易搭建的自托管 Git 服务" [level=2] [ref=e24]
|
||||
- generic [ref=e25]:
|
||||
- generic [ref=e26]:
|
||||
- heading "易安装" [level=1] [ref=e27]
|
||||
- paragraph [ref=e30]:
|
||||
- text: 直接
|
||||
- link "运行适合您平台的二进制文件" [ref=e31] [cursor=pointer]:
|
||||
- /url: https://docs.gitea.com/installation/install-from-binary
|
||||
- text: ,通过
|
||||
- link "Docker" [ref=e32] [cursor=pointer]:
|
||||
- /url: https://github.com/go-gitea/gitea/tree/master/docker
|
||||
- text: 部署,或使用
|
||||
- link "软件包" [ref=e33] [cursor=pointer]:
|
||||
- /url: https://docs.gitea.com/installation/install-from-package
|
||||
- text: 安装。
|
||||
- generic [ref=e34]:
|
||||
- heading "跨平台" [level=1] [ref=e35]
|
||||
- paragraph [ref=e38]:
|
||||
- text: 任何
|
||||
- link "Go 语言" [ref=e39] [cursor=pointer]:
|
||||
- /url: https://go.dev/
|
||||
- text: 支持的平台都可以运行 Gitea,包括 Windows、Mac、Linux 以及 ARM。挑一个您喜欢的就行!
|
||||
- generic [ref=e40]:
|
||||
- generic [ref=e41]:
|
||||
- heading "轻量级" [level=1] [ref=e42]
|
||||
- paragraph [ref=e45]: 一个廉价的树莓派就足以满足 Gitea 的最低系统硬件要求。最大程度节省您的服务器资源!
|
||||
- generic [ref=e46]:
|
||||
- heading "开源化" [level=1] [ref=e47]
|
||||
- paragraph [ref=e50]:
|
||||
- text: 所有代码都开源在
|
||||
- link "gitea.dev" [ref=e51] [cursor=pointer]:
|
||||
- /url: https://gitea.dev
|
||||
- text: ,还等什么?赶快加入我们来
|
||||
- link "共同发展" [ref=e52] [cursor=pointer]:
|
||||
- /url: https://github.com/go-gitea/gitea
|
||||
- text: 这个伟大的项目,成为贡献者吧!
|
||||
- group "页脚" [ref=e53]:
|
||||
- contentinfo "关于软件" [ref=e54]:
|
||||
- link "由 Gitea 强力驱动" [ref=e55] [cursor=pointer]:
|
||||
- /url: https://about.gitea.com
|
||||
- generic [ref=e56]: "版本: 1.27.1"
|
||||
- generic [ref=e57]:
|
||||
- text: "页面:"
|
||||
- strong [ref=e58]: 1ms
|
||||
- text: "模板:"
|
||||
- strong [ref=e59]: 1ms
|
||||
- group "链接" [ref=e60]:
|
||||
- menu [ref=e61] [cursor=pointer]:
|
||||
- generic [ref=e62]: Auto
|
||||
- menu [ref=e66] [cursor=pointer]:
|
||||
- generic [ref=e67]: 简体中文
|
||||
- link "许可证" [ref=e70] [cursor=pointer]:
|
||||
- /url: /assets/licenses.txt
|
||||
- link "API" [ref=e71] [cursor=pointer]:
|
||||
- /url: /api/swagger
|
||||
@@ -0,0 +1,75 @@
|
||||
- generic [active] [ref=f1e1]:
|
||||
- generic [ref=f1e2]:
|
||||
- navigation "导航栏" [ref=f1e3]:
|
||||
- generic [ref=f1e4]:
|
||||
- link "首页" [ref=f1e5] [cursor=pointer]:
|
||||
- /url: /
|
||||
- link "探索" [ref=f1e7] [cursor=pointer]:
|
||||
- /url: /explore/repos
|
||||
- link "帮助" [ref=f1e8] [cursor=pointer]:
|
||||
- /url: https://docs.gitea.com
|
||||
- generic [ref=f1e9]:
|
||||
- link "注册" [ref=f1e10] [cursor=pointer]:
|
||||
- /url: /user/sign_up
|
||||
- link "登录" [ref=f1e14] [cursor=pointer]:
|
||||
- /url: /user/login
|
||||
- main "首页" [ref=f1e18]:
|
||||
- generic [ref=f1e20]:
|
||||
- img "Logo" [ref=f1e21]
|
||||
- generic [ref=f1e22]:
|
||||
- heading "HAHA" [level=1] [ref=f1e23]
|
||||
- heading "一款极易搭建的自托管 Git 服务" [level=2] [ref=f1e24]
|
||||
- generic [ref=f1e25]:
|
||||
- generic [ref=f1e26]:
|
||||
- heading "易安装" [level=1] [ref=f1e27]
|
||||
- paragraph [ref=f1e30]:
|
||||
- text: 直接
|
||||
- link "运行适合您平台的二进制文件" [ref=f1e31] [cursor=pointer]:
|
||||
- /url: https://docs.gitea.com/installation/install-from-binary
|
||||
- text: ,通过
|
||||
- link "Docker" [ref=f1e32] [cursor=pointer]:
|
||||
- /url: https://github.com/go-gitea/gitea/tree/master/docker
|
||||
- text: 部署,或使用
|
||||
- link "软件包" [ref=f1e33] [cursor=pointer]:
|
||||
- /url: https://docs.gitea.com/installation/install-from-package
|
||||
- text: 安装。
|
||||
- generic [ref=f1e34]:
|
||||
- heading "跨平台" [level=1] [ref=f1e35]
|
||||
- paragraph [ref=f1e38]:
|
||||
- text: 任何
|
||||
- link "Go 语言" [ref=f1e39] [cursor=pointer]:
|
||||
- /url: https://go.dev/
|
||||
- text: 支持的平台都可以运行 Gitea,包括 Windows、Mac、Linux 以及 ARM。挑一个您喜欢的就行!
|
||||
- generic [ref=f1e40]:
|
||||
- generic [ref=f1e41]:
|
||||
- heading "轻量级" [level=1] [ref=f1e42]
|
||||
- paragraph [ref=f1e45]: 一个廉价的树莓派就足以满足 Gitea 的最低系统硬件要求。最大程度节省您的服务器资源!
|
||||
- generic [ref=f1e46]:
|
||||
- heading "开源化" [level=1] [ref=f1e47]
|
||||
- paragraph [ref=f1e50]:
|
||||
- text: 所有代码都开源在
|
||||
- link "gitea.dev" [ref=f1e51] [cursor=pointer]:
|
||||
- /url: https://gitea.dev
|
||||
- text: ,还等什么?赶快加入我们来
|
||||
- link "共同发展" [ref=f1e52] [cursor=pointer]:
|
||||
- /url: https://github.com/go-gitea/gitea
|
||||
- text: 这个伟大的项目,成为贡献者吧!
|
||||
- group "页脚" [ref=f1e53]:
|
||||
- contentinfo "关于软件" [ref=f1e54]:
|
||||
- link "由 Gitea 强力驱动" [ref=f1e55] [cursor=pointer]:
|
||||
- /url: https://about.gitea.com
|
||||
- generic [ref=f1e56]: "版本: 1.27.1"
|
||||
- generic [ref=f1e57]:
|
||||
- text: "页面:"
|
||||
- strong [ref=f1e58]: 3ms
|
||||
- text: "模板:"
|
||||
- strong [ref=f1e59]: 3ms
|
||||
- group "链接" [ref=f1e60]:
|
||||
- menu [ref=f1e61] [cursor=pointer]:
|
||||
- generic [ref=f1e62]: Auto
|
||||
- menu [ref=f1e66] [cursor=pointer]:
|
||||
- generic [ref=f1e67]: 简体中文
|
||||
- link "许可证" [ref=f1e70] [cursor=pointer]:
|
||||
- /url: /assets/licenses.txt
|
||||
- link "API" [ref=f1e71] [cursor=pointer]:
|
||||
- /url: /api/swagger
|
||||
@@ -35,7 +35,7 @@
|
||||
3. 相同或相似的功能必须封装为可复用的方法,避免重复代码。
|
||||
4. 查询字段、路由、菜单、配置前,优先以当前项目代码和 `sbnews.sql` / `docs/sql/` 中结构为准;如需线上核对,再按用户要求使用可用 MCP 或指定连接方式。
|
||||
5. 不通过 WSL sshpass/scp 上传代码到服务器;项目代码更新由用户自行通过 SFTP 等方式处理。
|
||||
6. 项目级文档(如协作规范、业务进度、设计稿映射、产品方案、实现流程、爬虫说明等)统一存放在项目根目录;仅子项目专属文档放在对应子目录。
|
||||
6. 新增项目级文档(如协作规范、业务进度、设计稿映射、产品方案、实现流程、爬虫说明等)统一存放在 `docs/`;根目录仅保留 `README.md`、`AGENTS.md`、`文档索引.md` 等入口文件。仅子项目专属的 README / AGENTS 等说明可放在对应子目录。
|
||||
|
||||
---
|
||||
|
||||
@@ -48,6 +48,13 @@
|
||||
| uniapp | `npm run dev:h5` | `npm run build:h5` |
|
||||
| pc | `npm run dev` | `npm run generate` / `npm run build` |
|
||||
|
||||
## 自动化执行边界
|
||||
|
||||
- 除非用户在当前任务中明确要求,否则不要自动执行构建、测试、提交代码或部署。
|
||||
- 完成代码修改后,可以说明建议执行的验证命令或部署命令,但不得自行运行。
|
||||
- 用户明确要求“构建”“测试”“提交”“部署”“上线”“发布”等操作时,才执行对应命令。
|
||||
- 对已经由用户给出的命令,可按用户原命令执行;不要额外扩展到未要求的构建、测试、提交或部署步骤。
|
||||
|
||||
## 数据库结构基准
|
||||
|
||||
- 数据库表前缀:`la_`。
|
||||
@@ -77,7 +84,7 @@
|
||||
|
||||
## 代码修改后验证与评审
|
||||
|
||||
除非用户特别说明不需要验证,代码修改完成后按改动类型选择验证方式:
|
||||
仅在用户明确要求验证、测试或构建时,代码修改完成后按改动类型选择验证方式;未明确要求时只列出建议命令,不自动执行:
|
||||
|
||||
### 后端接口修改
|
||||
|
||||
@@ -104,24 +111,24 @@
|
||||
| 5 | 命名一致性 | 字段、方法、路由命名与现有风格一致 |
|
||||
| 6 | 安全性 | SQL 拼接、用户输入、权限校验是否安全 |
|
||||
| 7 | 幂等性 | SQL 初始化必须可重复执行 |
|
||||
| 8 | 文档同步 | 功能完成后更新 `业务进度管理.md` |
|
||||
| 8 | 文档同步 | 功能完成后更新 `docs/业务进度管理.md` |
|
||||
|
||||
## 代码变更后部署
|
||||
|
||||
- 只要本项目有代码变更,完成必要验证后,必须执行以下命令,将最新代码更新到测试服运行环境:
|
||||
- 仅在用户明确要求部署、上线、发布或同步到测试服时,执行以下命令,将最新代码更新到测试服运行环境:
|
||||
|
||||
```powershell
|
||||
cd D:\www\sport-era
|
||||
cd D:\www\gs-sport-era
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -AutoIncremental -AutoIncrementalCommits 3 -RemoteDir /www/wwwroot/test-server.sbnews.net
|
||||
```
|
||||
|
||||
- 默认将这条部署命令视为 Sport Era 项目代码变更后的必做步骤,除非用户在当前任务中明确说明“不需要部署”。
|
||||
- 不要把部署视为代码变更后的默认必做步骤;未明确要求部署时,只提示可执行的部署命令。
|
||||
|
||||
## 设计稿映射
|
||||
|
||||
设计稿与页面/组件映射统一维护在:
|
||||
|
||||
- [设计稿映射.md](./设计稿映射.md)
|
||||
- [设计稿映射.md](./docs/设计稿映射.md)
|
||||
|
||||
开发或还原视觉前,先确认设计稿名称、页面路径、实现状态与备注。
|
||||
|
||||
@@ -129,10 +136,18 @@ powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -Auto
|
||||
|
||||
当前业务进度、待办事项、避坑记录统一维护在:
|
||||
|
||||
- [业务进度管理.md](./业务进度管理.md)
|
||||
- [业务进度管理.md](./docs/业务进度管理.md)
|
||||
|
||||
开发或接手任务前,先查看该文档确认已完成事项、进行中事项、待办事项与避坑记录。
|
||||
|
||||
## 近期交接总结
|
||||
|
||||
- 当前真实开发目录以 `D:\www\gs-sport-era` 为准;Codex worktree(如 `C:\Users\Administrator\.codex\worktrees\...\gs-sport-era`)中的改动不会自动进入真实仓库、`git log` 或服务器运行目录。涉及可部署代码时,先确认改动已经同步到真实目录并形成清晰提交。
|
||||
- 正确的服务器运行目录是 `/www/wwwroot/test-server.sbnews.net`;`/www/wwwroot/api.sbnews.net` 不是当前项目的有效同步目录,不要再部署到该路径。排查“代码已更新但服务器没生效”时,本地真实仓库看 `git log`,服务器侧看文件内容、修改时间、容器内 `/app` 文件与定时任务日志。
|
||||
- Docker crawler 任务真实执行入口是 `sport-era-crawler` 容器。更新 `docker/crawler` 源码或 `config/crawler_tasks.yaml` 后,必须在服务器 `docker` 目录执行 `sudo docker compose -f docker-compose.crawler.yml build crawler` 和 `sudo docker compose -f docker-compose.crawler.yml up -d --no-deps crawler`;仅重启旧容器不能保证镜像内代码更新,必要时使用 `--no-cache` 重建。
|
||||
- 重启 crawler 后必须核验容器内代码和 cron,而不是只看宿主机源码:例如检查 `/app/match_live_stream.py`、`/app/config/crawler_tasks.yaml`,以及 `cat /etc/cron.d/* | grep match_live_stream`。
|
||||
- 雨燕直播间任务 `match_live_stream` 当前应直接同步 `all_live_rooms.json`,写入主播 `anchor_id`、`anchor_name`、`anchor_avatar`、`anchor_level` 以及直播间观看/关注/公告/简介字段;对应 SQL 为 `docs/sql/alter_match_live_anchor_fields.sql` 和 `docs/sql/insert_crontab_match_live_stream.sql`。上线后用 `la_match_live` 主播字段统计和 `la_crawler_task_log` 最近任务状态共同确认是否生效。
|
||||
|
||||
## 近期踩坑
|
||||
|
||||
- `Validate::only()` 只限制校验字段范围,不会自动过滤请求参数;新增字段落库前,要同时检查 validate、logic、model、保存白名单和数据库列是否同步。
|
||||
|
||||
@@ -66,7 +66,7 @@ Docker 只负责运行 Python 爬虫和容器内 cron。MySQL、Redis、Nginx
|
||||
|
||||
```bash
|
||||
ssh sbnews
|
||||
cd /www/wwwroot/test-server.sbnews.net/docker
|
||||
cd /www/wwwroot/api.sbnews.net/docker
|
||||
```
|
||||
|
||||
查看容器状态:
|
||||
@@ -127,7 +127,7 @@ sudo docker exec sport-era-crawler python -c "import scrapling, browserforge; pr
|
||||
|
||||
```powershell
|
||||
cd D:\www\sport-era
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -RemoteDir /www/wwwroot/test-server.sbnews.net
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -RemoteDir /www/wwwroot/api.sbnews.net
|
||||
```
|
||||
|
||||
如果 `sbnews` 配置在 `C:\Users\Administrator\.ssh\config` 中,默认会使用 Windows 的 `ssh.exe` 读取该配置。
|
||||
@@ -138,7 +138,7 @@ powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -Remo
|
||||
|
||||
```powershell
|
||||
cd D:\www\sport-era
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -RemoteDir /www/wwwroot/test-server.sbnews.net
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -RemoteDir /www/wwwroot/api.sbnews.net
|
||||
```
|
||||
|
||||
全量模式默认以仓库根目录为源,只打包以下四个子目录:
|
||||
@@ -177,14 +177,14 @@ docker/
|
||||
|
||||
```powershell
|
||||
cd D:\www\sport-era
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -From <old_commit> -To <new_commit> -RemoteDir /www/wwwroot/test-server.sbnews.net
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -From <old_commit> -To <new_commit> -RemoteDir /www/wwwroot/api.sbnews.net
|
||||
```
|
||||
|
||||
示例:
|
||||
|
||||
```powershell
|
||||
cd D:\www\sport-era
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -From abc1234 -To def5678 -RemoteDir /www/wwwroot/test-server.sbnews.net
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -From abc1234 -To def5678 -RemoteDir /www/wwwroot/api.sbnews.net
|
||||
```
|
||||
|
||||
### 自动增量发布
|
||||
@@ -193,21 +193,21 @@ powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -From
|
||||
|
||||
```powershell
|
||||
cd D:\www\sport-era
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -AutoIncremental -RemoteDir /www/wwwroot/test-server.sbnews.net
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -AutoIncremental -RemoteDir /www/wwwroot/api.sbnews.net
|
||||
```
|
||||
|
||||
如果需要一次发布最近 N 个提交的后端改动,可以追加 `-AutoIncrementalCommits <n>`,例如发布最近 3 个提交会对比 `HEAD~3` 和 `HEAD`:
|
||||
|
||||
```powershell
|
||||
cd D:\www\sport-era
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -AutoIncremental -AutoIncrementalCommits 3 -RemoteDir /www/wwwroot/test-server.sbnews.net
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -AutoIncremental -AutoIncrementalCommits 3 -RemoteDir /www/wwwroot/api.sbnews.net
|
||||
```
|
||||
|
||||
先演练不上传:
|
||||
|
||||
```powershell
|
||||
cd D:\www\sport-era
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -AutoIncremental -RemoteDir /www/wwwroot/test-server.sbnews.net -DryRun
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -AutoIncremental -RemoteDir /www/wwwroot/api.sbnews.net -DryRun
|
||||
```
|
||||
|
||||
脚本会在打包和上传前先检查默认打包范围(`server` + `uniapp` + `admin` + `docker`);如果这些目录内存在未提交、删除或未跟踪文件,会先自动提交这些变更,再继续计算增量范围。可以通过 `-AutoCommitMessage "提交说明"` 自定义这次自动提交的说明。若存在合并冲突,需要先手动解决。
|
||||
@@ -222,7 +222,7 @@ powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -AutoIncrem
|
||||
|
||||
```powershell
|
||||
cd D:\www\sport-era
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -RemoteDir /www/wwwroot/test-server.sbnews.net -DryRun
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -RemoteDir /www/wwwroot/api.sbnews.net -DryRun
|
||||
```
|
||||
|
||||
脚本会在打包后打印 `update log`:增量模式包含 commit 范围、commit 摘要、变更文件和删除文件;全量模式包含当前最新 commit 和默认打包目录。
|
||||
@@ -235,7 +235,7 @@ powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -RemoteDir
|
||||
|
||||
```powershell
|
||||
cd D:\www\sport-era
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -RemoteDir /www/wwwroot/test-server.sbnews.net -PostInstall "php think optimize:clear"
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -RemoteDir /www/wwwroot/api.sbnews.net -PostInstall "php think optimize:clear"
|
||||
```
|
||||
|
||||
### 发布 uniapp 源码到服务器并在服务器构建
|
||||
@@ -246,7 +246,7 @@ powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -Sudo -Remo
|
||||
cd D:\www\sport-era
|
||||
powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 `
|
||||
-Sudo `
|
||||
-RemoteDir /www/wwwroot/test-server.sbnews.net `
|
||||
-RemoteDir /www/wwwroot/api.sbnews.net `
|
||||
-UniappReleasePath ../server/public/mobile `
|
||||
-PostInstall "cd uniapp && npm install && npm run build:h5"
|
||||
```
|
||||
|
||||
@@ -29,6 +29,17 @@ ODDS_SPORT_TYPES=FT,BK,ES,TN,VB,BM,TT,BS,SK,OP
|
||||
ODDS_SHOW_TYPES=live,today,early
|
||||
ODDS_VERIFY_TLS=0
|
||||
|
||||
# Titan007 public cup odds. Multiple cup URLs can be comma-separated.
|
||||
TITAN_ODDS_ENABLED=1
|
||||
TITAN_ODDS_URLS=https://zq.titan007.com/cn/CupMatch/75.html
|
||||
TITAN_ODDS_COMPANY_ID=3
|
||||
TITAN_ODDS_EURO_COMPANY_ID=545
|
||||
TITAN_ODDS_COMPANY_NAME=Crown
|
||||
TITAN_ODDS_SHOW_TYPE=early
|
||||
TITAN_ODDS_VERIFY_TLS=1
|
||||
TITAN_ODDS_TIMEOUT=20
|
||||
TITAN_ODDS_REQUEST_DELAY_SECONDS=0.2
|
||||
|
||||
# AI KB worker embedding config. Keep real key in docker/.env.docker only.
|
||||
EMBEDDING_API_KEY=change-me
|
||||
EMBEDDING_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode
|
||||
|
||||
@@ -19,7 +19,7 @@ from pathlib import Path
|
||||
env_file = Path("/etc/sport-era-crawler/env.sh")
|
||||
with env_file.open("w", encoding="utf-8") as fp:
|
||||
for key, value in sorted(os.environ.items()):
|
||||
if key.startswith(("DQD_", "ODDS_", "HG_ODDS_")) or key in {"TZ", "PYTHONPATH", "PYTHONUNBUFFERED"}:
|
||||
if key.startswith(("DQD_", "ODDS_", "HG_ODDS_", "TITAN_ODDS_")) or key in {"TZ", "PYTHONPATH", "PYTHONUNBUFFERED"}:
|
||||
fp.write(f"export {key}={shlex.quote(value)}\n")
|
||||
env_file.chmod(0o600)
|
||||
PY
|
||||
|
||||
+134
-52
@@ -15,6 +15,14 @@ import pymysql
|
||||
import requests
|
||||
import urllib3
|
||||
|
||||
from titan_odds import (
|
||||
DEFAULT_TITAN_COMPANY_ID,
|
||||
DEFAULT_TITAN_COMPANY_NAME,
|
||||
DEFAULT_TITAN_CUP_URLS,
|
||||
DEFAULT_TITAN_EURO_COMPANY_ID,
|
||||
TitanOddsClient,
|
||||
)
|
||||
|
||||
|
||||
DEFAULT_BASE_URLS = [
|
||||
"https://205.201.0.120/",
|
||||
@@ -70,6 +78,13 @@ def _safe_int(value: Any, default: int = 0) -> int:
|
||||
return default
|
||||
|
||||
|
||||
def _safe_float(value: Any, default: float = 0.0) -> float:
|
||||
try:
|
||||
return float(str(value).strip())
|
||||
except (TypeError, ValueError):
|
||||
return default
|
||||
|
||||
|
||||
def _text(raw: Dict[str, str], key: str) -> str:
|
||||
return str(raw.get(key) or "").strip()
|
||||
|
||||
@@ -538,62 +553,129 @@ def _build_result(
|
||||
|
||||
def run(db_config: Dict[str, Any], env: Optional[Dict[str, str]] = None) -> Dict[str, Any]:
|
||||
env = env if env is not None else os.environ
|
||||
username = (env.get("ODDS_USERNAME") or env.get("HG_ODDS_USERNAME") or "").strip()
|
||||
password = (env.get("ODDS_PASSWORD") or env.get("HG_ODDS_PASSWORD") or "").strip()
|
||||
if not username or not password:
|
||||
return _build_result(
|
||||
success=False,
|
||||
candidate_count=0,
|
||||
saved_count=0,
|
||||
errors=["ODDS_USERNAME/ODDS_PASSWORD 未配置"],
|
||||
)
|
||||
|
||||
base_urls = [_normalize_base_url(url) for url in _split_env_list(env.get("ODDS_BASE_URLS", ""), DEFAULT_BASE_URLS)]
|
||||
sport_types = [item.upper() for item in _split_env_list(env.get("ODDS_SPORT_TYPES", ""), DEFAULT_SPORT_TYPES)]
|
||||
show_types = [item.lower() for item in _split_env_list(env.get("ODDS_SHOW_TYPES", ""), DEFAULT_SHOW_TYPES)]
|
||||
timeout = _safe_int(env.get("ODDS_TIMEOUT"), 20)
|
||||
verify_tls = _bool_env(env.get("ODDS_VERIFY_TLS"), default=False)
|
||||
langx = (env.get("ODDS_LANGX") or "zh-cn").strip()
|
||||
odds_type = (env.get("ODDS_TYPE") or "H").strip().upper()
|
||||
request_delay = float(env.get("ODDS_REQUEST_DELAY_SECONDS") or REQUEST_DELAY_SECONDS)
|
||||
|
||||
client: Optional[HgOddsClient] = None
|
||||
login_errors: List[str] = []
|
||||
for base_url in base_urls:
|
||||
try:
|
||||
candidate = HgOddsClient(
|
||||
base_url=base_url,
|
||||
username=username,
|
||||
password=password,
|
||||
timeout=timeout,
|
||||
verify_tls=verify_tls,
|
||||
langx=langx,
|
||||
odds_type=odds_type,
|
||||
)
|
||||
candidate.login()
|
||||
client = candidate
|
||||
break
|
||||
except Exception as exc: # noqa: BLE001
|
||||
login_errors.append(f"{base_url}: {exc}")
|
||||
|
||||
if client is None:
|
||||
return _build_result(success=False, candidate_count=0, saved_count=0, errors=login_errors)
|
||||
|
||||
items: List[Dict[str, Any]] = []
|
||||
fetch_errors: List[str] = []
|
||||
source_urls: List[str] = []
|
||||
successful_sources = 0
|
||||
skipped_count = 0
|
||||
for sport_type in sport_types:
|
||||
for show_type in show_types:
|
||||
|
||||
username = (env.get("ODDS_USERNAME") or env.get("HG_ODDS_USERNAME") or "").strip()
|
||||
password = (env.get("ODDS_PASSWORD") or env.get("HG_ODDS_PASSWORD") or "").strip()
|
||||
if username and password:
|
||||
base_urls = [
|
||||
_normalize_base_url(url)
|
||||
for url in _split_env_list(env.get("ODDS_BASE_URLS", ""), DEFAULT_BASE_URLS)
|
||||
]
|
||||
sport_types = [
|
||||
item.upper()
|
||||
for item in _split_env_list(env.get("ODDS_SPORT_TYPES", ""), DEFAULT_SPORT_TYPES)
|
||||
]
|
||||
show_types = [
|
||||
item.lower()
|
||||
for item in _split_env_list(env.get("ODDS_SHOW_TYPES", ""), DEFAULT_SHOW_TYPES)
|
||||
]
|
||||
timeout = _safe_int(env.get("ODDS_TIMEOUT"), 20)
|
||||
verify_tls = _bool_env(env.get("ODDS_VERIFY_TLS"), default=False)
|
||||
langx = (env.get("ODDS_LANGX") or "zh-cn").strip()
|
||||
odds_type = (env.get("ODDS_TYPE") or "H").strip().upper()
|
||||
request_delay = _safe_float(
|
||||
env.get("ODDS_REQUEST_DELAY_SECONDS"),
|
||||
REQUEST_DELAY_SECONDS,
|
||||
)
|
||||
|
||||
client: Optional[HgOddsClient] = None
|
||||
login_errors: List[str] = []
|
||||
for base_url in base_urls:
|
||||
try:
|
||||
items.extend(client.fetch_game_list(sport_type, show_type))
|
||||
except OddsGameListUnavailable:
|
||||
skipped_count += 1
|
||||
candidate = HgOddsClient(
|
||||
base_url=base_url,
|
||||
username=username,
|
||||
password=password,
|
||||
timeout=timeout,
|
||||
verify_tls=verify_tls,
|
||||
langx=langx,
|
||||
odds_type=odds_type,
|
||||
)
|
||||
candidate.login()
|
||||
client = candidate
|
||||
break
|
||||
except Exception as exc: # noqa: BLE001
|
||||
fetch_errors.append(f"{sport_type}/{show_type}: {exc}")
|
||||
if request_delay > 0:
|
||||
time.sleep(request_delay)
|
||||
login_errors.append(f"hg {base_url}: {exc}")
|
||||
|
||||
if client is None:
|
||||
fetch_errors.extend(login_errors)
|
||||
else:
|
||||
successful_sources += 1
|
||||
source_urls.append(client.base_url)
|
||||
for sport_type in sport_types:
|
||||
for show_type in show_types:
|
||||
try:
|
||||
items.extend(client.fetch_game_list(sport_type, show_type))
|
||||
except OddsGameListUnavailable:
|
||||
skipped_count += 1
|
||||
except Exception as exc: # noqa: BLE001
|
||||
fetch_errors.append(f"hg {sport_type}/{show_type}: {exc}")
|
||||
if request_delay > 0:
|
||||
time.sleep(request_delay)
|
||||
|
||||
titan_enabled = _bool_env(env.get("TITAN_ODDS_ENABLED"), default=True)
|
||||
if titan_enabled:
|
||||
titan_urls = [
|
||||
str(url).strip()
|
||||
for url in _split_env_list(
|
||||
env.get("TITAN_ODDS_URLS", ""),
|
||||
DEFAULT_TITAN_CUP_URLS,
|
||||
)
|
||||
]
|
||||
titan_client = TitanOddsClient(
|
||||
timeout=_safe_int(env.get("TITAN_ODDS_TIMEOUT"), 20),
|
||||
verify_tls=_bool_env(env.get("TITAN_ODDS_VERIFY_TLS"), default=True),
|
||||
company_id=_safe_int(
|
||||
env.get("TITAN_ODDS_COMPANY_ID"),
|
||||
DEFAULT_TITAN_COMPANY_ID,
|
||||
),
|
||||
euro_company_id=_safe_int(
|
||||
env.get("TITAN_ODDS_EURO_COMPANY_ID"),
|
||||
DEFAULT_TITAN_EURO_COMPANY_ID,
|
||||
),
|
||||
company_name=(
|
||||
env.get("TITAN_ODDS_COMPANY_NAME")
|
||||
or DEFAULT_TITAN_COMPANY_NAME
|
||||
).strip(),
|
||||
show_type=(env.get("TITAN_ODDS_SHOW_TYPE") or "early").strip().lower(),
|
||||
request_delay=_safe_float(
|
||||
env.get("TITAN_ODDS_REQUEST_DELAY_SECONDS"),
|
||||
0.2,
|
||||
),
|
||||
)
|
||||
for titan_url in titan_urls:
|
||||
try:
|
||||
items.extend(titan_client.fetch_cup(titan_url))
|
||||
successful_sources += 1
|
||||
source_urls.append(titan_url)
|
||||
except Exception as exc: # noqa: BLE001
|
||||
fetch_errors.append(f"titan007 {titan_url}: {exc}")
|
||||
titan_request_delay = _safe_float(
|
||||
env.get("TITAN_ODDS_REQUEST_DELAY_SECONDS"),
|
||||
0.2,
|
||||
)
|
||||
if titan_request_delay > 0:
|
||||
time.sleep(titan_request_delay)
|
||||
|
||||
if successful_sources == 0:
|
||||
if not username or not password:
|
||||
fetch_errors.append("ODDS_USERNAME/ODDS_PASSWORD 未配置")
|
||||
return _build_result(
|
||||
success=False,
|
||||
candidate_count=len(items),
|
||||
saved_count=0,
|
||||
source_url=",".join(dict.fromkeys(source_urls)),
|
||||
skipped_count=skipped_count,
|
||||
errors=fetch_errors or ["没有可用的赔率来源"],
|
||||
)
|
||||
|
||||
repo = None
|
||||
source_url = ",".join(dict.fromkeys(source_urls))
|
||||
try:
|
||||
repo = MatchOddsRepository(db_config)
|
||||
repo.ensure_table()
|
||||
@@ -603,7 +685,7 @@ def run(db_config: Dict[str, Any], env: Optional[Dict[str, str]] = None) -> Dict
|
||||
success=False,
|
||||
candidate_count=len(items),
|
||||
saved_count=0,
|
||||
source_url=client.base_url,
|
||||
source_url=source_url,
|
||||
skipped_count=skipped_count,
|
||||
errors=fetch_errors + [f"database: {exc}"],
|
||||
)
|
||||
@@ -612,10 +694,10 @@ def run(db_config: Dict[str, Any], env: Optional[Dict[str, str]] = None) -> Dict
|
||||
repo.close()
|
||||
|
||||
return _build_result(
|
||||
success=len(fetch_errors) == 0,
|
||||
success=True,
|
||||
candidate_count=len(items),
|
||||
saved_count=saved_count,
|
||||
source_url=client.base_url,
|
||||
source_url=source_url,
|
||||
skipped_count=skipped_count,
|
||||
errors=fetch_errors,
|
||||
)
|
||||
|
||||
@@ -146,7 +146,7 @@ class MatchOddsTest(unittest.TestCase):
|
||||
self.assertEqual(json.loads(params[-2])["moneyline"]["draw"], "3.90")
|
||||
|
||||
def test_run_skips_without_credentials(self):
|
||||
result = run({"prefix": "la_"}, env={})
|
||||
result = run({"prefix": "la_"}, env={"TITAN_ODDS_ENABLED": "0"})
|
||||
|
||||
self.assertFalse(result["success"])
|
||||
self.assertEqual(result["candidate_count"], 0)
|
||||
@@ -182,6 +182,7 @@ class MatchOddsTest(unittest.TestCase):
|
||||
"ODDS_SPORT_TYPES": "FT",
|
||||
"ODDS_SHOW_TYPES": "today",
|
||||
"ODDS_REQUEST_DELAY_SECONDS": "0",
|
||||
"TITAN_ODDS_ENABLED": "0",
|
||||
},
|
||||
)
|
||||
|
||||
@@ -234,6 +235,7 @@ class MatchOddsTest(unittest.TestCase):
|
||||
"ODDS_SPORT_TYPES": "FT",
|
||||
"ODDS_SHOW_TYPES": "today,early",
|
||||
"ODDS_REQUEST_DELAY_SECONDS": "0",
|
||||
"TITAN_ODDS_ENABLED": "0",
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
import sys
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
if str(ROOT) not in sys.path:
|
||||
sys.path.insert(0, str(ROOT))
|
||||
|
||||
from titan_odds import (
|
||||
build_titan_odds_items,
|
||||
parse_titan_odds_script,
|
||||
parse_titan_schedule_script,
|
||||
)
|
||||
|
||||
|
||||
SCHEDULE_SCRIPT = r"""
|
||||
var arrCup = [75,'世界杯','世界盃','World Cup','世界杯','世界盃','World Cup','2026'];
|
||||
jh["G27976"] = [[2907402,75,0,'2026-07-12 05:00',640,744,'','','19','4',-0.5,-0.25,'2.5','1']];
|
||||
var arrTeam = [
|
||||
[640,'挪威','挪威','Norway','','images/norway.png'],
|
||||
[744,'英格兰','英格蘭','England','','images/england.png']
|
||||
];
|
||||
var lastUpdateTime = '2026-07-11 10:00:12';
|
||||
"""
|
||||
|
||||
ODDS_SCRIPT = """
|
||||
oddsData["O_2907402"]=[[545,3.5,3.6,2.01],[16,3.3,3.55,2.13]];
|
||||
oddsData["L_2907402"]=[[3,0.88,-0.5,0.94],[16,0.86,-0.5,0.98]];
|
||||
oddsData["T_2907402"]=[[3,0.92,2.5,0.88],[16,0.93,2.5,0.87]];
|
||||
"""
|
||||
|
||||
|
||||
class TitanOddsTest(unittest.TestCase):
|
||||
def test_parse_schedule_and_odds_builds_normalized_item(self):
|
||||
schedule = parse_titan_schedule_script(SCHEDULE_SCRIPT)
|
||||
odds = parse_titan_odds_script(ODDS_SCRIPT)
|
||||
|
||||
items = build_titan_odds_items(
|
||||
schedule,
|
||||
odds,
|
||||
source_url="https://zq.titan007.com/cn/CupMatch/75.html",
|
||||
company_id=3,
|
||||
euro_company_id=545,
|
||||
company_name="Crown",
|
||||
)
|
||||
|
||||
self.assertEqual(len(items), 1)
|
||||
item = items[0]
|
||||
self.assertEqual(item["source_site"], "titan007")
|
||||
self.assertEqual(item["source_match_id"], "2907402")
|
||||
self.assertEqual(item["league_name"], "世界杯")
|
||||
self.assertEqual(item["home_team"], "挪威")
|
||||
self.assertEqual(item["away_team"], "英格兰")
|
||||
self.assertEqual(item["show_type"], "early")
|
||||
self.assertEqual(item["strong_side"], "C")
|
||||
self.assertEqual(item["handicap_line"], "0.5")
|
||||
self.assertEqual(item["handicap_home_odds"], "0.88")
|
||||
self.assertEqual(item["handicap_away_odds"], "0.94")
|
||||
self.assertEqual(item["total_line"], "2.5")
|
||||
self.assertEqual(item["home_win_odds"], "3.5")
|
||||
self.assertEqual(item["draw_odds"], "3.6")
|
||||
self.assertEqual(item["away_win_odds"], "2.01")
|
||||
self.assertEqual(item["raw_data"]["selected_company_id"], 3)
|
||||
self.assertEqual(item["raw_data"]["selected_euro_company_id"], 545)
|
||||
|
||||
def test_sparse_schedule_rows_are_parsed_without_eval(self):
|
||||
script = r"""
|
||||
var arrCup = [75,'世界杯','','','','','','2026'];
|
||||
jh["G27977"] = [[2907405,75,0,'2026-07-16 03:00',77068,77069,'','','','',,,'','']];
|
||||
var arrTeam = [[77068,'99胜者'],[77069,'100胜者']];
|
||||
"""
|
||||
|
||||
parsed = parse_titan_schedule_script(script)
|
||||
|
||||
self.assertIn("2907405", parsed["matches"])
|
||||
self.assertEqual(parsed["matches"]["2907405"]["home_team"], "99胜者")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -0,0 +1,448 @@
|
||||
#!/usr/bin/env python3
|
||||
from __future__ import annotations
|
||||
|
||||
import ast
|
||||
import html
|
||||
import json
|
||||
import re
|
||||
import time
|
||||
from decimal import Decimal, InvalidOperation
|
||||
from typing import Any, Dict, Iterable, List, Optional, Tuple
|
||||
from urllib.parse import urljoin
|
||||
|
||||
import requests
|
||||
|
||||
|
||||
DEFAULT_TITAN_CUP_URLS = [
|
||||
"https://zq.titan007.com/cn/CupMatch/75.html",
|
||||
]
|
||||
DEFAULT_TITAN_COMPANY_ID = 3
|
||||
DEFAULT_TITAN_EURO_COMPANY_ID = 545
|
||||
DEFAULT_TITAN_COMPANY_NAME = "Crown"
|
||||
DEFAULT_USER_AGENT = (
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
|
||||
"AppleWebKit/537.36 (KHTML, like Gecko) "
|
||||
"Chrome/137.0.0.0 Safari/537.36"
|
||||
)
|
||||
|
||||
|
||||
def _limit(value: Any, size: int) -> str:
|
||||
return re.sub(r"\s+", " ", str(value or "")).strip()[:size]
|
||||
|
||||
|
||||
def _safe_int(value: Any, default: int = 0) -> int:
|
||||
try:
|
||||
return int(str(value).strip())
|
||||
except (TypeError, ValueError):
|
||||
return default
|
||||
|
||||
|
||||
def _number_text(value: Any, *, absolute: bool = False) -> str:
|
||||
if value is None or value == "":
|
||||
return ""
|
||||
try:
|
||||
number = Decimal(str(value))
|
||||
if absolute:
|
||||
number = abs(number)
|
||||
text = format(number.normalize(), "f")
|
||||
return "0" if text in {"-0", ""} else text
|
||||
except (InvalidOperation, ValueError):
|
||||
return _limit(value, 32)
|
||||
|
||||
|
||||
def _extract_array_expression(script: str, start_at: int) -> Tuple[str, int]:
|
||||
start = script.find("[", start_at)
|
||||
if start < 0:
|
||||
raise ValueError("JavaScript array start not found")
|
||||
|
||||
depth = 0
|
||||
quote = ""
|
||||
escaped = False
|
||||
for index in range(start, len(script)):
|
||||
char = script[index]
|
||||
if quote:
|
||||
if escaped:
|
||||
escaped = False
|
||||
elif char == "\\":
|
||||
escaped = True
|
||||
elif char == quote:
|
||||
quote = ""
|
||||
continue
|
||||
if char in {"'", '"'}:
|
||||
quote = char
|
||||
elif char == "[":
|
||||
depth += 1
|
||||
elif char == "]":
|
||||
depth -= 1
|
||||
if depth == 0:
|
||||
return script[start : index + 1], index + 1
|
||||
raise ValueError("JavaScript array end not found")
|
||||
|
||||
|
||||
def _fill_sparse_array_holes(expression: str) -> str:
|
||||
output: List[str] = []
|
||||
quote = ""
|
||||
escaped = False
|
||||
length = len(expression)
|
||||
for index, char in enumerate(expression):
|
||||
output.append(char)
|
||||
if quote:
|
||||
if escaped:
|
||||
escaped = False
|
||||
elif char == "\\":
|
||||
escaped = True
|
||||
elif char == quote:
|
||||
quote = ""
|
||||
continue
|
||||
if char in {"'", '"'}:
|
||||
quote = char
|
||||
continue
|
||||
if char not in {"[", ","}:
|
||||
continue
|
||||
next_index = index + 1
|
||||
while next_index < length and expression[next_index].isspace():
|
||||
next_index += 1
|
||||
if next_index < length and expression[next_index] == ",":
|
||||
output.append("None")
|
||||
return "".join(output)
|
||||
|
||||
|
||||
def _parse_js_array(expression: str) -> List[Any]:
|
||||
normalized = _fill_sparse_array_holes(expression)
|
||||
value = ast.literal_eval(normalized)
|
||||
if not isinstance(value, list):
|
||||
raise ValueError("JavaScript assignment is not an array")
|
||||
return value
|
||||
|
||||
|
||||
def _parse_named_array(script: str, marker: str) -> List[Any]:
|
||||
marker_index = script.find(marker)
|
||||
if marker_index < 0:
|
||||
raise ValueError(f"JavaScript marker not found: {marker}")
|
||||
expression, _ = _extract_array_expression(script, marker_index + len(marker))
|
||||
return _parse_js_array(expression)
|
||||
|
||||
|
||||
def _is_match_row(value: Any) -> bool:
|
||||
if not isinstance(value, list) or len(value) < 6:
|
||||
return False
|
||||
if _safe_int(value[0]) <= 0:
|
||||
return False
|
||||
return isinstance(value[3], str) and bool(re.match(r"^\d{4}-\d{2}-\d{2}\s", value[3]))
|
||||
|
||||
|
||||
def _flatten_match_rows(value: Any) -> Iterable[List[Any]]:
|
||||
if _is_match_row(value):
|
||||
yield value
|
||||
return
|
||||
if isinstance(value, list):
|
||||
for item in value:
|
||||
yield from _flatten_match_rows(item)
|
||||
|
||||
|
||||
def parse_titan_schedule_script(script: str) -> Dict[str, Any]:
|
||||
script = (script or "").lstrip("\ufeff")
|
||||
cup = _parse_named_array(script, "var arrCup =")
|
||||
teams = _parse_named_array(script, "var arrTeam =")
|
||||
team_map = {
|
||||
str(row[0]): str(row[1]).strip()
|
||||
for row in teams
|
||||
if isinstance(row, list) and len(row) >= 2
|
||||
}
|
||||
|
||||
matches: Dict[str, Dict[str, Any]] = {}
|
||||
assignment_pattern = re.compile(r'jh\["(G[^"]+)"\]\s*=')
|
||||
for assignment in assignment_pattern.finditer(script):
|
||||
expression, _ = _extract_array_expression(script, assignment.end())
|
||||
event_key = assignment.group(1)
|
||||
for row in _flatten_match_rows(_parse_js_array(expression)):
|
||||
match_id = str(row[0])
|
||||
home_team_id = str(row[4] or "")
|
||||
away_team_id = str(row[5] or "")
|
||||
matches[match_id] = {
|
||||
"source_match_id": match_id,
|
||||
"source_event_id": event_key,
|
||||
"match_time_text": str(row[3] or "").strip(),
|
||||
"home_team_id": home_team_id,
|
||||
"away_team_id": away_team_id,
|
||||
"home_team": team_map.get(home_team_id, home_team_id),
|
||||
"away_team": team_map.get(away_team_id, away_team_id),
|
||||
"state": row[2] if len(row) > 2 else 0,
|
||||
"schedule": row,
|
||||
}
|
||||
|
||||
last_update_match = re.search(r"var\s+lastUpdateTime\s*=\s*'([^']*)'", script)
|
||||
return {
|
||||
"source_league_id": str(cup[0] if cup else ""),
|
||||
"league_name": str(cup[1] if len(cup) > 1 else "球探赛事").strip(),
|
||||
"season": str(cup[7] if len(cup) > 7 else "").strip(),
|
||||
"last_update_time": last_update_match.group(1) if last_update_match else "",
|
||||
"matches": matches,
|
||||
}
|
||||
|
||||
|
||||
def parse_titan_odds_script(script: str) -> Dict[str, List[List[Any]]]:
|
||||
script = (script or "").lstrip("\ufeff")
|
||||
odds: Dict[str, List[List[Any]]] = {}
|
||||
assignment_pattern = re.compile(r'oddsData\["([OLT]_\d+)"\]\s*=')
|
||||
for assignment in assignment_pattern.finditer(script):
|
||||
expression, _ = _extract_array_expression(script, assignment.end())
|
||||
value = json.loads(expression)
|
||||
if isinstance(value, list):
|
||||
odds[assignment.group(1)] = value
|
||||
return odds
|
||||
|
||||
|
||||
def _find_company_row(rows: List[List[Any]], company_id: int) -> Optional[List[Any]]:
|
||||
for row in rows:
|
||||
if isinstance(row, list) and row and _safe_int(row[0], -1) == company_id:
|
||||
return row
|
||||
return None
|
||||
|
||||
|
||||
def _select_company_id(market_rows: Dict[str, List[List[Any]]], preferred_id: int) -> int:
|
||||
coverage: Dict[int, int] = {}
|
||||
for rows in market_rows.values():
|
||||
seen = set()
|
||||
for row in rows:
|
||||
if not isinstance(row, list) or not row:
|
||||
continue
|
||||
company_id = _safe_int(row[0], -1)
|
||||
if company_id < 0 or company_id in seen:
|
||||
continue
|
||||
seen.add(company_id)
|
||||
coverage[company_id] = coverage.get(company_id, 0) + 1
|
||||
if preferred_id in coverage:
|
||||
return preferred_id
|
||||
if not coverage:
|
||||
return preferred_id
|
||||
return sorted(coverage, key=lambda company_id: (-coverage[company_id], company_id))[0]
|
||||
|
||||
|
||||
def build_titan_odds_items(
|
||||
schedule_data: Dict[str, Any],
|
||||
odds_data: Dict[str, List[List[Any]]],
|
||||
*,
|
||||
source_url: str,
|
||||
company_id: int = DEFAULT_TITAN_COMPANY_ID,
|
||||
euro_company_id: int = DEFAULT_TITAN_EURO_COMPANY_ID,
|
||||
company_name: str = DEFAULT_TITAN_COMPANY_NAME,
|
||||
show_type: str = "early",
|
||||
) -> List[Dict[str, Any]]:
|
||||
items: List[Dict[str, Any]] = []
|
||||
matches = schedule_data.get("matches") or {}
|
||||
for match_id, match in matches.items():
|
||||
market_rows = {
|
||||
"moneyline": odds_data.get(f"O_{match_id}", []),
|
||||
"handicap": odds_data.get(f"L_{match_id}", []),
|
||||
"total": odds_data.get(f"T_{match_id}", []),
|
||||
}
|
||||
selected_company_id = _select_company_id(
|
||||
{
|
||||
"handicap": market_rows["handicap"],
|
||||
"total": market_rows["total"],
|
||||
},
|
||||
company_id,
|
||||
)
|
||||
selected_euro_company_id = _select_company_id(
|
||||
{"moneyline": market_rows["moneyline"]},
|
||||
euro_company_id,
|
||||
)
|
||||
moneyline = _find_company_row(
|
||||
market_rows["moneyline"],
|
||||
selected_euro_company_id,
|
||||
)
|
||||
handicap = _find_company_row(market_rows["handicap"], selected_company_id)
|
||||
total = _find_company_row(market_rows["total"], selected_company_id)
|
||||
if not any((moneyline, handicap, total)):
|
||||
continue
|
||||
|
||||
handicap_value = handicap[2] if handicap and len(handicap) > 2 else ""
|
||||
handicap_number: Optional[Decimal] = None
|
||||
try:
|
||||
handicap_number = Decimal(str(handicap_value))
|
||||
except (InvalidOperation, ValueError):
|
||||
pass
|
||||
strong_side = ""
|
||||
if handicap_number is not None:
|
||||
if handicap_number > 0:
|
||||
strong_side = "H"
|
||||
elif handicap_number < 0:
|
||||
strong_side = "C"
|
||||
|
||||
company_ids = {
|
||||
_safe_int(row[0], -1)
|
||||
for rows in market_rows.values()
|
||||
for row in rows
|
||||
if isinstance(row, list) and row
|
||||
}
|
||||
company_ids.discard(-1)
|
||||
markets = {
|
||||
"handicap": {
|
||||
"line": _number_text(handicap_value, absolute=True),
|
||||
"home": _number_text(handicap[1]) if handicap and len(handicap) > 1 else "",
|
||||
"away": _number_text(handicap[3]) if handicap and len(handicap) > 3 else "",
|
||||
"strong": strong_side,
|
||||
},
|
||||
"total": {
|
||||
"over_line": _number_text(total[2]) if total and len(total) > 2 else "",
|
||||
"under_line": _number_text(total[2]) if total and len(total) > 2 else "",
|
||||
"over": _number_text(total[1]) if total and len(total) > 1 else "",
|
||||
"under": _number_text(total[3]) if total and len(total) > 3 else "",
|
||||
},
|
||||
"moneyline": {
|
||||
"home": _number_text(moneyline[1]) if moneyline and len(moneyline) > 1 else "",
|
||||
"draw": _number_text(moneyline[2]) if moneyline and len(moneyline) > 2 else "",
|
||||
"away": _number_text(moneyline[3]) if moneyline and len(moneyline) > 3 else "",
|
||||
},
|
||||
"first_half": {
|
||||
"handicap_line": "",
|
||||
"handicap_home": "",
|
||||
"handicap_away": "",
|
||||
"total_over_line": "",
|
||||
"total_under_line": "",
|
||||
"total_over": "",
|
||||
"total_under": "",
|
||||
"home_win": "",
|
||||
"away_win": "",
|
||||
"draw": "",
|
||||
},
|
||||
"both_teams_to_score": {"yes": "", "no": ""},
|
||||
"kickoff": {"home": "", "away": ""},
|
||||
}
|
||||
selected_company_name = company_name if selected_company_id == company_id else str(selected_company_id)
|
||||
raw_data = {
|
||||
"schedule": match.get("schedule") or [],
|
||||
"odds": {
|
||||
"moneyline": market_rows["moneyline"],
|
||||
"handicap": market_rows["handicap"],
|
||||
"total": market_rows["total"],
|
||||
},
|
||||
"selected_company_id": selected_company_id,
|
||||
"selected_euro_company_id": selected_euro_company_id,
|
||||
"selected_company_name": selected_company_name,
|
||||
"last_update_time": schedule_data.get("last_update_time") or "",
|
||||
}
|
||||
items.append(
|
||||
{
|
||||
"source_site": "titan007",
|
||||
"source_url": _limit(source_url, 255),
|
||||
"source_match_id": _limit(match_id, 64),
|
||||
"source_parent_id": "",
|
||||
"source_league_id": _limit(schedule_data.get("source_league_id"), 64),
|
||||
"source_event_id": _limit(match.get("source_event_id"), 64),
|
||||
"sport_type": "FT",
|
||||
"show_type": _limit(show_type, 20),
|
||||
"odds_type": "H",
|
||||
"league_name": _limit(schedule_data.get("league_name"), 150),
|
||||
"match_time_text": _limit(match.get("match_time_text"), 50),
|
||||
"home_team_id": _limit(match.get("home_team_id"), 64),
|
||||
"away_team_id": _limit(match.get("away_team_id"), 64),
|
||||
"home_team": _limit(match.get("home_team"), 150),
|
||||
"away_team": _limit(match.get("away_team"), 150),
|
||||
"strong_side": strong_side,
|
||||
"more_count": len(company_ids),
|
||||
"is_running": 0,
|
||||
"handicap_line": _limit(markets["handicap"]["line"], 32),
|
||||
"handicap_home_odds": _limit(markets["handicap"]["home"], 32),
|
||||
"handicap_away_odds": _limit(markets["handicap"]["away"], 32),
|
||||
"total_line": _limit(markets["total"]["over_line"], 32),
|
||||
"total_over_odds": _limit(markets["total"]["over"], 32),
|
||||
"total_under_odds": _limit(markets["total"]["under"], 32),
|
||||
"home_win_odds": _limit(markets["moneyline"]["home"], 32),
|
||||
"draw_odds": _limit(markets["moneyline"]["draw"], 32),
|
||||
"away_win_odds": _limit(markets["moneyline"]["away"], 32),
|
||||
"half_handicap_line": "",
|
||||
"half_home_win_odds": "",
|
||||
"half_draw_odds": "",
|
||||
"half_away_win_odds": "",
|
||||
"raw_data": raw_data,
|
||||
"markets": markets,
|
||||
}
|
||||
)
|
||||
return items
|
||||
|
||||
|
||||
class TitanOddsClient:
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
user_agent: str = DEFAULT_USER_AGENT,
|
||||
timeout: int = 20,
|
||||
verify_tls: bool = True,
|
||||
company_id: int = DEFAULT_TITAN_COMPANY_ID,
|
||||
euro_company_id: int = DEFAULT_TITAN_EURO_COMPANY_ID,
|
||||
company_name: str = DEFAULT_TITAN_COMPANY_NAME,
|
||||
show_type: str = "early",
|
||||
request_delay: float = 0.2,
|
||||
) -> None:
|
||||
self.timeout = int(timeout)
|
||||
self.verify_tls = bool(verify_tls)
|
||||
self.company_id = int(company_id)
|
||||
self.euro_company_id = int(euro_company_id)
|
||||
self.company_name = company_name
|
||||
self.show_type = show_type
|
||||
self.request_delay = float(request_delay)
|
||||
self.session = requests.Session()
|
||||
self.session.verify = self.verify_tls
|
||||
self.session.headers.update(
|
||||
{
|
||||
"User-Agent": user_agent,
|
||||
"Accept": "text/html,application/xhtml+xml,application/javascript,*/*;q=0.8",
|
||||
}
|
||||
)
|
||||
|
||||
def fetch_cup(self, cup_url: str) -> List[Dict[str, Any]]:
|
||||
page_response = self.session.get(cup_url, timeout=self.timeout)
|
||||
page_response.raise_for_status()
|
||||
page_html = page_response.text or ""
|
||||
season_match = re.search(r"selectSeason\s*=\s*'([^']+)'", page_html)
|
||||
league_match = re.search(r"SclassID\s*=\s*(\d+)", page_html)
|
||||
script_match = re.search(
|
||||
r"""src=["']([^"']*/jsData/matchResult/[^"']+\.js(?:\?[^"']*)?)["']""",
|
||||
page_html,
|
||||
re.IGNORECASE,
|
||||
)
|
||||
if not season_match or not league_match or not script_match:
|
||||
raise ValueError("球探杯赛页面缺少赛季、联赛或赛程脚本")
|
||||
|
||||
season = season_match.group(1)
|
||||
league_id = league_match.group(1)
|
||||
schedule_url = urljoin(page_response.url, html.unescape(script_match.group(1)))
|
||||
schedule_response = self.session.get(
|
||||
schedule_url,
|
||||
headers={"Referer": page_response.url},
|
||||
timeout=self.timeout,
|
||||
)
|
||||
schedule_response.raise_for_status()
|
||||
schedule_data = parse_titan_schedule_script(schedule_response.text)
|
||||
|
||||
if self.request_delay > 0:
|
||||
time.sleep(self.request_delay)
|
||||
|
||||
odds_url = urljoin(page_response.url, "/League/LeagueOddsAjax")
|
||||
odds_response = self.session.get(
|
||||
odds_url,
|
||||
params={
|
||||
"sclassId": league_id,
|
||||
"subSclassId": "",
|
||||
"matchSeason": season,
|
||||
"round": 1,
|
||||
},
|
||||
headers={
|
||||
"Referer": page_response.url,
|
||||
"X-Requested-With": "XMLHttpRequest",
|
||||
},
|
||||
timeout=self.timeout,
|
||||
)
|
||||
odds_response.raise_for_status()
|
||||
odds_data = parse_titan_odds_script(odds_response.text)
|
||||
return build_titan_odds_items(
|
||||
schedule_data,
|
||||
odds_data,
|
||||
source_url=page_response.url,
|
||||
company_id=self.company_id,
|
||||
euro_company_id=self.euro_company_id,
|
||||
company_name=self.company_name,
|
||||
show_type=self.show_type,
|
||||
)
|
||||
@@ -0,0 +1,70 @@
|
||||
# Gitea 部署说明
|
||||
|
||||
> 部署时间:2026-07-31
|
||||
>
|
||||
> 当前阶段:安装已完成,服务正常运行。
|
||||
|
||||
## 访问方式
|
||||
|
||||
- 正式访问地址:<https://git.zones.sbnews.net/>
|
||||
- 后端监听:`0.0.0.0:3000`。该端口仍保留用于服务器直连和 Nginx 反向代理,但日常访问应使用 HTTPS 域名。
|
||||
- 协议:HTTPS(Nginx 终止 TLS,再转发至 Gitea HTTP 3000 端口)
|
||||
- Git 操作:当前仅启用 HTTP/HTTPS 克隆和推送,未映射 Git SSH 端口,避免与宿主机的 SSH 22 端口冲突。
|
||||
|
||||
Nginx 虚拟主机配置位于 `/www/server/panel/vhost/nginx/git.zones.sbnews.net.conf`,反向代理配置位于 `/www/server/panel/vhost/nginx/proxy/git.zones.sbnews.net/`。
|
||||
|
||||
## 容器配置
|
||||
|
||||
| 项目 | 当前配置 |
|
||||
| --- | --- |
|
||||
| 容器名 | `gitea` |
|
||||
| Gitea 版本 | 1.27.1 |
|
||||
| 镜像摘要 | `sha256:34e3f6b75f5cbb6aebce588037fc5a53c84213e4d4b00da0a8d73e031a558e52` |
|
||||
| 重启策略 | `unless-stopped` |
|
||||
| 端口映射 | `0.0.0.0:3000 -> 3000/tcp` |
|
||||
| 数据库 | SQLite,数据位于持久化卷内 |
|
||||
| 数据卷 | `gitea-data`,宿主机位置为 `/var/lib/docker/volumes/gitea-data/_data` |
|
||||
| 应用根地址 | `https://git.zones.sbnews.net/` |
|
||||
|
||||
## 首次初始化
|
||||
|
||||
1. 在浏览器打开 <https://git.zones.sbnews.net/>。
|
||||
2. 使用已创建的管理员账号登录。
|
||||
3. 创建组织与仓库;初期请使用 HTTPS 克隆地址。
|
||||
|
||||
> HTTPS 域名已配置完成。后续更换域名或端口时,需同步更新 Gitea 的 `ROOT_URL` 和 Nginx 反向代理的 `Host` 请求头。
|
||||
|
||||
## 反向代理跨域校验修复
|
||||
|
||||
2026-07-31 曾出现 `cross-origin request detected` 与 `Frontend is not initialized` 提示。根因是 Nginx 反代把请求头设置为 `Host: localhost`,而浏览器请求的 `Origin` 是 `https://git.zones.sbnews.net`,导致 Gitea 的 CSRF 校验拒绝表单提交。
|
||||
|
||||
已将反代请求头改为:
|
||||
|
||||
~~~
|
||||
proxy_set_header Host git.zones.sbnews.net;
|
||||
proxy_set_header X-Forwarded-Host git.zones.sbnews.net;
|
||||
proxy_set_header X-Forwarded-Proto https;
|
||||
proxy_set_header X-Forwarded-Port 443;
|
||||
~~~
|
||||
|
||||
并将 Gitea 的 `DOMAIN`、`ROOT_URL` 更新为 `git.zones.sbnews.net` 和 `https://git.zones.sbnews.net/`。修改后 Nginx 配置检查、Gitea 健康检查、HTTPS 页面与浏览器静态资源加载均已验证通过。
|
||||
|
||||
## 常用运维命令
|
||||
|
||||
以下命令均在服务器上执行:
|
||||
|
||||
~~~
|
||||
ssh sbnews
|
||||
sudo docker ps --filter name=gitea
|
||||
sudo docker logs --tail 200 gitea
|
||||
sudo docker restart gitea
|
||||
sudo docker stop gitea
|
||||
sudo docker start gitea
|
||||
sudo docker volume inspect gitea-data
|
||||
~~~
|
||||
|
||||
## 注意事项
|
||||
|
||||
- Gitea 数据存放在 Docker 卷中。备份或迁移前先确认容器已停止,或使用 Gitea 官方备份方式,避免只备份容器层。
|
||||
- 当前镜像已固定到上述摘要,不会随宿主机重启自动升级。升级前应先备份数据,并在测试环境验证目标版本。
|
||||
- 调整端口、域名、HTTPS 或 Git SSH 后,应同步更新本文档、[服务器运行环境](./服务器运行环境.md) 和 [文档索引](../文档索引.md)。
|
||||
@@ -0,0 +1,13 @@
|
||||
CREATE TABLE IF NOT EXISTS `la_ai_quota_unlock` (
|
||||
`id` int UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`user_id` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '用户ID',
|
||||
`analysis_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '分析类型',
|
||||
`analysis_key` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '分析唯一Key',
|
||||
`ref_id` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联ID或哈希ID',
|
||||
`create_time` int UNSIGNED NULL DEFAULT NULL COMMENT '解锁时间',
|
||||
`update_time` int UNSIGNED NULL DEFAULT NULL COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
UNIQUE INDEX `uk_user_analysis` (`user_id` ASC, `analysis_key` ASC) USING BTREE,
|
||||
INDEX `idx_user_type` (`user_id` ASC, `analysis_type` ASC) USING BTREE,
|
||||
INDEX `idx_analysis_key` (`analysis_key` ASC) USING BTREE
|
||||
) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'AI分析通用解锁记录表' ROW_FORMAT = Dynamic;
|
||||
@@ -0,0 +1,43 @@
|
||||
CREATE TABLE IF NOT EXISTS `la_match_odds` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`source_site` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '赔率来源',
|
||||
`source_url` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '来源线路',
|
||||
`source_match_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '来源比赛ID',
|
||||
`source_parent_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '来源主比赛ID',
|
||||
`source_league_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '来源联赛ID',
|
||||
`source_event_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '来源事件ID',
|
||||
`sport_type` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '运动类型',
|
||||
`show_type` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '盘口类型 live/today/early',
|
||||
`odds_type` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '赔率格式',
|
||||
`league_name` VARCHAR(150) NOT NULL DEFAULT '' COMMENT '联赛名称',
|
||||
`match_time_text` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '来源比赛时间文本',
|
||||
`home_team_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '主队来源ID',
|
||||
`away_team_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '客队来源ID',
|
||||
`home_team` VARCHAR(150) NOT NULL DEFAULT '' COMMENT '主队名称',
|
||||
`away_team` VARCHAR(150) NOT NULL DEFAULT '' COMMENT '客队名称',
|
||||
`strong_side` VARCHAR(10) NOT NULL DEFAULT '' COMMENT '让球强弱方',
|
||||
`more_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '更多玩法数量',
|
||||
`is_running` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否滚球',
|
||||
`handicap_line` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '让球盘口',
|
||||
`handicap_home_odds` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '主队让球赔率',
|
||||
`handicap_away_odds` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '客队让球赔率',
|
||||
`total_line` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '大小球盘口',
|
||||
`total_over_odds` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '大球赔率',
|
||||
`total_under_odds` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '小球赔率',
|
||||
`home_win_odds` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '主胜赔率',
|
||||
`draw_odds` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '平局赔率',
|
||||
`away_win_odds` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '客胜赔率',
|
||||
`half_handicap_line` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '上半场让球盘口',
|
||||
`half_home_win_odds` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '上半场主胜赔率',
|
||||
`half_draw_odds` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '上半场平局赔率',
|
||||
`half_away_win_odds` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '上半场客胜赔率',
|
||||
`create_time` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`raw_data` JSON NULL COMMENT '来源原始game节点',
|
||||
`markets_json` JSON NULL COMMENT '规范化盘口JSON',
|
||||
`update_time` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_source_match` (`source_site`, `source_match_id`),
|
||||
KEY `idx_sport_show` (`sport_type`, `show_type`),
|
||||
KEY `idx_league` (`source_league_id`),
|
||||
KEY `idx_update_time` (`update_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='第三方赛事赔率表';
|
||||
@@ -0,0 +1,31 @@
|
||||
UPDATE `la_dev_crontab`
|
||||
SET
|
||||
`name` = '第三方赛事赔率抓取',
|
||||
`remark` = 'Docker crawler 每5分钟登录第三方线路并同步赛事赔率到 la_match_odds',
|
||||
`status` = 1,
|
||||
`expression` = '*/5 * * * *',
|
||||
`update_time` = UNIX_TIMESTAMP()
|
||||
WHERE `command` = 'crawler'
|
||||
AND `params` = 'match_odds'
|
||||
AND `delete_time` IS NULL;
|
||||
|
||||
INSERT INTO `la_dev_crontab`
|
||||
(`name`, `type`, `system`, `remark`, `command`, `params`, `status`, `expression`, `create_time`, `update_time`)
|
||||
SELECT
|
||||
'第三方赛事赔率抓取',
|
||||
1,
|
||||
0,
|
||||
'Docker crawler 每5分钟登录第三方线路并同步赛事赔率到 la_match_odds',
|
||||
'crawler',
|
||||
'match_odds',
|
||||
1,
|
||||
'*/5 * * * *',
|
||||
UNIX_TIMESTAMP(),
|
||||
UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM `la_dev_crontab`
|
||||
WHERE `command` = 'crawler'
|
||||
AND `params` = 'match_odds'
|
||||
AND `delete_time` IS NULL
|
||||
);
|
||||
@@ -3,16 +3,16 @@ JOIN `la_system_menu` parent
|
||||
ON parent.`type` = 'M'
|
||||
AND parent.`paths` = 'match'
|
||||
SET child.`pid` = parent.`id`,
|
||||
child.`name` = '直播管理',
|
||||
child.`paths` = 'match_live',
|
||||
child.`component` = 'match/live/index',
|
||||
child.`selected` = '/match/lists',
|
||||
child.`is_show` = 0,
|
||||
child.`selected` = '',
|
||||
child.`is_show` = 1,
|
||||
child.`update_time` = UNIX_TIMESTAMP()
|
||||
WHERE child.`perms` = 'match.matchLive/index'
|
||||
AND child.`pid` <> parent.`id`;
|
||||
WHERE child.`perms` = 'match.matchLive/index';
|
||||
|
||||
INSERT INTO `la_system_menu` (`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`)
|
||||
SELECT parent.`id`, 'C', '直播线路管理', '', 0, 'match.matchLive/index', 'match_live', 'match/live/index', '/match/lists', '', 0, 0, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
SELECT parent.`id`, 'C', '直播管理', '', 0, 'match.matchLive/index', 'match_live', 'match/live/index', '', '', 0, 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
FROM `la_system_menu` parent
|
||||
WHERE parent.`type` = 'M'
|
||||
AND parent.`paths` = 'match'
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
UPDATE `la_system_menu` child
|
||||
JOIN `la_system_menu` parent
|
||||
ON parent.`type` = 'M'
|
||||
AND parent.`paths` = 'match'
|
||||
SET child.`pid` = parent.`id`,
|
||||
child.`name` = '赔率列表',
|
||||
child.`paths` = 'match_odds',
|
||||
child.`component` = 'match/odds/index',
|
||||
child.`selected` = '',
|
||||
child.`is_show` = 1,
|
||||
child.`update_time` = UNIX_TIMESTAMP()
|
||||
WHERE child.`perms` = 'match.matchOdds/index';
|
||||
|
||||
INSERT INTO `la_system_menu` (`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`)
|
||||
SELECT parent.`id`, 'C', '赔率列表', '', 0, 'match.matchOdds/index', 'match_odds', 'match/odds/index', '', '', 0, 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
FROM `la_system_menu` parent
|
||||
WHERE parent.`type` = 'M'
|
||||
AND parent.`paths` = 'match'
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM `la_system_menu`
|
||||
WHERE `perms` = 'match.matchOdds/index'
|
||||
);
|
||||
|
||||
INSERT INTO `la_system_menu` (`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`)
|
||||
SELECT (SELECT `id` FROM `la_system_menu` WHERE `perms` = 'match.matchOdds/index' LIMIT 1), 'A', '赔率列表查询', '', 0, 'match.matchOdds/lists', '', '', '', '', 0, 0, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM `la_system_menu`
|
||||
WHERE `perms` = 'match.matchOdds/lists'
|
||||
);
|
||||
|
||||
INSERT INTO `la_system_role_menu` (`role_id`, `menu_id`)
|
||||
SELECT 1, m.`id`
|
||||
FROM `la_system_menu` m
|
||||
WHERE m.`perms` IN (
|
||||
'match.matchOdds/index',
|
||||
'match.matchOdds/lists'
|
||||
)
|
||||
AND NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM `la_system_role_menu` rm
|
||||
WHERE rm.`role_id` = 1
|
||||
AND rm.`menu_id` = m.`id`
|
||||
);
|
||||
+322
-6
@@ -13,6 +13,322 @@
|
||||
|
||||
## 一、已完成事项
|
||||
|
||||
### 88. HG 赔率平台展示名统一为皇冠
|
||||
|
||||
- 状态:代码已修改,待构建与页面验证 - 时间:2026-07-13
|
||||
|
||||
完成内容:
|
||||
- `source_site=hg` 的平台展示名称由“滚球”统一调整为“皇冠”。
|
||||
- 前台赔率接口、管理端赔率列表、赛事中心默认平台选项和比赛详情赔率平台选项保持一致。
|
||||
- 用户端对接口返回的旧 `hg=滚球` 标签增加兼容归一化,筛选项和盘口卡片标题固定显示“皇冠”。
|
||||
- 比赛详情赔率平台筛选改为无左右内边距的等宽文字 Tab,当前平台均匀铺满可用宽度,使用统一 `gap` 分隔,并通过蓝色文字和底部下划线标识激活项;平台较多时保留横向滚动。
|
||||
- `platform_key=hg`、历史赔率数据、抓取任务和“滚球盘”盘口类型保持不变。
|
||||
|
||||
涉及模块:
|
||||
- `server/app/api/controller/MatchController.php`
|
||||
- `server/app/adminapi/lists/match/MatchOddsLists.php`
|
||||
- `uniapp/src/packages_match/components/MatchCenterTabsPanel.vue`
|
||||
- `uniapp/src/components/match-odds-detail/match-odds-detail.vue`
|
||||
|
||||
验证说明:
|
||||
- 已完成平台展示名和“滚球盘”盘口类型的静态区分检查。
|
||||
- 按当前项目规范,本次未执行构建、测试、提交或部署。
|
||||
|
||||
### 87. 比赛详情多平台赔率绑定
|
||||
|
||||
- 状态:代码已修改,待构建与页面验证 - 时间:2026-07-13
|
||||
|
||||
完成内容:
|
||||
- 赛事中心和世界杯专题页的独立“赔率”Tab 改为通过本地显示开关隐藏,原赔率模板、状态和请求逻辑继续保留,便于后续恢复。
|
||||
- 赛事中心顶部内容 Tab 改为按实际显示数量自动等分宽度;当前“赛程 / 直播”各占一半,恢复赔率 Tab 后自动三等分。
|
||||
- 世界杯专题旧链接携带 `tab=odds` 时自动回落到赛程,避免进入已隐藏的赔率内容。
|
||||
- 比赛详情页在“比赛数据”后新增“赔率”Tab,并隐藏比赛数据内原有的简易主胜/平/客胜赔率区域,避免重复展示。
|
||||
- 比赛详情主导航重构为可横向滚动的自然宽度文字 Tab,取消等宽 `flex: 1` 和项目左右内边距,使用容器 `gap` 控制间距;直播红点改为绝对定位,避免影响文字与下划线中心。
|
||||
- 赛事赛程卡的 `mc__odds-item` 改为按主客队与比赛日期批量匹配第三方赔率,只回填主胜、平、客胜;无效的 `0`/`0.00` 转为空字符串,缺失项不渲染。
|
||||
- 新增 `match-odds-detail.vue` 详情赔率组件,首次进入赔率 Tab 时按需请求,支持“全部平台 / 皇冠 / 球探”筛选,并展示独赢、让球、大小球盘口。
|
||||
- 赔率组件区分“接口请求失败”和“接口成功但没有赔率”,请求失败时显示重试入口,不再误显示为“暂无赔率”。
|
||||
- 本地 H5 开发环境改为通过 Vite `/api` 同源代理访问测试服,避免自定义请求头触发的跨域预检超时;App、小程序及生产环境仍使用原接口域名。
|
||||
- `/api/match/odds` 新增可选参数 `home_team`、`away_team`、`match_date`;详情页使用比赛双方名称和比赛日期进行文本匹配,不依赖站内 `match_id`。
|
||||
- 日期文本匹配兼容 `YYYY-MM-DD`、`MM-DD`、`YYYY/MM/DD`、`MM/DD` 以及不补零格式;未传入新参数时继续保持原通用赔率列表行为。
|
||||
|
||||
涉及模块:
|
||||
- `server/app/api/controller/MatchController.php`
|
||||
- `uniapp/src/api/match.ts`
|
||||
- `uniapp/src/components/match-odds-detail/match-odds-detail.vue`
|
||||
- `uniapp/src/pages/match_detail/match_detail.vue`
|
||||
- `uniapp/src/packages_match/components/MatchCenterTabsPanel.vue`
|
||||
- `uniapp/src/packages_match/components/WorldCupPanel.vue`
|
||||
|
||||
验证说明:
|
||||
- 已完成请求参数、查询条件、Tab 状态和模板结构的静态复核。
|
||||
- 按当前项目规范,本次未执行构建、测试、提交或部署。
|
||||
|
||||
### 86. 赛事中心赛程 / 直播 / 赔率统一组件
|
||||
|
||||
- 状态:代码已修改,待构建与页面验证 - 时间:2026-07-11
|
||||
|
||||
完成内容:
|
||||
- 用户端赛事中心新增 `MatchCenterTabsPanel.vue`,在当前页面内容区域统一切换“赛程 / 直播 / 赔率”,不再因点击三个 Tab 显示世界杯主题组件。
|
||||
- 赛程 Tab 迁移并保留原赛事列表、运动分类、联赛筛选、进行中/未开始/已结束分组和已结束赛事分页;运动与联赛分类条仅在赛程显示。
|
||||
- 直播 Tab 新增 `/api/match/liveCards` 通用接口,以 `la_match_live` 的有效抓取状态和播放地址为准,不强制要求绑定站内赛事;前端不显示运动或联赛分类筛选。
|
||||
- 赔率 Tab 新增 `/api/match/odds` 通用接口,只保留滚球盘/今日盘/早盘以及联赛/球队关键词搜索,并将赔率与普通站内赛事进行详情匹配。
|
||||
- 世界杯专题卡仍进入原世界杯专题页;`worldCupLiveCards` 也改为展示当前有效直播流,不再强制绑定世界杯赛事,`worldCupOdds` 原接口保持兼容。
|
||||
|
||||
涉及模块:
|
||||
- `server/app/api/controller/MatchController.php`
|
||||
- `server/app/common/service/match/MatchLiveService.php`
|
||||
- `uniapp/src/api/match.ts`
|
||||
- `uniapp/src/packages_match/components/MatchCenterPanel.vue`
|
||||
- `uniapp/src/packages_match/components/MatchCenterTabsPanel.vue`
|
||||
|
||||
验证说明:
|
||||
- 已完成静态改动范围和模板标签完整性检查。
|
||||
- 按当前项目规范和用户要求,本次未执行 PHP 语法检查、前端构建、浏览器验证、提交或部署。
|
||||
|
||||
### 85. 球探世界杯赔率线路
|
||||
|
||||
- 状态:已完成 - 时间:2026-07-11
|
||||
|
||||
完成内容:
|
||||
- `match_odds` 多平台抓取任务新增球探线路,默认读取 `https://zq.titan007.com/cn/CupMatch/75.html`。
|
||||
- 新增 `TitanOddsClient`,从杯赛页面动态识别赛季、联赛 ID 和赛程脚本,再请求公开的 `LeagueOddsAjax` 赔率数据接口。
|
||||
- 球探盘口按页面默认 Crown 公司整理:亚让/大小球公司 ID 为 `3`,胜平负公司 ID 为 `545`;全部公司原始赔率同时保存在 `raw_data`。
|
||||
- 球探数据使用 `source_site=titan007` 写入 `la_match_odds`,平台名称在用户端和管理端统一显示为“球探”。
|
||||
- HG 与球探改为独立抓取来源,单个来源失败不会阻断另一个来源入库;球探相关参数支持通过 `TITAN_ODDS_*` 环境变量覆盖。
|
||||
- 多平台赔率聚合键调整为“主客队 + 比赛月日”,兼容 HG 与球探不同的联赛名和时间文本格式,使同场比赛可以展示多个平台。
|
||||
- 赛事中心盘口组件新增独立的平台筛选行,支持“全部平台 / 皇冠 / 球探”,请求会携带 `source_site`、当前运动和联赛条件。
|
||||
- 盘口类型筛选行(全部盘口、滚球盘、今日盘、早盘)已按当前页面需求注释隐藏,暂不显示。
|
||||
- `/api/match/odds` 与 `/api/match/worldCupOdds` 增加 `platform_options`,统一返回已支持平台并兼容数据库中的后续新来源。
|
||||
|
||||
涉及模块:
|
||||
- `docker/crawler/titan_odds.py`
|
||||
- `docker/crawler/match_odds.py`
|
||||
- `docker/crawler/docker/entrypoint.sh`
|
||||
- `docker/.env.docker.example`
|
||||
- `docker/crawler/tests/test_titan_odds.py`
|
||||
- `docker/crawler/tests/test_match_odds.py`
|
||||
- `server/app/api/controller/MatchController.php`
|
||||
- `server/app/adminapi/lists/match/MatchOddsLists.php`
|
||||
- `uniapp/src/packages_match/components/MatchCenterTabsPanel.vue`
|
||||
|
||||
验证说明:
|
||||
- 已分析球探页面、赛程脚本和公开赔率接口的实时响应格式。
|
||||
- 已在测试服重建并重启 `sport-era-crawler`,确认容器内存在 `/app/titan_odds.py`,且 cron 已注册 `match_odds` 每 5 分钟执行。
|
||||
- 已手动触发一次 `match_odds`,确认 `/api/match/odds?source_site=titan007&limit=300` 返回 101 场球探世界杯赔率。
|
||||
- 本次未执行测试或提交命令。
|
||||
|
||||
### 84. 赛事中心世界杯快捷 Tab
|
||||
|
||||
- 状态:已完成 - 时间:2026-07-10
|
||||
|
||||
完成内容:
|
||||
- 用户端赛事中心 `topic-entry` 下方新增“赛程 / 直播 / 赔率”三项世界杯快捷入口。
|
||||
- 快捷入口复用世界杯专题页现有 Tab 状态,分别打开 `schedule`、`live`、`odds`,不新增接口和页面路由。
|
||||
- 原世界杯入口卡片继续默认进入赛程页,保持现有点击行为。
|
||||
|
||||
验证记录:
|
||||
- 已执行 `npm run build:h5`,H5 构建通过。
|
||||
- 已在本地 `http://localhost:5177/packages_match/pages/worldcup` 点击“其他赛事”后验证快捷 Tab 展示,并点击“赔率”确认可进入世界杯赔率列表。
|
||||
- 已执行项目部署脚本,同步到测试服运行目录,自动提交 `c9ac46f`。
|
||||
|
||||
### 83. 管理端赛事赔率列表
|
||||
|
||||
- 状态:已完成 - 时间:2026-07-10
|
||||
|
||||
完成内容:
|
||||
- 管理端在“赛事管理”菜单下新增“赔率列表”,对应组件 `match/odds/index`,菜单权限为 `match.matchOdds/index`。
|
||||
- 后端新增 `/adminapi/match.matchOdds/lists` 只读列表接口,基于 `la_match_odds` 展示第三方赔率记录,默认过滤没有任何盘口值的空赔率记录。
|
||||
- 赔率列表支持按平台、盘口类型、运动类型、联赛名称、球队/时间/来源ID 关键词筛选,并动态返回平台选项,便于后续接入多个赔率平台。
|
||||
- 管理端页面展示平台、盘口、运动、联赛、比赛双方、独赢、让球、大小球、半场独赢、玩法数量、来源ID、更新时间和来源线路。
|
||||
- 新增幂等菜单 SQL `docs/sql/insert_menu_match_odds.sql`,用于将“赔率列表”和隐藏查询权限挂到“赛事管理”下。
|
||||
|
||||
验证记录:
|
||||
- 已执行 `php -l server\app\adminapi\controller\match\MatchOddsController.php`、`php -l server\app\adminapi\lists\match\MatchOddsLists.php`,语法检查通过。
|
||||
- 已在 `admin` 目录执行 `npm run build`,管理端构建通过;构建产生的 `server/public/admin` 哈希产物已恢复,避免混入源码改动。
|
||||
- 已通过部署脚本将新增后端接口同步到测试服运行目录,并通过后台 API 写入菜单,确认“赔率列表”位于“赛事管理”下。
|
||||
- 已请求 `https://test-server.sbnews.net/adminapi/match.matchOdds/lists?page_no=1&page_size=5&sport_type=FT&has_odds=1`,接口返回 200,当前有赔率记录 48 条。
|
||||
- 已在本地管理端 `http://localhost:5176/match/match_odds` 验证页面渲染,菜单显示“赔率列表”,表格展示当前 `hg` 平台赔率数据(现展示名为“皇冠”)。
|
||||
|
||||
### 82. 世界杯专题赔率 Tab
|
||||
|
||||
- 状态:已完成 - 时间:2026-07-09
|
||||
|
||||
完成内容:
|
||||
- 后端新增 `/api/match/worldCupOdds` 接口,以 `la_match_odds` 赔率抓取结果为主数据源按比赛聚合返回,不强制绑定世界杯赛程;赛程匹配仅用于补充图标、状态和详情跳转。
|
||||
- 新增 `MatchOdds` 模型读取第三方赔率表,当前 `source_site=hg` 前端展示为“皇冠”,盘口类型展示为滚球盘/今日盘/早盘。
|
||||
- 用户端世界杯专题页在“比分和赛程”和“排名”之间新增“赔率”Tab,按赔率比赛卡片展示联赛、时间、主客队、平台、更新时间、独赢、让球、大小球赔率。
|
||||
- 赔率 Tab 支持按盘口类型筛选,并可通过关键词搜索联赛、主队、客队;后端接口同步支持 `show_type`、`source_site`、`keyword` 参数。
|
||||
- 后端会剔除没有任何盘口值的平台和比赛,避免前台展示只有赛程信息但没有赔率的空卡片。
|
||||
- 赔率比赛可匹配站内世界杯赛事时保留比赛详情跳转;未匹配站内赛事时仅展示第三方赔率。
|
||||
|
||||
验证记录:
|
||||
- 已执行 `php -l server\app\api\controller\MatchController.php`、`php -l server\app\common\model\match\MatchOdds.php`,语法检查通过。
|
||||
- 已执行 `npm run build:h5`,H5 构建通过。
|
||||
- 已请求 `https://test-server.sbnews.net/api/match/worldCupOdds?limit=300`,接口返回 200,当前可取到 45 场有盘口值的足球赔率,空赔率比赛为 0。
|
||||
- 已在本地 H5 `http://localhost:8991/packages_match/pages/worldcup?tab=odds` 验证“赔率”Tab 渲染,页面展示 45 张有盘口值的赔率比赛卡,包含当前 `hg` 平台(现展示名为“皇冠”)及独赢/让球/大小球赔率。
|
||||
|
||||
### 81. 第三方赛事赔率定时抓取
|
||||
|
||||
- 状态:已完成 - 时间:2026-07-09
|
||||
|
||||
完成内容:
|
||||
- Docker crawler 新增 `match_odds` 任务,支持依次尝试多条第三方线路,登录后拉取赛事赔率 XML,并同步到 `la_match_odds`。
|
||||
- 新增 `la_match_odds` 表,按 `source_site + source_match_id` 唯一更新,保存联赛、主客队、让球、大小球、独赢、半场赔率、来源原始节点和规范化盘口 JSON。
|
||||
- 赔率账号、密码、线路、运动类型、盘口范围均通过 `ODDS_*` / `HG_ODDS_*` 环境变量配置,未硬编码到代码或文档。
|
||||
- `docker/crawler/config/crawler_tasks.yaml` 注册 `match_odds`,默认每 5 分钟执行;`entrypoint.sh` 已把 `ODDS_` / `HG_ODDS_` 环境变量写入 cron 环境文件。
|
||||
- `docs/sql/create_match_odds_table.sql`、`docs/sql/insert_crontab_match_odds.sql` 已补齐幂等初始化脚本,`sbnews.sql` 已同步表结构。
|
||||
|
||||
验证记录:
|
||||
- 已执行 `python -m unittest docker.crawler.tests.test_match_odds`,5 个用例通过。
|
||||
- 已执行 `python -m unittest docker.crawler.tests.test_docker_task_runner`,7 个用例通过。
|
||||
- 已执行 `python -m py_compile docker/crawler/match_odds.py docker/crawler/main.py`,语法检查通过。
|
||||
- 已在测试库执行建表和定时任务 SQL,确认 `la_match_odds` 存在,`la_dev_crontab` 中 `crawler match_odds` 任务 ID 为 47。
|
||||
- 已进行真实线路抓取验证:来源 `https://205.201.0.120/`,最近一次抓取成功入库 65 场,跳过当前账号不可用/无日期组合 28 项,失败 0 项;测试库累计足球赔率 70 场(滚球 8、今日 62)。
|
||||
|
||||
### 80. AI分析统一请求接口与免费次数扣减
|
||||
|
||||
- 状态:已完成 - 时间:2026-07-05
|
||||
|
||||
完成内容:
|
||||
- 后端新增 `AiAnalysisRequestService`,统一承接赛事分段/完整预测、资讯分析、社区帖子分析、彩票总分析、彩票模块分析、用户可信度分析,并由 `/api/ai/analyze` 统一分发。
|
||||
- 后端新增 `la_ai_quota_unlock` 通用解锁表和 `AiQuotaUnlock` 模型,按 `analysis_type + analysis_key` 记录用户已解锁内容;同一比赛、文章、帖子、同一彩种最新期彩票分析重复查看不再重复扣减。
|
||||
- `AiQuotaService` 扩展为统一扣次服务:普通用户每日免费 3 次,VIP 展示 999 次;通用入口扣次成功后返回 `remain_count`、`charged`、`unlocked`。
|
||||
- 兼容旧接口:`/api/ai/*`、`/api/lottery/ai*`、`/api/community/aiAnalysis` 均改为代理到统一服务,避免旧页面绕过扣次。
|
||||
- 用户端 `uniapp/src/api/ai.ts` 新增 `requestAiAnalysis`,彩票、社区、赛事、资讯等 API 封装已统一走 `/api/ai/analyze`;页面接收 `remain_count` 后同步刷新免费剩余次数展示。
|
||||
|
||||
涉及模块:
|
||||
- `server/app/api/controller/AiController.php`
|
||||
- `server/app/api/controller/LotteryController.php`
|
||||
- `server/app/api/controller/CommunityController.php`
|
||||
- `server/app/common/service/ai/AiAnalysisRequestService.php`
|
||||
- `server/app/common/service/ai/AiQuotaService.php`
|
||||
- `server/app/common/model/ai/AiQuotaUnlock.php`
|
||||
- `server/app/common/model/ai/AiUnlock.php`
|
||||
- `uniapp/src/api/ai.ts`
|
||||
- `uniapp/src/api/lottery.ts`
|
||||
- `uniapp/src/api/community.ts`
|
||||
- `uniapp/src/pages/ai_analysis/ai_analysis.vue`
|
||||
- `uniapp/src/pages/match_detail/match_detail.vue`
|
||||
- `uniapp/src/pages/lottery_analysis/lottery_analysis.vue`
|
||||
- `uniapp/src/packages_lottery/pages/index.vue`
|
||||
- `uniapp/src/packages_lottery/pages/draw_list.vue`
|
||||
- `docs/sql/create_ai_quota_unlock.sql`
|
||||
- `sbnews.sql`
|
||||
|
||||
验证记录:
|
||||
- 已执行 `php -l` 检查 `AiController.php`、`LotteryController.php`、`CommunityController.php`、`AiQuotaService.php`、`AiAnalysisRequestService.php`、`AiQuotaUnlock.php`、`AiUnlock.php`,均通过。
|
||||
- 已在测试库执行幂等建表,确认 `la_ai_quota_unlock` 已存在。
|
||||
- 已执行 `npm run build:h5`,H5 构建通过并复制产物到 `server/public/mobile`。
|
||||
- 已执行源码搜索,确认用户端 AI 分析 API 封装不再请求旧的 `/ai/matchPredict`、`/ai/articleAnalysis`、`/lottery/aiPredict`、`/community/aiAnalysis` 等分析入口。
|
||||
|
||||
### 79. AI分析入口与每日免费额度统一整理
|
||||
|
||||
- 状态:已完成 - 时间:2026-07-05
|
||||
|
||||
完成内容:
|
||||
- 梳理系统内 AI 分析入口:用户端赛事分段预测、资讯深度解读、社区帖子分析、彩票总分析/模块分析/独立预测页;管理端包含 AI 配置、AI 分析记录、AI 日志、知识库相关配置与查询记录。
|
||||
- 后端新增 `AiQuotaService`,统一维护 AI 每日免费次数为 3 次、VIP 剩余额度展示为 999,并复用到用户 VIP 信息和赛事 AI 解锁扣次逻辑,避免后续多处硬编码。
|
||||
- 用户端新增 `uniapp/src/config/ai.ts`,统一维护“每日免费3次AI分析”文案和默认剩余额度;赛事、资讯、AI 分析页、彩票分析页、彩票首页、开奖列表的免费额度展示已统一读取该配置。
|
||||
- 已将测试库/运行库未删除用户的 `ai_free_count` 恢复为 3,`ai_free_date` 恢复为 2026-07-05。
|
||||
|
||||
涉及模块:
|
||||
- `server/app/common/service/ai/AiQuotaService.php`
|
||||
- `server/app/common/model/user/User.php`
|
||||
- `server/app/common/model/ai/AiUnlock.php`
|
||||
- `uniapp/src/config/ai.ts`
|
||||
- `uniapp/src/pages/ai_analysis/ai_analysis.vue`
|
||||
- `uniapp/src/pages/match_detail/match_detail.vue`
|
||||
- `uniapp/src/pages/news_detail/news_detail.vue`
|
||||
- `uniapp/src/pages/lottery_analysis/lottery_analysis.vue`
|
||||
- `uniapp/src/packages_lottery/pages/index.vue`
|
||||
- `uniapp/src/packages_lottery/pages/draw_list.vue`
|
||||
|
||||
验证记录:
|
||||
- 已执行源码搜索,确认 AI 免费次数默认值集中在后端 `AiQuotaService::DAILY_FREE_COUNT`、前端 `AI_DAILY_FREE_COUNT` 和 SQL 表结构默认值 3。
|
||||
- 已执行数据库恢复脚本,确认未删除用户 `224/224` 均恢复为今日剩余 3 次。
|
||||
|
||||
### 78. 安卓端新闻详情正文渲染修复
|
||||
|
||||
- 状态:已完成 - 时间:2026-07-05
|
||||
|
||||
完成内容:
|
||||
- 排查 `/pages/news_detail/news_detail` 安卓端详情正文不显示,确认接口 `/api/article/detail` 正常返回 `content`,问题集中在 App 端富文本渲染链路。
|
||||
- 修复正文图片 HTML 归一化:自闭合 `<img ... />` 追加 `referrerpolicy` 和样式前会先移除末尾 `/`,避免生成 `<img ... / referrerpolicy=...>` 这类畸形标签。
|
||||
- 非 H5 端正文块改为使用项目已有 `u-parse` 解析 HTML,并补充移动端正文标签样式,降低 App `rich-text` 直接消费 HTML 字符串导致的空白风险;H5 端保留原 `v-html` 渲染。
|
||||
|
||||
涉及模块:
|
||||
- `uniapp/src/pages/news_detail/news_detail.vue`
|
||||
|
||||
验证记录:
|
||||
- 已用测试服文章 `id=2430879` 确认详情接口返回正文 `content`。
|
||||
- 已执行一次性静态检查,确认 App 端使用 `u-parse` 且图片归一化不再保留错误斜杠。
|
||||
- 已执行 `npm run build:app`,App 目标构建通过。
|
||||
- 已执行 `npm run build:h5`,H5 构建通过;构建生成的 `server/public/mobile` 哈希产物已清理回构建前状态,避免混入源码修复。
|
||||
- 已执行项目约定部署命令,部署脚本自动提交 `074aa7a` 并同步到 `/www/wwwroot/api.sbnews.net`。
|
||||
|
||||
### 77. 新闻详情底部评论操作区优化
|
||||
|
||||
- 状态:已完成 - 时间:2026-07-04
|
||||
|
||||
完成内容:
|
||||
- 用户端新闻详情页 `/pages/news_detail/news_detail` 底部操作区已移除“不喜欢”入口,不再展示点踩按钮和点踩数量。
|
||||
- 评论输入入口改为带图标、主提示和讨论数副提示的胶囊布局,右侧仅保留点赞、收藏、分享三个固定宽度操作,降低底栏拥挤和文字溢出风险。
|
||||
- 点赞数增加万级与 `999+` 展示兜底,无点赞时显示“点赞”,保持操作含义清晰。
|
||||
|
||||
涉及模块:
|
||||
- `uniapp/src/pages/news_detail/news_detail.vue`
|
||||
|
||||
验证记录:
|
||||
- 已执行 `npm run build:h5`,H5 构建通过,构建产物已复制到 `server/public/mobile`。
|
||||
|
||||
### 76. 世界杯直播卡展示主播与房间信息
|
||||
|
||||
- 状态:已完成 - 时间:2026-07-03
|
||||
|
||||
完成内容:
|
||||
- 前台 `/api/match/worldCupLiveCards` 增加透出 `la_match_live` 中的主播与房间字段:`anchor_name`、`anchor_avatar`、`room_view_count`、`room_focus_count`、`room_notice`。
|
||||
- 用户端世界杯直播卡片 `worldcup-live-card__meta` 改为展示主播头像/昵称、观看数、关注数和直播间公告,人数支持万级格式化并提供空值兜底。
|
||||
- `WorldCupLiveCardItem` 类型已同步补齐上述字段,避免后续调用方继续依赖索引签名。
|
||||
|
||||
涉及模块:
|
||||
- `server/app/common/service/match/MatchLiveService.php`
|
||||
- `uniapp/src/api/match.ts`
|
||||
- `uniapp/src/packages_match/components/WorldCupPanel.vue`
|
||||
|
||||
验证记录:
|
||||
- 已执行 `php -l server/app/common/service/match/MatchLiveService.php`,PHP 语法检查通过。
|
||||
- 已执行 `npm run build:h5`,H5 构建通过;构建生成的 `server/public/mobile` 哈希产物已恢复,避免混入源码改动。
|
||||
- 已执行项目约定部署命令,部署脚本自动提交 `b1539d9` 并同步到 `/www/wwwroot/api.sbnews.net`。
|
||||
|
||||
### 75. 管理端直播管理接入 la_match_live
|
||||
|
||||
- 状态:已完成 - 时间:2026-07-01
|
||||
|
||||
完成内容:
|
||||
- 管理端新增独立“直播管理”页面,放在“赛事管理”一级菜单下,数据以 `la_match_live` 为主表展示。
|
||||
- 后台列表支持按赛事ID、线路标题、播放类型、抓取状态、来源域名、热门标记筛选,并展示 `play_type`、`iframe_url`、`source_domain`、`source_is_hot`、`fetch_status_text` 等 HTML/视频流线路字段。
|
||||
- `MatchLiveLists` 不再在未传 `match_id` 时强制追加 `match_id=0`,因此菜单入口可以直接分页查看全部直播线路;从赛事列表点“直播线路”仍可带 `match_id` 进入单场筛选。
|
||||
- `insert_menu_match_live.sql` 已调整为将 `match.matchLive/index` 挂到 `paths='match'` 的赛事管理目录下,菜单名为“直播管理”,并设为显示。
|
||||
- 已构建管理端并覆盖测试服后台静态产物,旧后台产物备份为 `/www/wwwroot/test-server.sbnews.net/server/public/admin.bak-20260701151143`。
|
||||
|
||||
涉及模块:
|
||||
- `admin/src/views/match/live/index.vue`
|
||||
- `admin/src/views/match/lists/components/MatchLiveTable.vue`
|
||||
- `admin/src/api/match.ts`
|
||||
- `server/app/adminapi/lists/match/MatchLiveLists.php`
|
||||
- `server/app/adminapi/logic/match/MatchLiveLogic.php`
|
||||
- `docs/sql/insert_menu_match_live.sql`
|
||||
- `qa/frontend/test_admin_match_live_management_static.py`
|
||||
|
||||
验证记录:
|
||||
- 已先新增 `qa/frontend/test_admin_match_live_management_static.py` 红灯检查,修改前因直播页仍依赖单场赛事上下文失败。
|
||||
- 已执行 `C:\Python311\python.exe qa/frontend/test_admin_match_live_management_static.py`,静态检查通过。
|
||||
- 已执行 `php -l server/app/adminapi/lists/match/MatchLiveLists.php`、`php -l server/app/adminapi/logic/match/MatchLiveLogic.php`,PHP 语法检查通过。
|
||||
- 已在 `admin` 目录执行 `npm run build`,管理端构建通过,产物复制到 `server/public/admin`。
|
||||
- 已在测试服执行菜单 SQL,确认 `直播管理` 的父级为 `赛事管理`,`is_show=1`,超级管理员角色已拥有 `index/detail/add/edit/delete` 5 个权限节点。
|
||||
- 已验证 `https://test-admin.sbnews.net/` 返回 200,构建产物中可检索到“直播管理”。
|
||||
- 本次未执行自动部署脚本:当前工作区存在任务前已有的无关未提交改动,部署脚本会自动暂存/提交发布范围内容;本次按用户要求直接将相关源码、SQL 与构建产物同步到测试服。
|
||||
|
||||
### 74. 赛事直播流定时抓取恢复与 Docker 调度优化
|
||||
|
||||
- 状态:已完成 - 时间:2026-06-21
|
||||
@@ -127,7 +443,7 @@
|
||||
- 根目录部署默认范围继续包含 `server/`、`uniapp/`、`admin/` 与 `docker/`,并默认排除 `docker/.env`、`docker/.env.docker`、`docker/crawler/venv`、`docker/crawler/logs`、`docker/crawler/data`、`test_output.txt` 与临时脚本,避免密钥、日志、缓存和样例输出进入发布包。
|
||||
- 默认发布范围内如仍存在 `admin` 这类 root gitlink,部署脚本会跳过该 gitlink 的自动提交 pathspec,但仍从当前工作区把源码补进发布包,避免自动提交阶段被 gitlink 卡住。
|
||||
- `docker/crawler/Dockerfile` 在镜像构建时会把 `/app/docker/entrypoint.sh` 的 CRLF 换行归一为 LF,避免 Windows 上传后入口脚本报 `/usr/bin/env: 'bash\r': No such file or directory`。
|
||||
- `.vscode/sftp.json` 新增 `docker` 上传配置,远端目录为 `/www/wwwroot/test-server.sbnews.net/docker`,并忽略 Docker 密钥与 crawler 运行态目录。
|
||||
- `.vscode/sftp.json` 新增 `docker` 上传配置,远端目录为 `/www/wwwroot/api.sbnews.net/docker`,并忽略 Docker 密钥与 crawler 运行态目录。
|
||||
- `README.md` 已同步 Docker 爬虫源码目录、任务清单路径、默认发布目录结构和服务器 `CRAWLER_DIR` 注意事项。
|
||||
|
||||
涉及模块:
|
||||
@@ -144,8 +460,8 @@
|
||||
验证记录:
|
||||
- 已执行 `git diff --check -- docker/docker-compose.crawler.yml docker/.env.example docker/.gitignore docker/crawler/.dockerignore docker/crawler/.gitignore scripts/deploy-server.ps1 README.md 业务进度管理.md`,未发现空白错误。
|
||||
- 已执行 `deploy-server.ps1` PowerShell 语法解析检查,通过。
|
||||
- 已在临时 Git 克隆中执行 `powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -RemoteDir /www/wwwroot/test-server.sbnews.net -DryRun`,确认全量包默认包含 `server`、`uniapp`、`admin`、`docker`,且未上传到服务器。
|
||||
- 已在临时 Git 克隆中执行 `powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -AutoIncremental -AutoIncrementalCommits 3 -RemoteDir /www/wwwroot/test-server.sbnews.net -DryRun`,确认迁移提交范围会上传 `docker/crawler` 源码并跳过 `docker/crawler/data`、`logs`、`venv`、`test_output.txt` 等运行态/输出文件。
|
||||
- 已在临时 Git 克隆中执行 `powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -RemoteDir /www/wwwroot/api.sbnews.net -DryRun`,确认全量包默认包含 `server`、`uniapp`、`admin`、`docker`,且未上传到服务器。
|
||||
- 已在临时 Git 克隆中执行 `powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -AutoIncremental -AutoIncrementalCommits 3 -RemoteDir /www/wwwroot/api.sbnews.net -DryRun`,确认迁移提交范围会上传 `docker/crawler` 源码并跳过 `docker/crawler/data`、`logs`、`venv`、`test_output.txt` 等运行态/输出文件。
|
||||
- 本机未安装 `docker` 命令,因此未在本机执行 `docker compose -f docker-compose.crawler.yml config`;该项需要在服务器或已安装 Docker 的环境验证。
|
||||
|
||||
### 68. 默认部署切换为根目录同时上传 server、uniapp 与 admin
|
||||
@@ -168,7 +484,7 @@
|
||||
- 已在临时最小 Git 仓库执行默认 `powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -DryRun -RemoteDir /tmp/test`,修改前日志只出现 `server` 打包,确认红灯。
|
||||
- 修改后已在临时最小 Git 仓库执行默认 `powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -DryRun -AutoIncremental -AutoIncrementalCommits 3 -RemoteDir /tmp/test`,日志已同时出现 `server/app/ok.txt`、`uniapp/src/App.vue` 与 `admin/src/main.ts` 的增量变更,确认根目录模式能同时覆盖三套源码。
|
||||
- 已补跑 `powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -SourceDir server -DryRun -RemoteDir /tmp/test`,确认显式单独发布 `server` 的老用法仍可继续使用。
|
||||
- 已在真实仓库执行 `powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -DryRun -AutoIncremental -AutoIncrementalCommits 3 -RemoteDir /www/wwwroot/test-server.sbnews.net`,日志出现 `root gitlink include paths will be copied from working tree: admin` 与 `+ admin/`,确认 `admin` 仍是 gitlink 记录时也会被补进增量包。
|
||||
- 已在真实仓库执行 `powershell -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -DryRun -AutoIncremental -AutoIncrementalCommits 3 -RemoteDir /www/wwwroot/api.sbnews.net`,日志出现 `root gitlink include paths will be copied from working tree: admin` 与 `+ admin/`,确认 `admin` 仍是 gitlink 记录时也会被补进增量包。
|
||||
- 已在真实仓库执行默认全量 DryRun,日志显示 `working tree include paths: server uniapp admin`,确认全量包也会同时包含三套源码。
|
||||
|
||||
### 67. 部署脚本支持发布 uniapp 源码到服务器
|
||||
@@ -254,7 +570,7 @@
|
||||
- 已执行 `C:\Python311\python.exe -m py_compile server/public/dongqiudi-crawler/ai_comment_dispatch.py server/public/dongqiudi-crawler/main.py server/public/dongqiudi-crawler/scripts/docker_task_runner.py qa/backend/test_ai_comment_dispatch_static.py`,Python 语法检查通过。
|
||||
- 已在测试库执行 `docs/sql/create_ai_comment_task.sql`、`docs/sql/insert_ai_comment_config.sql`、`docs/sql/disable_article_ai_comment_crontab.sql`,确认 `la_ai_comment_task` 建表成功、`auto_comment_*` 配置写入成功,旧 `article_ai_comment` 定时任务已停用。
|
||||
- 已用远端测试库配置手动执行一轮 `ai_comment_dispatch` 最小联调,临时将单轮条数压到 2,实际成功创建 2 条任务:`article_id=2044144`、`post_id=5924`,均已写入对应评论表并将文章/帖子 `comment_count` 回写为 `1`。
|
||||
- 已在测试服 `/www/wwwroot/test-server.sbnews.net/docker` 执行 `sudo docker compose -f docker-compose.crawler.yml build crawler` 并强制删除旧 `sport-era-crawler` 容器后重新 `up -d --no-deps crawler`,当前 `sport-era-crawler` 已切到新容器并正常运行。
|
||||
- 已在测试服 `/www/wwwroot/api.sbnews.net/docker` 执行 `sudo docker compose -f docker-compose.crawler.yml build crawler` 并强制删除旧 `sport-era-crawler` 容器后重新 `up -d --no-deps crawler`,当前 `sport-era-crawler` 已切到新容器并正常运行。
|
||||
- 已确认运行中容器内 `/etc/cron.d/sport-era-crawler` 已渲染 `ai_comment_dispatch` 的 `*/10 * * * *` 任务,且容器内可直接 `import ai_comment_dispatch`。
|
||||
|
||||
### 64. AI助手资讯类联网检索接入
|
||||
@@ -683,7 +999,7 @@
|
||||
- `README.md`
|
||||
|
||||
验证记录:
|
||||
- 已先执行 `powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -AutoIncremental -AutoIncrementalCommits 2 -RemoteDir /www/wwwroot/test-server.sbnews.net -DryRun`,修改前因参数不存在失败,确认覆盖新行为。
|
||||
- 已先执行 `powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\deploy-server.ps1 -AutoIncremental -AutoIncrementalCommits 2 -RemoteDir /www/wwwroot/api.sbnews.net -DryRun`,修改前因参数不存在失败,确认覆盖新行为。
|
||||
- 修改后已执行自定义 2 个提交 dry-run,日志显示 `auto incremental commits: 2`,只打包不上传。
|
||||
- 修改后已执行默认自动增量 dry-run,日志显示 `auto incremental commits: 1`,原命令兼容。
|
||||
- 已验证单独传 `-AutoIncrementalCommits` 且不带 `-AutoIncremental` 会报错阻止误用。
|
||||
@@ -0,0 +1,93 @@
|
||||
# 测试服务器运行环境
|
||||
|
||||
> 采集时间:2026-07-31 15:59(Asia/Shanghai;包含 Gitea 反向代理配置修复后的状态)
|
||||
>
|
||||
> 采集方式:通过 `ssh sbnews` 执行只读检查。本文记录当前快照,不包含账号、密码、环境变量等敏感信息。
|
||||
|
||||
## 服务器概况
|
||||
|
||||
| 项目 | 当前值 |
|
||||
| --- | --- |
|
||||
| 主机名 | `ip-172-31-25-241` |
|
||||
| 操作系统 | Ubuntu 22.04.5 LTS |
|
||||
| 已运行时间 | 13 周 6 天 10 小时 |
|
||||
| 项目运行目录 | `/www/wwwroot/test-server.sbnews.net` |
|
||||
|
||||
## 资源使用情况
|
||||
|
||||
| 资源 | 总量 | 已使用 | 可用 / 剩余 | 说明 |
|
||||
| --- | ---: | ---: | ---: | --- |
|
||||
| 内存 | 7.6 GiB | 3.9 GiB | 3.5 GiB 可用 | `free -h` 的 `available` 值,包含可回收缓存 |
|
||||
| Swap | 0 B | 0 B | 0 B | 未配置交换分区 |
|
||||
| 根分区 `/` | 124 GB | 64 GB | 61 GB | 使用率 52% |
|
||||
|
||||
## 宿主机运行服务
|
||||
|
||||
### 项目相关服务
|
||||
|
||||
| 服务 | 状态 | 用途 |
|
||||
| --- | --- | --- |
|
||||
| `nginx.service` | running | Web 服务与反向代理 |
|
||||
| `mysqld.service` | running | MySQL 数据库 |
|
||||
| `docker.service` | running | Docker 容器引擎 |
|
||||
| `containerd.service` | running | Docker 容器运行时 |
|
||||
| `cron.service` | running | 宿主机定时任务 |
|
||||
| `supervisord.service` | running | 进程守护 |
|
||||
| `mtranserver.service` | running | 本地翻译服务 |
|
||||
| `site_total.service` | running | 站点统计服务 |
|
||||
| `pure-ftpd.service` | running | FTP 服务 |
|
||||
| `ssh.service` | running | SSH 远程访问 |
|
||||
| `redis-server.service` | inactive | 本机 Redis 服务未运行,且未发现 TCP 6379 监听 |
|
||||
|
||||
系统同时运行 chrony、日志、网络、BT 面板等基础服务;完整服务清单可通过 `systemctl list-units --type=service --state=running` 查看。
|
||||
|
||||
## Docker 运行状态
|
||||
|
||||
- Docker 版本:`29.1.3`
|
||||
- Compose 项目:`docker`
|
||||
- Compose 配置:`/www/wwwroot/test-server.sbnews.net/docker/docker-compose.crawler.yml`
|
||||
- Docker 负责运行 Python 爬虫与容器内 cron;本次确认 Nginx、MySQL 由宿主机服务提供。
|
||||
- Gitea 以独立 Docker 容器运行,详情见 [Gitea 部署说明](./Gitea部署说明.md)。
|
||||
|
||||
### 容器
|
||||
|
||||
| 容器 | 镜像 | 状态 | 重启策略 | 挂载 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| `gitea` | `docker.gitea.com/gitea:1.27.1` | 正常运行,Nginx HTTPS 域名反代至 HTTP `3000` | `unless-stopped` | Docker 卷 `gitea-data` → `/data` |
|
||||
| `sport-era-crawler` | `sport-era-crawler:latest` | 正常运行,已持续 2 周 | `always` | crawler `logs` → `/app/logs`;crawler `data` → `/app/data` |
|
||||
| `sport-era-kb-worker` | `sport-era-crawler:latest` | 已退出,Docker 持续重启 | `always` | 与 crawler 共用 `logs`、`data` 挂载 |
|
||||
|
||||
### Docker 存储占用
|
||||
|
||||
| 类别 | 占用 | 可回收 |
|
||||
| --- | ---: | ---: |
|
||||
| 镜像 | 13.03 GB | 13.03 GB |
|
||||
| 容器 | 126.8 MB | 0 B |
|
||||
| 构建缓存 | 12.04 GB | 9.627 GB |
|
||||
| 本地卷 | 5.444 kB | 0 B |
|
||||
|
||||
> 以上数值来自 `docker system df`。即使 Docker 显示可回收空间,也不得未经确认直接执行清理命令,避免影响正在使用的镜像或后续回滚。
|
||||
|
||||
## 待处理风险
|
||||
|
||||
- `sport-era-kb-worker` 当前退出码为 `1`,重启次数为 `17`,在 Compose 中显示 `Restarting (1)` 已约 3 周。
|
||||
- 本机 `redis-server.service` 为 inactive,且未发现 TCP 6379 监听。项目是否改用远程 Redis 或其他缓存连接,需以服务器 `server/.env` 为准后再确认。
|
||||
- Gitea 已监听 `0.0.0.0:3000`,正式入口为 `https://git.zones.sbnews.net/`。Nginx 反代和 Gitea 的根地址已统一为该域名,浏览器静态资源与健康检查已通过。
|
||||
- 本次仅记录运行状态,未读取日志、未重启容器、未修改服务器。排查时可优先使用:
|
||||
|
||||
~~~
|
||||
ssh sbnews
|
||||
sudo docker logs --tail 200 sport-era-kb-worker
|
||||
sudo docker inspect sport-era-kb-worker
|
||||
~~~
|
||||
|
||||
## 常用只读检查命令
|
||||
|
||||
~~~
|
||||
ssh sbnews
|
||||
free -h
|
||||
df -h /
|
||||
sudo docker ps
|
||||
sudo docker compose -f /www/wwwroot/test-server.sbnews.net/docker/docker-compose.crawler.yml ps
|
||||
sudo docker system df
|
||||
~~~
|
||||
@@ -0,0 +1,15 @@
|
||||
# 比赛详情赔率绑定实施计划
|
||||
|
||||
**目标:** 隐藏独立赔率入口,并在比赛详情页按比赛双方名称和日期展示多平台盘口。
|
||||
|
||||
**实现方式:** 保留现有通用赔率列表代码,通过显示开关隐藏入口;扩展 `/api/match/odds` 的可选文本筛选参数;详情页首次进入赔率 Tab 时请求并展示当前比赛的平台盘口。
|
||||
|
||||
## 任务
|
||||
|
||||
- [x] 修改 `server/app/api/controller/MatchController.php`:读取 `home_team`、`away_team`、`match_date`,在通用赔率查询中增加可选文本筛选和日期格式兼容。
|
||||
- [x] 修改 `uniapp/src/api/match.ts`:为 `getMatchOdds` 增加三个可选请求参数。
|
||||
- [x] 修改 `uniapp/src/packages_match/components/MatchCenterTabsPanel.vue`:通过开关隐藏赛事中心赔率 Tab,保留原实现。
|
||||
- [x] 修改 `uniapp/src/packages_match/components/WorldCupPanel.vue`:通过开关隐藏世界杯赔率 Tab,并避免旧 `tab=odds` 激活隐藏页面。
|
||||
- [x] 修改 `uniapp/src/pages/match_detail/match_detail.vue`:新增赔率 Tab、平台筛选、懒加载和盘口展示,隐藏比赛数据里的旧简易赔率。
|
||||
- [x] 更新 `业务进度管理.md`:记录比赛详情赔率绑定方式和独立入口隐藏状态。
|
||||
- [x] 静态复核请求参数、Tab 状态、模板标签和工作区改动;不自动执行构建、测试、提交或部署。
|
||||
@@ -0,0 +1,28 @@
|
||||
# 比赛详情赔率绑定设计
|
||||
|
||||
## 目标
|
||||
|
||||
- 赛事中心和世界杯专题页不再显示独立赔率 Tab,但保留原赔率功能代码。
|
||||
- 赔率强绑定到比赛详情页,在详情 Tab 中展示当前比赛的滚球、球探及后续平台盘口。
|
||||
- 绑定不依赖站内 `match_id`,由比赛双方名称和比赛日期进行文本匹配。
|
||||
|
||||
## 交互设计
|
||||
|
||||
- 比赛详情 Tab 顺序调整为:文字直播、比赛数据、赔率、阵容、近期战绩、AI分析。
|
||||
- 进入详情页时不立即请求赔率;首次切换到赔率 Tab 时按需加载。
|
||||
- 赔率页提供“全部平台 / 滚球 / 球探”平台筛选,不提供联赛或球队搜索。
|
||||
- 每个平台展示独赢、让球、大小球盘口;没有匹配数据时展示“暂无赔率”。
|
||||
- 比赛数据 Tab 中原有的简易主胜/平/客胜区域隐藏,避免重复展示。
|
||||
|
||||
## 数据绑定
|
||||
|
||||
- 用户端调用 `/api/match/odds` 时传入 `home_team`、`away_team`、`match_date`。
|
||||
- 后端对主队、客队字段分别进行文本包含匹配。
|
||||
- `match_date` 统一按 `YYYY-MM-DD` 传递,后端兼容赔率记录中的 `YYYY-MM-DD`、`MM-DD`、`YYYY/MM/DD`、`MM/DD` 日期文本。
|
||||
- 未传入上述条件时,`/api/match/odds` 保持原通用列表行为,兼容现有调用方。
|
||||
|
||||
## 显示开关
|
||||
|
||||
- `MatchCenterTabsPanel.vue` 和 `WorldCupPanel.vue` 使用本地布尔开关过滤赔率 Tab。
|
||||
- 原赔率模板、状态与请求逻辑保留,后续恢复入口时只需调整开关。
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
| 设计稿名称 | uniapp 页面路径 | 状态 | 备注 |
|
||||
| --- | --- | --- | --- |
|
||||
| 赛事中心(含世界杯专题入口) | `uniapp/src/pages/match/match.vue` | ✅ 已完成 | 2026-05-20 按世界杯专题稿补充顶部蓝色专题入口,入口位于标题与运动分类之间 |
|
||||
| 赛事中心(含世界杯专题入口) | `uniapp/src/pages/match/match.vue` | ✅ 已完成 | 2026-07-11 赛程、直播、赔率改为在赛事中心当前内容区域切换;运动和联赛分类仅在赛程显示,赔率只保留盘口与联赛/球队搜索,顶部蓝色世界杯专题卡仍进入专题页 |
|
||||
| 赛事详情页 | `uniapp/src/pages/match_detail/match_detail.vue` | 🚧 部分完成 | 2026-05-29 优化顶部赛事摘要头部,补充联赛、对阵、状态与直播入口信息 |
|
||||
| 世界杯专题页(排名导航) | `uniapp/src/packages_match/pages/worldcup.vue` | 🚧 部分完成 | 2026-05-20 已按设计稿拆分排名导航、积分榜、球员榜组件,后续可继续细化表格视觉与新闻页样式 |
|
||||
| 首页 | `uniapp/src/pages/index/index.vue` | 待核对 | 需结合实际设计稿补充 |
|
||||
@@ -0,0 +1,6 @@
|
||||
# 赔率平台皇冠展示名实施计划
|
||||
|
||||
- [x] 修改前台 API 的 HG 平台名称映射。
|
||||
- [x] 修改管理端赔率列表的 HG 平台名称映射。
|
||||
- [x] 修改用户端赛事中心和比赛详情的默认平台名称。
|
||||
- [x] 更新业务进度并检查仍需保留的“滚球盘”文案。
|
||||
@@ -0,0 +1,6 @@
|
||||
# 赔率平台皇冠展示名设计
|
||||
|
||||
- 将 `source_site=hg` 的平台展示名称由“滚球”统一改为“皇冠”。
|
||||
- 前台接口、管理端赔率列表和用户端默认筛选选项保持一致。
|
||||
- `platform_key=hg`、数据库历史数据、抓取任务和“滚球盘”盘口类型保持不变。
|
||||
|
||||
@@ -0,0 +1,294 @@
|
||||
# 赛事中心赛程、直播、赔率组件实施计划
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use `executing-plans` to implement this plan task-by-task. 本项目未授权子代理、自动测试、构建、提交或部署。
|
||||
|
||||
**Goal:** 在赛事中心当前页面内用一个通用组件切换赛程、直播和赔率内容,不再因点击三个 Tab 切换到世界杯主题组件。
|
||||
|
||||
**Architecture:** `MatchCenterPanel.vue` 只保留赛事中心外壳和世界杯专题入口,新建 `MatchCenterTabsPanel.vue` 管理通用筛选、三个 Tab、数据加载和内容渲染。后端新增通用直播与赔率接口,并复用现有直播地址解析、赔率盘口格式化和赛事匹配逻辑;世界杯专题接口保持兼容。
|
||||
|
||||
**Tech Stack:** PHP 8 / ThinkPHP、Vue 3 `<script setup>`、TypeScript、uni-app、SCSS。
|
||||
|
||||
---
|
||||
|
||||
### Task 1: 通用直播查询
|
||||
|
||||
**Files:**
|
||||
- Modify: `server/app/common/service/match/MatchLiveService.php`
|
||||
- Modify: `server/app/api/controller/MatchController.php`
|
||||
|
||||
- [ ] **Step 1: 将世界杯直播查询抽成可传筛选条件的通用方法**
|
||||
|
||||
在 `MatchLiveService` 增加:
|
||||
|
||||
```php
|
||||
public static function getLiveCards(int $sportType = 0, string $leagueName = ''): array
|
||||
```
|
||||
|
||||
查询必须保留:
|
||||
|
||||
```php
|
||||
->leftJoin('match m', 'm.id = live.match_id')
|
||||
->where('live.fetch_status', 1)
|
||||
```
|
||||
|
||||
`MatchLive` 模型已启用 `SoftDelete`,查询自动排除已软删除记录,不额外重复拼接 `delete_time` 条件。
|
||||
|
||||
条件规则:
|
||||
|
||||
```php
|
||||
if ($sportType > 0) {
|
||||
$query->where('m.sport_type', $sportType);
|
||||
}
|
||||
if ($leagueName !== '') {
|
||||
$query->where('m.league_name', $leagueName);
|
||||
}
|
||||
```
|
||||
|
||||
`getWorldCupLiveCards()` 改为调用:
|
||||
|
||||
```php
|
||||
return self::getLiveCards();
|
||||
```
|
||||
|
||||
- [ ] **Step 2: 新增公开接口**
|
||||
|
||||
在 `MatchController::$notNeedLogin` 增加 `liveCards`,新增:
|
||||
|
||||
```php
|
||||
public function liveCards()
|
||||
{
|
||||
$sportType = $this->request->get('sport_type/d', 0);
|
||||
$leagueName = trim($this->request->get('league_name/s', ''));
|
||||
|
||||
return $this->data([
|
||||
'list' => MatchLiveService::getLiveCards($sportType, $leagueName),
|
||||
]);
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 3: 保持世界杯接口响应兼容**
|
||||
|
||||
`worldCupLiveCards()` 继续返回 `season_id` 和 `list`,不改变专题页字段结构,但不再强制按世界杯赛事过滤。
|
||||
|
||||
### Task 2: 通用赔率查询
|
||||
|
||||
**Files:**
|
||||
- Modify: `server/app/api/controller/MatchController.php`
|
||||
|
||||
- [ ] **Step 1: 抽取赔率列表构建方法**
|
||||
|
||||
新增私有方法:
|
||||
|
||||
```php
|
||||
private function getOddsList(
|
||||
string $showType,
|
||||
string $sourceSite,
|
||||
string $keyword,
|
||||
int $includeSpecial,
|
||||
int $limit,
|
||||
int $sportType = 0,
|
||||
string $leagueName = '',
|
||||
bool $worldCupEventOnly = false
|
||||
): array
|
||||
```
|
||||
|
||||
`sport_type` 映射规则:
|
||||
|
||||
```php
|
||||
private function resolveOddsSportType(int $sportType): string
|
||||
{
|
||||
$map = [1 => 'FT'];
|
||||
return $map[$sportType] ?? '';
|
||||
}
|
||||
```
|
||||
|
||||
当 `sportType > 0` 且无法映射时直接返回空数组。`leagueName` 非空时对 `MatchOdds.league_name` 做精确筛选。
|
||||
|
||||
- [ ] **Step 2: 将赛事匹配扩展为通用匹配**
|
||||
|
||||
将 `buildWorldCupEventMap()` 改为:
|
||||
|
||||
```php
|
||||
private function buildOddsEventMap(int $sportType = 0, string $leagueName = '', bool $worldCupOnly = false): array
|
||||
```
|
||||
|
||||
通用查询以 `MatchEvent::where('is_show', 1)` 为基础;根据参数增加 `sport_type`、`league_name` 或世界杯条件,继续按标准化主客队键匹配。
|
||||
|
||||
- [ ] **Step 3: 新增通用赔率接口并保持专题接口**
|
||||
|
||||
在 `MatchController::$notNeedLogin` 增加 `odds`。
|
||||
|
||||
```php
|
||||
public function odds()
|
||||
{
|
||||
return $this->data([
|
||||
'list' => $this->getOddsList(
|
||||
$this->request->get('show_type/s', ''),
|
||||
strtolower(trim($this->request->get('source_site/s', ''))),
|
||||
trim($this->request->get('keyword/s', '')),
|
||||
$this->request->get('include_special/d', 0),
|
||||
min(max($this->request->get('limit/d', 120), 1), 300),
|
||||
$this->request->get('sport_type/d', 0),
|
||||
trim($this->request->get('league_name/s', ''))
|
||||
),
|
||||
]);
|
||||
}
|
||||
```
|
||||
|
||||
`worldCupOdds()` 调用同一方法并传 `worldCupEventOnly=true`,继续返回 `season_id`。
|
||||
|
||||
### Task 3: 前端 API 类型与请求
|
||||
|
||||
**Files:**
|
||||
- Modify: `uniapp/src/api/match.ts`
|
||||
|
||||
- [ ] **Step 1: 将专题类型改成可复用类型**
|
||||
|
||||
新增别名或通用接口:
|
||||
|
||||
```ts
|
||||
export type MatchLiveCardItem = WorldCupLiveCardItem
|
||||
export type MatchOddsMatchItem = WorldCupOddsMatchItem
|
||||
```
|
||||
|
||||
- [ ] **Step 2: 增加通用请求方法**
|
||||
|
||||
```ts
|
||||
export function getMatchLiveCards(data?: {
|
||||
sport_type?: number
|
||||
league_name?: string
|
||||
}) {
|
||||
return request.get({ url: '/match/liveCards', data }, { withToken: false })
|
||||
}
|
||||
|
||||
export function getMatchOdds(data?: {
|
||||
sport_type?: number
|
||||
league_name?: string
|
||||
show_type?: 'live' | 'today' | 'early'
|
||||
source_site?: string
|
||||
keyword?: string
|
||||
include_special?: number
|
||||
limit?: number
|
||||
}) {
|
||||
return request.get({ url: '/match/odds', data }, { withToken: false })
|
||||
}
|
||||
```
|
||||
|
||||
世界杯请求方法保持不变。
|
||||
|
||||
### Task 4: 通用赛事中心 Tab 组件
|
||||
|
||||
**Files:**
|
||||
- Create: `uniapp/src/packages_match/components/MatchCenterTabsPanel.vue`
|
||||
- Modify: `uniapp/src/packages_match/components/MatchCenterPanel.vue`
|
||||
|
||||
- [ ] **Step 1: 创建组件状态**
|
||||
|
||||
组件内部定义:
|
||||
|
||||
```ts
|
||||
type MatchCenterTab = 'schedule' | 'live' | 'odds'
|
||||
type OddsShowType = '' | 'live' | 'today' | 'early'
|
||||
|
||||
const activeTab = ref<MatchCenterTab>('schedule')
|
||||
const currentSport = ref(0)
|
||||
const currentLeague = ref('')
|
||||
```
|
||||
|
||||
组件统一加载 `getSportTypes()`、`getMatchLeagues()`,运动和联赛分类只在赛程 Tab 显示并刷新赛程数据。
|
||||
|
||||
- [ ] **Step 2: 迁移赛程列表**
|
||||
|
||||
从 `MatchCenterPanel.vue` 迁移:
|
||||
|
||||
- `liveList`、`upcomingList`、`endedList`
|
||||
- 已结束赛事分页
|
||||
- `matchGroups`
|
||||
- 分组折叠
|
||||
- `fetchMatchList()`、`loadMore()`、`goDetail()`
|
||||
- 当前运动和联赛筛选
|
||||
- 现有 `match-card` 列表模板与样式
|
||||
|
||||
- [ ] **Step 3: 增加直播内容**
|
||||
|
||||
调用:
|
||||
|
||||
```ts
|
||||
getMatchLiveCards()
|
||||
```
|
||||
|
||||
直播卡复用世界杯直播卡现有的地址选择、主播信息、观看/关注人数格式化以及 H5/App 播放兼容逻辑,但不渲染世界杯主题头部。
|
||||
|
||||
- [ ] **Step 4: 增加赔率内容和筛选**
|
||||
|
||||
赔率请求:
|
||||
|
||||
```ts
|
||||
getMatchOdds({
|
||||
show_type: oddsShowType.value || undefined,
|
||||
keyword: oddsKeyword.value || undefined,
|
||||
include_special: 0,
|
||||
limit: 300
|
||||
})
|
||||
```
|
||||
|
||||
保留:
|
||||
|
||||
- 全部/滚球盘/今日盘/早盘筛选
|
||||
- 联赛/球队搜索输入框
|
||||
- 不显示运动分类和联赛分类条
|
||||
- 筛选、清空
|
||||
- 独赢、让球、大小球盘口卡
|
||||
- 匹配到站内赛事时进入比赛详情
|
||||
|
||||
- [ ] **Step 5: 精简赛事中心外壳**
|
||||
|
||||
`MatchCenterPanel.vue` 只保留:
|
||||
|
||||
```vue
|
||||
<view class="match-header__title">...</view>
|
||||
<view class="topic-entry" @tap="openWorldCupCenter">...</view>
|
||||
<MatchCenterTabsPanel />
|
||||
```
|
||||
|
||||
删除原 `topic-tabs` 的世界杯视图切换事件。蓝色专题卡仍调用:
|
||||
|
||||
```ts
|
||||
emit('open-worldcup', { tab: 'schedule', cid })
|
||||
```
|
||||
|
||||
### Task 5: 文档同步与人工验证建议
|
||||
|
||||
**Files:**
|
||||
- Modify: `业务进度管理.md`
|
||||
- Modify: `设计稿映射.md`
|
||||
|
||||
- [ ] **Step 1: 记录完成内容**
|
||||
|
||||
在业务进度中增加:
|
||||
|
||||
- 赛事中心三个通用 Tab。
|
||||
- 通用直播和赔率接口。
|
||||
- 世界杯专题入口与专题页保持兼容。
|
||||
- 本次未执行构建、测试和部署。
|
||||
|
||||
- [ ] **Step 2: 更新设计稿映射**
|
||||
|
||||
将赛事中心备注更新为“赛程/直播/赔率在当前页面内容区切换,世界杯专题卡仍进入专题页”。
|
||||
|
||||
- [ ] **Step 3: 建议验证命令,不自动执行**
|
||||
|
||||
```powershell
|
||||
php -l server\app\api\controller\MatchController.php
|
||||
php -l server\app\common\service\match\MatchLiveService.php
|
||||
cd uniapp
|
||||
npm run build:h5
|
||||
```
|
||||
|
||||
建议浏览器人工验证:
|
||||
|
||||
1. 赛事中心默认显示赛程。
|
||||
2. 三个 Tab 切换时 URL 和页面外壳不切换为世界杯主题。
|
||||
3. 直播不显示运动或联赛分类筛选,并展示全部可用直播。
|
||||
4. 赔率不显示运动或联赛分类条,盘口和联赛/球队关键词筛选有效。
|
||||
5. 世界杯专题卡仍能进入专题页。
|
||||
@@ -0,0 +1,98 @@
|
||||
# 赛事中心赛程、直播、赔率组件设计
|
||||
|
||||
## 目标
|
||||
|
||||
赛事中心在当前页面内提供“赛程 / 直播 / 赔率”三个内容 Tab。点击 Tab 只切换赛事列表区域,不再切换到世界杯主题组件。
|
||||
|
||||
蓝色世界杯专题卡继续保留,点击专题卡仍可进入原世界杯专题页;本次不删除或改变世界杯专题页原有功能。
|
||||
|
||||
## 页面结构
|
||||
|
||||
`MatchCenterPanel.vue` 保留赛事中心标题、AI 助手入口和世界杯专题卡。
|
||||
|
||||
新增通用赛事中心内容组件 `MatchCenterTabsPanel.vue`,统一负责:
|
||||
|
||||
- 赛程、直播、赔率 Tab 状态。
|
||||
- 赛程 Tab 的运动分类和联赛筛选。
|
||||
- 三类数据的加载、空状态和错误提示。
|
||||
- 赛事详情、直播播放等交互。
|
||||
|
||||
世界杯专题卡与三个内容 Tab 分离:只有专题卡触发 `open-worldcup`,三个内容 Tab 不再向 `MatchShellPage.vue` 发送世界杯视图切换事件。
|
||||
|
||||
## 赛程 Tab
|
||||
|
||||
- 默认选中赛程。
|
||||
- 沿用当前赛事中心的赛事列表样式和分组方式。
|
||||
- 保留运动分类、联赛筛选、进行中/未开始/已结束分组、折叠状态和已结束赛事分页加载。
|
||||
- 点击赛事卡继续进入现有比赛详情页。
|
||||
|
||||
## 直播 Tab
|
||||
|
||||
- 新增通用赛事直播接口,不复用只过滤世界杯的 `worldCupLiveCards`。
|
||||
- 以 `la_match_live` 的有效抓取状态和播放地址为准;赛事关联仅用于补充赛事信息,不作为显示前提。
|
||||
- 不显示运动分类或联赛分类筛选,直接展示当前可用的全部直播。
|
||||
- 直播卡保留赛事名称、主播、观看数、关注数、公告、封面和播放地址。
|
||||
- H5、App 的视频播放和海报模式继续复用现有世界杯直播卡的兼容处理。
|
||||
|
||||
## 赔率 Tab
|
||||
|
||||
- 新增通用赛事赔率接口,不再依赖世界杯赛事映射。
|
||||
- 继续读取 `la_match_odds`,保留滚球盘、今日盘、早盘筛选。
|
||||
- 保留联赛/球队关键词搜索。
|
||||
- 不显示赛程的运动分类或联赛分类筛选。
|
||||
- 仅保留盘口类型筛选,以及按联赛名、主队、客队进行关键词搜索。
|
||||
- 赔率记录与站内普通赛事匹配成功时补充赛事 ID、队徽、比分和状态,允许进入比赛详情;未匹配时只展示赔率。
|
||||
- 继续过滤没有任何有效盘口值的空赔率记录。
|
||||
|
||||
## 后端接口
|
||||
|
||||
在现有 `MatchController` 和赛事服务中增加通用接口:
|
||||
|
||||
- `GET /api/match/liveCards`
|
||||
- 参数:`sport_type`、`league_name`
|
||||
- 返回通用直播卡列表。
|
||||
- `GET /api/match/odds`
|
||||
- 参数:`sport_type`、`league_name`、`show_type`、`source_site`、`keyword`、`include_special`、`limit`
|
||||
- 返回按比赛聚合的赔率列表。
|
||||
|
||||
世界杯原接口继续保留,避免影响世界杯专题页:
|
||||
|
||||
- `/api/match/worldCupLiveCards`
|
||||
- `/api/match/worldCupOdds`
|
||||
|
||||
通用与世界杯接口复用服务层的查询、格式化和赛事匹配方法,避免复制赔率盘口组装与直播地址解析逻辑。
|
||||
|
||||
世界杯直播接口不再强制按世界杯赛事过滤,和通用直播接口一样展示当前有效直播流。
|
||||
|
||||
## 状态与交互
|
||||
|
||||
- 切换 Tab 时按需加载对应数据,已加载数据可缓存,筛选条件改变后重新请求。
|
||||
- 赛程、直播、赔率分别展示独立加载状态和空状态。
|
||||
- 接口失败时保留当前筛选条件并展示无数据/提示,不影响切回其他 Tab。
|
||||
- 赔率搜索确认、清除关键词和盘口切换均只刷新赔率数据。
|
||||
|
||||
## 改动范围
|
||||
|
||||
预计涉及:
|
||||
|
||||
- `uniapp/src/packages_match/components/MatchCenterPanel.vue`
|
||||
- `uniapp/src/packages_match/components/MatchCenterTabsPanel.vue`
|
||||
- `uniapp/src/api/match.ts`
|
||||
- `server/app/api/controller/MatchController.php`
|
||||
- `server/app/common/service/match/MatchLiveService.php`
|
||||
- 赔率通用查询相关服务或控制器辅助方法
|
||||
- `业务进度管理.md`
|
||||
- `设计稿映射.md`
|
||||
|
||||
不修改数据库表结构,不新增页面路由。
|
||||
|
||||
## 验收标准
|
||||
|
||||
1. 赛事中心默认显示赛程内容。
|
||||
2. 点击赛程、直播、赔率只切换当前页面列表区域。
|
||||
3. 三个 Tab 切换时不出现世界杯主题头部。
|
||||
4. 赛程保持现有赛事列表、运动分类、联赛筛选和分页行为。
|
||||
5. 直播展示通用赛事直播,不局限于世界杯。
|
||||
6. 赔率保留盘口分类和联赛/球队搜索筛选。
|
||||
7. 世界杯专题卡仍能进入原世界杯专题页。
|
||||
8. 原世界杯专题页的赛程、直播、赔率等功能不受影响。
|
||||
+1
-1
@@ -69,4 +69,4 @@ npm run generate
|
||||
- 接口 baseURL 由 `runtimeConfig` 或环境配置控制,不要写死。
|
||||
- 页面级数据获取优先使用 `useAsyncData` / `useFetch`。
|
||||
- 与 uniapp 共享前台接口契约,避免同一业务前台两套字段命名。
|
||||
- 设计稿与页面映射维护在根目录 `设计稿映射.md`。
|
||||
- 设计稿与页面映射维护在 `docs/设计稿映射.md`。
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
uid=3_0 RootWebArea "乐博头条" url="http://localhost:8993/"
|
||||
uid=3_0 RootWebArea "世博头条" url="http://localhost:8993/"
|
||||
uid=3_1 StaticText ""
|
||||
uid=3_2 StaticText "搜索乐博头条"
|
||||
uid=3_2 StaticText "搜索世博头条"
|
||||
uid=3_3 StaticText "推荐"
|
||||
uid=3_4 StaticText "世界杯"
|
||||
uid=3_5 StaticText "中超"
|
||||
|
||||
+66
@@ -153,6 +153,24 @@ CREATE TABLE `la_ai_unlock` (
|
||||
INDEX `idx_user_id`(`user_id` ASC) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'AI分析解锁记录' ROW_FORMAT = Dynamic;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for la_ai_quota_unlock
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `la_ai_quota_unlock`;
|
||||
CREATE TABLE `la_ai_quota_unlock` (
|
||||
`id` int UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`user_id` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '用户ID',
|
||||
`analysis_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '分析类型',
|
||||
`analysis_key` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '分析唯一Key',
|
||||
`ref_id` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联ID或哈希ID',
|
||||
`create_time` int UNSIGNED NULL DEFAULT NULL COMMENT '解锁时间',
|
||||
`update_time` int UNSIGNED NULL DEFAULT NULL COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
UNIQUE INDEX `uk_user_analysis`(`user_id` ASC, `analysis_key` ASC) USING BTREE,
|
||||
INDEX `idx_user_type`(`user_id` ASC, `analysis_type` ASC) USING BTREE,
|
||||
INDEX `idx_analysis_key`(`analysis_key` ASC) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'AI分析通用解锁记录表' ROW_FORMAT = Dynamic;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for la_article
|
||||
-- ----------------------------
|
||||
@@ -1042,6 +1060,54 @@ CREATE TABLE `la_match_data` (
|
||||
INDEX `idx_crawl_time`(`crawl_time` ASC) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 2964 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '比赛数据表' ROW_FORMAT = Dynamic;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for la_match_odds
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `la_match_odds`;
|
||||
CREATE TABLE `la_match_odds` (
|
||||
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`source_site` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '赔率来源',
|
||||
`source_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '来源线路',
|
||||
`source_match_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '来源比赛ID',
|
||||
`source_parent_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '来源主比赛ID',
|
||||
`source_league_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '来源联赛ID',
|
||||
`source_event_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '来源事件ID',
|
||||
`sport_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '运动类型',
|
||||
`show_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '盘口类型 live/today/early',
|
||||
`odds_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '赔率格式',
|
||||
`league_name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '联赛名称',
|
||||
`match_time_text` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '来源比赛时间文本',
|
||||
`home_team_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '主队来源ID',
|
||||
`away_team_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '客队来源ID',
|
||||
`home_team` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '主队名称',
|
||||
`away_team` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '客队名称',
|
||||
`strong_side` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '让球强弱方',
|
||||
`more_count` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '更多玩法数量',
|
||||
`is_running` tinyint UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否滚球',
|
||||
`handicap_line` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '让球盘口',
|
||||
`handicap_home_odds` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '主队让球赔率',
|
||||
`handicap_away_odds` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '客队让球赔率',
|
||||
`total_line` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '大小球盘口',
|
||||
`total_over_odds` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '大球赔率',
|
||||
`total_under_odds` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '小球赔率',
|
||||
`home_win_odds` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '主胜赔率',
|
||||
`draw_odds` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '平局赔率',
|
||||
`away_win_odds` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '客胜赔率',
|
||||
`half_handicap_line` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '上半场让球盘口',
|
||||
`half_home_win_odds` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '上半场主胜赔率',
|
||||
`half_draw_odds` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '上半场平局赔率',
|
||||
`half_away_win_odds` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '上半场客胜赔率',
|
||||
`create_time` int UNSIGNED NOT NULL DEFAULT 0,
|
||||
`raw_data` json NULL COMMENT '来源原始game节点',
|
||||
`markets_json` json NULL COMMENT '规范化盘口JSON',
|
||||
`update_time` int UNSIGNED NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
UNIQUE INDEX `uk_source_match`(`source_site` ASC, `source_match_id` ASC) USING BTREE,
|
||||
INDEX `idx_sport_show`(`sport_type` ASC, `show_type` ASC) USING BTREE,
|
||||
INDEX `idx_league`(`source_league_id` ASC) USING BTREE,
|
||||
INDEX `idx_update_time`(`update_time` ASC) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '第三方赛事赔率表' ROW_FORMAT = Dynamic;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for la_match_event
|
||||
-- ----------------------------
|
||||
|
||||
@@ -9,18 +9,18 @@ Usage:
|
||||
|
||||
Modes:
|
||||
1. Full deploy (no commit ids)
|
||||
./scripts/deploy-server.sh --remote-dir /www/wwwroot/test-server.sbnews.net
|
||||
./scripts/deploy-server.sh --remote-dir /www/wwwroot/api.sbnews.net
|
||||
|
||||
2. Incremental deploy (compare two commits)
|
||||
./scripts/deploy-server.sh \
|
||||
--from <old_commit> \
|
||||
--to <new_commit> \
|
||||
--remote-dir /www/wwwroot/test-server.sbnews.net
|
||||
--remote-dir /www/wwwroot/api.sbnews.net
|
||||
|
||||
3. Auto incremental deploy (compare latest two commits)
|
||||
./scripts/deploy-server.sh \
|
||||
--auto-incremental \
|
||||
--remote-dir /www/wwwroot/test-server.sbnews.net
|
||||
--remote-dir /www/wwwroot/api.sbnews.net
|
||||
|
||||
Options:
|
||||
--source-dir <dir> Local source directory, default: server
|
||||
|
||||
@@ -225,7 +225,7 @@ ${ZIP_NAME}
|
||||
|
||||
使用方法:
|
||||
1. 把 zip 上传到服务器 server 项目根
|
||||
例: /www/wwwroot/test-server.sbnews.net/
|
||||
例: /www/wwwroot/api.sbnews.net/
|
||||
2. 解压: unzip -o ${ZIP_NAME}
|
||||
3. 应用: bash apply.sh
|
||||
4. apply.sh 会自动删除废弃文件、清理空目录,并自我清理
|
||||
|
||||
+1
-1
@@ -89,7 +89,7 @@ Step 2: 前端并行消费契约
|
||||
Step 3: 集成联调与文档同步
|
||||
|
||||
- 检查接口响应格式、权限、字段、字典
|
||||
- 同步更新 `业务进度管理.md`
|
||||
- 同步更新 `docs/业务进度管理.md`
|
||||
```
|
||||
|
||||
## 与前端 Agent 的协作方式
|
||||
|
||||
@@ -184,7 +184,8 @@ class MatchOddsLists extends BaseAdminDataLists implements ListsExtendInterface
|
||||
public static function formatSourceSite(string $sourceSite): string
|
||||
{
|
||||
$map = [
|
||||
'hg' => '滚球',
|
||||
'hg' => '皇冠',
|
||||
'titan007' => '球探',
|
||||
];
|
||||
return $map[$sourceSite] ?? ($sourceSite !== '' ? strtoupper($sourceSite) : '未知平台');
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ use app\common\service\match\MatchLiveService;
|
||||
|
||||
class MatchController extends BaseApiController
|
||||
{
|
||||
public array $notNeedLogin = ['lists', 'detail', 'leagues', 'sportTypes', 'liveText', 'lineup', 'worldCupStandings', 'worldCupRankings', 'worldCupSchedule', 'worldCupLiveCards', 'worldCupOdds'];
|
||||
public array $notNeedLogin = ['lists', 'detail', 'leagues', 'sportTypes', 'liveText', 'lineup', 'liveCards', 'odds', 'worldCupStandings', 'worldCupRankings', 'worldCupSchedule', 'worldCupLiveCards', 'worldCupOdds'];
|
||||
|
||||
protected int $worldCupSeasonId = 26123;
|
||||
protected string $worldCupLeagueName = '世界杯';
|
||||
@@ -96,7 +96,7 @@ class MatchController extends BaseApiController
|
||||
$endedPageSize = $this->request->get('ended_page_size/d', 20);
|
||||
$endedOnly = $this->request->get('ended_only/d', 0);
|
||||
|
||||
$field = 'id,league_name,league_icon,home_team,home_icon,home_score,away_team,away_icon,away_score,sport_type,status,match_time,current_minute,half_score,home_odds,draw_odds,away_odds,home_corner,away_corner,home_yellow,away_yellow,home_red,away_red,is_hot,round_name';
|
||||
$field = 'id,competition_id,league_name,league_icon,home_team,home_icon,home_score,away_team,away_icon,away_score,sport_type,status,match_time,current_minute,half_score,home_odds,draw_odds,away_odds,home_corner,away_corner,home_yellow,away_yellow,home_red,away_red,is_hot,round_name';
|
||||
|
||||
// 基础筛选
|
||||
$baseWhere = [['is_show', '=', 1]];
|
||||
@@ -121,6 +121,7 @@ class MatchController extends BaseApiController
|
||||
|
||||
// 加载更多时只返回已结束数据
|
||||
if ($endedOnly) {
|
||||
$ended = $this->attachMoneylineOdds($ended);
|
||||
return $this->data([
|
||||
'ended' => [
|
||||
'lists' => $ended,
|
||||
@@ -139,6 +140,13 @@ class MatchController extends BaseApiController
|
||||
$upcoming = MatchEvent::where($baseWhere)->where('status', 0)
|
||||
->field($field)->order('match_time asc')->limit(20)->select()->toArray();
|
||||
|
||||
$liveCount = count($live);
|
||||
$upcomingCount = count($upcoming);
|
||||
$matches = $this->attachMoneylineOdds(array_merge($live, $upcoming, $ended));
|
||||
$live = array_slice($matches, 0, $liveCount);
|
||||
$upcoming = array_slice($matches, $liveCount, $upcomingCount);
|
||||
$ended = array_slice($matches, $liveCount + $upcomingCount);
|
||||
|
||||
return $this->data([
|
||||
'live' => $live,
|
||||
'upcoming' => $upcoming,
|
||||
@@ -151,6 +159,106 @@ class MatchController extends BaseApiController
|
||||
]);
|
||||
}
|
||||
|
||||
private function attachMoneylineOdds(array $matches): array
|
||||
{
|
||||
if (empty($matches)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$homeTeams = [];
|
||||
$awayTeams = [];
|
||||
$matchKeys = [];
|
||||
foreach ($matches as $index => &$match) {
|
||||
$match['home_odds'] = $this->normalizeMoneylineOdds($match['home_odds'] ?? '');
|
||||
$match['draw_odds'] = $this->normalizeMoneylineOdds($match['draw_odds'] ?? '');
|
||||
$match['away_odds'] = $this->normalizeMoneylineOdds($match['away_odds'] ?? '');
|
||||
|
||||
if ((int)($match['sport_type'] ?? 0) !== 1) {
|
||||
continue;
|
||||
}
|
||||
$key = $this->buildEventOddsMatchKey($match);
|
||||
if ($key === '') {
|
||||
continue;
|
||||
}
|
||||
$matchKeys[$index] = $key;
|
||||
$homeTeams[] = trim((string)($match['home_team'] ?? ''));
|
||||
$awayTeams[] = trim((string)($match['away_team'] ?? ''));
|
||||
}
|
||||
unset($match);
|
||||
|
||||
$homeTeams = array_values(array_unique(array_filter($homeTeams)));
|
||||
$awayTeams = array_values(array_unique(array_filter($awayTeams)));
|
||||
if (empty($matchKeys) || empty($homeTeams) || empty($awayTeams)) {
|
||||
return $matches;
|
||||
}
|
||||
|
||||
$rows = MatchOdds::where('sport_type', 'FT')
|
||||
->whereIn('home_team', $homeTeams)
|
||||
->whereIn('away_team', $awayTeams)
|
||||
->where(function ($query) {
|
||||
$query->where('home_win_odds', '<>', '')
|
||||
->whereOr('draw_odds', '<>', '')
|
||||
->whereOr('away_win_odds', '<>', '');
|
||||
})
|
||||
->field('home_team,away_team,match_time_text,home_win_odds,draw_odds,away_win_odds,update_time')
|
||||
->order('update_time desc')
|
||||
->select()
|
||||
->toArray();
|
||||
|
||||
$oddsMap = [];
|
||||
$scoreMap = [];
|
||||
foreach ($rows as $row) {
|
||||
$key = $this->buildOddsMatchKey($row);
|
||||
if (!in_array($key, $matchKeys, true)) {
|
||||
continue;
|
||||
}
|
||||
$odds = [
|
||||
'home_odds' => $this->normalizeMoneylineOdds($row['home_win_odds'] ?? ''),
|
||||
'draw_odds' => $this->normalizeMoneylineOdds($row['draw_odds'] ?? ''),
|
||||
'away_odds' => $this->normalizeMoneylineOdds($row['away_win_odds'] ?? ''),
|
||||
];
|
||||
$score = count(array_filter($odds, static fn($value) => $value !== ''));
|
||||
if ($score === 0 || $score <= ($scoreMap[$key] ?? -1)) {
|
||||
continue;
|
||||
}
|
||||
$oddsMap[$key] = $odds;
|
||||
$scoreMap[$key] = $score;
|
||||
}
|
||||
|
||||
foreach ($matchKeys as $index => $key) {
|
||||
if (!isset($oddsMap[$key])) {
|
||||
continue;
|
||||
}
|
||||
$matches[$index] = array_merge($matches[$index], $oddsMap[$key]);
|
||||
}
|
||||
return $matches;
|
||||
}
|
||||
|
||||
private function buildEventOddsMatchKey(array $match): string
|
||||
{
|
||||
$teamPairKey = $this->buildTeamPairKey(
|
||||
(string)($match['home_team'] ?? ''),
|
||||
(string)($match['away_team'] ?? '')
|
||||
);
|
||||
$timestamp = (int)($match['match_time'] ?? 0);
|
||||
if ($teamPairKey === '' || $timestamp <= 0) {
|
||||
return '';
|
||||
}
|
||||
if ($this->isWorldCupMatch($match)) {
|
||||
$timestamp += 8 * 60 * 60;
|
||||
}
|
||||
return $teamPairKey . '|' . date('m-d', $timestamp);
|
||||
}
|
||||
|
||||
private function normalizeMoneylineOdds($value): string
|
||||
{
|
||||
$value = trim((string)$value);
|
||||
if ($value === '' || !is_numeric($value) || (float)$value <= 0) {
|
||||
return '';
|
||||
}
|
||||
return $value;
|
||||
}
|
||||
|
||||
public function detail()
|
||||
{
|
||||
$id = $this->request->get('id/d');
|
||||
@@ -513,16 +621,80 @@ class MatchController extends BaseApiController
|
||||
]);
|
||||
}
|
||||
|
||||
public function liveCards()
|
||||
{
|
||||
$sportType = $this->request->get('sport_type/d', 0);
|
||||
$leagueName = trim($this->request->get('league_name/s', ''));
|
||||
|
||||
return $this->data([
|
||||
'list' => MatchLiveService::getLiveCards($sportType, $leagueName),
|
||||
]);
|
||||
}
|
||||
|
||||
public function odds()
|
||||
{
|
||||
return $this->data([
|
||||
'list' => $this->getOddsList(
|
||||
$this->request->get('show_type/s', ''),
|
||||
strtolower(trim($this->request->get('source_site/s', ''))),
|
||||
trim($this->request->get('keyword/s', '')),
|
||||
$this->request->get('include_special/d', 0),
|
||||
min(max($this->request->get('limit/d', 120), 1), 300),
|
||||
$this->request->get('sport_type/d', 0),
|
||||
trim($this->request->get('league_name/s', '')),
|
||||
false,
|
||||
trim($this->request->get('home_team/s', '')),
|
||||
trim($this->request->get('away_team/s', '')),
|
||||
trim($this->request->get('match_date/s', ''))
|
||||
),
|
||||
'platform_options' => $this->getOddsPlatformOptions(),
|
||||
]);
|
||||
}
|
||||
|
||||
public function worldCupOdds()
|
||||
{
|
||||
$showType = $this->request->get('show_type/s', '');
|
||||
$sourceSite = strtolower(trim($this->request->get('source_site/s', '')));
|
||||
$keyword = trim($this->request->get('keyword/s', ''));
|
||||
$includeSpecial = $this->request->get('include_special/d', 0);
|
||||
$limit = min(max($this->request->get('limit/d', 120), 1), 300);
|
||||
return $this->data([
|
||||
'season_id' => $this->worldCupSeasonId,
|
||||
'list' => $this->getOddsList(
|
||||
$this->request->get('show_type/s', ''),
|
||||
strtolower(trim($this->request->get('source_site/s', ''))),
|
||||
trim($this->request->get('keyword/s', '')),
|
||||
$this->request->get('include_special/d', 0),
|
||||
min(max($this->request->get('limit/d', 120), 1), 300),
|
||||
1,
|
||||
'',
|
||||
true
|
||||
),
|
||||
'platform_options' => $this->getOddsPlatformOptions(),
|
||||
]);
|
||||
}
|
||||
|
||||
private function getOddsList(
|
||||
string $showType,
|
||||
string $sourceSite,
|
||||
string $keyword,
|
||||
int $includeSpecial,
|
||||
int $limit,
|
||||
int $sportType = 0,
|
||||
string $leagueName = '',
|
||||
bool $worldCupEventOnly = false,
|
||||
string $homeTeam = '',
|
||||
string $awayTeam = '',
|
||||
string $matchDate = ''
|
||||
): array {
|
||||
$validShowTypes = ['live', 'today', 'early'];
|
||||
|
||||
$query = MatchOdds::where('sport_type', 'FT');
|
||||
$query = MatchOdds::where([]);
|
||||
if ($sportType > 0) {
|
||||
$oddsSportType = $this->resolveOddsSportType($sportType);
|
||||
if ($oddsSportType === '') {
|
||||
return [];
|
||||
}
|
||||
$query->where('sport_type', $oddsSportType);
|
||||
}
|
||||
if ($leagueName !== '') {
|
||||
$query->where('league_name', $leagueName);
|
||||
}
|
||||
if (!$includeSpecial) {
|
||||
$query->where('league_name', 'not like', '%特定球员%');
|
||||
}
|
||||
@@ -544,6 +716,25 @@ class MatchController extends BaseApiController
|
||||
->whereOr('match_time_text', 'like', $likeKeyword);
|
||||
});
|
||||
}
|
||||
if ($homeTeam !== '') {
|
||||
$query->where('home_team', 'like', '%' . addcslashes($homeTeam, '\\%_') . '%');
|
||||
}
|
||||
if ($awayTeam !== '') {
|
||||
$query->where('away_team', 'like', '%' . addcslashes($awayTeam, '\\%_') . '%');
|
||||
}
|
||||
$matchDatePatterns = $this->buildOddsMatchDatePatterns($matchDate);
|
||||
if (!empty($matchDatePatterns)) {
|
||||
$query->where(function ($query) use ($matchDatePatterns) {
|
||||
foreach ($matchDatePatterns as $index => $pattern) {
|
||||
$likePattern = '%' . addcslashes($pattern, '\\%_') . '%';
|
||||
if ($index === 0) {
|
||||
$query->where('match_time_text', 'like', $likePattern);
|
||||
} else {
|
||||
$query->whereOr('match_time_text', 'like', $likePattern);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$rows = $query
|
||||
->field('id,source_site,source_url,source_match_id,source_league_id,sport_type,show_type,odds_type,league_name,match_time_text,home_team,away_team,handicap_line,handicap_home_odds,handicap_away_odds,total_line,total_over_odds,total_under_odds,home_win_odds,draw_odds,away_win_odds,update_time')
|
||||
@@ -553,7 +744,7 @@ class MatchController extends BaseApiController
|
||||
->select()
|
||||
->toArray();
|
||||
|
||||
$eventMap = $this->buildWorldCupEventMap();
|
||||
$eventMap = $this->buildOddsEventMap($sportType, $leagueName, $worldCupEventOnly);
|
||||
$matches = [];
|
||||
foreach ($rows as $row) {
|
||||
$platform = $this->formatOddsPlatform($row);
|
||||
@@ -604,17 +795,30 @@ class MatchController extends BaseApiController
|
||||
return (int)$right['update_time'] <=> (int)$left['update_time'];
|
||||
});
|
||||
|
||||
return $this->data([
|
||||
'season_id' => $this->worldCupSeasonId,
|
||||
'list' => $list,
|
||||
]);
|
||||
return $list;
|
||||
}
|
||||
|
||||
private function buildWorldCupEventMap(): array
|
||||
private function buildOddsEventMap(
|
||||
int $sportType = 0,
|
||||
string $leagueName = '',
|
||||
bool $worldCupOnly = false
|
||||
): array
|
||||
{
|
||||
$rows = MatchEvent::where('league_name', $this->worldCupLeagueName)
|
||||
->where('sport_type', 1)
|
||||
->where('is_show', 1)
|
||||
$query = MatchEvent::where('is_show', 1);
|
||||
if ($sportType > 0) {
|
||||
$query->where('sport_type', $sportType);
|
||||
}
|
||||
if ($leagueName !== '') {
|
||||
$query->where('league_name', $leagueName);
|
||||
}
|
||||
if ($worldCupOnly) {
|
||||
$query->where(function ($query) {
|
||||
$query->where('league_name', $this->worldCupLeagueName)
|
||||
->whereOr('competition_id', 61);
|
||||
});
|
||||
}
|
||||
|
||||
$rows = $query
|
||||
->field('id,match_id,home_team,home_icon,home_score,away_team,away_icon,away_score,status,match_time,current_minute')
|
||||
->select()
|
||||
->toArray();
|
||||
@@ -629,15 +833,77 @@ class MatchController extends BaseApiController
|
||||
return $map;
|
||||
}
|
||||
|
||||
private function resolveOddsSportType(int $sportType): string
|
||||
{
|
||||
$map = [
|
||||
1 => 'FT',
|
||||
];
|
||||
return $map[$sportType] ?? '';
|
||||
}
|
||||
|
||||
private function buildOddsMatchKey(array $row): string
|
||||
{
|
||||
$teamPairKey = $this->buildTeamPairKey(
|
||||
$row['home_team'] ?? '',
|
||||
$row['away_team'] ?? ''
|
||||
);
|
||||
$dateKey = $this->buildOddsMatchDateKey(
|
||||
(string)($row['match_time_text'] ?? '')
|
||||
);
|
||||
if ($teamPairKey !== '') {
|
||||
return $teamPairKey . '|' . $dateKey;
|
||||
}
|
||||
return implode('|', [
|
||||
trim((string)($row['league_name'] ?? '')),
|
||||
trim((string)($row['match_time_text'] ?? '')),
|
||||
$this->buildTeamPairKey($row['home_team'] ?? '', $row['away_team'] ?? ''),
|
||||
(string)($row['source_match_id'] ?? ''),
|
||||
]);
|
||||
}
|
||||
|
||||
private function buildOddsMatchDateKey(string $matchTimeText): string
|
||||
{
|
||||
if (preg_match('/(?:\d{4}[-\/])?(\d{1,2})[-\/](\d{1,2})/', $matchTimeText, $matches)) {
|
||||
return sprintf('%02d-%02d', (int)$matches[1], (int)$matches[2]);
|
||||
}
|
||||
return trim($matchTimeText);
|
||||
}
|
||||
|
||||
private function buildOddsMatchDatePatterns(string $matchDate): array
|
||||
{
|
||||
$matchDate = trim($matchDate);
|
||||
if ($matchDate === '') {
|
||||
return [];
|
||||
}
|
||||
|
||||
$normalized = str_replace('/', '-', $matchDate);
|
||||
if (preg_match('/^(\d{4})-(\d{1,2})-(\d{1,2})$/', $normalized, $matches)) {
|
||||
$year = (int)$matches[1];
|
||||
$month = (int)$matches[2];
|
||||
$day = (int)$matches[3];
|
||||
return array_values(array_unique([
|
||||
sprintf('%04d-%02d-%02d', $year, $month, $day),
|
||||
sprintf('%04d/%02d/%02d', $year, $month, $day),
|
||||
sprintf('%02d-%02d', $month, $day),
|
||||
sprintf('%02d/%02d', $month, $day),
|
||||
sprintf('%d-%d', $month, $day),
|
||||
sprintf('%d/%d', $month, $day),
|
||||
]));
|
||||
}
|
||||
|
||||
if (preg_match('/^(\d{1,2})-(\d{1,2})$/', $normalized, $matches)) {
|
||||
$month = (int)$matches[1];
|
||||
$day = (int)$matches[2];
|
||||
return array_values(array_unique([
|
||||
sprintf('%02d-%02d', $month, $day),
|
||||
sprintf('%02d/%02d', $month, $day),
|
||||
sprintf('%d-%d', $month, $day),
|
||||
sprintf('%d/%d', $month, $day),
|
||||
]));
|
||||
}
|
||||
|
||||
return [$matchDate];
|
||||
}
|
||||
|
||||
private function buildTeamPairKey(string $homeTeam, string $awayTeam): string
|
||||
{
|
||||
$homeTeam = preg_replace('/\s+/u', '', trim($homeTeam));
|
||||
@@ -701,12 +967,41 @@ class MatchController extends BaseApiController
|
||||
|
||||
private function resolveOddsPlatformName(string $sourceSite): string
|
||||
{
|
||||
$map = [
|
||||
'hg' => '滚球',
|
||||
];
|
||||
$map = $this->getOddsPlatformNameMap();
|
||||
return $map[$sourceSite] ?? ($sourceSite !== '' ? strtoupper($sourceSite) : '平台');
|
||||
}
|
||||
|
||||
private function getOddsPlatformNameMap(): array
|
||||
{
|
||||
return [
|
||||
'hg' => '皇冠',
|
||||
'titan007' => '球探',
|
||||
];
|
||||
}
|
||||
|
||||
private function getOddsPlatformOptions(): array
|
||||
{
|
||||
$platformMap = $this->getOddsPlatformNameMap();
|
||||
$sourceSites = MatchOdds::where('source_site', '<>', '')
|
||||
->group('source_site')
|
||||
->column('source_site');
|
||||
foreach ($sourceSites as $sourceSite) {
|
||||
$sourceSite = strtolower(trim((string)$sourceSite));
|
||||
if ($sourceSite !== '' && !isset($platformMap[$sourceSite])) {
|
||||
$platformMap[$sourceSite] = strtoupper($sourceSite);
|
||||
}
|
||||
}
|
||||
|
||||
$options = [];
|
||||
foreach ($platformMap as $key => $label) {
|
||||
$options[] = [
|
||||
'key' => $key,
|
||||
'label' => $label,
|
||||
];
|
||||
}
|
||||
return $options;
|
||||
}
|
||||
|
||||
private function resolveOddsShowTypeText(string $showType): string
|
||||
{
|
||||
$map = [
|
||||
|
||||
@@ -97,16 +97,20 @@ class MatchLiveService
|
||||
return '';
|
||||
}
|
||||
|
||||
public static function getWorldCupLiveCards(): array
|
||||
public static function getLiveCards(int $sportType = 0, string $leagueName = ''): array
|
||||
{
|
||||
$rows = MatchLive::alias('live')
|
||||
->join('match m', 'm.id = live.match_id')
|
||||
->where(['m.is_show' => 1])
|
||||
->where([['m.status', '<>', 2]])
|
||||
->where(function ($query) {
|
||||
$query->where('m.league_name', '世界杯')
|
||||
->whereOr('m.competition_id', 61);
|
||||
})
|
||||
$query = MatchLive::alias('live')
|
||||
->leftJoin('match m', 'm.id = live.match_id')
|
||||
->where('live.fetch_status', 1);
|
||||
|
||||
if ($sportType > 0) {
|
||||
$query->where('m.sport_type', $sportType);
|
||||
}
|
||||
if ($leagueName !== '') {
|
||||
$query->where('m.league_name', $leagueName);
|
||||
}
|
||||
|
||||
$rows = $query
|
||||
->field([
|
||||
'live.id as live_id',
|
||||
'live.match_id',
|
||||
@@ -191,4 +195,9 @@ class MatchLiveService
|
||||
|
||||
return $cards;
|
||||
}
|
||||
|
||||
public static function getWorldCupLiveCards(): array
|
||||
{
|
||||
return self::getLiveCards();
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import r from"./error-DZQqA73l.js";import{d as p,c as i,o as m,U as e,L as s,a as o}from"./@vue-DjVelRet.js";import"./element-plus-BluzIk5z.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./vue-router-DifUqGFW.js";import"./index-CFvGjZJA.js";import"./nprogress-DYbUr3Ql.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const a="/assets/no_perms-jDxcYpYC.png",n={class:"error404"},O=p({__name:"403",setup(c){return(_,t)=>(m(),i("div",n,[e(r,{code:"403",title:"您的账号权限不足,请联系管理员添加权限!","show-btn":!1},{content:s(()=>t[0]||(t[0]=[o("div",{class:"flex justify-center"},[o("img",{class:"w-[150px] h-[150px]",src:a,alt:""})],-1)])),_:1})]))}});export{O as default};
|
||||
import r from"./error-qVVK4REj.js";import{d as p,c as i,o as m,U as e,L as s,a as o}from"./@vue-DjVelRet.js";import"./element-plus-BluzIk5z.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./vue-router-DifUqGFW.js";import"./index-CLy3qTQ5.js";import"./nprogress-DYbUr3Ql.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const a="/assets/no_perms-jDxcYpYC.png",n={class:"error404"},O=p({__name:"403",setup(c){return(_,t)=>(m(),i("div",n,[e(r,{code:"403",title:"您的账号权限不足,请联系管理员添加权限!","show-btn":!1},{content:s(()=>t[0]||(t[0]=[o("div",{class:"flex justify-center"},[o("img",{class:"w-[150px] h-[150px]",src:a,alt:""})],-1)])),_:1})]))}});export{O as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import o from"./error-DZQqA73l.js";import{d as r,c as t,o as m,U as p}from"./@vue-DjVelRet.js";import"./element-plus-BluzIk5z.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./vue-router-DifUqGFW.js";import"./index-CFvGjZJA.js";import"./nprogress-DYbUr3Ql.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const i={class:"error404"},L=r({__name:"404",setup(e){return(c,s)=>(m(),t("div",i,[p(o,{code:"404",title:"哎呀,出错了!您访问的页面不存在…"})]))}});export{L as default};
|
||||
import o from"./error-qVVK4REj.js";import{d as r,c as t,o as m,U as p}from"./@vue-DjVelRet.js";import"./element-plus-BluzIk5z.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./vue-router-DifUqGFW.js";import"./index-CLy3qTQ5.js";import"./nprogress-DYbUr3Ql.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const i={class:"error404"},L=r({__name:"404",setup(e){return(c,s)=>(m(),t("div",i,[p(o,{code:"404",title:"哎呀,出错了!您访问的页面不存在…"})]))}});export{L as default};
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./account-adjust.vue_vue_type_script_setup_true_lang-17d7Cpqw.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-DNyOr68f.js";import"./index-CFvGjZJA.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";export{o as default};
|
||||
import{_ as o}from"./account-adjust.vue_vue_type_script_setup_true_lang-CpFHI-jN.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-D-UvWoOR.js";import"./index-CLy3qTQ5.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";export{o as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{D as U,B as q,O as D,P as F,C as I}from"./element-plus-BluzIk5z.js";import{P as j}from"./index-DNyOr68f.js";import{f as R}from"./index-CFvGjZJA.js";import{d as L,s as g,a0 as M,b as i,w as N,K as G,o as K,L as a,a as O,U as t,u as o,R as m,S as p}from"./@vue-DjVelRet.js";const z={class:"pr-8"},W=L({__name:"account-adjust",props:{show:{type:Boolean,required:!0},userMoney:{type:[Number,String],default:0},userPoints:{type:[Number,String],default:0},defaultType:{type:String,default:"money"}},emits:["update:show","confirm"],setup(x,{emit:C}){const c=g(),f=x,y=C,e=M({type:"money",action:1,num:"",remark:""}),_=g(),r=i(()=>e.type==="money"?"余额":"积分"),b=i(()=>e.type==="money"?"元":"分"),E=i(()=>r.value+"调整"),v=i(()=>e.type==="money"?Number(f.userMoney):Number(f.userPoints)),V=i(()=>v.value+Number(e.num)*(e.action==1?1:-1)),B={num:[{required:!0,message:"请输入调整数量"}]},P=l=>{if(l.includes("-"))return R.msgError("请输入正整数");e.num=l},S=async()=>{var l;await((l=c.value)==null?void 0:l.validate()),y("confirm",{...e})},h=()=>{var l;y("update:show",!1),(l=c.value)==null||l.resetFields(),e.type="money",e.action=1,e.num="",e.remark=""};return N(()=>f.show,l=>{var n,u;l?(e.type=f.defaultType,(n=_.value)==null||n.open()):(u=_.value)==null||u.close()}),N(V,l=>{l<0&&(R.msgError("调整后"+r.value+"不能小于0"),e.num="")}),(l,n)=>{const u=F,w=D,s=q,k=I,T=U;return K(),G(j,{ref_key:"popupRef",ref:_,title:o(E),width:"500px",onConfirm:S,async:!0,onClose:h},{default:a(()=>[O("div",z,[t(T,{ref_key:"formRef",ref:c,model:o(e),"label-width":"120px",rules:B},{default:a(()=>[t(s,{label:"调整账户"},{default:a(()=>[t(w,{modelValue:o(e).type,"onUpdate:modelValue":n[0]||(n[0]=d=>o(e).type=d)},{default:a(()=>[t(u,{value:"money"},{default:a(()=>n[3]||(n[3]=[m("余额")])),_:1}),t(u,{value:"points"},{default:a(()=>n[4]||(n[4]=[m("积分")])),_:1})]),_:1},8,["modelValue"])]),_:1}),t(s,{label:"当前"+o(r)},{default:a(()=>[m(p(o(v))+" "+p(o(b)),1)]),_:1},8,["label"]),t(s,{label:o(r)+"增减",required:"",prop:"action"},{default:a(()=>[t(w,{modelValue:o(e).action,"onUpdate:modelValue":n[1]||(n[1]=d=>o(e).action=d)},{default:a(()=>[t(u,{value:1},{default:a(()=>[m("增加"+p(o(r)),1)]),_:1}),t(u,{value:2},{default:a(()=>[m("扣减"+p(o(r)),1)]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["label"]),t(s,{label:"调整"+o(r),prop:"num"},{default:a(()=>[t(k,{"model-value":o(e).num,placeholder:"请输入调整的"+o(r),type:"number",onInput:P},null,8,["model-value","placeholder"])]),_:1},8,["label"]),t(s,{label:"调整后"+o(r)},{default:a(()=>[m(p(o(V))+" "+p(o(b)),1)]),_:1},8,["label"]),t(s,{label:"备注",prop:"remark"},{default:a(()=>[t(k,{modelValue:o(e).remark,"onUpdate:modelValue":n[2]||(n[2]=d=>o(e).remark=d),type:"textarea",rows:4},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])])]),_:1},8,["title"])}}});export{W as _};
|
||||
import{D as U,B as q,O as D,P as F,C as I}from"./element-plus-BluzIk5z.js";import{P as j}from"./index-D-UvWoOR.js";import{f as R}from"./index-CLy3qTQ5.js";import{d as L,s as g,a0 as M,b as i,w as N,K as G,o as K,L as a,a as O,U as t,u as o,R as m,S as p}from"./@vue-DjVelRet.js";const z={class:"pr-8"},W=L({__name:"account-adjust",props:{show:{type:Boolean,required:!0},userMoney:{type:[Number,String],default:0},userPoints:{type:[Number,String],default:0},defaultType:{type:String,default:"money"}},emits:["update:show","confirm"],setup(x,{emit:C}){const c=g(),f=x,y=C,e=M({type:"money",action:1,num:"",remark:""}),_=g(),r=i(()=>e.type==="money"?"余额":"积分"),b=i(()=>e.type==="money"?"元":"分"),E=i(()=>r.value+"调整"),v=i(()=>e.type==="money"?Number(f.userMoney):Number(f.userPoints)),V=i(()=>v.value+Number(e.num)*(e.action==1?1:-1)),B={num:[{required:!0,message:"请输入调整数量"}]},P=l=>{if(l.includes("-"))return R.msgError("请输入正整数");e.num=l},S=async()=>{var l;await((l=c.value)==null?void 0:l.validate()),y("confirm",{...e})},h=()=>{var l;y("update:show",!1),(l=c.value)==null||l.resetFields(),e.type="money",e.action=1,e.num="",e.remark=""};return N(()=>f.show,l=>{var n,u;l?(e.type=f.defaultType,(n=_.value)==null||n.open()):(u=_.value)==null||u.close()}),N(V,l=>{l<0&&(R.msgError("调整后"+r.value+"不能小于0"),e.num="")}),(l,n)=>{const u=F,w=D,s=q,k=I,T=U;return K(),G(j,{ref_key:"popupRef",ref:_,title:o(E),width:"500px",onConfirm:S,async:!0,onClose:h},{default:a(()=>[O("div",z,[t(T,{ref_key:"formRef",ref:c,model:o(e),"label-width":"120px",rules:B},{default:a(()=>[t(s,{label:"调整账户"},{default:a(()=>[t(w,{modelValue:o(e).type,"onUpdate:modelValue":n[0]||(n[0]=d=>o(e).type=d)},{default:a(()=>[t(u,{value:"money"},{default:a(()=>n[3]||(n[3]=[m("余额")])),_:1}),t(u,{value:"points"},{default:a(()=>n[4]||(n[4]=[m("积分")])),_:1})]),_:1},8,["modelValue"])]),_:1}),t(s,{label:"当前"+o(r)},{default:a(()=>[m(p(o(v))+" "+p(o(b)),1)]),_:1},8,["label"]),t(s,{label:o(r)+"增减",required:"",prop:"action"},{default:a(()=>[t(w,{modelValue:o(e).action,"onUpdate:modelValue":n[1]||(n[1]=d=>o(e).action=d)},{default:a(()=>[t(u,{value:1},{default:a(()=>[m("增加"+p(o(r)),1)]),_:1}),t(u,{value:2},{default:a(()=>[m("扣减"+p(o(r)),1)]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["label"]),t(s,{label:"调整"+o(r),prop:"num"},{default:a(()=>[t(k,{"model-value":o(e).num,placeholder:"请输入调整的"+o(r),type:"number",onInput:P},null,8,["model-value","placeholder"])]),_:1},8,["label"]),t(s,{label:"调整后"+o(r)},{default:a(()=>[m(p(o(V))+" "+p(o(b)),1)]),_:1},8,["label"]),t(s,{label:"备注",prop:"remark"},{default:a(()=>[t(k,{modelValue:o(e).remark,"onUpdate:modelValue":n[2]||(n[2]=d=>o(e).remark=d),type:"textarea",rows:4},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])])]),_:1},8,["title"])}}});export{W as _};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./add-nav.vue_vue_type_script_setup_true_lang-Buvqdy-V.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-BTmfRTpN.js";import"./index-CFvGjZJA.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./picker-D3waTbLd.js";import"./index-DNyOr68f.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./article-DUpjglUt.js";import"./usePaging-Dtz4iZyr.js";import"./picker-CZXTeC5w.js";import"./index-Chn2KoSQ.js";import"./index-DJokFQnh.js";import"./index.vue_vue_type_script_setup_true_lang-DZT8OG85.js";import"./vuedraggable-CUBnU4N-.js";import"./vue-BlNCuTuS.js";import"./sortablejs-SiPGO7My.js";export{o as default};
|
||||
import{_ as o}from"./add-nav.vue_vue_type_script_setup_true_lang-Bzl_Y-wg.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-CUJDR3jl.js";import"./index-CLy3qTQ5.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./picker-tDJ86Pbf.js";import"./index-D-UvWoOR.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./article-BKQTRpme.js";import"./usePaging-Dtz4iZyr.js";import"./picker-DvLnzHAC.js";import"./index-pCudR3yY.js";import"./index-DFCXCmnA.js";import"./index.vue_vue_type_script_setup_true_lang-DZT8OG85.js";import"./vuedraggable-CUBnU4N-.js";import"./vue-BlNCuTuS.js";import"./sortablejs-SiPGO7My.js";export{o as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{C as E,B,g as C,i as N}from"./element-plus-BluzIk5z.js";import{_ as $}from"./index-BTmfRTpN.js";import{_ as z}from"./picker-D3waTbLd.js";import{_ as D}from"./picker-CZXTeC5w.js";import{b as R,f as p}from"./index-CFvGjZJA.js";import{D as A}from"./vuedraggable-CUBnU4N-.js";import{d as I,b as L,c as F,o as r,a as l,U as a,u as c,i as K,L as d,K as P,R as S}from"./@vue-DjVelRet.js";const T={class:"bg-fill-light flex items-center w-full p-4 mb-4"},j={class:"upload-btn w-[60px] h-[60px]"},q={class:"ml-3 flex-1"},G={class:"flex items-center"},H={class:"flex items-center mt-[18px]"},J={class:"flex-1 flex items-center"},M={class:"drag-move cursor-move ml-auto"},le=I({__name:"add-nav",props:{modelValue:{type:Array,default:()=>[]},max:{type:Number,default:100},min:{type:Number,default:1}},emits:["update:modelValue"],setup(_,{emit:f}){const t=_,V=f,m=L({get(){return t.modelValue},set(s){V("update:modelValue",s)}}),x=()=>{var s;((s=t.modelValue)==null?void 0:s.length)<t.max?m.value.push({image:"",name:"导航名称",link:{},is_show:"1"}):p.msgError(`最多添加${t.max}个`)},g=s=>{var e;if(((e=t.modelValue)==null?void 0:e.length)<=t.min)return p.msgError(`最少保留${t.min}个`);m.value.splice(s,1)};return(s,e)=>{const i=R,v=D,h=E,b=z,k=C,w=B,U=$,y=N;return r(),F("div",null,[l("div",null,[a(c(A),{class:"draggable",modelValue:c(m),"onUpdate:modelValue":e[0]||(e[0]=o=>K(m)?m.value=o:null),animation:"300",handle:".drag-move","item-key":"index"},{item:d(({element:o,index:u})=>[(r(),P(U,{class:"w-[467px]",key:u,onClose:n=>g(u)},{default:d(()=>[l("div",T,[a(v,{modelValue:o.image,"onUpdate:modelValue":n=>o.image=n,"upload-class":"bg-body",size:"60px","exclude-domain":""},{upload:d(()=>[l("div",j,[a(i,{name:"el-icon-Plus",size:20})])]),_:2},1032,["modelValue","onUpdate:modelValue"]),l("div",q,[l("div",G,[e[1]||(e[1]=l("span",{class:"text-tx-regular flex-none mr-3"},"名称",-1)),a(h,{modelValue:o.name,"onUpdate:modelValue":n=>o.name=n,placeholder:"请输入名称"},null,8,["modelValue","onUpdate:modelValue"])]),l("div",H,[e[2]||(e[2]=l("span",{class:"text-tx-regular flex-none mr-3"},"链接",-1)),a(b,{modelValue:o.link,"onUpdate:modelValue":n=>o.link=n},null,8,["modelValue","onUpdate:modelValue"])]),a(w,{label:"是否显示",class:"mt-[18px]"},{default:d(()=>[l("div",J,[a(k,{modelValue:o.is_show,"onUpdate:modelValue":n=>o.is_show=n,"active-value":"1","inactive-value":"0"},null,8,["modelValue","onUpdate:modelValue"]),l("div",M,[a(i,{name:"el-icon-Rank",size:"18"})])])]),_:2},1024)])])]),_:2},1032,["onClose"]))]),_:1},8,["modelValue"])]),l("div",null,[a(y,{type:"primary",onClick:x},{default:d(()=>e[3]||(e[3]=[S("添加")])),_:1})])])}}});export{le as _};
|
||||
import{C as E,B,g as C,i as N}from"./element-plus-BluzIk5z.js";import{_ as $}from"./index-CUJDR3jl.js";import{_ as z}from"./picker-tDJ86Pbf.js";import{_ as D}from"./picker-DvLnzHAC.js";import{b as R,f as p}from"./index-CLy3qTQ5.js";import{D as A}from"./vuedraggable-CUBnU4N-.js";import{d as I,b as L,c as F,o as r,a as l,U as a,u as c,i as K,L as d,K as P,R as S}from"./@vue-DjVelRet.js";const T={class:"bg-fill-light flex items-center w-full p-4 mb-4"},j={class:"upload-btn w-[60px] h-[60px]"},q={class:"ml-3 flex-1"},G={class:"flex items-center"},H={class:"flex items-center mt-[18px]"},J={class:"flex-1 flex items-center"},M={class:"drag-move cursor-move ml-auto"},le=I({__name:"add-nav",props:{modelValue:{type:Array,default:()=>[]},max:{type:Number,default:100},min:{type:Number,default:1}},emits:["update:modelValue"],setup(_,{emit:f}){const t=_,V=f,m=L({get(){return t.modelValue},set(s){V("update:modelValue",s)}}),x=()=>{var s;((s=t.modelValue)==null?void 0:s.length)<t.max?m.value.push({image:"",name:"导航名称",link:{},is_show:"1"}):p.msgError(`最多添加${t.max}个`)},g=s=>{var e;if(((e=t.modelValue)==null?void 0:e.length)<=t.min)return p.msgError(`最少保留${t.min}个`);m.value.splice(s,1)};return(s,e)=>{const i=R,v=D,h=E,b=z,k=C,w=B,U=$,y=N;return r(),F("div",null,[l("div",null,[a(c(A),{class:"draggable",modelValue:c(m),"onUpdate:modelValue":e[0]||(e[0]=o=>K(m)?m.value=o:null),animation:"300",handle:".drag-move","item-key":"index"},{item:d(({element:o,index:u})=>[(r(),P(U,{class:"w-[467px]",key:u,onClose:n=>g(u)},{default:d(()=>[l("div",T,[a(v,{modelValue:o.image,"onUpdate:modelValue":n=>o.image=n,"upload-class":"bg-body",size:"60px","exclude-domain":""},{upload:d(()=>[l("div",j,[a(i,{name:"el-icon-Plus",size:20})])]),_:2},1032,["modelValue","onUpdate:modelValue"]),l("div",q,[l("div",G,[e[1]||(e[1]=l("span",{class:"text-tx-regular flex-none mr-3"},"名称",-1)),a(h,{modelValue:o.name,"onUpdate:modelValue":n=>o.name=n,placeholder:"请输入名称"},null,8,["modelValue","onUpdate:modelValue"])]),l("div",H,[e[2]||(e[2]=l("span",{class:"text-tx-regular flex-none mr-3"},"链接",-1)),a(b,{modelValue:o.link,"onUpdate:modelValue":n=>o.link=n},null,8,["modelValue","onUpdate:modelValue"])]),a(w,{label:"是否显示",class:"mt-[18px]"},{default:d(()=>[l("div",J,[a(k,{modelValue:o.is_show,"onUpdate:modelValue":n=>o.is_show=n,"active-value":"1","inactive-value":"0"},null,8,["modelValue","onUpdate:modelValue"]),l("div",M,[a(i,{name:"el-icon-Rank",size:"18"})])])]),_:2},1024)])])]),_:2},1032,["onClose"]))]),_:1},8,["modelValue"])]),l("div",null,[a(y,{type:"primary",onClick:x},{default:d(()=>e[3]||(e[3]=[S("添加")])),_:1})])])}}});export{le as _};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{r as t}from"./index-CFvGjZJA.js";function n(i){return t.get({url:"/ai.aiConfig/lists",params:i})}function r(i){return t.post({url:"/ai.aiConfig/edit",params:i})}function u(i){return t.get({url:"/ai.aiAnalysis/lists",params:i})}function o(i){return t.get({url:"/ai.aiLog/lists",params:i})}function a(i){return t.get({url:"/ai.kbConfig/lists",params:i})}function e(i){return t.post({url:"/ai.kbConfig/edit",params:i})}function l(i){return t.get({url:"/ai.kbDocument/lists",params:i})}function f(i){return t.get({url:"/ai.kbSyncJob/lists",params:i})}function g(i){return t.post({url:"/ai.kbSyncJob/rebuild",params:i})}function b(i){return t.get({url:"/ai.kbQueryLog/lists",params:i})}export{u as a,n as b,r as c,e as d,l as e,b as f,f as g,g as h,o as i,a as k};
|
||||
import{r as t}from"./index-CLy3qTQ5.js";function n(i){return t.get({url:"/ai.aiConfig/lists",params:i})}function r(i){return t.post({url:"/ai.aiConfig/edit",params:i})}function u(i){return t.get({url:"/ai.aiAnalysis/lists",params:i})}function o(i){return t.get({url:"/ai.aiLog/lists",params:i})}function a(i){return t.get({url:"/ai.kbConfig/lists",params:i})}function e(i){return t.post({url:"/ai.kbConfig/edit",params:i})}function l(i){return t.get({url:"/ai.kbDocument/lists",params:i})}function f(i){return t.get({url:"/ai.kbSyncJob/lists",params:i})}function g(i){return t.post({url:"/ai.kbSyncJob/rebuild",params:i})}function b(i){return t.get({url:"/ai.kbQueryLog/lists",params:i})}export{u as a,n as b,r as c,e as d,l as e,b as f,f as g,g as h,o as i,a as k};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{r as e}from"./index-CFvGjZJA.js";function a(t){return e.get({url:"/article.articleCate/lists",params:t})}function i(t){return e.get({url:"/article.articleCate/all",params:t})}function l(t){return e.post({url:"/article.articleCate/add",params:t})}function c(t){return e.post({url:"/article.articleCate/edit",params:t})}function n(t){return e.post({url:"/article.articleCate/delete",params:t})}function u(t){return e.get({url:"/article.articleCate/detail",params:t})}function s(t){return e.post({url:"/article.articleCate/updateStatus",params:t})}function o(t){return e.get({url:"/article.article/lists",params:t})}function d(t){return e.post({url:"/article.article/add",params:t})}function f(t){return e.post({url:"/article.article/edit",params:t})}function m(t){return e.post({url:"/article.article/delete",params:t})}function C(t){return e.get({url:"/article.article/detail",params:t})}function p(t){return e.post({url:"/article.article/updateStatus",params:t})}function _(t){return e.post({url:"/article.article/batchRecommend",params:t})}function g(t){return e.get({url:"/article.article_ai_comment_task/lists",params:t})}function k(t){return e.post({url:"/article.article_ai_comment_task/delete",params:t})}function A(t){return e.post({url:"/article.article_ai_comment_task/retry",params:t})}export{g as a,k as b,A as c,a as d,n as e,s as f,c as g,l as h,u as i,C as j,f as k,d as l,i as m,o as n,_ as o,p,m as q};
|
||||
import{r as e}from"./index-CLy3qTQ5.js";function a(t){return e.get({url:"/article.articleCate/lists",params:t})}function i(t){return e.get({url:"/article.articleCate/all",params:t})}function l(t){return e.post({url:"/article.articleCate/add",params:t})}function c(t){return e.post({url:"/article.articleCate/edit",params:t})}function n(t){return e.post({url:"/article.articleCate/delete",params:t})}function u(t){return e.get({url:"/article.articleCate/detail",params:t})}function s(t){return e.post({url:"/article.articleCate/updateStatus",params:t})}function o(t){return e.get({url:"/article.article/lists",params:t})}function d(t){return e.post({url:"/article.article/add",params:t})}function f(t){return e.post({url:"/article.article/edit",params:t})}function m(t){return e.post({url:"/article.article/delete",params:t})}function C(t){return e.get({url:"/article.article/detail",params:t})}function p(t){return e.post({url:"/article.article/updateStatus",params:t})}function _(t){return e.post({url:"/article.article/batchRecommend",params:t})}function g(t){return e.get({url:"/article.article_ai_comment_task/lists",params:t})}function k(t){return e.post({url:"/article.article_ai_comment_task/delete",params:t})}function A(t){return e.post({url:"/article.article_ai_comment_task/retry",params:t})}export{g as a,k as b,A as c,a as d,n as e,s as f,c as g,l as h,u as i,C as j,f as k,d as l,i as m,o as n,_ as o,p,m as q};
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-C5NnDhpw.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./picker-CZXTeC5w.js";import"./index-DNyOr68f.js";import"./index-CFvGjZJA.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./index-Chn2KoSQ.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./index-BTmfRTpN.js";import"./index-DJokFQnh.js";import"./index.vue_vue_type_script_setup_true_lang-DZT8OG85.js";import"./usePaging-Dtz4iZyr.js";import"./vuedraggable-CUBnU4N-.js";import"./vue-BlNCuTuS.js";import"./sortablejs-SiPGO7My.js";export{o as default};
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-rSpeUH2M.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./picker-DvLnzHAC.js";import"./index-D-UvWoOR.js";import"./index-CLy3qTQ5.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./index-pCudR3yY.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./index-CUJDR3jl.js";import"./index-DFCXCmnA.js";import"./index.vue_vue_type_script_setup_true_lang-DZT8OG85.js";import"./usePaging-Dtz4iZyr.js";import"./vuedraggable-CUBnU4N-.js";import"./vue-BlNCuTuS.js";import"./sortablejs-SiPGO7My.js";export{o as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-BbxRdB6p.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-BTmfRTpN.js";import"./index-CFvGjZJA.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./picker-D3waTbLd.js";import"./index-DNyOr68f.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./article-DUpjglUt.js";import"./usePaging-Dtz4iZyr.js";import"./picker-CZXTeC5w.js";import"./index-Chn2KoSQ.js";import"./index-DJokFQnh.js";import"./index.vue_vue_type_script_setup_true_lang-DZT8OG85.js";import"./vuedraggable-CUBnU4N-.js";import"./vue-BlNCuTuS.js";import"./sortablejs-SiPGO7My.js";import"./index.vue_vue_type_script_setup_true_lang-Bf0Dasz8.js";export{o as default};
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-Dv2DbOiG.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-CUJDR3jl.js";import"./index-CLy3qTQ5.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./picker-tDJ86Pbf.js";import"./index-D-UvWoOR.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./article-BKQTRpme.js";import"./usePaging-Dtz4iZyr.js";import"./picker-DvLnzHAC.js";import"./index-pCudR3yY.js";import"./index-DFCXCmnA.js";import"./index.vue_vue_type_script_setup_true_lang-DZT8OG85.js";import"./vuedraggable-CUBnU4N-.js";import"./vue-BlNCuTuS.js";import"./sortablejs-SiPGO7My.js";import"./index.vue_vue_type_script_setup_true_lang-Bf0Dasz8.js";export{o as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-TBmFUNXO.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./add-nav.vue_vue_type_script_setup_true_lang-Buvqdy-V.js";import"./index-BTmfRTpN.js";import"./index-CFvGjZJA.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./picker-D3waTbLd.js";import"./index-DNyOr68f.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./article-DUpjglUt.js";import"./usePaging-Dtz4iZyr.js";import"./picker-CZXTeC5w.js";import"./index-Chn2KoSQ.js";import"./index-DJokFQnh.js";import"./index.vue_vue_type_script_setup_true_lang-DZT8OG85.js";import"./vuedraggable-CUBnU4N-.js";import"./vue-BlNCuTuS.js";import"./sortablejs-SiPGO7My.js";export{o as default};
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-CvvVSqGe.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./add-nav.vue_vue_type_script_setup_true_lang-Bzl_Y-wg.js";import"./index-CUJDR3jl.js";import"./index-CLy3qTQ5.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./picker-tDJ86Pbf.js";import"./index-D-UvWoOR.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./article-BKQTRpme.js";import"./usePaging-Dtz4iZyr.js";import"./picker-DvLnzHAC.js";import"./index-pCudR3yY.js";import"./index-DFCXCmnA.js";import"./index.vue_vue_type_script_setup_true_lang-DZT8OG85.js";import"./vuedraggable-CUBnU4N-.js";import"./vue-BlNCuTuS.js";import"./sortablejs-SiPGO7My.js";export{o as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-DY67rOy7.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-BTmfRTpN.js";import"./index-CFvGjZJA.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./picker-D3waTbLd.js";import"./index-DNyOr68f.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./article-DUpjglUt.js";import"./usePaging-Dtz4iZyr.js";import"./picker-CZXTeC5w.js";import"./index-Chn2KoSQ.js";import"./index-DJokFQnh.js";import"./index.vue_vue_type_script_setup_true_lang-DZT8OG85.js";import"./vuedraggable-CUBnU4N-.js";import"./vue-BlNCuTuS.js";import"./sortablejs-SiPGO7My.js";export{o as default};
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-ogR2cZuh.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-CUJDR3jl.js";import"./index-CLy3qTQ5.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./picker-tDJ86Pbf.js";import"./index-D-UvWoOR.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./article-BKQTRpme.js";import"./usePaging-Dtz4iZyr.js";import"./picker-DvLnzHAC.js";import"./index-pCudR3yY.js";import"./index-DFCXCmnA.js";import"./index.vue_vue_type_script_setup_true_lang-DZT8OG85.js";import"./vuedraggable-CUBnU4N-.js";import"./vue-BlNCuTuS.js";import"./sortablejs-SiPGO7My.js";export{o as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-DLKhROSq.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index.vue_vue_type_script_setup_true_lang-Bf0Dasz8.js";import"./@vueuse-DbKvT5Ch.js";import"./picker-CZXTeC5w.js";import"./index-DNyOr68f.js";import"./index-CFvGjZJA.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./index-Chn2KoSQ.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./index-BTmfRTpN.js";import"./index-DJokFQnh.js";import"./index.vue_vue_type_script_setup_true_lang-DZT8OG85.js";import"./usePaging-Dtz4iZyr.js";import"./vuedraggable-CUBnU4N-.js";import"./vue-BlNCuTuS.js";import"./sortablejs-SiPGO7My.js";export{o as default};
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-E5hnPJXz.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index.vue_vue_type_script_setup_true_lang-Bf0Dasz8.js";import"./@vueuse-DbKvT5Ch.js";import"./picker-DvLnzHAC.js";import"./index-D-UvWoOR.js";import"./index-CLy3qTQ5.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./index-pCudR3yY.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./index-CUJDR3jl.js";import"./index-DFCXCmnA.js";import"./index.vue_vue_type_script_setup_true_lang-DZT8OG85.js";import"./usePaging-Dtz4iZyr.js";import"./vuedraggable-CUBnU4N-.js";import"./vue-BlNCuTuS.js";import"./sortablejs-SiPGO7My.js";export{o as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-DnBJtJRr.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./add-nav.vue_vue_type_script_setup_true_lang-Buvqdy-V.js";import"./index-BTmfRTpN.js";import"./index-CFvGjZJA.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./picker-D3waTbLd.js";import"./index-DNyOr68f.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./article-DUpjglUt.js";import"./usePaging-Dtz4iZyr.js";import"./picker-CZXTeC5w.js";import"./index-Chn2KoSQ.js";import"./index-DJokFQnh.js";import"./index.vue_vue_type_script_setup_true_lang-DZT8OG85.js";import"./vuedraggable-CUBnU4N-.js";import"./vue-BlNCuTuS.js";import"./sortablejs-SiPGO7My.js";export{o as default};
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-CY-Te7Jn.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./add-nav.vue_vue_type_script_setup_true_lang-Bzl_Y-wg.js";import"./index-CUJDR3jl.js";import"./index-CLy3qTQ5.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./picker-tDJ86Pbf.js";import"./index-D-UvWoOR.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./article-BKQTRpme.js";import"./usePaging-Dtz4iZyr.js";import"./picker-DvLnzHAC.js";import"./index-pCudR3yY.js";import"./index-DFCXCmnA.js";import"./index.vue_vue_type_script_setup_true_lang-DZT8OG85.js";import"./vuedraggable-CUBnU4N-.js";import"./vue-BlNCuTuS.js";import"./sortablejs-SiPGO7My.js";export{o as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{m as b,l as c,D as V}from"./element-plus-BluzIk5z.js";import{_ as l}from"./menu-set.vue_vue_type_script_setup_true_lang-DdPu5AnC.js";import{d as v,b as x,c as E,o as g,a as k,U as o,L as m,u as r,T as w}from"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-BTmfRTpN.js";import"./index-CFvGjZJA.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./picker-D3waTbLd.js";import"./index-DNyOr68f.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./article-DUpjglUt.js";import"./usePaging-Dtz4iZyr.js";import"./picker-CZXTeC5w.js";import"./index-Chn2KoSQ.js";import"./index-DJokFQnh.js";import"./index.vue_vue_type_script_setup_true_lang-DZT8OG85.js";import"./vuedraggable-CUBnU4N-.js";import"./vue-BlNCuTuS.js";import"./sortablejs-SiPGO7My.js";const bt=v({__name:"attr",props:{modelValue:{type:Object,default:()=>({nav:[],menu:{}})}},emits:["update:modelValue"],setup(n,{emit:s}){const u=n,d=s,e=x({get(){return u.modelValue},set(a){d("update:modelValue",a)}});return(a,t)=>{const i=c,f=b,_=V;return g(),E(w,null,[t[2]||(t[2]=k("div",{class:"title flex items-center before:w-[3px] before:h-[14px] before:block before:bg-primary before:mr-2"}," pc导航设置 ",-1)),o(_,{class:"mt-4","label-width":"70px"},{default:m(()=>[o(f,{"model-value":"nav"},{default:m(()=>[o(i,{label:"主导航设置",name:"nav"},{default:m(()=>[o(l,{modelValue:r(e).nav,"onUpdate:modelValue":t[0]||(t[0]=p=>r(e).nav=p)},null,8,["modelValue"])]),_:1}),o(i,{label:"菜单设置",name:"menu"},{default:m(()=>[o(l,{modelValue:r(e).menu,"onUpdate:modelValue":t[1]||(t[1]=p=>r(e).menu=p)},null,8,["modelValue"])]),_:1})]),_:1})]),_:1})],64)}}});export{bt as default};
|
||||
import{m as b,l as c,D as V}from"./element-plus-BluzIk5z.js";import{_ as l}from"./menu-set.vue_vue_type_script_setup_true_lang-BYaFq3Md.js";import{d as v,b as x,c as E,o as g,a as k,U as o,L as m,u as r,T as w}from"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-CUJDR3jl.js";import"./index-CLy3qTQ5.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./picker-tDJ86Pbf.js";import"./index-D-UvWoOR.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./article-BKQTRpme.js";import"./usePaging-Dtz4iZyr.js";import"./picker-DvLnzHAC.js";import"./index-pCudR3yY.js";import"./index-DFCXCmnA.js";import"./index.vue_vue_type_script_setup_true_lang-DZT8OG85.js";import"./vuedraggable-CUBnU4N-.js";import"./vue-BlNCuTuS.js";import"./sortablejs-SiPGO7My.js";const bt=v({__name:"attr",props:{modelValue:{type:Object,default:()=>({nav:[],menu:{}})}},emits:["update:modelValue"],setup(n,{emit:s}){const u=n,d=s,e=x({get(){return u.modelValue},set(a){d("update:modelValue",a)}});return(a,t)=>{const i=c,f=b,_=V;return g(),E(w,null,[t[2]||(t[2]=k("div",{class:"title flex items-center before:w-[3px] before:h-[14px] before:block before:bg-primary before:mr-2"}," pc导航设置 ",-1)),o(_,{class:"mt-4","label-width":"70px"},{default:m(()=>[o(f,{"model-value":"nav"},{default:m(()=>[o(i,{label:"主导航设置",name:"nav"},{default:m(()=>[o(l,{modelValue:r(e).nav,"onUpdate:modelValue":t[0]||(t[0]=p=>r(e).nav=p)},null,8,["modelValue"])]),_:1}),o(i,{label:"菜单设置",name:"menu"},{default:m(()=>[o(l,{modelValue:r(e).menu,"onUpdate:modelValue":t[1]||(t[1]=p=>r(e).menu=p)},null,8,["modelValue"])]),_:1})]),_:1})]),_:1})],64)}}});export{bt as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-CVOujgmX.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-BTmfRTpN.js";import"./index-CFvGjZJA.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./picker-D3waTbLd.js";import"./index-DNyOr68f.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./article-DUpjglUt.js";import"./usePaging-Dtz4iZyr.js";import"./picker-CZXTeC5w.js";import"./index-Chn2KoSQ.js";import"./index-DJokFQnh.js";import"./index.vue_vue_type_script_setup_true_lang-DZT8OG85.js";import"./vuedraggable-CUBnU4N-.js";import"./vue-BlNCuTuS.js";import"./sortablejs-SiPGO7My.js";export{o as default};
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-C5MjXLep.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-CUJDR3jl.js";import"./index-CLy3qTQ5.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./picker-tDJ86Pbf.js";import"./index-D-UvWoOR.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./article-BKQTRpme.js";import"./usePaging-Dtz4iZyr.js";import"./picker-DvLnzHAC.js";import"./index-pCudR3yY.js";import"./index-DFCXCmnA.js";import"./index.vue_vue_type_script_setup_true_lang-DZT8OG85.js";import"./vuedraggable-CUBnU4N-.js";import"./vue-BlNCuTuS.js";import"./sortablejs-SiPGO7My.js";export{o as default};
|
||||
@@ -0,0 +1 @@
|
||||
import{_ as o}from"./attr-setting.vue_vue_type_script_setup_true_lang-BRG7pu6l.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-sGnMlEX8.js";import"./attr-B7OL_Ml1.js";import"./index-CUJDR3jl.js";import"./index-CLy3qTQ5.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./picker-tDJ86Pbf.js";import"./index-D-UvWoOR.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./article-BKQTRpme.js";import"./usePaging-Dtz4iZyr.js";import"./picker-DvLnzHAC.js";import"./index-pCudR3yY.js";import"./index-DFCXCmnA.js";import"./index.vue_vue_type_script_setup_true_lang-DZT8OG85.js";import"./vuedraggable-CUBnU4N-.js";import"./vue-BlNCuTuS.js";import"./sortablejs-SiPGO7My.js";import"./content.vue_vue_type_script_setup_true_lang-jQE3yqtf.js";import"./decoration-img-J-gzYln4.js";import"./attr.vue_vue_type_script_setup_true_lang-rSpeUH2M.js";import"./content-DSG0mAR6.js";import"./attr.vue_vue_type_script_setup_true_lang-C5MjXLep.js";import"./content.vue_vue_type_script_setup_true_lang-BMYMqhlE.js";import"./attr.vue_vue_type_script_setup_true_lang-CvvVSqGe.js";import"./add-nav.vue_vue_type_script_setup_true_lang-Bzl_Y-wg.js";import"./content-ByXM3-WD.js";import"./attr.vue_vue_type_script_setup_true_lang-CY-Te7Jn.js";import"./content.vue_vue_type_script_setup_true_lang-DyRDlsyL.js";import"./attr.vue_vue_type_script_setup_true_lang-DBygAIdU.js";import"./content-ByKpG_nb.js";import"./decoration-D2atLvb7.js";import"./attr.vue_vue_type_script_setup_true_lang-E5hnPJXz.js";import"./index.vue_vue_type_script_setup_true_lang-Bf0Dasz8.js";import"./content-TOVhKI1r.js";import"./content.vue_vue_type_script_setup_true_lang-D6GrtWJm.js";import"./attr.vue_vue_type_script_setup_true_lang-BVvYT2f8.js";import"./content-fndmIRPo.js";import"./attr.vue_vue_type_script_setup_true_lang-ogR2cZuh.js";import"./content.vue_vue_type_script_setup_true_lang-h0Df60K-.js";import"./attr.vue_vue_type_script_setup_true_lang-_nxTWFXL.js";import"./content-C3x4W0Bd.js";export{o as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as o}from"./attr-setting.vue_vue_type_script_setup_true_lang-niR0LXDc.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-Bc_PNEpy.js";import"./attr-cZNT0tUa.js";import"./index-BTmfRTpN.js";import"./index-CFvGjZJA.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./picker-D3waTbLd.js";import"./index-DNyOr68f.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./article-DUpjglUt.js";import"./usePaging-Dtz4iZyr.js";import"./picker-CZXTeC5w.js";import"./index-Chn2KoSQ.js";import"./index-DJokFQnh.js";import"./index.vue_vue_type_script_setup_true_lang-DZT8OG85.js";import"./vuedraggable-CUBnU4N-.js";import"./vue-BlNCuTuS.js";import"./sortablejs-SiPGO7My.js";import"./content.vue_vue_type_script_setup_true_lang-C8wmQSjh.js";import"./decoration-img-DM6kFAvY.js";import"./attr.vue_vue_type_script_setup_true_lang-C5NnDhpw.js";import"./content-DRxVgkex.js";import"./attr.vue_vue_type_script_setup_true_lang-DY67rOy7.js";import"./content.vue_vue_type_script_setup_true_lang-C-IPStjh.js";import"./attr.vue_vue_type_script_setup_true_lang-DnBJtJRr.js";import"./add-nav.vue_vue_type_script_setup_true_lang-Buvqdy-V.js";import"./content-BA6WV8YD.js";import"./attr.vue_vue_type_script_setup_true_lang-TBmFUNXO.js";import"./content.vue_vue_type_script_setup_true_lang-C_78qfOy.js";import"./attr.vue_vue_type_script_setup_true_lang-DBygAIdU.js";import"./content-jse-YGQx.js";import"./decoration-Db7gUctO.js";import"./attr.vue_vue_type_script_setup_true_lang-DLKhROSq.js";import"./index.vue_vue_type_script_setup_true_lang-Bf0Dasz8.js";import"./content-xNiOyCOy.js";import"./content.vue_vue_type_script_setup_true_lang-B0PSjrMz.js";import"./attr.vue_vue_type_script_setup_true_lang-BVvYT2f8.js";import"./content-DNLooG88.js";import"./attr.vue_vue_type_script_setup_true_lang-CVOujgmX.js";import"./content.vue_vue_type_script_setup_true_lang-CxIM1Ssf.js";import"./attr.vue_vue_type_script_setup_true_lang-_nxTWFXL.js";import"./content-DNYtQdlY.js";export{o as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{I as g,s as y}from"./element-plus-BluzIk5z.js";import{e as b}from"./index-Bc_PNEpy.js";import{d as x,c as _,o as n,U as c,L as r,a as h,S as w,K as i,aE as v,Q as C,u as k}from"./@vue-DjVelRet.js";const B={class:"pages-setting"},E={class:"title flex items-center before:w-[3px] before:h-[14px] before:block before:bg-primary before:mr-2 text-xl font-medium"},N=x({__name:"attr-setting",props:{widget:{type:Object,default:()=>({})},type:{type:String,default:"mobile"}},emits:["update:content"],setup(e,{emit:d}){const m=d,p=o=>{m("update:content",o)};return(o,S)=>{const f=g,u=y;return n(),_("div",B,[c(f,{shadow:"never",class:"!border-none flex"},{default:r(()=>{var t;return[h("div",E,w((t=e.widget)==null?void 0:t.title),1)]}),_:1}),c(u,{class:"w-full",style:{height:"calc(100% - 60px)"}},{default:r(()=>{var t,a,s,l;return[(n(),i(v,null,[(n(),i(C((a=k(b)[(t=e.widget)==null?void 0:t.name])==null?void 0:a.attr),{content:(s=e.widget)==null?void 0:s.content,styles:(l=e.widget)==null?void 0:l.styles,type:e.type,"onUpdate:content":p},null,40,["content","styles","type"]))],1024))]}),_:1})])}}});export{N as _};
|
||||
import{I as g,s as y}from"./element-plus-BluzIk5z.js";import{e as b}from"./index-sGnMlEX8.js";import{d as x,c as _,o as n,U as c,L as r,a as h,S as w,K as i,aE as v,Q as C,u as k}from"./@vue-DjVelRet.js";const B={class:"pages-setting"},E={class:"title flex items-center before:w-[3px] before:h-[14px] before:block before:bg-primary before:mr-2 text-xl font-medium"},N=x({__name:"attr-setting",props:{widget:{type:Object,default:()=>({})},type:{type:String,default:"mobile"}},emits:["update:content"],setup(e,{emit:d}){const m=d,p=o=>{m("update:content",o)};return(o,S)=>{const f=g,u=y;return n(),_("div",B,[c(f,{shadow:"never",class:"!border-none flex"},{default:r(()=>{var t;return[h("div",E,w((t=e.widget)==null?void 0:t.title),1)]}),_:1}),c(u,{class:"w-full",style:{height:"calc(100% - 60px)"}},{default:r(()=>{var t,a,s,l;return[(n(),i(v,null,[(n(),i(C((a=k(b)[(t=e.widget)==null?void 0:t.name])==null?void 0:a.attr),{content:(s=e.widget)==null?void 0:s.content,styles:(l=e.widget)==null?void 0:l.styles,type:e.type,"onUpdate:content":p},null,40,["content","styles","type"]))],1024))]}),_:1})])}}});export{N as _};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{I as F,B as O,C as R,g as S,i as z,D as A}from"./element-plus-BluzIk5z.js";import{_ as K}from"./index-BTmfRTpN.js";import{b as L,f as b}from"./index-CFvGjZJA.js";import{_ as P}from"./picker-D3waTbLd.js";import{_ as T}from"./picker-CZXTeC5w.js";import{D as q}from"./vuedraggable-CUBnU4N-.js";import{n as v}from"./lodash-es-VsDguZh5.js";import{d as G,b as H,c as k,o as c,U as o,L as s,a as l,P as u,u as r,K as _,R as J}from"./@vue-DjVelRet.js";const M={class:"flex-1"},Q={class:"bg-fill-light w-full p-4 mt-4"},W={class:"flex-1"},X={class:"flex-1 flex items-center"},Y={class:"drag-move cursor-move ml-auto"},Z={key:0,class:"mt-4"},f=5,ce=G({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})},type:{type:String,default:"mobile"}},emits:["update:content"],setup(m,{emit:y}){const p=y,d=m,g=H({get:()=>d.content,set:a=>{p("update:content",a)}}),w=()=>{var a;if(((a=d.content.data)==null?void 0:a.length)<f){const e=v(d.content);e.data.push({is_show:"1",image:"",name:"",link:{}}),p("update:content",e)}else b.msgError(`最多添加${f}张图片`)},U=a=>{var i;if(((i=d.content.data)==null?void 0:i.length)<=1)return b.msgError("最少保留一张图片");const e=v(d.content);e.data.splice(a,1),p("update:content",e)};return(a,e)=>{const i=T,E=P,C=R,h=O,B=S,D=L,N=K,I=z,$=F,j=A;return c(),k("div",null,[o(j,{"label-width":"70px"},{default:s(()=>[o($,{shadow:"never",class:"!border-none flex mt-2"},{default:s(()=>{var x;return[e[2]||(e[2]=l("div",{class:"flex items-end"},[l("div",{class:"text-base text-[#101010] font-medium"},"图片设置"),l("div",{class:"text-xs text-tx-secondary ml-2"}," 最多添加5张,建议图片尺寸:750px*200px ")],-1)),l("div",M,[o(r(q),{class:"draggable",modelValue:r(g).data,"onUpdate:modelValue":e[0]||(e[0]=t=>r(g).data=t),animation:"300",handle:".drag-move"},{item:s(({element:t,index:V})=>[(c(),_(N,{key:V,onClose:n=>U(V),class:"w-full"},{default:s(()=>[l("div",Q,[o(i,{width:"396px",height:"196px",modelValue:t.image,"onUpdate:modelValue":n=>t.image=n,"upload-class":"bg-body","exclude-domain":""},null,8,["modelValue","onUpdate:modelValue"]),l("div",W,[o(h,{class:"mt-[18px]",label:"图片链接"},{default:s(()=>[m.type=="mobile"?(c(),_(E,{key:0,modelValue:t.link,"onUpdate:modelValue":n=>t.link=n},null,8,["modelValue","onUpdate:modelValue"])):u("",!0),m.type=="pc"?(c(),_(C,{key:1,placeholder:"请输入链接",modelValue:t.link.path,"onUpdate:modelValue":n=>t.link.path=n},null,8,["modelValue","onUpdate:modelValue"])):u("",!0)]),_:2},1024),o(h,{label:"是否显示",class:"mt-[18px] !mb-0"},{default:s(()=>[l("div",X,[o(B,{modelValue:t.is_show,"onUpdate:modelValue":n=>t.is_show=n,"active-value":"1","inactive-value":"0"},null,8,["modelValue","onUpdate:modelValue"]),l("div",Y,[o(D,{name:"el-icon-Rank",size:"18"})])])]),_:2},1024)])])]),_:2},1032,["onClose"]))]),_:1},8,["modelValue"])]),((x=m.content.data)==null?void 0:x.length)<f?(c(),k("div",Z,[o(I,{class:"w-full",type:"primary",onClick:w},{default:s(()=>e[1]||(e[1]=[J("添加图片")])),_:1})])):u("",!0)]}),_:1})]),_:1})])}}});export{ce as _};
|
||||
import{I as F,B as O,C as R,g as S,i as z,D as A}from"./element-plus-BluzIk5z.js";import{_ as K}from"./index-CUJDR3jl.js";import{b as L,f as b}from"./index-CLy3qTQ5.js";import{_ as P}from"./picker-tDJ86Pbf.js";import{_ as T}from"./picker-DvLnzHAC.js";import{D as q}from"./vuedraggable-CUBnU4N-.js";import{n as v}from"./lodash-es-VsDguZh5.js";import{d as G,b as H,c as k,o as c,U as o,L as s,a as l,P as u,u as r,K as _,R as J}from"./@vue-DjVelRet.js";const M={class:"flex-1"},Q={class:"bg-fill-light w-full p-4 mt-4"},W={class:"flex-1"},X={class:"flex-1 flex items-center"},Y={class:"drag-move cursor-move ml-auto"},Z={key:0,class:"mt-4"},f=5,ce=G({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})},type:{type:String,default:"mobile"}},emits:["update:content"],setup(m,{emit:y}){const p=y,d=m,g=H({get:()=>d.content,set:a=>{p("update:content",a)}}),w=()=>{var a;if(((a=d.content.data)==null?void 0:a.length)<f){const e=v(d.content);e.data.push({is_show:"1",image:"",name:"",link:{}}),p("update:content",e)}else b.msgError(`最多添加${f}张图片`)},U=a=>{var i;if(((i=d.content.data)==null?void 0:i.length)<=1)return b.msgError("最少保留一张图片");const e=v(d.content);e.data.splice(a,1),p("update:content",e)};return(a,e)=>{const i=T,E=P,C=R,h=O,B=S,D=L,N=K,I=z,$=F,j=A;return c(),k("div",null,[o(j,{"label-width":"70px"},{default:s(()=>[o($,{shadow:"never",class:"!border-none flex mt-2"},{default:s(()=>{var x;return[e[2]||(e[2]=l("div",{class:"flex items-end"},[l("div",{class:"text-base text-[#101010] font-medium"},"图片设置"),l("div",{class:"text-xs text-tx-secondary ml-2"}," 最多添加5张,建议图片尺寸:750px*200px ")],-1)),l("div",M,[o(r(q),{class:"draggable",modelValue:r(g).data,"onUpdate:modelValue":e[0]||(e[0]=t=>r(g).data=t),animation:"300",handle:".drag-move"},{item:s(({element:t,index:V})=>[(c(),_(N,{key:V,onClose:n=>U(V),class:"w-full"},{default:s(()=>[l("div",Q,[o(i,{width:"396px",height:"196px",modelValue:t.image,"onUpdate:modelValue":n=>t.image=n,"upload-class":"bg-body","exclude-domain":""},null,8,["modelValue","onUpdate:modelValue"]),l("div",W,[o(h,{class:"mt-[18px]",label:"图片链接"},{default:s(()=>[m.type=="mobile"?(c(),_(E,{key:0,modelValue:t.link,"onUpdate:modelValue":n=>t.link=n},null,8,["modelValue","onUpdate:modelValue"])):u("",!0),m.type=="pc"?(c(),_(C,{key:1,placeholder:"请输入链接",modelValue:t.link.path,"onUpdate:modelValue":n=>t.link.path=n},null,8,["modelValue","onUpdate:modelValue"])):u("",!0)]),_:2},1024),o(h,{label:"是否显示",class:"mt-[18px] !mb-0"},{default:s(()=>[l("div",X,[o(B,{modelValue:t.is_show,"onUpdate:modelValue":n=>t.is_show=n,"active-value":"1","inactive-value":"0"},null,8,["modelValue","onUpdate:modelValue"]),l("div",Y,[o(D,{name:"el-icon-Rank",size:"18"})])])]),_:2},1024)])])]),_:2},1032,["onClose"]))]),_:1},8,["modelValue"])]),((x=m.content.data)==null?void 0:x.length)<f?(c(),k("div",Z,[o(I,{class:"w-full",type:"primary",onClick:w},{default:s(()=>e[1]||(e[1]=[J("添加图片")])),_:1})])):u("",!0)]}),_:1})]),_:1})])}}});export{ce as _};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{I as k,O as B,P as O,B as g,G as C,H as F,D as N}from"./element-plus-BluzIk5z.js";import{_ as R}from"./add-nav.vue_vue_type_script_setup_true_lang-Buvqdy-V.js";import{d as j,b as D,c as d,o as u,U as l,L as o,a as s,u as n,R as x,T as c,ab as b}from"./@vue-DjVelRet.js";const G={class:"flex-1 mt-4"},H=j({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(v,{emit:V}){const y=V,w=v,a=D({get:()=>w.content,set:m=>{y("update:content",m)}});return(m,e)=>{const r=O,E=B,p=F,i=C,_=g,f=k,U=N;return u(),d("div",null,[l(U,{"label-width":"70px"},{default:o(()=>[l(f,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[6]||(e[6]=s("div",{class:"flex items-end mb-4"},[s("div",{class:"text-base text-[#101010] font-medium"},"展示样式")],-1)),l(E,{modelValue:n(a).style,"onUpdate:modelValue":e[0]||(e[0]=t=>n(a).style=t)},{default:o(()=>[l(r,{value:1},{default:o(()=>e[4]||(e[4]=[x("固定显示")])),_:1}),l(r,{value:2},{default:o(()=>e[5]||(e[5]=[x("分页滑动")])),_:1})]),_:1},8,["modelValue"]),l(_,{label:"每行数量",class:"mt-4"},{default:o(()=>[l(i,{modelValue:n(a).per_line,"onUpdate:modelValue":e[1]||(e[1]=t=>n(a).per_line=t),style:{width:"300px"}},{default:o(()=>[(u(),d(c,null,b(5,t=>l(p,{key:t,label:t+"个",value:t},null,8,["label","value"])),64))]),_:1},8,["modelValue"])]),_:1}),l(_,{label:"显示行数"},{default:o(()=>[l(i,{modelValue:n(a).show_line,"onUpdate:modelValue":e[2]||(e[2]=t=>n(a).show_line=t),style:{width:"300px"}},{default:o(()=>[(u(),d(c,null,b(2,t=>l(p,{key:t,label:t+"行",value:t},null,8,["label","value"])),64))]),_:1},8,["modelValue"])]),_:1})]),_:1}),l(f,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[7]||(e[7]=s("div",{class:"flex items-end"},[s("div",{class:"text-base text-[#101010] font-medium"},"菜单设置"),s("div",{class:"text-xs text-tx-secondary ml-2"},"建议图片尺寸:100px*100px")],-1)),s("div",G,[l(R,{modelValue:n(a).data,"onUpdate:modelValue":e[3]||(e[3]=t=>n(a).data=t)},null,8,["modelValue"])])]),_:1})]),_:1})])}}});export{H as _};
|
||||
import{I as k,O as B,P as O,B as g,G as C,H as F,D as N}from"./element-plus-BluzIk5z.js";import{_ as R}from"./add-nav.vue_vue_type_script_setup_true_lang-Bzl_Y-wg.js";import{d as j,b as D,c as d,o as u,U as l,L as o,a as s,u as n,R as x,T as c,ab as b}from"./@vue-DjVelRet.js";const G={class:"flex-1 mt-4"},H=j({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(v,{emit:V}){const y=V,w=v,a=D({get:()=>w.content,set:m=>{y("update:content",m)}});return(m,e)=>{const r=O,E=B,p=F,i=C,_=g,f=k,U=N;return u(),d("div",null,[l(U,{"label-width":"70px"},{default:o(()=>[l(f,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[6]||(e[6]=s("div",{class:"flex items-end mb-4"},[s("div",{class:"text-base text-[#101010] font-medium"},"展示样式")],-1)),l(E,{modelValue:n(a).style,"onUpdate:modelValue":e[0]||(e[0]=t=>n(a).style=t)},{default:o(()=>[l(r,{value:1},{default:o(()=>e[4]||(e[4]=[x("固定显示")])),_:1}),l(r,{value:2},{default:o(()=>e[5]||(e[5]=[x("分页滑动")])),_:1})]),_:1},8,["modelValue"]),l(_,{label:"每行数量",class:"mt-4"},{default:o(()=>[l(i,{modelValue:n(a).per_line,"onUpdate:modelValue":e[1]||(e[1]=t=>n(a).per_line=t),style:{width:"300px"}},{default:o(()=>[(u(),d(c,null,b(5,t=>l(p,{key:t,label:t+"个",value:t},null,8,["label","value"])),64))]),_:1},8,["modelValue"])]),_:1}),l(_,{label:"显示行数"},{default:o(()=>[l(i,{modelValue:n(a).show_line,"onUpdate:modelValue":e[2]||(e[2]=t=>n(a).show_line=t),style:{width:"300px"}},{default:o(()=>[(u(),d(c,null,b(2,t=>l(p,{key:t,label:t+"行",value:t},null,8,["label","value"])),64))]),_:1},8,["modelValue"])]),_:1})]),_:1}),l(f,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[7]||(e[7]=s("div",{class:"flex items-end"},[s("div",{class:"text-base text-[#101010] font-medium"},"菜单设置"),s("div",{class:"text-xs text-tx-secondary ml-2"},"建议图片尺寸:100px*100px")],-1)),s("div",G,[l(R,{modelValue:n(a).data,"onUpdate:modelValue":e[3]||(e[3]=t=>n(a).data=t)},null,8,["modelValue"])])]),_:1})]),_:1})])}}});export{H as _};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{I as V,B as E,C as w,O as y,P as B,D as C}from"./element-plus-BluzIk5z.js";import{_ as U}from"./add-nav.vue_vue_type_script_setup_true_lang-Buvqdy-V.js";import{d as I,b as N,c as O,o as R,U as t,L as o,u as s,a,R as u}from"./@vue-DjVelRet.js";const g={class:"flex-1"},F=I({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(p,{emit:i}){const f=i,_=p,l=N({get:()=>_.content,set:m=>{f("update:content",m)}});return(m,e)=>{const x=w,c=E,d=V,r=B,b=y,v=C;return R(),O("div",null,[t(v,{"label-width":"70px"},{default:o(()=>[t(d,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[t(c,{label:"标题"},{default:o(()=>[t(x,{class:"w-[396px]",modelValue:s(l).title,"onUpdate:modelValue":e[0]||(e[0]=n=>s(l).title=n)},null,8,["modelValue"])]),_:1})]),_:1}),t(d,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[5]||(e[5]=a("div",{class:"flex items-end mb-4"},[a("div",{class:"text-base text-[#101010] font-medium"},"展示样式")],-1)),t(b,{modelValue:s(l).style,"onUpdate:modelValue":e[1]||(e[1]=n=>s(l).style=n)},{default:o(()=>[t(r,{value:1},{default:o(()=>e[3]||(e[3]=[u("横排")])),_:1}),t(r,{value:2},{default:o(()=>e[4]||(e[4]=[u("竖排")])),_:1})]),_:1},8,["modelValue"])]),_:1}),t(d,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[6]||(e[6]=a("div",{class:"flex items-end mb-4"},[a("div",{class:"text-base text-[#101010] font-medium"},"菜单"),a("div",{class:"text-xs text-tx-secondary ml-2"},"建议图片尺寸:100px*100px")],-1)),a("div",g,[t(U,{modelValue:s(l).data,"onUpdate:modelValue":e[2]||(e[2]=n=>s(l).data=n)},null,8,["modelValue"])])]),_:1})]),_:1})])}}});export{F as _};
|
||||
import{I as V,B as E,C as w,O as y,P as B,D as C}from"./element-plus-BluzIk5z.js";import{_ as U}from"./add-nav.vue_vue_type_script_setup_true_lang-Bzl_Y-wg.js";import{d as I,b as N,c as O,o as R,U as t,L as o,u as s,a,R as u}from"./@vue-DjVelRet.js";const g={class:"flex-1"},F=I({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(p,{emit:i}){const f=i,_=p,l=N({get:()=>_.content,set:m=>{f("update:content",m)}});return(m,e)=>{const x=w,c=E,d=V,r=B,b=y,v=C;return R(),O("div",null,[t(v,{"label-width":"70px"},{default:o(()=>[t(d,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[t(c,{label:"标题"},{default:o(()=>[t(x,{class:"w-[396px]",modelValue:s(l).title,"onUpdate:modelValue":e[0]||(e[0]=n=>s(l).title=n)},null,8,["modelValue"])]),_:1})]),_:1}),t(d,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[5]||(e[5]=a("div",{class:"flex items-end mb-4"},[a("div",{class:"text-base text-[#101010] font-medium"},"展示样式")],-1)),t(b,{modelValue:s(l).style,"onUpdate:modelValue":e[1]||(e[1]=n=>s(l).style=n)},{default:o(()=>[t(r,{value:1},{default:o(()=>e[3]||(e[3]=[u("横排")])),_:1}),t(r,{value:2},{default:o(()=>e[4]||(e[4]=[u("竖排")])),_:1})]),_:1},8,["modelValue"])]),_:1}),t(d,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[6]||(e[6]=a("div",{class:"flex items-end mb-4"},[a("div",{class:"text-base text-[#101010] font-medium"},"菜单"),a("div",{class:"text-xs text-tx-secondary ml-2"},"建议图片尺寸:100px*100px")],-1)),a("div",g,[t(U,{modelValue:s(l).data,"onUpdate:modelValue":e[2]||(e[2]=n=>s(l).data=n)},null,8,["modelValue"])])]),_:1})]),_:1})])}}});export{F as _};
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
import{I as E,B as C,O as F,P as B,C as N,D as z}from"./element-plus-BluzIk5z.js";import{_ as I}from"./index.vue_vue_type_script_setup_true_lang-Bf0Dasz8.js";import{_ as O}from"./picker-CZXTeC5w.js";import{d as R,b as j,K as s,o as r,L as t,U as l,P as i,u as a,R as p,a as g}from"./@vue-DjVelRet.js";const L=R({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(u,{emit:y}){const b=y,x=u,o=j({get:()=>x.content,set:f=>{b("update:content",f)}});return(f,e)=>{const m=B,_=F,d=C,k=N,V=O,v=I,U=E,w=z;return r(),s(w,{ref:"form","label-width":"80px",size:"large"},{default:t(()=>[l(U,{shadow:"never",class:"!border-none flex mt-2"},{default:t(()=>[l(d,{label:"页面标题"},{default:t(()=>[l(_,{modelValue:a(o).title_type,"onUpdate:modelValue":e[0]||(e[0]=n=>a(o).title_type=n)},{default:t(()=>[l(m,{value:"1"},{default:t(()=>e[7]||(e[7]=[p("文字")])),_:1}),l(m,{value:"2"},{default:t(()=>e[8]||(e[8]=[p("图片")])),_:1})]),_:1},8,["modelValue"])]),_:1}),u.content.title_type==1?(r(),s(d,{key:0},{default:t(()=>[l(k,{modelValue:a(o).title,"onUpdate:modelValue":e[1]||(e[1]=n=>a(o).title=n),maxlength:"8","show-word-limit":"",class:"w-[300px]",placeholder:"请输入页面标题"},null,8,["modelValue"])]),_:1})):i("",!0),u.content.title_type==2?(r(),s(d,{key:1},{default:t(()=>[l(V,{modelValue:a(o).title_img,"onUpdate:modelValue":e[2]||(e[2]=n=>a(o).title_img=n),limit:1,size:"100px"},null,8,["modelValue"]),e[9]||(e[9]=g("div",{class:"form-tips"},"建议图片尺寸:300px*40px",-1))]),_:1})):i("",!0),u.content.title_type==1?(r(),s(d,{key:2,label:"文字颜色"},{default:t(()=>[l(_,{modelValue:a(o).text_color,"onUpdate:modelValue":e[3]||(e[3]=n=>a(o).text_color=n)},{default:t(()=>[l(m,{value:"1"},{default:t(()=>e[10]||(e[10]=[p("白色")])),_:1}),l(m,{value:"2"},{default:t(()=>e[11]||(e[11]=[p("黑色")])),_:1})]),_:1},8,["modelValue"])]),_:1})):i("",!0),l(d,{label:"页面背景"},{default:t(()=>[l(_,{modelValue:a(o).bg_type,"onUpdate:modelValue":e[4]||(e[4]=n=>a(o).bg_type=n)},{default:t(()=>[l(m,{value:"1"},{default:t(()=>e[12]||(e[12]=[p("背景颜色")])),_:1}),l(m,{value:"2"},{default:t(()=>e[13]||(e[13]=[p("背景图片")])),_:1})]),_:1},8,["modelValue"])]),_:1}),u.content.bg_type==1?(r(),s(d,{key:3},{default:t(()=>[l(v,{modelValue:a(o).bg_color,"onUpdate:modelValue":e[5]||(e[5]=n=>a(o).bg_color=n),"reset-color":"#F5F5F5"},null,8,["modelValue"])]),_:1})):i("",!0),u.content.bg_type==2?(r(),s(d,{key:4},{default:t(()=>[l(V,{modelValue:a(o).bg_image,"onUpdate:modelValue":e[6]||(e[6]=n=>a(o).bg_image=n),limit:1,size:"100px"},null,8,["modelValue"]),e[14]||(e[14]=g("div",{class:"form-tips"},"建议图片尺寸:750px*高度不限",-1))]),_:1})):i("",!0)]),_:1})]),_:1},512)}}});export{L as _};
|
||||
import{I as E,B as C,O as F,P as B,C as N,D as z}from"./element-plus-BluzIk5z.js";import{_ as I}from"./index.vue_vue_type_script_setup_true_lang-Bf0Dasz8.js";import{_ as O}from"./picker-DvLnzHAC.js";import{d as R,b as j,K as s,o as r,L as t,U as l,P as i,u as a,R as p,a as g}from"./@vue-DjVelRet.js";const L=R({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(u,{emit:y}){const b=y,x=u,o=j({get:()=>x.content,set:f=>{b("update:content",f)}});return(f,e)=>{const m=B,_=F,d=C,k=N,V=O,v=I,U=E,w=z;return r(),s(w,{ref:"form","label-width":"80px",size:"large"},{default:t(()=>[l(U,{shadow:"never",class:"!border-none flex mt-2"},{default:t(()=>[l(d,{label:"页面标题"},{default:t(()=>[l(_,{modelValue:a(o).title_type,"onUpdate:modelValue":e[0]||(e[0]=n=>a(o).title_type=n)},{default:t(()=>[l(m,{value:"1"},{default:t(()=>e[7]||(e[7]=[p("文字")])),_:1}),l(m,{value:"2"},{default:t(()=>e[8]||(e[8]=[p("图片")])),_:1})]),_:1},8,["modelValue"])]),_:1}),u.content.title_type==1?(r(),s(d,{key:0},{default:t(()=>[l(k,{modelValue:a(o).title,"onUpdate:modelValue":e[1]||(e[1]=n=>a(o).title=n),maxlength:"8","show-word-limit":"",class:"w-[300px]",placeholder:"请输入页面标题"},null,8,["modelValue"])]),_:1})):i("",!0),u.content.title_type==2?(r(),s(d,{key:1},{default:t(()=>[l(V,{modelValue:a(o).title_img,"onUpdate:modelValue":e[2]||(e[2]=n=>a(o).title_img=n),limit:1,size:"100px"},null,8,["modelValue"]),e[9]||(e[9]=g("div",{class:"form-tips"},"建议图片尺寸:300px*40px",-1))]),_:1})):i("",!0),u.content.title_type==1?(r(),s(d,{key:2,label:"文字颜色"},{default:t(()=>[l(_,{modelValue:a(o).text_color,"onUpdate:modelValue":e[3]||(e[3]=n=>a(o).text_color=n)},{default:t(()=>[l(m,{value:"1"},{default:t(()=>e[10]||(e[10]=[p("白色")])),_:1}),l(m,{value:"2"},{default:t(()=>e[11]||(e[11]=[p("黑色")])),_:1})]),_:1},8,["modelValue"])]),_:1})):i("",!0),l(d,{label:"页面背景"},{default:t(()=>[l(_,{modelValue:a(o).bg_type,"onUpdate:modelValue":e[4]||(e[4]=n=>a(o).bg_type=n)},{default:t(()=>[l(m,{value:"1"},{default:t(()=>e[12]||(e[12]=[p("背景颜色")])),_:1}),l(m,{value:"2"},{default:t(()=>e[13]||(e[13]=[p("背景图片")])),_:1})]),_:1},8,["modelValue"])]),_:1}),u.content.bg_type==1?(r(),s(d,{key:3},{default:t(()=>[l(v,{modelValue:a(o).bg_color,"onUpdate:modelValue":e[5]||(e[5]=n=>a(o).bg_color=n),"reset-color":"#F5F5F5"},null,8,["modelValue"])]),_:1})):i("",!0),u.content.bg_type==2?(r(),s(d,{key:4},{default:t(()=>[l(V,{modelValue:a(o).bg_image,"onUpdate:modelValue":e[6]||(e[6]=n=>a(o).bg_image=n),limit:1,size:"100px"},null,8,["modelValue"]),e[14]||(e[14]=g("div",{class:"form-tips"},"建议图片尺寸:750px*高度不限",-1))]),_:1})):i("",!0)]),_:1})]),_:1},512)}}});export{L as _};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{I as $,B as j,C as F,g as O,i as R,D as z}from"./element-plus-BluzIk5z.js";import{_ as A}from"./index-BTmfRTpN.js";import{b as K,f as g}from"./index-CFvGjZJA.js";import{_ as L}from"./picker-D3waTbLd.js";import{_ as P}from"./picker-CZXTeC5w.js";import{D as S}from"./vuedraggable-CUBnU4N-.js";import{n as b}from"./lodash-es-VsDguZh5.js";import{d as T,b as q,c as v,o as _,U as t,L as l,a as s,P as G,u as p,K as H,R as J}from"./@vue-DjVelRet.js";const M={class:"bg-fill-light flex items-center w-full p-4 mt-4"},Q={class:"ml-3 flex-1"},W={class:"flex-1 flex items-center"},X={class:"drag-move cursor-move ml-auto"},Y={key:0,class:"mt-4"},u=5,de=T({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(r,{emit:h}){const c=h,d=r,f=q({get:()=>d.content,set:a=>{c("update:content",a)}}),k=()=>{var a;if(((a=d.content.data)==null?void 0:a.length)<u){const e=b(d.content);e.data.push({is_show:"1",image:"",name:"",link:{}}),c("update:content",e)}else g.msgError(`最多添加${u}张图片`)},w=a=>{var m;if(((m=d.content.data)==null?void 0:m.length)<=1)return g.msgError("最少保留一张图片");const e=b(d.content);e.data.splice(a,1),c("update:content",e)};return(a,e)=>{const m=P,y=F,i=j,U=L,E=O,C=K,B=A,D=R,N=$,I=z;return _(),v("div",null,[t(I,{"label-width":"70px"},{default:l(()=>[t(N,{shadow:"never",class:"!border-none flex mt-2"},{default:l(()=>{var x;return[e[2]||(e[2]=s("div",{class:"flex items-end mb-4"},[s("div",{class:"text-base text-[#101010] font-medium"},"菜单"),s("div",{class:"text-xs text-tx-secondary ml-2"}," 最多添加5张,建议图片尺寸:750px*200px ")],-1)),t(p(S),{class:"draggable",modelValue:p(f).data,"onUpdate:modelValue":e[0]||(e[0]=o=>p(f).data=o),animation:"300",handle:".drag-move","item-key":"index"},{item:l(({element:o,index:V})=>[(_(),H(B,{key:V,onClose:n=>w(V),class:"w-[467px]"},{default:l(()=>[s("div",M,[t(m,{modelValue:o.image,"onUpdate:modelValue":n=>o.image=n,"upload-class":"bg-body","exclude-domain":""},null,8,["modelValue","onUpdate:modelValue"]),s("div",Q,[t(i,{label:"图片名称"},{default:l(()=>[t(y,{modelValue:o.name,"onUpdate:modelValue":n=>o.name=n,placeholder:"请输入名称"},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),t(i,{class:"mt-[18px]",label:"图片链接"},{default:l(()=>[t(U,{modelValue:o.link,"onUpdate:modelValue":n=>o.link=n},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),t(i,{label:"是否显示",class:"mt-[18px]"},{default:l(()=>[s("div",W,[t(E,{modelValue:o.is_show,"onUpdate:modelValue":n=>o.is_show=n,"active-value":"1","inactive-value":"0"},null,8,["modelValue","onUpdate:modelValue"]),s("div",X,[t(C,{name:"el-icon-Rank",size:"18"})])])]),_:2},1024)])])]),_:2},1032,["onClose"]))]),_:1},8,["modelValue"]),((x=r.content.data)==null?void 0:x.length)<u?(_(),v("div",Y,[t(D,{class:"w-full",type:"primary",onClick:k},{default:l(()=>e[1]||(e[1]=[J("添加图片")])),_:1})])):G("",!0)]}),_:1})]),_:1})])}}});export{de as _};
|
||||
import{I as $,B as j,C as F,g as O,i as R,D as z}from"./element-plus-BluzIk5z.js";import{_ as A}from"./index-CUJDR3jl.js";import{b as K,f as g}from"./index-CLy3qTQ5.js";import{_ as L}from"./picker-tDJ86Pbf.js";import{_ as P}from"./picker-DvLnzHAC.js";import{D as S}from"./vuedraggable-CUBnU4N-.js";import{n as b}from"./lodash-es-VsDguZh5.js";import{d as T,b as q,c as v,o as _,U as t,L as l,a as s,P as G,u as p,K as H,R as J}from"./@vue-DjVelRet.js";const M={class:"bg-fill-light flex items-center w-full p-4 mt-4"},Q={class:"ml-3 flex-1"},W={class:"flex-1 flex items-center"},X={class:"drag-move cursor-move ml-auto"},Y={key:0,class:"mt-4"},u=5,de=T({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(r,{emit:h}){const c=h,d=r,f=q({get:()=>d.content,set:a=>{c("update:content",a)}}),k=()=>{var a;if(((a=d.content.data)==null?void 0:a.length)<u){const e=b(d.content);e.data.push({is_show:"1",image:"",name:"",link:{}}),c("update:content",e)}else g.msgError(`最多添加${u}张图片`)},w=a=>{var m;if(((m=d.content.data)==null?void 0:m.length)<=1)return g.msgError("最少保留一张图片");const e=b(d.content);e.data.splice(a,1),c("update:content",e)};return(a,e)=>{const m=P,y=F,i=j,U=L,E=O,C=K,B=A,D=R,N=$,I=z;return _(),v("div",null,[t(I,{"label-width":"70px"},{default:l(()=>[t(N,{shadow:"never",class:"!border-none flex mt-2"},{default:l(()=>{var x;return[e[2]||(e[2]=s("div",{class:"flex items-end mb-4"},[s("div",{class:"text-base text-[#101010] font-medium"},"菜单"),s("div",{class:"text-xs text-tx-secondary ml-2"}," 最多添加5张,建议图片尺寸:750px*200px ")],-1)),t(p(S),{class:"draggable",modelValue:p(f).data,"onUpdate:modelValue":e[0]||(e[0]=o=>p(f).data=o),animation:"300",handle:".drag-move","item-key":"index"},{item:l(({element:o,index:V})=>[(_(),H(B,{key:V,onClose:n=>w(V),class:"w-[467px]"},{default:l(()=>[s("div",M,[t(m,{modelValue:o.image,"onUpdate:modelValue":n=>o.image=n,"upload-class":"bg-body","exclude-domain":""},null,8,["modelValue","onUpdate:modelValue"]),s("div",Q,[t(i,{label:"图片名称"},{default:l(()=>[t(y,{modelValue:o.name,"onUpdate:modelValue":n=>o.name=n,placeholder:"请输入名称"},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),t(i,{class:"mt-[18px]",label:"图片链接"},{default:l(()=>[t(U,{modelValue:o.link,"onUpdate:modelValue":n=>o.link=n},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),t(i,{label:"是否显示",class:"mt-[18px]"},{default:l(()=>[s("div",W,[t(E,{modelValue:o.is_show,"onUpdate:modelValue":n=>o.is_show=n,"active-value":"1","inactive-value":"0"},null,8,["modelValue","onUpdate:modelValue"]),s("div",X,[t(C,{name:"el-icon-Rank",size:"18"})])])]),_:2},1024)])])]),_:2},1032,["onClose"]))]),_:1},8,["modelValue"]),((x=r.content.data)==null?void 0:x.length)<u?(_(),v("div",Y,[t(D,{class:"w-full",type:"primary",onClick:k},{default:l(()=>e[1]||(e[1]=[J("添加图片")])),_:1})])):G("",!0)]}),_:1})]),_:1})])}}});export{de as _};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{I as V,B as b,C as w,D as x}from"./element-plus-BluzIk5z.js";import{_ as g}from"./picker-CZXTeC5w.js";import{d as U,b as k,c as E,o as B,U as e,L as n,u as o,a as C}from"./@vue-DjVelRet.js";const j=U({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(u,{emit:r}){const p=r,i=u,l=k({get:()=>i.content,set:s=>{p("update:content",s)}});return(s,t)=>{const d=w,m=b,_=g,c=V,f=x;return B(),E("div",null,[e(f,{"label-width":"90px",size:"large","label-position":"top"},{default:n(()=>[e(c,{shadow:"never",class:"!border-none flex mt-2"},{default:n(()=>[e(m,{label:"平台名称"},{default:n(()=>[e(d,{class:"w-[400px]","show-word-limit":"",maxlength:"20",modelValue:o(l).title,"onUpdate:modelValue":t[0]||(t[0]=a=>o(l).title=a)},null,8,["modelValue"])]),_:1}),e(m,{label:"客服二维码"},{default:n(()=>[C("div",null,[e(_,{modelValue:o(l).qrcode,"onUpdate:modelValue":t[1]||(t[1]=a=>o(l).qrcode=a),"exclude-domain":""},null,8,["modelValue"])])]),_:1}),e(m,{label:"备注"},{default:n(()=>[e(d,{class:"w-[400px]","show-word-limit":"",maxlength:"20",modelValue:o(l).remark,"onUpdate:modelValue":t[2]||(t[2]=a=>o(l).remark=a)},null,8,["modelValue"])]),_:1}),e(m,{label:"联系电话"},{default:n(()=>[e(d,{class:"w-[400px]",modelValue:o(l).mobile,"onUpdate:modelValue":t[3]||(t[3]=a=>o(l).mobile=a)},null,8,["modelValue"])]),_:1}),e(m,{label:"服务时间"},{default:n(()=>[e(d,{class:"w-[400px]","show-word-limit":"",maxlength:"20",modelValue:o(l).time,"onUpdate:modelValue":t[4]||(t[4]=a=>o(l).time=a)},null,8,["modelValue"])]),_:1})]),_:1})]),_:1})])}}});export{j as _};
|
||||
import{I as V,B as b,C as w,D as x}from"./element-plus-BluzIk5z.js";import{_ as g}from"./picker-DvLnzHAC.js";import{d as U,b as k,c as E,o as B,U as e,L as n,u as o,a as C}from"./@vue-DjVelRet.js";const j=U({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(u,{emit:r}){const p=r,i=u,l=k({get:()=>i.content,set:s=>{p("update:content",s)}});return(s,t)=>{const d=w,m=b,_=g,c=V,f=x;return B(),E("div",null,[e(f,{"label-width":"90px",size:"large","label-position":"top"},{default:n(()=>[e(c,{shadow:"never",class:"!border-none flex mt-2"},{default:n(()=>[e(m,{label:"平台名称"},{default:n(()=>[e(d,{class:"w-[400px]","show-word-limit":"",maxlength:"20",modelValue:o(l).title,"onUpdate:modelValue":t[0]||(t[0]=a=>o(l).title=a)},null,8,["modelValue"])]),_:1}),e(m,{label:"客服二维码"},{default:n(()=>[C("div",null,[e(_,{modelValue:o(l).qrcode,"onUpdate:modelValue":t[1]||(t[1]=a=>o(l).qrcode=a),"exclude-domain":""},null,8,["modelValue"])])]),_:1}),e(m,{label:"备注"},{default:n(()=>[e(d,{class:"w-[400px]","show-word-limit":"",maxlength:"20",modelValue:o(l).remark,"onUpdate:modelValue":t[2]||(t[2]=a=>o(l).remark=a)},null,8,["modelValue"])]),_:1}),e(m,{label:"联系电话"},{default:n(()=>[e(d,{class:"w-[400px]",modelValue:o(l).mobile,"onUpdate:modelValue":t[3]||(t[3]=a=>o(l).mobile=a)},null,8,["modelValue"])]),_:1}),e(m,{label:"服务时间"},{default:n(()=>[e(d,{class:"w-[400px]","show-word-limit":"",maxlength:"20",modelValue:o(l).time,"onUpdate:modelValue":t[4]||(t[4]=a=>o(l).time=a)},null,8,["modelValue"])]),_:1})]),_:1})]),_:1})])}}});export{j as _};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./auth.vue_vue_type_script_setup_true_lang-MyIJ_AKP.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./menu-gx2VkGHi.js";import"./index-CFvGjZJA.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./role-BP9rjzPd.js";import"./index-DNyOr68f.js";export{o as default};
|
||||
import{_ as o}from"./auth.vue_vue_type_script_setup_true_lang-1cx43iDo.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./menu-BkrScQvA.js";import"./index-CLy3qTQ5.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./role-LQil4t2Z.js";import"./index-D-UvWoOR.js";export{o as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{D as U,s as q,B as H,F as I,W as O,M as W}from"./element-plus-BluzIk5z.js";import{m as j}from"./menu-gx2VkGHi.js";import{a as z}from"./role-BP9rjzPd.js";import{P as G}from"./index-DNyOr68f.js";import{t as J}from"./index-CFvGjZJA.js";import{d as Q,s as f,r,a0 as X,c as Y,o as k,U as o,L as d,M as Z,K as $,u as c,a as y,i as ee,n as x}from"./@vue-DjVelRet.js";const te={class:"edit-popup"},ie=Q({__name:"auth",emits:["success","close"],setup(le,{expose:C,emit:b}){const _=b,s=f(),h=f(),u=f(),g=r(!1),i=r(!0),m=r(!1),v=r([]),p=r([]),a=X({id:"",name:"",desc:"",sort:0,menu_id:[]}),E={name:[{required:!0,message:"请输入名称",trigger:["blur"]}]},w=()=>{m.value=!0,j().then(e=>{p.value=e,v.value=J(e),x(()=>{K()}),m.value=!1})},R=()=>{var l,n;const e=(l=s.value)==null?void 0:l.getCheckedKeys(),t=(n=s.value)==null?void 0:n.getHalfCheckedKeys();return e==null||e.unshift.apply(e,t),e},K=()=>{a.menu_id.forEach(e=>{x(()=>{var t;(t=s.value)==null||t.setChecked(e,!0,!1)})})},A=e=>{const t=p.value;for(let l=0;l<t.length;l++)s.value.store.nodesMap[t[l].id].expanded=e},D=e=>{var t,l;e?(t=s.value)==null||t.setCheckedKeys(v.value.map(n=>n.id)):(l=s.value)==null||l.setCheckedKeys([])},B=async()=>{var e,t;await((e=h.value)==null?void 0:e.validate()),a.menu_id=R(),await z(a),(t=u.value)==null||t.close(),_("success")},V=()=>{_("close")},F=()=>{var e;(e=u.value)==null||e.open()},S=async e=>{for(const t in a)e[t]!=null&&e[t]!=null&&(a[t]=e[t])};return w(),C({open:F,setFormData:S}),(e,t)=>{const l=I,n=O,T=H,L=q,M=U,N=W;return k(),Y("div",te,[o(G,{ref_key:"popupRef",ref:u,title:"分配权限",async:!0,width:"550px",onConfirm:B,onClose:V},{default:d(()=>[Z((k(),$(M,{class:"ls-form",ref_key:"formRef",ref:h,rules:E,model:c(a),"label-width":"60px"},{default:d(()=>[o(L,{class:"h-[400px] sm:h-[600px]"},{default:d(()=>[o(T,{label:"权限",prop:"menu_id"},{default:d(()=>[y("div",null,[o(l,{label:"展开/折叠",onChange:A}),o(l,{label:"全选/不全选",onChange:D}),o(l,{modelValue:c(i),"onUpdate:modelValue":t[0]||(t[0]=P=>ee(i)?i.value=P:null),label:"父子联动"},null,8,["modelValue"]),y("div",null,[o(n,{ref_key:"treeRef",ref:s,data:c(p),props:{label:"name",children:"children"},"check-strictly":!c(i),"node-key":"id","default-expand-all":c(g),"show-checkbox":""},null,8,["data","check-strictly","default-expand-all"])])])]),_:1})]),_:1})]),_:1},8,["model"])),[[N,c(m)]])]),_:1},512)])}}});export{ie as _};
|
||||
import{D as U,s as q,B as H,F as I,W as O,M as W}from"./element-plus-BluzIk5z.js";import{m as j}from"./menu-BkrScQvA.js";import{a as z}from"./role-LQil4t2Z.js";import{P as G}from"./index-D-UvWoOR.js";import{t as J}from"./index-CLy3qTQ5.js";import{d as Q,s as f,r,a0 as X,c as Y,o as k,U as o,L as d,M as Z,K as $,u as c,a as y,i as ee,n as x}from"./@vue-DjVelRet.js";const te={class:"edit-popup"},ie=Q({__name:"auth",emits:["success","close"],setup(le,{expose:C,emit:b}){const _=b,s=f(),h=f(),u=f(),g=r(!1),i=r(!0),m=r(!1),v=r([]),p=r([]),a=X({id:"",name:"",desc:"",sort:0,menu_id:[]}),E={name:[{required:!0,message:"请输入名称",trigger:["blur"]}]},w=()=>{m.value=!0,j().then(e=>{p.value=e,v.value=J(e),x(()=>{K()}),m.value=!1})},R=()=>{var l,n;const e=(l=s.value)==null?void 0:l.getCheckedKeys(),t=(n=s.value)==null?void 0:n.getHalfCheckedKeys();return e==null||e.unshift.apply(e,t),e},K=()=>{a.menu_id.forEach(e=>{x(()=>{var t;(t=s.value)==null||t.setChecked(e,!0,!1)})})},A=e=>{const t=p.value;for(let l=0;l<t.length;l++)s.value.store.nodesMap[t[l].id].expanded=e},D=e=>{var t,l;e?(t=s.value)==null||t.setCheckedKeys(v.value.map(n=>n.id)):(l=s.value)==null||l.setCheckedKeys([])},B=async()=>{var e,t;await((e=h.value)==null?void 0:e.validate()),a.menu_id=R(),await z(a),(t=u.value)==null||t.close(),_("success")},V=()=>{_("close")},F=()=>{var e;(e=u.value)==null||e.open()},S=async e=>{for(const t in a)e[t]!=null&&e[t]!=null&&(a[t]=e[t])};return w(),C({open:F,setFormData:S}),(e,t)=>{const l=I,n=O,T=H,L=q,M=U,N=W;return k(),Y("div",te,[o(G,{ref_key:"popupRef",ref:u,title:"分配权限",async:!0,width:"550px",onConfirm:B,onClose:V},{default:d(()=>[Z((k(),$(M,{class:"ls-form",ref_key:"formRef",ref:h,rules:E,model:c(a),"label-width":"60px"},{default:d(()=>[o(L,{class:"h-[400px] sm:h-[600px]"},{default:d(()=>[o(T,{label:"权限",prop:"menu_id"},{default:d(()=>[y("div",null,[o(l,{label:"展开/折叠",onChange:A}),o(l,{label:"全选/不全选",onChange:D}),o(l,{modelValue:c(i),"onUpdate:modelValue":t[0]||(t[0]=P=>ee(i)?i.value=P:null),label:"父子联动"},null,8,["modelValue"]),y("div",null,[o(n,{ref_key:"treeRef",ref:s,data:c(p),props:{label:"name",children:"children"},"check-strictly":!c(i),"node-key":"id","default-expand-all":c(g),"show-checkbox":""},null,8,["data","check-strictly","default-expand-all"])])])]),_:1})]),_:1})]),_:1},8,["model"])),[[N,c(m)]])]),_:1},512)])}}});export{ie as _};
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
import{R as c,I as d,J as _,K as f,i as u}from"./element-plus-BluzIk5z.js";import{f as h,v as b}from"./index-CFvGjZJA.js";import{d as n,r as w,c as C,o as E,U as t,L as o,u as k,R as x}from"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const y={class:"cache"},v=n({name:"cache"}),rt=n({...v,setup(g){const i=w([{content:"系统缓存",desc:"系统运行过程中产生的各类缓存数据"}]),m=async()=>{await h.confirm("确认清除系统缓存?"),await b(),window.location.reload()};return(B,a)=>{const l=c,r=d,e=f,p=u,s=_;return E(),C("div",y,[t(r,{class:"!border-none",shadow:"never"},{default:o(()=>[t(l,{type:"warning",title:"温馨提示:管理系统运行过程中产生的缓存",closable:!1,"show-icon":""})]),_:1}),t(r,{class:"!border-none mt-4",shadow:"never"},{default:o(()=>[t(s,{data:k(i),size:"large"},{default:o(()=>[t(e,{label:"管理内容",prop:"content","min-width":"130"}),t(e,{label:"内容说明",prop:"desc","min-width":"180"}),t(e,{label:"操作",width:"130",fixed:"right"},{default:o(()=>[t(p,{type:"primary",link:"",onClick:m},{default:o(()=>a[0]||(a[0]=[x("清除系统缓存")])),_:1})]),_:1})]),_:1},8,["data"])]),_:1})])}}});export{rt as default};
|
||||
import{R as c,I as d,J as _,K as f,i as u}from"./element-plus-BluzIk5z.js";import{f as h,v as b}from"./index-CLy3qTQ5.js";import{d as n,r as w,c as C,o as E,U as t,L as o,u as k,R as x}from"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const y={class:"cache"},v=n({name:"cache"}),rt=n({...v,setup(g){const i=w([{content:"系统缓存",desc:"系统运行过程中产生的各类缓存数据"}]),m=async()=>{await h.confirm("确认清除系统缓存?"),await b(),window.location.reload()};return(B,a)=>{const l=c,r=d,e=f,p=u,s=_;return E(),C("div",y,[t(r,{class:"!border-none",shadow:"never"},{default:o(()=>[t(l,{type:"warning",title:"温馨提示:管理系统运行过程中产生的缓存",closable:!1,"show-icon":""})]),_:1}),t(r,{class:"!border-none mt-4",shadow:"never"},{default:o(()=>[t(s,{data:k(i),size:"large"},{default:o(()=>[t(e,{label:"管理内容",prop:"content","min-width":"130"}),t(e,{label:"内容说明",prop:"desc","min-width":"180"}),t(e,{label:"操作",width:"130",fixed:"right"},{default:o(()=>[t(p,{type:"primary",link:"",onClick:m},{default:o(()=>a[0]||(a[0]=[x("清除系统缓存")])),_:1})]),_:1})]),_:1},8,["data"])]),_:1})])}}});export{rt as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{r as t}from"./index-CFvGjZJA.js";function o(e){return t.get({url:"/tools.generator/generateTable",params:e})}function n(e){return t.get({url:"/tools.generator/dataTable",params:e})}function a(e){return t.post({url:"/tools.generator/selectTable",params:e})}function l(e){return t.get({url:"/tools.generator/detail",params:e})}function s(e){return t.post({url:"/tools.generator/syncColumn",params:e})}function u(e){return t.post({url:"/tools.generator/delete",params:e})}function g(e){return t.post({url:"/tools.generator/edit",params:e})}function i(e){return t.post({url:"/tools.generator/preview",params:e})}function c(e){return t.post({url:"/tools.generator/generate",params:e})}function f(){return t.get({url:"/tools.generator/getModels"})}export{f as a,o as b,u as c,i as d,c as e,n as f,g,a as h,s,l as t};
|
||||
import{r as t}from"./index-CLy3qTQ5.js";function o(e){return t.get({url:"/tools.generator/generateTable",params:e})}function n(e){return t.get({url:"/tools.generator/dataTable",params:e})}function a(e){return t.post({url:"/tools.generator/selectTable",params:e})}function l(e){return t.get({url:"/tools.generator/detail",params:e})}function s(e){return t.post({url:"/tools.generator/syncColumn",params:e})}function u(e){return t.post({url:"/tools.generator/delete",params:e})}function g(e){return t.post({url:"/tools.generator/edit",params:e})}function i(e){return t.post({url:"/tools.generator/preview",params:e})}function c(e){return t.post({url:"/tools.generator/generate",params:e})}function f(){return t.get({url:"/tools.generator/getModels"})}export{f as a,o as b,u as c,i as d,c as e,n as f,g,a as h,s,l as t};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./code-preview.vue_vue_type_script_setup_true_lang-B8UIgBuY.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-CFvGjZJA.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";export{o as default};
|
||||
import{_ as o}from"./code-preview.vue_vue_type_script_setup_true_lang-C06__8tP.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-CLy3qTQ5.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";export{o as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{m as B,l as T,s as N,i as j,N as U}from"./element-plus-BluzIk5z.js";import{b as $,f as d}from"./index-CFvGjZJA.js";import{u as D}from"./vue-clipboard3-DXsJvHIW.js";import{d as L,r as R,b as S,aj as F,c as m,o as c,U as t,L as a,i,u,T as K,ab as P,K as q,a as p,R as z}from"./@vue-DjVelRet.js";const A={class:"code-preview"},G={class:"flex",style:{height:"50vh"}},Q=L({__name:"code-preview",props:{modelValue:{type:Boolean},code:{}},emits:["update:modelValue"],setup(_,{emit:f}){const b=_,V=f,{toClipboard:g}=D(),n=R("index0"),h=async l=>{try{await g(l),d.msgSuccess("复制成功")}catch{d.msgError("复制失败")}},s=S({get(){return b.modelValue},set(l){V("update:modelValue",l)}});return(l,e)=>{const v=F("highlightjs"),y=N,C=$,k=j,x=T,E=B,w=U;return c(),m("div",A,[t(w,{modelValue:u(s),"onUpdate:modelValue":e[1]||(e[1]=o=>i(s)?s.value=o:null),width:"900px",title:"代码预览"},{default:a(()=>[t(E,{modelValue:u(n),"onUpdate:modelValue":e[0]||(e[0]=o=>i(n)?n.value=o:null)},{default:a(()=>[(c(!0),m(K,null,P(l.code,(o,r)=>(c(),q(x,{label:o.name,name:`index${r}`,key:r},{default:a(()=>[p("div",G,[t(y,{class:"flex-1"},{default:a(()=>[t(v,{autodetect:"",code:o.content},null,8,["code"])]),_:2},1024),p("div",null,[t(k,{onClick:H=>h(o.content),type:"primary",link:""},{icon:a(()=>[t(C,{name:"el-icon-CopyDocument"})]),default:a(()=>[e[2]||(e[2]=z(" 复制 "))]),_:2},1032,["onClick"])])])]),_:2},1032,["label","name"]))),128))]),_:1},8,["modelValue"])]),_:1},8,["modelValue"])])}}});export{Q as _};
|
||||
import{m as B,l as T,s as N,i as j,N as U}from"./element-plus-BluzIk5z.js";import{b as $,f as d}from"./index-CLy3qTQ5.js";import{u as D}from"./vue-clipboard3-DXsJvHIW.js";import{d as L,r as R,b as S,aj as F,c as m,o as c,U as t,L as a,i,u,T as K,ab as P,K as q,a as p,R as z}from"./@vue-DjVelRet.js";const A={class:"code-preview"},G={class:"flex",style:{height:"50vh"}},Q=L({__name:"code-preview",props:{modelValue:{type:Boolean},code:{}},emits:["update:modelValue"],setup(_,{emit:f}){const b=_,V=f,{toClipboard:g}=D(),n=R("index0"),h=async l=>{try{await g(l),d.msgSuccess("复制成功")}catch{d.msgError("复制失败")}},s=S({get(){return b.modelValue},set(l){V("update:modelValue",l)}});return(l,e)=>{const v=F("highlightjs"),y=N,C=$,k=j,x=T,E=B,w=U;return c(),m("div",A,[t(w,{modelValue:u(s),"onUpdate:modelValue":e[1]||(e[1]=o=>i(s)?s.value=o:null),width:"900px",title:"代码预览"},{default:a(()=>[t(E,{modelValue:u(n),"onUpdate:modelValue":e[0]||(e[0]=o=>i(n)?n.value=o:null)},{default:a(()=>[(c(!0),m(K,null,P(l.code,(o,r)=>(c(),q(x,{label:o.name,name:`index${r}`,key:r},{default:a(()=>[p("div",G,[t(y,{class:"flex-1"},{default:a(()=>[t(v,{autodetect:"",code:o.content},null,8,["code"])]),_:2},1024),p("div",null,[t(k,{onClick:H=>h(o.content),type:"primary",link:""},{icon:a(()=>[t(C,{name:"el-icon-CopyDocument"})]),default:a(()=>[e[2]||(e[2]=z(" 复制 "))]),_:2},1032,["onClick"])])])]),_:2},1032,["label","name"]))),128))]),_:1},8,["modelValue"])]),_:1},8,["modelValue"])])}}});export{Q as _};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{r as m}from"./index-CFvGjZJA.js";function o(t){return m.get({url:"/community.communityPost/lists",params:t})}function u(t){return m.get({url:"/community.communityPost/detail",params:t})}function i(t){return m.post({url:"/community.communityPost/updateStatus",params:t})}function c(t){return m.post({url:"/community.communityPost/setTop",params:t})}function s(t){return m.post({url:"/community.communityPost/setHot",params:t})}function e(t){return m.post({url:"/community.communityPost/delete",params:t})}function r(t){return m.get({url:"/community.communityTag/lists",params:t})}function y(t){return m.post({url:"/community.communityTag/add",params:t})}function a(t){return m.post({url:"/community.communityTag/edit",params:t})}function l(t){return m.post({url:"/community.communityTag/delete",params:t})}function f(t){return m.get({url:"/community.communityComment/lists",params:t})}function p(t){return m.get({url:"/community.commentAccount/lists",params:t})}function g(t){return m.post({url:"/community.communityComment/updateStatus",params:t})}function d(t){return m.post({url:"/community.communityComment/delete",params:t})}export{f as a,g as b,p as c,d,o as e,i as f,c as g,s as h,e as i,u as j,r as k,a as l,y as m,l as n};
|
||||
import{r as m}from"./index-CLy3qTQ5.js";function o(t){return m.get({url:"/community.communityPost/lists",params:t})}function u(t){return m.get({url:"/community.communityPost/detail",params:t})}function i(t){return m.post({url:"/community.communityPost/updateStatus",params:t})}function c(t){return m.post({url:"/community.communityPost/setTop",params:t})}function s(t){return m.post({url:"/community.communityPost/setHot",params:t})}function e(t){return m.post({url:"/community.communityPost/delete",params:t})}function r(t){return m.get({url:"/community.communityTag/lists",params:t})}function y(t){return m.post({url:"/community.communityTag/add",params:t})}function a(t){return m.post({url:"/community.communityTag/edit",params:t})}function l(t){return m.post({url:"/community.communityTag/delete",params:t})}function f(t){return m.get({url:"/community.communityComment/lists",params:t})}function p(t){return m.get({url:"/community.commentAccount/lists",params:t})}function g(t){return m.post({url:"/community.communityComment/updateStatus",params:t})}function d(t){return m.post({url:"/community.communityComment/delete",params:t})}export{f as a,g as b,p as c,d,o as e,i as f,c as g,s as h,e as i,u as j,r as k,a as l,y as m,l as n};
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
import{r as u}from"./index-CFvGjZJA.js";function t(r){return u.get({url:"/user.user/lists",params:r},{ignoreCancelToken:!0})}function s(r){return u.get({url:"/user.user/detail",params:r})}function n(r){return u.post({url:"/user.user/edit",params:r})}function o(r){return u.post({url:"/user.user/adjustMoney",params:r})}function a(r){return u.post({url:"/user.user/adjustAccount",params:r})}export{o as a,t as b,a as c,s as g,n as u};
|
||||
import{r as u}from"./index-CLy3qTQ5.js";function t(r){return u.get({url:"/user.user/lists",params:r},{ignoreCancelToken:!0})}function s(r){return u.get({url:"/user.user/detail",params:r})}function n(r){return u.post({url:"/user.user/edit",params:r})}function o(r){return u.post({url:"/user.user/adjustMoney",params:r})}function a(r){return u.post({url:"/user.user/adjustAccount",params:r})}export{o as a,t as b,a as c,s as g,n as u};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./content.vue_vue_type_script_setup_true_lang-C-IPStjh.js";import"./decoration-img-DM6kFAvY.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-CFvGjZJA.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";export{o as default};
|
||||
import{_ as o}from"./content.vue_vue_type_script_setup_true_lang-jQE3yqtf.js";import"./decoration-img-J-gzYln4.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-CLy3qTQ5.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";export{o as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{b as n,d as m}from"./index-CFvGjZJA.js";import{g as l}from"./decoration-Db7gUctO.js";import{d,r as _,c as o,o as s,a as t,T as x,ab as f,P as u,S as i,U as v,u as b}from"./@vue-DjVelRet.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./element-plus-BluzIk5z.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const w={class:"news"},y={key:0,class:"mr-[10px]"},g=["src"],h={class:"flex flex-col justify-between flex-1"},j={class:"text-[15px] font-medium line-clamp-2"},k={class:"line-clamp-1 text-sm mt-[8px]"},D={class:"text-[#999] text-xs w-full flex justify-between mt-[8px]"},V={class:"flex items-center"},B={class:"ml-[5px]"},N=d({__name:"content",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},setup(C){const r=_([]);return(async()=>{const a=await l({limit:10});r.value=a})(),(a,p)=>{const c=n;return s(),o("div",w,[p[0]||(p[0]=t("div",{class:"flex items-center news-title mx-[10px] my-[15px] text-[17px] font-medium"}," 最新资讯 ",-1)),(s(!0),o(x,null,f(b(r),e=>(s(),o("div",{key:e.id,class:"news-card flex bg-white px-[10px] py-[16px] text-[#333] border-[#f2f2f2] border-b"},[e.image?(s(),o("div",y,[t("img",{src:e.image,class:"w-[120px] h-[90px] object-contain"},null,8,g)])):u("",!0),t("div",h,[t("div",j,i(e.title),1),t("div",k,i(e.desc),1),t("div",D,[t("div",null,i(e.create_time),1),t("div",V,[v(c,{name:"el-icon-View"}),t("div",B,i(e.click),1)])])])]))),128))])}}}),nt=m(N,[["__scopeId","data-v-dba98882"]]);export{nt as default};
|
||||
import{b as n,d as m}from"./index-CLy3qTQ5.js";import{g as l}from"./decoration-D2atLvb7.js";import{d,r as _,c as o,o as s,a as t,T as x,ab as f,P as u,S as i,U as v,u as b}from"./@vue-DjVelRet.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./element-plus-BluzIk5z.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const w={class:"news"},y={key:0,class:"mr-[10px]"},g=["src"],h={class:"flex flex-col justify-between flex-1"},j={class:"text-[15px] font-medium line-clamp-2"},k={class:"line-clamp-1 text-sm mt-[8px]"},D={class:"text-[#999] text-xs w-full flex justify-between mt-[8px]"},V={class:"flex items-center"},B={class:"ml-[5px]"},N=d({__name:"content",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},setup(C){const r=_([]);return(async()=>{const a=await l({limit:10});r.value=a})(),(a,p)=>{const c=n;return s(),o("div",w,[p[0]||(p[0]=t("div",{class:"flex items-center news-title mx-[10px] my-[15px] text-[17px] font-medium"}," 最新资讯 ",-1)),(s(!0),o(x,null,f(b(r),e=>(s(),o("div",{key:e.id,class:"news-card flex bg-white px-[10px] py-[16px] text-[#333] border-[#f2f2f2] border-b"},[e.image?(s(),o("div",y,[t("img",{src:e.image,class:"w-[120px] h-[90px] object-contain"},null,8,g)])):u("",!0),t("div",h,[t("div",j,i(e.title),1),t("div",k,i(e.desc),1),t("div",D,[t("div",null,i(e.create_time),1),t("div",V,[v(c,{name:"el-icon-View"}),t("div",B,i(e.click),1)])])])]))),128))])}}}),nt=m(N,[["__scopeId","data-v-dba98882"]]);export{nt as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{b as y,d as v}from"./index-CFvGjZJA.js";import d from"./decoration-img-DM6kFAvY.js";import{d as b,b as g,c as t,o as e,P as p,a as i,S as c,T as x,ab as u,U as m,u as f}from"./@vue-DjVelRet.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./element-plus-BluzIk5z.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const k={class:"my-service"},w={key:0,class:"title px-[15px] py-[10px]"},B={key:1,class:"flex flex-wrap pt-[20px] pb-[10px]"},N={class:"mt-[7px]"},V={key:2},j={class:"ml-[10px] flex-1"},C=b({__name:"content",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},setup(o){const _=o,a=g(()=>{var s;return((s=_.content.data)==null?void 0:s.filter(l=>l.is_show=="1"))||[]});return(s,l)=>{const h=y;return e(),t("div",k,[o.content.title?(e(),t("div",w,[i("div",null,c(o.content.title),1)])):p("",!0),o.content.style==1?(e(),t("div",B,[(e(!0),t(x,null,u(f(a),(r,n)=>(e(),t("div",{key:n,class:"flex flex-col items-center w-1/4 mb-[15px]"},[m(d,{width:"26px",height:"26px",src:r.image,alt:""},null,8,["src"]),i("div",N,c(r.name),1)]))),128))])):p("",!0),o.content.style==2?(e(),t("div",V,[(e(!0),t(x,null,u(f(a),(r,n)=>(e(),t("div",{key:n,class:"flex items-center border-b border-[#e5e5e5] h-[50px] px-[12px]"},[m(d,{width:"24px",height:"24px",src:r.image,alt:""},null,8,["src"]),i("div",j,c(r.name),1),i("div",null,[m(h,{name:"el-icon-ArrowRight"})])]))),128))])):p("",!0)])}}}),pt=v(C,[["__scopeId","data-v-2f09c27b"]]);export{pt as default};
|
||||
import{b as y,d as v}from"./index-CLy3qTQ5.js";import d from"./decoration-img-J-gzYln4.js";import{d as b,b as g,c as t,o as e,P as p,a as i,S as c,T as x,ab as u,U as m,u as f}from"./@vue-DjVelRet.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./element-plus-BluzIk5z.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const k={class:"my-service"},w={key:0,class:"title px-[15px] py-[10px]"},B={key:1,class:"flex flex-wrap pt-[20px] pb-[10px]"},N={class:"mt-[7px]"},V={key:2},j={class:"ml-[10px] flex-1"},C=b({__name:"content",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},setup(o){const _=o,a=g(()=>{var s;return((s=_.content.data)==null?void 0:s.filter(l=>l.is_show=="1"))||[]});return(s,l)=>{const h=y;return e(),t("div",k,[o.content.title?(e(),t("div",w,[i("div",null,c(o.content.title),1)])):p("",!0),o.content.style==1?(e(),t("div",B,[(e(!0),t(x,null,u(f(a),(r,n)=>(e(),t("div",{key:n,class:"flex flex-col items-center w-1/4 mb-[15px]"},[m(d,{width:"26px",height:"26px",src:r.image,alt:""},null,8,["src"]),i("div",N,c(r.name),1)]))),128))])):p("",!0),o.content.style==2?(e(),t("div",V,[(e(!0),t(x,null,u(f(a),(r,n)=>(e(),t("div",{key:n,class:"flex items-center border-b border-[#e5e5e5] h-[50px] px-[12px]"},[m(d,{width:"24px",height:"24px",src:r.image,alt:""},null,8,["src"]),i("div",j,c(r.name),1),i("div",null,[m(h,{name:"el-icon-ArrowRight"})])]))),128))])):p("",!0)])}}}),pt=v(C,[["__scopeId","data-v-2f09c27b"]]);export{pt as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{s as _}from"./element-plus-BluzIk5z.js";import m from"./decoration-img-DM6kFAvY.js";import{d as f,c as r,o as e,U as a,L as p,a as t,T as n,ab as c,P as v,O as h,S as d}from"./@vue-DjVelRet.js";import{d as x}from"./index-CFvGjZJA.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const y={class:"pc-aside absolute top-0 bottom-0 left-0 w-[150px]"},b={class:"h-full px-[10px] flex flex-col"},k={class:"mb-auto"},g={class:"nav"},w=["to"],C={class:"ml-[10px]"},S={class:"menu"},B={class:"ml-[6px] line-clamp-1"},E=f({__name:"content",props:{nav:{type:Array,default:()=>[]},menu:{type:Array,default:()=>[]}},setup(l){return(N,i)=>{const u=_;return e(),r("div",y,[a(u,null,{default:p(()=>[t("div",b,[t("div",k,[t("div",g,[(e(!0),r(n,null,c(l.nav,(o,s)=>(e(),r(n,{key:s},[o.is_show=="1"?(e(),r("div",{key:0,to:o.link.path,class:h(["nav-item",{active:s==0}])},[a(m,{width:"18px",height:"18px",src:s==0?o.selected:o.unselected,fit:"cover"},{error:p(()=>i[0]||(i[0]=[t("span",null,null,-1)])),_:2},1032,["src"]),t("div",C,d(o.name),1)],10,w)):v("",!0)],64))),128))])]),t("div",null,[t("div",S,[(e(!0),r(n,null,c(l.menu,(o,s)=>(e(),r("div",{class:"menu-item",key:s},[a(m,{width:"16px",height:"16px",src:o.unselected,fit:"cover"},{error:p(()=>i[1]||(i[1]=[t("span",null,null,-1)])),_:2},1032,["src"]),t("span",B,d(o.name),1)]))),128))])])])]),_:1})])}}}),pt=x(E,[["__scopeId","data-v-35c14957"]]);export{pt as default};
|
||||
import{s as _}from"./element-plus-BluzIk5z.js";import m from"./decoration-img-J-gzYln4.js";import{d as f,c as r,o as e,U as a,L as p,a as t,T as n,ab as c,P as v,O as h,S as d}from"./@vue-DjVelRet.js";import{d as x}from"./index-CLy3qTQ5.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const y={class:"pc-aside absolute top-0 bottom-0 left-0 w-[150px]"},b={class:"h-full px-[10px] flex flex-col"},k={class:"mb-auto"},g={class:"nav"},w=["to"],C={class:"ml-[10px]"},S={class:"menu"},B={class:"ml-[6px] line-clamp-1"},E=f({__name:"content",props:{nav:{type:Array,default:()=>[]},menu:{type:Array,default:()=>[]}},setup(l){return(N,i)=>{const u=_;return e(),r("div",y,[a(u,null,{default:p(()=>[t("div",b,[t("div",k,[t("div",g,[(e(!0),r(n,null,c(l.nav,(o,s)=>(e(),r(n,{key:s},[o.is_show=="1"?(e(),r("div",{key:0,to:o.link.path,class:h(["nav-item",{active:s==0}])},[a(m,{width:"18px",height:"18px",src:s==0?o.selected:o.unselected,fit:"cover"},{error:p(()=>i[0]||(i[0]=[t("span",null,null,-1)])),_:2},1032,["src"]),t("div",C,d(o.name),1)],10,w)):v("",!0)],64))),128))])]),t("div",null,[t("div",S,[(e(!0),r(n,null,c(l.menu,(o,s)=>(e(),r("div",{class:"menu-item",key:s},[a(m,{width:"16px",height:"16px",src:o.unselected,fit:"cover"},{error:p(()=>i[1]||(i[1]=[t("span",null,null,-1)])),_:2},1032,["src"]),t("span",B,d(o.name),1)]))),128))])])])]),_:1})])}}}),pt=x(E,[["__scopeId","data-v-35c14957"]]);export{pt as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./content.vue_vue_type_script_setup_true_lang-C_78qfOy.js";import"./decoration-img-DM6kFAvY.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-CFvGjZJA.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";export{o as default};
|
||||
import{_ as o}from"./content.vue_vue_type_script_setup_true_lang-DyRDlsyL.js";import"./decoration-img-J-gzYln4.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-CLy3qTQ5.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";export{o as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{d as r}from"./index-CFvGjZJA.js";import{c as p,o as i,a as o}from"./@vue-DjVelRet.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./element-plus-BluzIk5z.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const m="/assets/default_avatar-C6VB7PGm.png",e={},s={class:"user-info flex items-center px-[25px]"};function a(c,t){return i(),p("div",s,t[0]||(t[0]=[o("img",{src:m,class:"w-[60px] h-[60px]",alt:""},null,-1),o("div",{class:"text-white text-[18px] ml-[10px]"},"未登录",-1)]))}const L=r(e,[["render",a],["__scopeId","data-v-4b1b613f"]]);export{L as default};
|
||||
import{d as r}from"./index-CLy3qTQ5.js";import{c as p,o as i,a as o}from"./@vue-DjVelRet.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./element-plus-BluzIk5z.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const m="/assets/default_avatar-C6VB7PGm.png",e={},s={class:"user-info flex items-center px-[25px]"};function a(c,t){return i(),p("div",s,t[0]||(t[0]=[o("img",{src:m,class:"w-[60px] h-[60px]",alt:""},null,-1),o("div",{class:"text-white text-[18px] ml-[10px]"},"未登录",-1)]))}const L=r(e,[["render",a],["__scopeId","data-v-4b1b613f"]]);export{L as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./content.vue_vue_type_script_setup_true_lang-B0PSjrMz.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-BTmfRTpN.js";import"./index-CFvGjZJA.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./picker-D3waTbLd.js";import"./index-DNyOr68f.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./article-DUpjglUt.js";import"./usePaging-Dtz4iZyr.js";import"./picker-CZXTeC5w.js";import"./index-Chn2KoSQ.js";import"./index-DJokFQnh.js";import"./index.vue_vue_type_script_setup_true_lang-DZT8OG85.js";import"./vuedraggable-CUBnU4N-.js";import"./vue-BlNCuTuS.js";import"./sortablejs-SiPGO7My.js";export{o as default};
|
||||
import{_ as o}from"./content.vue_vue_type_script_setup_true_lang-D6GrtWJm.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-CUJDR3jl.js";import"./index-CLy3qTQ5.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./picker-tDJ86Pbf.js";import"./index-D-UvWoOR.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./article-BKQTRpme.js";import"./usePaging-Dtz4iZyr.js";import"./picker-DvLnzHAC.js";import"./index-pCudR3yY.js";import"./index-DFCXCmnA.js";import"./index.vue_vue_type_script_setup_true_lang-DZT8OG85.js";import"./vuedraggable-CUBnU4N-.js";import"./vue-BlNCuTuS.js";import"./sortablejs-SiPGO7My.js";export{o as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./content.vue_vue_type_script_setup_true_lang-CxIM1Ssf.js";import"./decoration-img-DM6kFAvY.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-CFvGjZJA.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";export{o as default};
|
||||
import{_ as o}from"./content.vue_vue_type_script_setup_true_lang-h0Df60K-.js";import"./decoration-img-J-gzYln4.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-CLy3qTQ5.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";export{o as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import s from"./decoration-img-DM6kFAvY.js";import{d as p,c as r,o as i,a as e,R as c,P as n,S as m,U as a,T as l}from"./@vue-DjVelRet.js";import{d as x}from"./index-CFvGjZJA.js";import"./element-plus-BluzIk5z.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const d={class:"customer-service bg-white flex flex-col justify-center items-center mx-[18px] mt-[15px] rounded-[10px] px-[10px] pb-[50px]"},f={class:"w-full border-solid border-0 border-b border-[#f5f5f5] p-[15px] text-center text-[#101010] text-base font-medium"},u={class:"mt-[30px]"},b={key:0,class:"text-sm mt-[20px] font-medium"},h={key:1,class:"text-sm mt-[12px] flex flex-wrap"},w=["href"],v={key:2,class:"text-muted text-sm mt-[15px]"},y=p({__name:"content",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},setup(t){return(g,o)=>(i(),r(l,null,[o[0]||(o[0]=e("view",{class:"bg-white p-[15px] flex text-[#101010] font-medium text-lg"}," 联系我们 ",-1)),e("view",d,[e("view",f,m(t.content.title),1),e("view",u,[a(s,{width:"100px",height:"100px",src:t.content.qrcode,alt:""},null,8,["src"])]),t.content.remark?(i(),r("view",b,m(t.content.remark),1)):n("",!0),t.content.mobile?(i(),r("view",h,[e("a",{class:"ml-[5px] phone text-primary underline",href:"tel:"+t.content.mobile},m(t.content.mobile),9,w)])):n("",!0),t.content.time?(i(),r("view",v," 服务时间:"+m(t.content.time),1)):n("",!0)]),o[1]||(o[1]=c(" Î "))],64))}}),tt=x(y,[["__scopeId","data-v-ed28524a"]]);export{tt as default};
|
||||
import s from"./decoration-img-J-gzYln4.js";import{d as p,c as r,o as i,a as e,R as c,P as n,S as m,U as a,T as l}from"./@vue-DjVelRet.js";import{d as x}from"./index-CLy3qTQ5.js";import"./element-plus-BluzIk5z.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const d={class:"customer-service bg-white flex flex-col justify-center items-center mx-[18px] mt-[15px] rounded-[10px] px-[10px] pb-[50px]"},f={class:"w-full border-solid border-0 border-b border-[#f5f5f5] p-[15px] text-center text-[#101010] text-base font-medium"},u={class:"mt-[30px]"},b={key:0,class:"text-sm mt-[20px] font-medium"},h={key:1,class:"text-sm mt-[12px] flex flex-wrap"},w=["href"],v={key:2,class:"text-muted text-sm mt-[15px]"},y=p({__name:"content",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},setup(t){return(g,o)=>(i(),r(l,null,[o[0]||(o[0]=e("view",{class:"bg-white p-[15px] flex text-[#101010] font-medium text-lg"}," 联系我们 ",-1)),e("view",d,[e("view",f,m(t.content.title),1),e("view",u,[a(s,{width:"100px",height:"100px",src:t.content.qrcode,alt:""},null,8,["src"])]),t.content.remark?(i(),r("view",b,m(t.content.remark),1)):n("",!0),t.content.mobile?(i(),r("view",h,[e("a",{class:"ml-[5px] phone text-primary underline",href:"tel:"+t.content.mobile},m(t.content.mobile),9,w)])):n("",!0),t.content.time?(i(),r("view",v," 服务时间:"+m(t.content.time),1)):n("",!0)]),o[1]||(o[1]=c(" Î "))],64))}}),tt=x(y,[["__scopeId","data-v-ed28524a"]]);export{tt as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import c from"./decoration-img-DM6kFAvY.js";import{d as n,b as l,c as o,o as r,T as d,ab as f,_ as u,U as _,a as x,S as b,u as y}from"./@vue-DjVelRet.js";import{d as h}from"./index-CFvGjZJA.js";import"./element-plus-BluzIk5z.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const g={class:"tabbar flex"},v={class:"leading-3 text-[12px] mt-[4px]"},k=n({__name:"content",props:{style:{type:Object,default:()=>({})},list:{type:Array,default:()=>[]}},setup(e){const p=e,m=l(()=>{var t;return((t=p.list)==null?void 0:t.filter(i=>i.is_show==1))||[]});return(t,i)=>(r(),o("div",g,[(r(!0),o(d,null,f(y(m),(s,a)=>(r(),o("div",{key:a,class:"tabbar-item flex flex-col justify-center items-center flex-1",style:u({color:e.style.default_color})},[_(c,{width:"22px",height:"22px",src:s.unselected,fit:"cover"},null,8,["src"]),x("div",v,b(s.name),1)],4))),128))]))}}),ot=h(k,[["__scopeId","data-v-0405bccb"]]);export{ot as default};
|
||||
import c from"./decoration-img-J-gzYln4.js";import{d as n,b as l,c as o,o as r,T as d,ab as f,_ as u,U as _,a as x,S as b,u as y}from"./@vue-DjVelRet.js";import{d as h}from"./index-CLy3qTQ5.js";import"./element-plus-BluzIk5z.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const g={class:"tabbar flex"},v={class:"leading-3 text-[12px] mt-[4px]"},k=n({__name:"content",props:{style:{type:Object,default:()=>({})},list:{type:Array,default:()=>[]}},setup(e){const p=e,m=l(()=>{var t;return((t=p.list)==null?void 0:t.filter(i=>i.is_show==1))||[]});return(t,i)=>(r(),o("div",g,[(r(!0),o(d,null,f(y(m),(s,a)=>(r(),o("div",{key:a,class:"tabbar-item flex flex-col justify-center items-center flex-1",style:u({color:e.style.default_color})},[_(c,{width:"22px",height:"22px",src:s.unselected,fit:"cover"},null,8,["src"]),x("div",v,b(s.name),1)],4))),128))]))}}),ot=h(k,[["__scopeId","data-v-0405bccb"]]);export{ot as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{d as t}from"./index-CFvGjZJA.js";import{c as o,o as r}from"./@vue-DjVelRet.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./element-plus-BluzIk5z.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const m={},i={class:"page-mate"};function p(e,c){return r(),o("div",i)}const M=t(m,[["render",p]]);export{M as default};
|
||||
import{d as t}from"./index-CLy3qTQ5.js";import{c as o,o as r}from"./@vue-DjVelRet.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./element-plus-BluzIk5z.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const m={},i={class:"page-mate"};function p(e,c){return r(),o("div",i)}const M=t(m,[["render",p]]);export{M as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./content.vue_vue_type_script_setup_true_lang-C8wmQSjh.js";import"./decoration-img-DM6kFAvY.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-CFvGjZJA.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";export{o as default};
|
||||
import{_ as o}from"./content.vue_vue_type_script_setup_true_lang-BMYMqhlE.js";import"./decoration-img-J-gzYln4.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-CLy3qTQ5.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";export{o as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{d as i,b as m}from"./index-CFvGjZJA.js";import{c as p,o as e,a as t,U as s}from"./@vue-DjVelRet.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./element-plus-BluzIk5z.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const c={},a={class:"search"},n={class:"search-con flex items-center px-[15px]"};function _(d,o){const r=m;return e(),p("div",a,[t("div",n,[s(r,{name:"el-icon-Search",size:17}),o[0]||(o[0]=t("span",{class:"ml-[5px]"},"请输入关键词搜索",-1))])])}const M=i(c,[["render",_],["__scopeId","data-v-3514bdd8"]]);export{M as default};
|
||||
import{d as i,b as m}from"./index-CLy3qTQ5.js";import{c as p,o as e,a as t,U as s}from"./@vue-DjVelRet.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./element-plus-BluzIk5z.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";const c={},a={class:"search"},n={class:"search-con flex items-center px-[15px]"};function _(d,o){const r=m;return e(),p("div",a,[t("div",n,[s(r,{name:"el-icon-Search",size:17}),o[0]||(o[0]=t("span",{class:"ml-[5px]"},"请输入关键词搜索",-1))])])}const M=i(c,[["render",_],["__scopeId","data-v-3514bdd8"]]);export{M as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import c from"./decoration-img-DM6kFAvY.js";import{d as i,b as n,c as l,o as u,a as h,U as m,u as d,_ as f}from"./@vue-DjVelRet.js";const g={class:"banner-image w-full h-full"},b=i({__name:"content",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})},height:{type:String,default:"96px"}},setup(e){const r=e,t=n(()=>{var a;return((a=r.content.data)==null?void 0:a.filter(s=>s.is_show=="1"))||[]}),o=n(()=>Array.isArray(t.value)&&t.value[0]?t.value[0].image:"");return(a,s)=>(u(),l("div",{class:"banner",style:f(e.styles)},[h("div",g,[m(c,{width:"100%",height:e.styles.height||e.height,src:d(o),fit:"contain"},null,8,["height","src"])])],4))}});export{b as _};
|
||||
import c from"./decoration-img-J-gzYln4.js";import{d as i,b as n,c as l,o as u,a as h,U as m,u as d,_ as f}from"./@vue-DjVelRet.js";const g={class:"banner-image w-full h-full"},b=i({__name:"content",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})},height:{type:String,default:"96px"}},setup(e){const r=e,t=n(()=>{var a;return((a=r.content.data)==null?void 0:a.filter(s=>s.is_show=="1"))||[]}),o=n(()=>Array.isArray(t.value)&&t.value[0]?t.value[0].image:"");return(a,s)=>(u(),l("div",{class:"banner",style:f(e.styles)},[h("div",g,[m(c,{width:"100%",height:e.styles.height||e.height,src:d(o),fit:"contain"},null,8,["height","src"])])],4))}});export{b as _};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{R as U,s as j,i as N}from"./element-plus-BluzIk5z.js";import{_ as S}from"./index-BTmfRTpN.js";import{_ as A}from"./picker-D3waTbLd.js";import{_ as D}from"./picker-CZXTeC5w.js";import{P as L}from"./index-DNyOr68f.js";import{f as _}from"./index-CFvGjZJA.js";import{n as f}from"./lodash-es-VsDguZh5.js";import{d as O,s as P,K as g,o as r,L as o,U as n,a as l,c as h,T,ab as $,R as F}from"./@vue-DjVelRet.js";const K={class:"flex flex-wrap p-4"},q={class:"bg-fill-light w-full p-4"},z={class:"flex items-center"},G={class:"mt-4 ml-4"},Z=O({__name:"content",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})},height:{type:String,default:"170px"}},emits:["update:content"],setup(d,{expose:x,emit:k}){const u=k,i=P(),a=d,y=()=>{var e;(e=i.value)==null||e.open()},b=()=>{var e;(e=i.value)==null||e.close()},w=()=>{var e;if(((e=a.content.data)==null?void 0:e.length)<10){const t=f(a.content);t.data.push({image:"",name:"",link:{}}),u("update:content",t)}else _.msgError("最多添加10张图片")},V=e=>{var s;if(((s=a.content.data)==null?void 0:s.length)<=1)return _.msgError("最少保留一个轮播图");const t=f(a.content);t.data.splice(e,1),u("update:content",t)};return x({open:y}),(e,t)=>{const s=U,v=D,C=A,E=S,B=N,R=j;return r(),g(L,{ref_key:"popupRef",ref:i,title:"轮播图设置",async:!0,width:"980px",onConfirm:b},{default:o(()=>[n(s,{title:"最多可添加10张,建议图片尺寸750px*440px",type:"warning"}),n(R,{height:"400px",class:"mt-4"},{default:o(()=>[l("div",K,[(r(!0),h(T,null,$(d.content.data,(c,m)=>(r(),h("div",{key:m,class:"w-[400px] mr-4 mb-4"},[(r(),g(E,{key:m,onClose:p=>V(m),class:"w-full"},{default:o(()=>[l("div",q,[l("div",z,[n(v,{width:"122px",height:"122px",modelValue:c.image,"onUpdate:modelValue":p=>c.image=p,"upload-class":"bg-body","exclude-domain":""},{upload:o(()=>t[0]||(t[0]=[l("div",{class:"w-[122px] h-[122px] flex justify-center items-center"}," 轮播图 ",-1)])),_:2},1032,["modelValue","onUpdate:modelValue"]),n(C,{modelValue:c.link,"onUpdate:modelValue":p=>c.link=p},null,8,["modelValue","onUpdate:modelValue"])])])]),_:2},1032,["onClose"]))]))),128))]),l("div",G,[n(B,{link:"",type:"primary",onClick:w},{default:o(()=>t[1]||(t[1]=[F("+ 添加轮播图")])),_:1})])]),_:1})]),_:1},512)}}});export{Z as _};
|
||||
import{R as U,s as j,i as N}from"./element-plus-BluzIk5z.js";import{_ as S}from"./index-CUJDR3jl.js";import{_ as A}from"./picker-tDJ86Pbf.js";import{_ as D}from"./picker-DvLnzHAC.js";import{P as L}from"./index-D-UvWoOR.js";import{f as _}from"./index-CLy3qTQ5.js";import{n as f}from"./lodash-es-VsDguZh5.js";import{d as O,s as P,K as g,o as r,L as o,U as n,a as l,c as h,T,ab as $,R as F}from"./@vue-DjVelRet.js";const K={class:"flex flex-wrap p-4"},q={class:"bg-fill-light w-full p-4"},z={class:"flex items-center"},G={class:"mt-4 ml-4"},Z=O({__name:"content",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})},height:{type:String,default:"170px"}},emits:["update:content"],setup(d,{expose:x,emit:k}){const u=k,i=P(),a=d,y=()=>{var e;(e=i.value)==null||e.open()},b=()=>{var e;(e=i.value)==null||e.close()},w=()=>{var e;if(((e=a.content.data)==null?void 0:e.length)<10){const t=f(a.content);t.data.push({image:"",name:"",link:{}}),u("update:content",t)}else _.msgError("最多添加10张图片")},V=e=>{var s;if(((s=a.content.data)==null?void 0:s.length)<=1)return _.msgError("最少保留一个轮播图");const t=f(a.content);t.data.splice(e,1),u("update:content",t)};return x({open:y}),(e,t)=>{const s=U,v=D,C=A,E=S,B=N,R=j;return r(),g(L,{ref_key:"popupRef",ref:i,title:"轮播图设置",async:!0,width:"980px",onConfirm:b},{default:o(()=>[n(s,{title:"最多可添加10张,建议图片尺寸750px*440px",type:"warning"}),n(R,{height:"400px",class:"mt-4"},{default:o(()=>[l("div",K,[(r(!0),h(T,null,$(d.content.data,(c,m)=>(r(),h("div",{key:m,class:"w-[400px] mr-4 mb-4"},[(r(),g(E,{key:m,onClose:p=>V(m),class:"w-full"},{default:o(()=>[l("div",q,[l("div",z,[n(v,{width:"122px",height:"122px",modelValue:c.image,"onUpdate:modelValue":p=>c.image=p,"upload-class":"bg-body","exclude-domain":""},{upload:o(()=>t[0]||(t[0]=[l("div",{class:"w-[122px] h-[122px] flex justify-center items-center"}," 轮播图 ",-1)])),_:2},1032,["modelValue","onUpdate:modelValue"]),n(C,{modelValue:c.link,"onUpdate:modelValue":p=>c.link=p},null,8,["modelValue","onUpdate:modelValue"])])])]),_:2},1032,["onClose"]))]))),128))]),l("div",G,[n(B,{link:"",type:"primary",onClick:w},{default:o(()=>t[1]||(t[1]=[F("+ 添加轮播图")])),_:1})])]),_:1})]),_:1},512)}}});export{Z as _};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import p from"./decoration-img-DM6kFAvY.js";import{d,b as m,c as a,o as n,a as r,T as u,ab as _,U as f,S as g,u as h,_ as x}from"./@vue-DjVelRet.js";const y={class:"nav bg-white pt-[15px] pb-[8px]"},w={class:"mt-[7px]"},k=d({__name:"content",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},setup(o){const t=o,c=m(()=>{var s;return(((s=t.content.data)==null?void 0:s.filter(e=>e.is_show=="1"))||[]).slice(0,t.content.show_line*t.content.per_line)});return(l,s)=>(n(),a("div",y,[r("div",{class:"grid grid-rows-auto gap-y-3 w-full",style:x({"grid-template-columns":`repeat(${o.content.per_line}, 1fr)`})},[(n(!0),a(u,null,_(h(c),(e,i)=>(n(),a("div",{key:i,class:"flex flex-col items-center"},[f(p,{width:"41px",height:"41px",src:e.image,alt:""},null,8,["src"]),r("div",w,g(e.name),1)]))),128))],4)]))}});export{k as _};
|
||||
import p from"./decoration-img-J-gzYln4.js";import{d,b as m,c as a,o as n,a as r,T as u,ab as _,U as f,S as g,u as h,_ as x}from"./@vue-DjVelRet.js";const y={class:"nav bg-white pt-[15px] pb-[8px]"},w={class:"mt-[7px]"},k=d({__name:"content",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},setup(o){const t=o,c=m(()=>{var s;return(((s=t.content.data)==null?void 0:s.filter(e=>e.is_show=="1"))||[]).slice(0,t.content.show_line*t.content.per_line)});return(l,s)=>(n(),a("div",y,[r("div",{class:"grid grid-rows-auto gap-y-3 w-full",style:x({"grid-template-columns":`repeat(${o.content.per_line}, 1fr)`})},[(n(!0),a(u,null,_(h(c),(e,i)=>(n(),a("div",{key:i,class:"flex flex-col items-center"},[f(p,{width:"41px",height:"41px",src:e.image,alt:""},null,8,["src"]),r("div",w,g(e.name),1)]))),128))],4)]))}});export{k as _};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import c from"./decoration-img-DM6kFAvY.js";import{d as i,b as s,c as p,o as m,a as u,U as l,u as d}from"./@vue-DjVelRet.js";const _={class:"banner mx-[10px] mt-[10px]"},f={class:"banner-image"},x=i({__name:"content",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},setup(n){const o=n,e=s(()=>{var t;return((t=o.content.data)==null?void 0:t.filter(a=>a.is_show=="1"))||[]}),r=s(()=>Array.isArray(e.value)&&e.value[0]?e.value[0].image:"");return(t,a)=>(m(),p("div",_,[u("div",f,[l(c,{width:"100%",height:"100px",src:d(r),fit:"contain"},null,8,["src"])])]))}});export{x as _};
|
||||
import c from"./decoration-img-J-gzYln4.js";import{d as i,b as s,c as p,o as m,a as u,U as l,u as d}from"./@vue-DjVelRet.js";const _={class:"banner mx-[10px] mt-[10px]"},f={class:"banner-image"},x=i({__name:"content",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},setup(n){const o=n,e=s(()=>{var t;return((t=o.content.data)==null?void 0:t.filter(a=>a.is_show=="1"))||[]}),r=s(()=>Array.isArray(e.value)&&e.value[0]?e.value[0].image:"");return(t,a)=>(m(),p("div",_,[u("div",f,[l(c,{width:"100%",height:"100px",src:d(r),fit:"contain"},null,8,["src"])])]))}});export{x as _};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import c from"./decoration-img-DM6kFAvY.js";import{d as i,b as s,c as l,o as u,a as h,U as m,u as d,_ as f}from"./@vue-DjVelRet.js";const g={class:"banner-image w-full h-full"},b=i({__name:"content",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})},height:{type:String,default:"170px"}},setup(e){const r=e,t=s(()=>{var a;return((a=r.content.data)==null?void 0:a.filter(n=>n.is_show=="1"))||[]}),o=s(()=>Array.isArray(t.value)&&t.value[0]?t.value[0].image:"");return(a,n)=>(u(),l("div",{class:"banner",style:f(e.styles)},[h("div",g,[m(c,{width:"100%",height:e.content.style==1?e.height:"550px",src:d(o),fit:"contain"},null,8,["height","src"])])],4))}});export{b as _};
|
||||
import c from"./decoration-img-J-gzYln4.js";import{d as i,b as s,c as l,o as u,a as h,U as m,u as d,_ as f}from"./@vue-DjVelRet.js";const g={class:"banner-image w-full h-full"},b=i({__name:"content",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})},height:{type:String,default:"170px"}},setup(e){const r=e,t=s(()=>{var a;return((a=r.content.data)==null?void 0:a.filter(n=>n.is_show=="1"))||[]}),o=s(()=>Array.isArray(t.value)&&t.value[0]?t.value[0].image:"");return(a,n)=>(u(),l("div",{class:"banner",style:f(e.styles)},[h("div",g,[m(c,{width:"100%",height:e.content.style==1?e.height:"550px",src:d(o),fit:"contain"},null,8,["height","src"])])],4))}});export{b as _};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{r as e}from"./index-CFvGjZJA.js";function a(r){return e.get({url:"/crawler.crawlErrorLog/lists",params:r})}function l(r){return e.get({url:"/crawler.crawlErrorLog/detail",params:r})}function o(r){return e.post({url:"/crawler.crawlErrorLog/delete",params:r})}function s(r){return e.get({url:"/crawler.taskLog/lists",params:r})}function c(r){return e.get({url:"/crawler.taskLog/detail",params:r})}export{l as a,o as b,a as c,s as d,c as e};
|
||||
import{r as e}from"./index-CLy3qTQ5.js";function a(r){return e.get({url:"/crawler.crawlErrorLog/lists",params:r})}function l(r){return e.get({url:"/crawler.crawlErrorLog/detail",params:r})}function o(r){return e.post({url:"/crawler.crawlErrorLog/delete",params:r})}function s(r){return e.get({url:"/crawler.taskLog/lists",params:r})}function c(r){return e.get({url:"/crawler.taskLog/detail",params:r})}export{l as a,o as b,a as c,s as d,c as e};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./data-table.vue_vue_type_script_setup_true_lang-fDvmykWc.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./code-C-v84yrJ.js";import"./index-CFvGjZJA.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./index-DNyOr68f.js";import"./usePaging-Dtz4iZyr.js";export{o as default};
|
||||
import{_ as o}from"./data-table.vue_vue_type_script_setup_true_lang-D0Viee0O.js";import"./element-plus-BluzIk5z.js";import"./@vue-DjVelRet.js";import"./@element-plus-RuzzlbSF.js";import"./lodash-es-VsDguZh5.js";import"./dayjs-Mv9jwnDt.js";import"./@popperjs-D_chPuIy.js";import"./async-validator-9PlIezaS.js";import"./@ctrl-r5W6hzzQ.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./code-B2CjHOB1.js";import"./index-CLy3qTQ5.js";import"./nprogress-DYbUr3Ql.js";import"./vue-router-DifUqGFW.js";import"./pinia-D1_qSsvX.js";import"./axios-DIsA03vz.js";import"./lodash-wrSAtCJj.js";import"./@vueuse-DbKvT5Ch.js";import"./css-color-function-DsMtFL6v.js";import"./balanced-match-BdS7OldZ.js";import"./color-DYO1E7y4.js";import"./clone-Ddk2tjDh.js";import"./color-convert-DsNsD289.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DXsJvHIW.js";import"./clipboard-DPX9bJ1T.js";import"./echarts-CXZcVnUo.js";import"./tslib-BDyQ-Jie.js";import"./zrender-DO4NV0px.js";import"./highlight.js--xG_hASo.js";import"./@highlightjs-DcY7_PRf.js";import"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import"./index-D-UvWoOR.js";import"./usePaging-Dtz4iZyr.js";export{o as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{D as B,B as P,C as R,i as T,J as D,K as U,M as F}from"./element-plus-BluzIk5z.js";import{d as L,s as M,a0 as N,r as S,w as z,c as b,o as g,U as e,L as o,M as I,a as $,u as a,a9 as h,R as C,i as j,H}from"./@vue-DjVelRet.js";import{f as J,h as q}from"./code-C-v84yrJ.js";import{_ as A}from"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import{P as G}from"./index-DNyOr68f.js";import{u as O}from"./usePaging-Dtz4iZyr.js";import{f as Q}from"./index-CFvGjZJA.js";const W={class:"data-table"},X={class:"m-4"},Y={class:"flex justify-end mt-4"},me=L({__name:"data-table",emits:["success"],setup(Z,{emit:v}){const w=v,u=M(),s=N({name:"",comment:""}),{pager:n,getLists:f,resetParams:y,resetPage:d}=O({fetchFun:J,params:s,size:10}),c=S([]),V=l=>{c.value=l.map(({name:t,comment:i})=>({name:t,comment:i}))},k=async()=>{var l;if(!c.value.length)return Q.msgError("请选择数据表");await q({table:c.value}),(l=u.value)==null||l.close(),w("success")};return z(()=>{var l;return(l=u.value)==null?void 0:l.visible},l=>{l&&f()}),(l,t)=>{const i=R,p=P,_=T,E=B,r=U,x=D,K=F;return g(),b("div",W,[e(G,{ref_key:"popupRef",ref:u,clickModalClose:!1,title:"选择表",width:"900px",async:!0,onConfirm:k},{trigger:o(()=>[H(l.$slots,"default")]),default:o(()=>[e(E,{class:"ls-form",model:a(s),inline:""},{default:o(()=>[e(p,{class:"w-[280px]",label:"表名称"},{default:o(()=>[e(i,{modelValue:a(s).name,"onUpdate:modelValue":t[0]||(t[0]=m=>a(s).name=m),clearable:"",onKeyup:h(a(d),["enter"])},null,8,["modelValue","onKeyup"])]),_:1}),e(p,{class:"w-[280px]",label:"表描述"},{default:o(()=>[e(i,{modelValue:a(s).comment,"onUpdate:modelValue":t[1]||(t[1]=m=>a(s).comment=m),clearable:"",onKeyup:h(a(d),["enter"])},null,8,["modelValue","onKeyup"])]),_:1}),e(p,null,{default:o(()=>[e(_,{type:"primary",onClick:a(d)},{default:o(()=>t[3]||(t[3]=[C("查询")])),_:1},8,["onClick"]),e(_,{onClick:a(y)},{default:o(()=>t[4]||(t[4]=[C("重置")])),_:1},8,["onClick"])]),_:1})]),_:1},8,["model"]),I((g(),b("div",X,[e(x,{height:"400",size:"large",data:a(n).lists,onSelectionChange:V},{default:o(()=>[e(r,{type:"selection",width:"55"}),e(r,{label:"表名称",prop:"name","min-width":"150"}),e(r,{label:"表描述",prop:"comment","min-width":"160"}),e(r,{label:"创建时间",prop:"create_time","min-width":"180"})]),_:1},8,["data"])])),[[K,a(n).loading]]),$("div",Y,[e(A,{modelValue:a(n),"onUpdate:modelValue":t[2]||(t[2]=m=>j(n)?n.value=m:null),onChange:a(f)},null,8,["modelValue","onChange"])])]),_:3},512)])}}});export{me as _};
|
||||
import{D as B,B as P,C as R,i as T,J as D,K as U,M as F}from"./element-plus-BluzIk5z.js";import{d as L,s as M,a0 as N,r as S,w as z,c as b,o as g,U as e,L as o,M as I,a as $,u as a,a9 as h,R as C,i as j,H}from"./@vue-DjVelRet.js";import{f as J,h as q}from"./code-B2CjHOB1.js";import{_ as A}from"./index.vue_vue_type_script_setup_true_lang-BYYopaMT.js";import{P as G}from"./index-D-UvWoOR.js";import{u as O}from"./usePaging-Dtz4iZyr.js";import{f as Q}from"./index-CLy3qTQ5.js";const W={class:"data-table"},X={class:"m-4"},Y={class:"flex justify-end mt-4"},me=L({__name:"data-table",emits:["success"],setup(Z,{emit:v}){const w=v,u=M(),s=N({name:"",comment:""}),{pager:n,getLists:f,resetParams:y,resetPage:d}=O({fetchFun:J,params:s,size:10}),c=S([]),V=l=>{c.value=l.map(({name:t,comment:i})=>({name:t,comment:i}))},k=async()=>{var l;if(!c.value.length)return Q.msgError("请选择数据表");await q({table:c.value}),(l=u.value)==null||l.close(),w("success")};return z(()=>{var l;return(l=u.value)==null?void 0:l.visible},l=>{l&&f()}),(l,t)=>{const i=R,p=P,_=T,E=B,r=U,x=D,K=F;return g(),b("div",W,[e(G,{ref_key:"popupRef",ref:u,clickModalClose:!1,title:"选择表",width:"900px",async:!0,onConfirm:k},{trigger:o(()=>[H(l.$slots,"default")]),default:o(()=>[e(E,{class:"ls-form",model:a(s),inline:""},{default:o(()=>[e(p,{class:"w-[280px]",label:"表名称"},{default:o(()=>[e(i,{modelValue:a(s).name,"onUpdate:modelValue":t[0]||(t[0]=m=>a(s).name=m),clearable:"",onKeyup:h(a(d),["enter"])},null,8,["modelValue","onKeyup"])]),_:1}),e(p,{class:"w-[280px]",label:"表描述"},{default:o(()=>[e(i,{modelValue:a(s).comment,"onUpdate:modelValue":t[1]||(t[1]=m=>a(s).comment=m),clearable:"",onKeyup:h(a(d),["enter"])},null,8,["modelValue","onKeyup"])]),_:1}),e(p,null,{default:o(()=>[e(_,{type:"primary",onClick:a(d)},{default:o(()=>t[3]||(t[3]=[C("查询")])),_:1},8,["onClick"]),e(_,{onClick:a(y)},{default:o(()=>t[4]||(t[4]=[C("重置")])),_:1},8,["onClick"])]),_:1})]),_:1},8,["model"]),I((g(),b("div",X,[e(x,{height:"400",size:"large",data:a(n).lists,onSelectionChange:V},{default:o(()=>[e(r,{type:"selection",width:"55"}),e(r,{label:"表名称",prop:"name","min-width":"150"}),e(r,{label:"表描述",prop:"comment","min-width":"160"}),e(r,{label:"创建时间",prop:"create_time","min-width":"180"})]),_:1},8,["data"])])),[[K,a(n).loading]]),$("div",Y,[e(A,{modelValue:a(n),"onUpdate:modelValue":t[2]||(t[2]=m=>j(n)?n.value=m:null),onChange:a(f)},null,8,["modelValue","onChange"])])]),_:3},512)])}}});export{me as _};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{r as t}from"./index-CFvGjZJA.js";function a(e){return t.get({url:"/decorate.page/detail",params:e},{ignoreCancelToken:!0})}function o(e){return t.post({url:"/decorate.page/save",params:e})}function c(e){return t.get({url:"/decorate.data/article",params:e})}function n(e){return t.get({url:"/decorate.tabbar/detail",params:e})}function u(e){return t.post({url:"/decorate.tabbar/save",params:e})}function s(){return t.get({url:"/decorate.data/pc"})}export{a,s as b,n as c,u as d,c as g,o as s};
|
||||
import{r as t}from"./index-CLy3qTQ5.js";function a(e){return t.get({url:"/decorate.page/detail",params:e},{ignoreCancelToken:!0})}function o(e){return t.post({url:"/decorate.page/save",params:e})}function c(e){return t.get({url:"/decorate.data/article",params:e})}function n(e){return t.get({url:"/decorate.tabbar/detail",params:e})}function u(e){return t.post({url:"/decorate.tabbar/save",params:e})}function s(){return t.get({url:"/decorate.data/pc"})}export{a,s as b,n as c,u as d,c as g,o as s};
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user