Compare commits

...
10 Commits
364 changed files with 4575 additions and 922 deletions
+4
View File
@@ -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
+23 -8
View File
@@ -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、保存白名单和数据库列是否同步。
+11 -11
View File
@@ -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"
```
+11
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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,
)
+3 -1
View File
@@ -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",
},
)
+81
View File
@@ -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()
+448
View File
@@ -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,
)
+70
View File
@@ -0,0 +1,70 @@
# Gitea 部署说明
> 部署时间:2026-07-31
>
> 当前阶段:安装已完成,服务正常运行。
## 访问方式
- 正式访问地址:<https://git.zones.sbnews.net/>
- 后端监听:`0.0.0.0:3000`。该端口仍保留用于服务器直连和 Nginx 反向代理,但日常访问应使用 HTTPS 域名。
- 协议:HTTPSNginx 终止 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)。
+13
View File
@@ -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;
+43
View File
@@ -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='第三方赛事赔率表';
+31
View File
@@ -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
);
+5 -5
View File
@@ -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'
+43
View File
@@ -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`
);
@@ -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` 会报错阻止误用。
+93
View File
@@ -0,0 +1,93 @@
# 测试服务器运行环境
> 采集时间:2026-07-31 15:59Asia/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 状态、模板标签和工作区改动;不自动执行构建、测试、提交或部署。
+28
View File
@@ -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
View File
@@ -69,4 +69,4 @@ npm run generate
- 接口 baseURL 由 `runtimeConfig` 或环境配置控制,不要写死。
- 页面级数据获取优先使用 `useAsyncData` / `useFetch`
- 与 uniapp 共享前台接口契约,避免同一业务前台两套字段命名。
- 设计稿与页面映射维护在根目录 `设计稿映射.md`
- 设计稿与页面映射维护在 `docs/设计稿映射.md`
+2 -2
View File
@@ -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
View File
@@ -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
-- ----------------------------
+3 -3
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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) : '未知平台');
}
+316 -21
View File
@@ -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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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};
File diff suppressed because one or more lines are too long
@@ -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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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};
File diff suppressed because one or more lines are too long
@@ -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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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